OverviewFilesCommitsIssuesDocsReleasesPeers

opencog-cogserver commits / 1cc63e8

Remove the visualizer
1cc63e82ef2e0c46893bdf4770a51272a2d77ce3
by Linas Vepstas <linasvepstas@gmail.com> · 2026-01-17T01:17:31.000Z

Changed files (12) +4 -5786

examples/visualizer/CMakeLists.txt +0 -22
……@@ -2,29 +2,7 @@
22# Install visualizer files to /usr/local/share/cogserver/visualizer/
33INSTALL(FILES
44 index.html
5 tree-view.html
6 type-view.html
75 README.md
86 DESTINATION share/cogserver/visualizer
97 COMPONENT visualizer
108)
11
12INSTALL(FILES
13 atomspace-cache.js
14 graph-view.js
15 landing.js
16 theme.js
17 tree-view.js
18 type-view.js
19 styles.css
20 DESTINATION share/cogserver/visualizer
21 COMPONENT visualizer
22)
23
24# Install vis-network subdirectory
25INSTALL(DIRECTORY vis-network
26 DESTINATION share/cogserver/visualizer
27 COMPONENT visualizer
28 FILES_MATCHING
29 PATTERN "*"
30)
examples/visualizer/README.md +4 -126
……@@ -1,129 +1,7 @@
11# AtomSpace Visualizer
22
3A web-based visualization tool for the AtomSpace in-RAM database, providing real-time statistics and monitoring through WebSocket connections to the CogServer using the JSON protocol.
3The demo code here became large and complex, and has been moved to
4the [atomspace-viz](https://github.com/opencog/atomspace-viz) github
5repo.
46
5[***Try it here***](https://html-preview.github.io/?url=https://github.com/opencog/cogserver/blob/master/examples/visualizer/index.html).
6You must have a CogServer running somewhere; you will need to type the
7URL into the connection box.
8
9## Features
10
11- **WebSocket Connection Management**: Connect to any running CogServer instance via WebSocket
12- **JSON Protocol**: Uses the JSON endpoint for reliable data exchange and visualization
13- **Real-time Statistics**: Display total atom count, nodes, links, and atom types
14- **Interactive Debug Console**: Send JSON commands directly to the CogServer
15- **Responsive Design**: Modern, clean interface that works on desktop and mobile devices
16- **Connection Status Monitoring**: Visual feedback for connection state
17
18## Getting Started
19
20### Prerequisites
21
221. A running CogServer instance with WebSocket support enabled
232. A web browser with WebSocket support (all modern browsers)
24
25### Starting the CogServer
26
27Start the CogServer using one of these methods:
28
29#### Command Line:
30```bash
31/usr/local/bin/cogserver
32```
33
34#### From Guile Scheme:
35```scheme
36(use-modules (opencog) (opencog cogserver))
37(start-cogserver)
38```
39
40#### From Python:
41```python
42import opencog, opencog.cogserver
43opencog.cogserver.startCogserver()
44```
45
46### Using the Visualizer
47
481. Open `index.html` in a web browser.
49 [***Try it here***](https://html-preview.github.io/?url=https://github.com/opencog/cogserver/blob/master/examples/visutalizer/index.html).
502. Enter the WebSocket URL of your CogServer (default: `ws://localhost:18080/`)
513. Click "Connect" (the JSON endpoint will be automatically appended)
524. Once connected, the visualizer will automatically fetch and display AtomSpace statistics
53
54## Interface Components
55
56### Connection Panel
57- **CogServer URL**: Enter the WebSocket URL of your CogServer (JSON endpoint is automatically used)
58- **Connect/Disconnect Button**: Manage the WebSocket connection
59
60### Status Panel
61- Displays current connection status
62- Shows connected server URL with JSON endpoint
63
64### Statistics Panel
65- **Total Atoms**: Complete count of all atoms in the AtomSpace
66- **Nodes**: Count of atomic nodes
67- **Links**: Count of link atoms
68- **Atom Types**: Number of distinct atom types
69- **Refresh Button**: Manually update statistics
70- **Last Update**: Timestamp of most recent data fetch
71
72### Atoms by Type
73- Displays a breakdown of all atoms grouped by their type
74- Shows the count for each atom type
75- Sorted by count (highest first) and then alphabetically
76- Only displays types with at least one atom (zero counts are excluded)
77- Updates automatically when fetching atom statistics
78
79### Debug Console
80- Send JSON commands to the CogServer
81- View raw responses from the server
82- Useful for testing and exploration
83
84## Supported JSON Commands
85
86- `AtomSpace.version()` - Get API version
87- `AtomSpace.getAtoms("Atom", true)` - Fetch all atoms
88- `AtomSpace.getSubTypes("TopType", true)` - Get all atom types
89- `AtomSpace.makeAtom({"type": "Concept", "name": "example"})` - Create an atom
90- See the [JSON README](https://github.com/opencog/atomspace-storage/tree/master/opencog/persist/json) for full documentation
91
92## Architecture
93
94The visualizer consists of three main components:
95
961. **index.html**: Main HTML structure and layout
972. **styles.css**: Comprehensive styling with modern CSS features
983. **visualizer.js**: WebSocket management and JSON data processing logic
99
100## Troubleshooting
101
102### Connection Issues
103- Verify the CogServer is running and accessible
104- Check the WebSocket URL format (should be `ws://host:port/`)
105- The visualizer will automatically append `/json` to connect to the JSON endpoint
106- Ensure no firewall is blocking the WebSocket port
107- Check browser console for detailed error messages
108- Try the
109 [../websockets/json-test.html](https://html-preview.github.io/?url=https://github.com/opencog/cogserver/blob/master/examples/websockets/json-test.html)
110 page and check for errors.
111
112### No Data Displayed
113- Confirm the CogServer has JSON endpoint enabled
114- Use the debug console to test JSON commands
115- Check that the AtomSpace contains atoms to display
116
117## Future Enhancements
118
119Potential improvements for future versions:
120- Graph visualization of atom relationships
121- Real-time atom creation/deletion monitoring
122- Atom type distribution charts
123- Search and filter capabilities
124- Export functionality for statistics
125- Multi-server connection support
126
127## License
128
129Part of the OpenCog project. See the main project license for details.
7Nothing is left here.
examples/visualizer/atomspace-cache.js +0 -811
……@@ -1,811 +0,0 @@
1// AtomSpace Cache - Central storage for all atoms being visualized
2// This maintains a single source of truth for all layout modes
3// Handles all WebSocket communications with the CogServer
4
5class AtomSpaceCache extends EventTarget {
6 constructor() {
7 super();
8 // Map of atom key to atom object
9 this.atoms = new Map();
10 // Map of atom key to parent atom keys (for hierarchy tracking)
11 this.parents = new Map();
12 // Map of atom key to child atom keys
13 this.children = new Map();
14 // Set of root atom keys (atoms with no parents)
15 this.roots = new Set();
16
17 // Reverse index: Map of atom key to Set of atom keys that reference it
18 // This tracks which Links contain this atom in their outgoing set
19 this.referencedBy = new Map();
20
21 // WebSocket connection
22 this.socket = null;
23 this.serverUrl = null;
24
25 // Queue for sequential processing of ListLink requests
26 this.pendingListLinkRequests = [];
27 this.isProcessingListLink = false;
28 this.operationsCancelled = false;
29
30 // Cache size management
31 this.maxCacheSize = 250; // Default max size
32 this.skippedAtoms = false; // Track if atoms were skipped due to limit
33 }
34
35 // Generate unique key for an atom
36 atomToKey(atom) {
37 if (!atom) return null;
38 if (atom.handle) {
39 return `handle:${atom.handle}`;
40 }
41 if (atom.name !== undefined) {
42 return `${atom.type}:${atom.name}`;
43 }
44 if (atom.outgoing) {
45 const outgoingKeys = atom.outgoing.map(o => this.atomToKey(o)).join(',');
46 return `${atom.type}:[${outgoingKeys}]`;
47 }
48 return `${atom.type}:${JSON.stringify(atom)}`;
49 }
50
51 // Set the maximum cache size
52 setMaxCacheSize(size) {
53 const oldSize = this.maxCacheSize;
54 this.maxCacheSize = Math.max(10, size); // Minimum size of 10
55 this.checkCacheWarning();
56
57 // If size increased and we have space now, resume processing if there are pending requests
58 if (size > oldSize && this.canAddAtom()) {
59 // Resume ListLink processing if it was stopped
60 if (!this.isProcessingListLink && this.pendingListLinkRequests.length > 0) {
61 this.processNextListLink();
62 }
63 }
64 }
65
66 // Check if we can add more atoms without exceeding limit
67 canAddAtom() {
68 return this.atoms.size < this.maxCacheSize;
69 }
70
71 // Check if cache is near full (96% or more)
72 isCacheNearFull() {
73 return this.atoms.size >= (this.maxCacheSize * 0.96);
74 }
75
76 // Check and update cache warning status
77 checkCacheWarning() {
78 const nearFull = this.isCacheNearFull();
79 this.dispatchEvent(new CustomEvent('cache-status', {
80 detail: {
81 size: this.atoms.size,
82 maxSize: this.maxCacheSize,
83 nearFull: nearFull,
84 skippedAtoms: this.skippedAtoms
85 }
86 }));
87 }
88
89 // Add an atom to the cache
90 addAtom(atom, parentAtom = null) {
91 if (!atom) return null;
92
93 const atomKey = this.atomToKey(atom);
94 const isNewAtom = !this.atoms.has(atomKey);
95
96 // Store the atom if not already present and we have space
97 if (isNewAtom) {
98 // Check cache limit
99 if (!this.canAddAtom()) {
100 this.skippedAtoms = true;
101 return null; // Can't add due to cache limit
102 }
103 this.atoms.set(atomKey, atom);
104 this.parents.set(atomKey, new Set());
105 this.children.set(atomKey, new Set());
106 this.referencedBy.set(atomKey, new Set());
107 this.checkCacheWarning(); // Update warning status
108 }
109
110 // Update parent-child relationships
111 if (parentAtom) {
112 const parentKey = this.atomToKey(parentAtom);
113 if (parentKey) {
114 // Add parent relationship
115 this.parents.get(atomKey).add(parentKey);
116 // Add child relationship
117 if (!this.children.has(parentKey)) {
118 this.children.set(parentKey, new Set());
119 }
120 this.children.get(parentKey).add(atomKey);
121 // Remove from roots if it has a parent
122 this.roots.delete(atomKey);
123 }
124 } else {
125 // Add to roots if no parent
126 if (this.parents.get(atomKey).size === 0) {
127 this.roots.add(atomKey);
128 }
129 }
130
131 // Process outgoing links
132 if (atom.outgoing && atom.outgoing.length > 0) {
133 atom.outgoing.forEach(child => {
134 if (typeof child === 'object' && child !== null) {
135 // Recursively add the child atom first
136 this.addAtom(child, null); // No parent relationship for structural children
137
138 // Update reverse index - do this AFTER adding child and only for new atoms
139 // This tracks which atoms are referenced by this atom
140 if (isNewAtom) {
141 const childKey = this.atomToKey(child);
142 // Add this atom to the child's referencedBy set
143 if (!this.referencedBy.has(childKey)) {
144 this.referencedBy.set(childKey, new Set());
145 }
146 this.referencedBy.get(childKey).add(atomKey);
147 }
148 }
149 });
150 }
151
152 return atomKey;
153 }
154
155 // Remove an atom and optionally its descendants
156 removeAtom(atom, removeDescendants = false) {
157 const atomKey = this.atomToKey(atom);
158 if (!this.atoms.has(atomKey)) return 0;
159
160 let removedCount = 0;
161
162 // First, find and remove all Links that contain this atom
163 // Use reverse index for O(1) lookup instead of scanning all atoms
164 const linksToRemove = new Set(this.referencedBy.get(atomKey) || []);
165
166 // Recursively remove all dependent Links
167 // This recursion ensures that Links containing removed Links are also removed
168 linksToRemove.forEach(linkKey => {
169 const linkAtom = this.atoms.get(linkKey);
170 if (linkAtom) {
171 removedCount += this.removeAtom(linkAtom, false);
172 }
173 });
174
175 // If removing descendants, remove all children first
176 if (removeDescendants) {
177 const children = Array.from(this.children.get(atomKey) || []);
178 children.forEach(childKey => {
179 const childAtom = this.atoms.get(childKey);
180 if (childAtom) {
181 removedCount += this.removeAtom(childAtom, true);
182 }
183 });
184 }
185
186 // Only proceed if the atom still exists (might have been removed as a dependent)
187 if (!this.atoms.has(atomKey)) {
188 return removedCount;
189 }
190
191 // Clean up reverse index entries for this atom's outgoing links
192 const atomToRemove = this.atoms.get(atomKey);
193 if (atomToRemove && atomToRemove.outgoing && atomToRemove.outgoing.length > 0) {
194 atomToRemove.outgoing.forEach(child => {
195 if (typeof child === 'object' && child !== null) {
196 const childKey = this.atomToKey(child);
197 const referencedBySet = this.referencedBy.get(childKey);
198 if (referencedBySet) {
199 referencedBySet.delete(atomKey);
200 // Clean up empty sets
201 if (referencedBySet.size === 0) {
202 this.referencedBy.delete(childKey);
203 }
204 }
205 }
206 });
207 }
208
209 // Remove from parent's children
210 const parents = this.parents.get(atomKey);
211 if (parents) {
212 parents.forEach(parentKey => {
213 const parentChildren = this.children.get(parentKey);
214 if (parentChildren) {
215 parentChildren.delete(atomKey);
216 }
217 });
218 }
219
220 // Remove from children's parents
221 const children = this.children.get(atomKey);
222 if (children) {
223 children.forEach(childKey => {
224 const childParents = this.parents.get(childKey);
225 if (childParents) {
226 childParents.delete(atomKey);
227 // If child has no more parents, make it a root
228 if (childParents.size === 0 && this.atoms.has(childKey)) {
229 this.roots.add(childKey);
230 }
231 }
232 });
233 }
234
235 // Remove the atom from all maps
236 this.atoms.delete(atomKey);
237 this.parents.delete(atomKey);
238 this.children.delete(atomKey);
239 this.roots.delete(atomKey);
240 this.referencedBy.delete(atomKey);
241 removedCount++;
242
243 return removedCount;
244 }
245
246 // Get all atoms
247 getAllAtoms() {
248 return Array.from(this.atoms.values());
249 }
250
251 // Get root atoms
252 getRootAtoms() {
253 return Array.from(this.roots).map(key => this.atoms.get(key)).filter(a => a);
254 }
255
256 // Get atom by key
257 getAtom(atomKey) {
258 return this.atoms.get(atomKey);
259 }
260
261 // Check if atom exists
262 hasAtom(atom) {
263 const atomKey = this.atomToKey(atom);
264 return this.atoms.has(atomKey);
265 }
266
267 // Get parents of an atom
268 getParents(atom) {
269 const atomKey = this.atomToKey(atom);
270 const parentKeys = this.parents.get(atomKey);
271 if (!parentKeys) return [];
272 return Array.from(parentKeys).map(key => this.atoms.get(key)).filter(a => a);
273 }
274
275 // Get children of an atom
276 getChildren(atom) {
277 const atomKey = this.atomToKey(atom);
278 const childKeys = this.children.get(atomKey);
279 if (!childKeys) return [];
280 return Array.from(childKeys).map(key => this.atoms.get(key)).filter(a => a);
281 }
282
283 // Clear all atoms
284 // Remove an atom and its parent chain from the cache
285 removeAtomAndParents(atom) {
286 if (!atom) return 0;
287
288 const atomsToRemove = new Set();
289 const atomKey = this.atomToKey(atom);
290
291 // Recursive function to collect atom and all its parents
292 const collectAtomsToRemove = (currentKey) => {
293 if (!currentKey || atomsToRemove.has(currentKey)) {
294 return;
295 }
296
297 atomsToRemove.add(currentKey);
298
299 // Get all parent atoms of this atom
300 const parentKeys = this.parents.get(currentKey);
301 if (parentKeys) {
302 parentKeys.forEach(parentKey => {
303 collectAtomsToRemove(parentKey);
304 });
305 }
306 };
307
308 // Start collection from the given atom
309 collectAtomsToRemove(atomKey);
310
311 // Recursively find ALL dependent Links using reverse index
312 // We need to keep finding links until no new ones are found
313 let previousSize = 0;
314 while (previousSize !== atomsToRemove.size) {
315 previousSize = atomsToRemove.size;
316 const newDependentLinks = new Set();
317
318 // For each atom to be removed, find Links that reference it
319 atomsToRemove.forEach(keyToRemove => {
320 const referencingLinks = this.referencedBy.get(keyToRemove);
321 if (referencingLinks) {
322 referencingLinks.forEach(linkKey => {
323 // Only add if not already marked for removal
324 if (!atomsToRemove.has(linkKey)) {
325 newDependentLinks.add(linkKey);
326 }
327 });
328 }
329 });
330
331 // Add newly found dependent Links to removal set
332 newDependentLinks.forEach(linkKey => {
333 atomsToRemove.add(linkKey);
334 });
335 }
336
337 // Remove all collected atoms
338 atomsToRemove.forEach(key => {
339 // Get the atom before removing
340 const atomToRemove = this.atoms.get(key);
341
342 // Clean up reverse index for this atom's outgoing links
343 if (atomToRemove && atomToRemove.outgoing && atomToRemove.outgoing.length > 0) {
344 atomToRemove.outgoing.forEach(child => {
345 if (typeof child === 'object' && child !== null) {
346 const childKey = this.atomToKey(child);
347 const referencedBySet = this.referencedBy.get(childKey);
348 if (referencedBySet) {
349 referencedBySet.delete(key);
350 // Clean up empty sets
351 if (referencedBySet.size === 0) {
352 this.referencedBy.delete(childKey);
353 }
354 }
355 }
356 });
357 }
358
359 // Remove from atoms map
360 this.atoms.delete(key);
361
362 // Clean up parent relationships
363 const parents = this.parents.get(key);
364 if (parents) {
365 parents.forEach(parentKey => {
366 const childrenSet = this.children.get(parentKey);
367 if (childrenSet) {
368 childrenSet.delete(key);
369 }
370 });
371 }
372 this.parents.delete(key);
373
374 // Clean up children relationships
375 const children = this.children.get(key);
376 if (children) {
377 children.forEach(childKey => {
378 const parentsSet = this.parents.get(childKey);
379 if (parentsSet) {
380 parentsSet.delete(key);
381 // If child has no more parents, it becomes a root
382 if (parentsSet.size === 0 && this.atoms.has(childKey)) {
383 this.roots.add(childKey);
384 }
385 }
386 });
387 }
388 this.children.delete(key);
389
390 // Remove from roots if present
391 this.roots.delete(key);
392
393 // Remove from referencedBy map
394 this.referencedBy.delete(key);
395 });
396
397 // Check if we're below the warning threshold after removal
398 if (this.skippedAtoms && !this.isCacheNearFull()) {
399 this.skippedAtoms = false;
400 }
401
402 // Notify that cache has been updated
403 this.dispatchEvent(new CustomEvent('update', {
404 detail: {
405 type: 'atoms-removed',
406 count: atomsToRemove.size
407 }
408 }));
409
410 this.checkCacheWarning(); // Update cache status
411 return atomsToRemove.size;
412 }
413
414 clear() {
415 this.atoms.clear();
416 this.parents.clear();
417 this.children.clear();
418 this.roots.clear();
419 this.referencedBy.clear();
420 this.skippedAtoms = false;
421 this.checkCacheWarning();
422 }
423
424 // Get atoms for graph view (only nodes and EdgeLink relationships)
425 getAtomsForGraphView() {
426 // Use Map to track nodes efficiently (key -> node)
427 const nodeMap = new Map();
428 const edges = [];
429
430 this.atoms.forEach(atom => {
431 // Check if this is an EdgeLink/EvaluationLink pattern
432 if ((atom.type === 'EdgeLink' || atom.type === 'EvaluationLink') &&
433 atom.outgoing && atom.outgoing.length === 2) {
434
435 const predicate = atom.outgoing[0];
436 const list = atom.outgoing[1];
437
438 // Validate the pattern AND check if the ListLink is still in cache
439 const listKey = this.atomToKey(list);
440 if (predicate && (predicate.type === 'PredicateNode' || predicate.type === 'BondNode') &&
441 list && list.type === 'ListLink' &&
442 list.outgoing && list.outgoing.length === 2 &&
443 this.atoms.has(listKey)) { // Make sure ListLink still exists in cache
444
445 const fromNode = list.outgoing[0];
446 const toNode = list.outgoing[1];
447 const fromKey = this.atomToKey(fromNode);
448 const toKey = this.atomToKey(toNode);
449
450 // Check nodes exist and are still in cache
451 if (fromNode && fromNode.type && fromNode.type.endsWith('Node') &&
452 toNode && toNode.type && toNode.type.endsWith('Node') &&
453 this.atoms.has(fromKey) && this.atoms.has(toKey)) {
454
455 // Add edge info
456 edges.push({
457 from: fromNode,
458 to: toNode,
459 label: predicate.name || 'edge',
460 type: atom.type
461 });
462
463 // Add nodes to map (O(1) operation)
464 nodeMap.set(fromKey, fromNode);
465 nodeMap.set(toKey, toNode);
466 }
467 }
468 } else if (atom.type && atom.type.endsWith('Node') &&
469 atom.type !== 'BondNode' && atom.type !== 'PredicateNode') {
470 // Add standalone nodes (O(1) operation)
471 const atomKey = this.atomToKey(atom);
472 nodeMap.set(atomKey, atom);
473 }
474 });
475
476 // Convert map values to array for return
477 const nodes = Array.from(nodeMap.values());
478 return { nodes, edges };
479 }
480
481 // Get statistics
482 getStats() {
483 return {
484 totalAtoms: this.atoms.size,
485 rootAtoms: this.roots.size,
486 atomTypes: this.getAtomTypeDistribution()
487 };
488 }
489
490 // Get distribution of atom types
491 getAtomTypeDistribution() {
492 const distribution = {};
493 this.atoms.forEach(atom => {
494 distribution[atom.type] = (distribution[atom.type] || 0) + 1;
495 });
496 return distribution;
497 }
498
499 // ============= WebSocket Communication Methods =============
500
501 // Connect to CogServer
502 connect(serverUrl) {
503 if (this.socket && this.socket.readyState === WebSocket.OPEN) {
504 this.socket.close();
505 }
506
507 this.serverUrl = serverUrl;
508 this.socket = new WebSocket(serverUrl);
509
510 this.socket.onopen = () => {
511 console.log('Connected to CogServer');
512 this.dispatchEvent(new CustomEvent('connection', {
513 detail: { status: 'connected', message: 'Connected to server' }
514 }));
515 };
516
517 this.socket.onclose = () => {
518 console.log('Disconnected from CogServer');
519 this.dispatchEvent(new CustomEvent('connection', {
520 detail: { status: 'disconnected', message: 'Disconnected from server' }
521 }));
522 };
523
524 this.socket.onerror = (error) => {
525 console.error('WebSocket error:', error);
526 this.dispatchEvent(new CustomEvent('connection', {
527 detail: { status: 'error', message: 'Connection error' }
528 }));
529 };
530
531 this.socket.onmessage = (event) => {
532 this.handleWebSocketMessage(event);
533 };
534 }
535
536 // Handle incoming WebSocket messages
537 handleWebSocketMessage(event) {
538 try {
539 const rawResponse = JSON.parse(event.data);
540 let response;
541
542 // Handle MCP content format (the only format cogserver uses)
543 if (rawResponse.content && Array.isArray(rawResponse.content)) {
544 // Check for error first
545 if (rawResponse.isError === true) {
546 const errorText = rawResponse.content[0]?.text || 'Unknown error';
547 console.error('Server returned error:', errorText);
548 this.dispatchEvent(new CustomEvent('error', {
549 detail: { message: 'Server error: ' + errorText }
550 }));
551 return;
552 }
553
554 const contentItem = rawResponse.content[0];
555 if (contentItem && contentItem.type === 'text' && contentItem.text) {
556 // Parse the nested JSON string
557 try {
558 response = JSON.parse(contentItem.text);
559 } catch {
560 response = contentItem.text;
561 }
562 }
563 } else {
564 console.warn('Unexpected response format (not MCP):', rawResponse);
565 return;
566 }
567
568 // Process the response based on what we're waiting for
569 if (this.isProcessingListLink && response && Array.isArray(response)) {
570 this.processListLinkResponse(response);
571 } else if (this.pendingRegularRequest && response && Array.isArray(response)) {
572 // Process regular atom response
573 this.processRegularAtomResponse(response);
574 } else {
575 console.log('Received non-array response:', response);
576 }
577 } catch (error) {
578 console.error('Error parsing WebSocket message:', error, 'Raw data:', event.data);
579 }
580 }
581
582 // Fetch incoming set for an atom
583 fetchIncomingSet(atom) {
584 // Check if operations were cancelled
585 if (this.operationsCancelled) {
586 return;
587 }
588
589 if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {
590 this.dispatchEvent(new CustomEvent('error', {
591 detail: { message: 'Not connected to server' }
592 }));
593 return;
594 }
595
596 // Construct the command
597 let atomSpec;
598 if (atom.name !== undefined) {
599 const escapedName = JSON.stringify(atom.name);
600 atomSpec = `{"type": "${atom.type}", "name": ${escapedName}}`;
601 } else {
602 atomSpec = JSON.stringify(atom);
603 }
604
605 const command = `AtomSpace.getIncoming(${atomSpec})`;
606 console.log('Getting incoming set:', command);
607
608 // For ListLinks, queue for sequential processing
609 if (atom.type === 'ListLink') {
610 this.pendingListLinkRequests.push({
611 atom: atom,
612 command: command
613 });
614
615 if (!this.isProcessingListLink) {
616 this.processNextListLink();
617 }
618 } else {
619 // For regular atoms, track the request and send
620 this.pendingRegularRequest = {
621 atom: atom,
622 command: command
623 };
624 this.socket.send(command + '\n');
625 }
626 }
627
628 // Process ListLink requests sequentially
629 processNextListLink() {
630 // Check if operations were cancelled
631 if (this.operationsCancelled) {
632 this.pendingListLinkRequests = [];
633 this.isProcessingListLink = false;
634 return;
635 }
636
637 if (this.pendingListLinkRequests.length === 0) {
638 this.isProcessingListLink = false;
639 this.dispatchEvent(new CustomEvent('update', {
640 detail: { type: 'listlinks-complete' }
641 }));
642 return;
643 }
644
645 this.isProcessingListLink = true;
646 const request = this.pendingListLinkRequests.shift();
647 this.currentListLinkRequest = request;
648 this.socket.send(request.command + '\n');
649 }
650
651 // Process ListLink response
652 processListLinkResponse(response) {
653 if (!this.currentListLinkRequest) return;
654
655 // Check if operations were cancelled
656 if (this.operationsCancelled) {
657 this.currentListLinkRequest = null;
658 this.pendingListLinkRequests = [];
659 this.isProcessingListLink = false;
660 return;
661 }
662
663 const targetAtom = this.currentListLinkRequest.atom;
664
665 // Add all atoms from the response
666 // These atoms are in the incoming set of targetAtom, meaning they contain/reference it
667 // So THEY are parents of targetAtom, not the other way around
668 let addedCount = 0;
669 let skippedCount = 0;
670 response.forEach(atom => {
671 if (atom && typeof atom === 'object') {
672 // First add the atom to cache
673 const result = this.addAtom(atom, null);
674 if (result !== null) {
675 addedCount++;
676 // Then mark it as a parent of the target atom
677 const atomKey = this.atomToKey(atom);
678 const targetKey = this.atomToKey(targetAtom);
679 if (!this.parents.has(targetKey)) {
680 this.parents.set(targetKey, new Set());
681 }
682 this.parents.get(targetKey).add(atomKey);
683 if (!this.children.has(atomKey)) {
684 this.children.set(atomKey, new Set());
685 }
686 this.children.get(atomKey).add(targetKey);
687 } else {
688 skippedCount++;
689 }
690 }
691 });
692
693 // Only dispatch update if not cancelled AND atoms were actually added
694 if (!this.operationsCancelled && addedCount > 0) {
695 // Notify that cache has been updated
696 this.dispatchEvent(new CustomEvent('update', {
697 detail: {
698 type: 'incoming-set',
699 parent: targetAtom,
700 atoms: response,
701 addedCount: addedCount,
702 skippedCount: skippedCount
703 }
704 }));
705 }
706
707 // Process next ListLink
708 this.currentListLinkRequest = null;
709 setTimeout(() => this.processNextListLink(), 10);
710 }
711
712 // Process regular atom response
713 processRegularAtomResponse(response) {
714 if (!this.pendingRegularRequest) return;
715
716 const targetAtom = this.pendingRegularRequest.atom;
717
718 // Add all atoms from the response
719 // These atoms are in the incoming set of targetAtom, meaning they contain/reference it
720 // So THEY are parents of targetAtom, not the other way around
721 let addedCount = 0;
722 let skippedCount = 0;
723 response.forEach(atom => {
724 if (atom && typeof atom === 'object') {
725 // First add the atom to cache
726 const result = this.addAtom(atom, null);
727 if (result !== null) {
728 addedCount++;
729 // Then mark it as a parent of the target atom
730 const atomKey = this.atomToKey(atom);
731 const targetKey = this.atomToKey(targetAtom);
732 if (!this.parents.has(targetKey)) {
733 this.parents.set(targetKey, new Set());
734 }
735 this.parents.get(targetKey).add(atomKey);
736 if (!this.children.has(atomKey)) {
737 this.children.set(atomKey, new Set());
738 }
739 this.children.get(atomKey).add(targetKey);
740 } else {
741 skippedCount++;
742 }
743 }
744 });
745
746 // Clear the pending request BEFORE dispatching event
747 // This ensures hasPendingOperations() returns correct value in event handlers
748 this.pendingRegularRequest = null;
749
750 // Only dispatch update if atoms were actually added
751 if (addedCount > 0) {
752 // Notify that cache has been updated
753 this.dispatchEvent(new CustomEvent('update', {
754 detail: {
755 type: 'incoming-set',
756 parent: targetAtom,
757 atoms: response,
758 addedCount: addedCount,
759 skippedCount: skippedCount
760 }
761 }));
762 }
763
764 // If there are no more pending operations, dispatch completion event
765 if (!this.hasPendingOperations()) {
766 this.dispatchEvent(new CustomEvent('update', {
767 detail: { type: 'operations-complete' }
768 }));
769 }
770 }
771
772 // Cancel all pending operations
773 cancelAllOperations() {
774 // Set cancellation flag
775 this.operationsCancelled = true;
776
777 // Clear ListLink queue
778 this.pendingListLinkRequests = [];
779 this.isProcessingListLink = false;
780 this.currentListLinkRequest = null;
781
782 // Clear regular request
783 this.pendingRegularRequest = null;
784
785 // Notify that operations were cancelled
786 this.dispatchEvent(new CustomEvent('update', {
787 detail: { type: 'operations-cancelled' }
788 }));
789 }
790
791 // Reset cancellation flag (call when starting new operation)
792 resetCancellation() {
793 this.operationsCancelled = false;
794 }
795
796 // Check if there are pending operations
797 hasPendingOperations() {
798 return this.isProcessingListLink || this.pendingListLinkRequests.length > 0 || this.pendingRegularRequest !== null;
799 }
800
801 // Disconnect from server
802 disconnect() {
803 if (this.socket) {
804 this.socket.close();
805 this.socket = null;
806 }
807 }
808}
809
810// Create global instance
811const atomSpaceCache = new AtomSpaceCache();
examples/visualizer/graph-view.js +0 -380
……@@ -1,380 +0,0 @@
1// Graph View - Special handling for Edge and Evaluation links as labeled edges
2
3// Check if an atom is an Edge or Evaluation link with the special pattern
4function isGraphEdgePattern(atom) {
5 if (!atom || !atom.outgoing || atom.outgoing.length !== 2) {
6 return false;
7 }
8
9 // Must be EdgeLink or EvaluationLink
10 if (atom.type !== 'EdgeLink' && atom.type !== 'EvaluationLink') {
11 return false;
12 }
13
14 // First outgoing must be a PredicateNode or BondNode
15 const predicate = atom.outgoing[0];
16 if (typeof predicate !== 'object' || (predicate.type !== 'PredicateNode' && predicate.type !== 'BondNode')) {
17 return false;
18 }
19
20 // Second outgoing must be a List with exactly 2 nodes
21 const list = atom.outgoing[1];
22 if (typeof list !== 'object' || list.type !== 'ListLink') {
23 return false;
24 }
25
26 if (!list.outgoing || list.outgoing.length !== 2) {
27 return false;
28 }
29
30 // Both items in the list should be nodes (any type ending in "Node")
31 const from = list.outgoing[0];
32 const to = list.outgoing[1];
33
34 if (typeof from !== 'object' || !from.type.endsWith('Node')) {
35 return false;
36 }
37 if (typeof to !== 'object' || !to.type.endsWith('Node')) {
38 return false;
39 }
40
41 return true;
42}
43
44// Extract edge information from the special pattern
45function extractGraphEdgeInfo(atom) {
46 const predicate = atom.outgoing[0];
47 const list = atom.outgoing[1];
48 const fromNode = list.outgoing[0];
49 const toNode = list.outgoing[1];
50
51 return {
52 edgeLabel: predicate.name || 'edge',
53 fromNode: fromNode,
54 toNode: toNode,
55 edgeType: atom.type // EdgeLink or EvaluationLink
56 };
57}
58
59// Add a single vertex to the graph (reusing existing if already present)
60function addVertexToGraph(atom) {
61 const atomKey = atomToKey(atom);
62
63 // Check if vertex already exists
64 if (atomVertexMap.has(atomKey)) {
65 return atomVertexMap.get(atomKey);
66 }
67
68 // Create new vertex
69 const vertexId = vertexIdCounter++;
70 const vertexLabel = createCompactLabel(atom);
71 const vertexColor = getVertexColor(atom.type);
72
73 vertices.add({
74 id: vertexId,
75 label: vertexLabel,
76 color: vertexColor,
77 atom: atom,
78 title: atomToSExpression(atom),
79 shape: 'ellipse' // Use ellipse for graph mode vertices
80 });
81
82 atomVertexMap.set(atomKey, vertexId);
83 return vertexId;
84}
85
86// Initialize graph view using atom cache
87function initializeGraphViewWithAtomCache() {
88 // Clear existing vertices and edges
89 vertices.clear();
90 edges.clear();
91 atomVertexMap.clear();
92 vertexIdCounter = 1;
93
94 // Get atoms from cache for graph view
95 const graphData = atomSpaceCache.getAtomsForGraphView();
96
97 // Add all vertices first (from AtomSpace nodes)
98 graphData.nodes.forEach(atom => {
99 const atomKey = atomSpaceCache.atomToKey(atom);
100 if (!atomVertexMap.has(atomKey)) {
101 const vertexId = vertexIdCounter++;
102 const vertexLabel = createCompactLabel(atom);
103 const vertexColor = getVertexColor(atom.type);
104
105 vertices.add({
106 id: vertexId,
107 label: vertexLabel,
108 color: vertexColor,
109 atom: atom,
110 title: atomToSExpression(atom)
111 });
112
113 atomVertexMap.set(atomKey, vertexId);
114 }
115 });
116
117 // Add all edges
118 graphData.edges.forEach(edge => {
119 const fromKey = atomSpaceCache.atomToKey(edge.from);
120 const toKey = atomSpaceCache.atomToKey(edge.to);
121 const fromId = atomVertexMap.get(fromKey);
122 const toId = atomVertexMap.get(toKey);
123
124 if (fromId && toId) {
125 edges.add({
126 from: fromId,
127 to: toId,
128 label: edge.label,
129 arrows: {
130 to: {
131 enabled: true,
132 scaleFactor: 0.5
133 }
134 },
135 font: {
136 size: 12,
137 align: 'middle'
138 },
139 color: {
140 color: getEdgeColor(),
141 highlight: getEdgeColor(),
142 hover: getEdgeColor()
143 }
144 });
145 }
146 });
147}
148
149// Batching mechanism for graph updates
150let pendingGraphUpdate = null;
151let pendingListLinkFetches = 0;
152let lastUpdateTime = 0;
153const MIN_UPDATE_INTERVAL = 100; // Minimum ms between graph updates
154const AGGRESSIVE_THROTTLE_INTERVAL = 500; // Much longer delay when cache is full
155let isProcessingBatch = false; // Track if we're in a batch of updates
156let batchUpdateTimer = null; // Timer for batch completion
157
158// Handle cache updates for graph view - performs double fetch for ListLinks
159function handleGraphViewCacheUpdate(parent, atoms, eventDetail) {
160 // Check if operation was cancelled (from tree-view.js)
161 if (typeof operationCancelled !== 'undefined' && operationCancelled) {
162 pendingListLinkFetches = 0;
163 if (pendingGraphUpdate) {
164 clearTimeout(pendingGraphUpdate);
165 pendingGraphUpdate = null;
166 }
167 if (batchUpdateTimer) {
168 clearTimeout(batchUpdateTimer);
169 batchUpdateTimer = null;
170 }
171 isProcessingBatch = false;
172 return;
173 }
174
175 // Always clear any existing batch timer when we get a new update
176 if (batchUpdateTimer) {
177 clearTimeout(batchUpdateTimer);
178 batchUpdateTimer = null;
179 }
180
181 // Check cache status
182 const cacheNearFull = atomSpaceCache.isCacheNearFull();
183 const hasPendingOps = atomSpaceCache.hasPendingOperations();
184
185 // Check if we should be in batch mode
186 // This happens when:
187 // 1. Cache is full and atoms are being skipped, OR
188 // 2. We're already in batch mode, OR
189 // 3. There are any pending operations (downloads in progress)
190 const shouldBatch = (eventDetail && eventDetail.skippedCount > 0 && cacheNearFull) ||
191 isProcessingBatch ||
192 hasPendingOps;
193
194 if (shouldBatch) {
195 // Enter or stay in batch mode
196 isProcessingBatch = true;
197
198 // Clear any immediate update timer
199 if (pendingGraphUpdate) {
200 clearTimeout(pendingGraphUpdate);
201 pendingGraphUpdate = null;
202 }
203
204 // Set a new batch timer - this will only fire after no updates for this period
205 // Use longer delay (1 second) to ensure all downloads complete
206 const batchInterval = 1000;
207
208 batchUpdateTimer = setTimeout(() => {
209 // Only NOW do we exit batch mode and redraw
210 isProcessingBatch = false;
211 batchUpdateTimer = null;
212
213 // Do the final redraw
214 if (typeof operationCancelled === 'undefined' || !operationCancelled) {
215 initializeGraphViewWithAtomCache();
216 lastUpdateTime = Date.now();
217 }
218
219 // End operation if no more pending work
220 if (typeof endOperation === 'function' &&
221 pendingListLinkFetches === 0 &&
222 !atomSpaceCache.hasPendingOperations()) {
223 endOperation();
224 }
225 }, batchInterval);
226
227 // Skip all processing below when in batch mode
228 return;
229 }
230
231 // Not in batch mode - check if we need to process immediately or defer
232
233 // If we have a pending batch timer but are not in batch mode anymore,
234 // this is likely a straggler update after cache size increase
235 // Clear any lingering timers and process immediately
236 if (batchUpdateTimer) {
237 clearTimeout(batchUpdateTimer);
238 batchUpdateTimer = null;
239 }
240
241 // Check if we need to fetch incoming sets for ListLinks
242 const listLinksToFetch = [];
243
244 atoms.forEach(atom => {
245 // Check if it's a ListLink with exactly 2 AtomSpace Nodes
246 if (atom.type === 'ListLink' && atom.outgoing && atom.outgoing.length === 2) {
247 // Check if both outgoing atoms are AtomSpace Nodes
248 const firstIsNode = atom.outgoing[0] && typeof atom.outgoing[0] === 'object' &&
249 atom.outgoing[0].type && atom.outgoing[0].type.endsWith('Node');
250 const secondIsNode = atom.outgoing[1] && typeof atom.outgoing[1] === 'object' &&
251 atom.outgoing[1].type && atom.outgoing[1].type.endsWith('Node');
252
253 if (firstIsNode && secondIsNode) {
254 listLinksToFetch.push(atom);
255 }
256 }
257 });
258
259 // Track how many ListLink fetches we're about to start
260 if (listLinksToFetch.length > 0) {
261 pendingListLinkFetches += listLinksToFetch.length;
262
263 // Fetch incoming sets for qualifying ListLinks (second-level fetch)
264 listLinksToFetch.forEach(listLink => {
265 atomSpaceCache.fetchIncomingSet(listLink);
266 });
267 }
268
269 // If this was a ListLink response, decrement the counter
270 if (parent && parent.type === 'ListLink') {
271 pendingListLinkFetches = Math.max(0, pendingListLinkFetches - 1);
272 }
273
274 // Clear any existing update timer
275 if (pendingGraphUpdate) {
276 clearTimeout(pendingGraphUpdate);
277 pendingGraphUpdate = null;
278 }
279
280 // If we're waiting for ListLink fetches, defer the update
281 if (pendingListLinkFetches > 0) {
282 // Set a timeout as a fallback in case some fetches fail
283 pendingGraphUpdate = setTimeout(() => {
284 // Check again for cancellation before rebuilding
285 if (typeof operationCancelled === 'undefined' || !operationCancelled) {
286 pendingListLinkFetches = 0; // Reset counter
287 initializeGraphViewWithAtomCache();
288 }
289 // End operation when timeout completes
290 if (typeof endOperation === 'function') {
291 endOperation();
292 }
293 pendingGraphUpdate = null;
294 }, 1000); // 1 second timeout
295 } else {
296 // No pending fetches, update immediately
297 if (typeof operationCancelled === 'undefined' || !operationCancelled) {
298 initializeGraphViewWithAtomCache();
299 }
300 // End operation if this is the initial fetch with no ListLinks to follow
301 // The cache's operations-complete event doesn't know about our double-fetch logic
302 if (typeof endOperation === 'function' &&
303 pendingListLinkFetches === 0 &&
304 !atomSpaceCache.hasPendingOperations()) {
305 endOperation();
306 }
307 }
308}
309
310// NOTE: Old atom processing functions removed - now handled by atomspace-cache
311
312// Get graph view layout options
313function getGraphViewOptions() {
314 return {
315 nodes: { // vis-network expects 'nodes' key
316 shape: 'ellipse',
317 font: {
318 size: 14,
319 face: 'monospace'
320 },
321 margin: 8,
322 widthConstraint: {
323 maximum: 150,
324 minimum: 40
325 }
326 },
327 edges: {
328 arrows: {
329 to: {
330 enabled: true,
331 scaleFactor: 0.5
332 }
333 },
334 smooth: {
335 enabled: true,
336 type: 'dynamic'
337 },
338 font: {
339 size: 12,
340 align: 'middle',
341 color: getEdgeColor(),
342 background: getComputedStyle(document.body).getPropertyValue('--surface').trim() || '#FFFFFF'
343 },
344 color: {
345 color: getEdgeColor(),
346 highlight: getEdgeColor(),
347 hover: getEdgeColor()
348 }
349 },
350 physics: {
351 enabled: true,
352 solver: 'forceAtlas2Based',
353 forceAtlas2Based: {
354 gravitationalConstant: -50,
355 centralGravity: 0.01,
356 springLength: 150,
357 springConstant: 0.08,
358 damping: 0.9, // Increased damping to reduce oscillation
359 avoidOverlap: 0.5
360 },
361 stabilization: {
362 enabled: true,
363 iterations: 1000, // Increased iterations for better initial stabilization
364 updateInterval: 50,
365 fit: true
366 },
367 maxVelocity: 50, // Limit maximum velocity to prevent runaway movement
368 minVelocity: 0.75, // Stop physics when movement is minimal
369 timestep: 0.5 // Smaller timesteps for more stable simulation
370 },
371 layout: {
372 randomSeed: 2,
373 improvedLayout: true
374 },
375 interaction: {
376 hover: true,
377 tooltipDelay: 200
378 }
379 };
380}
examples/visualizer/landing.js +0 -952
……@@ -1,952 +0,0 @@
1// AtomSpace Visualizer JavaScript
2
3let socket = null;
4let serverURL = '';
5let isConnected = false;
6let atomData = {};
7let checkedAtoms = new Map(); // Track checked atoms
8
9// DOM elements
10let serverInput, connectBtn;
11let connectionStatus, serverDisplay;
12let atomspaceStats, errorPanel, errorMessage;
13let atomCount, nodeCount, linkCount, typeCount;
14let refreshBtn, lastUpdate;
15let debugCommand, sendCommand, debugResponse;
16let atomTypesBreakdown, typesList;
17let atomListingPanel, atomListingTitle, atomListingContent, closeAtomListing, visualizeCheckedBtn;
18
19// Initialize when DOM is loaded
20document.addEventListener('DOMContentLoaded', init);
21
22function init() {
23 // Get DOM elements
24 serverInput = document.getElementById('server-url');
25 connectBtn = document.getElementById('connect-btn');
26
27 connectionStatus = document.getElementById('connection-status');
28 serverDisplay = document.getElementById('server-display');
29
30 atomspaceStats = document.getElementById('atomspace-stats');
31 errorPanel = document.getElementById('error-panel');
32 errorMessage = document.getElementById('error-message');
33
34 atomCount = document.getElementById('atom-count');
35 nodeCount = document.getElementById('node-count');
36 linkCount = document.getElementById('link-count');
37 typeCount = document.getElementById('type-count');
38
39 refreshBtn = document.getElementById('refresh-stats');
40 lastUpdate = document.getElementById('last-update');
41
42 debugCommand = document.getElementById('debug-command');
43 sendCommand = document.getElementById('send-command');
44 debugResponse = document.getElementById('debug-response');
45
46 atomTypesBreakdown = document.getElementById('atom-types-breakdown');
47 typesList = document.getElementById('types-list');
48
49 atomListingPanel = document.getElementById('atom-listing-panel');
50 atomListingTitle = document.getElementById('atom-listing-title');
51 atomListingContent = document.getElementById('atom-listing-content');
52 closeAtomListing = document.getElementById('close-atom-listing');
53 visualizeCheckedBtn = document.getElementById('visualize-checked');
54
55 // Set up event listeners
56 connectBtn.addEventListener('click', toggleConnection);
57 closeAtomListing.addEventListener('click', hideAtomListing);
58 visualizeCheckedBtn.addEventListener('click', visualizeCheckedAtoms);
59 refreshBtn.addEventListener('click', fetchAtomSpaceStats);
60 sendCommand.addEventListener('click', sendDebugCommand);
61 debugCommand.addEventListener('keypress', (e) => {
62 if (e.key === 'Enter') sendDebugCommand();
63 });
64
65 // Set default values - use current hostname/IP
66 const defaultUrl = `ws://${window.location.hostname}:18080/`;
67 serverInput.value = serverInput.value || defaultUrl;
68
69 // Check for autoconnect URL parameter
70 const urlParams = new URLSearchParams(window.location.search);
71 const autoconnect = urlParams.get('autoconnect');
72 if (autoconnect === 'true') {
73 // Auto-connect after a short delay to ensure UI is ready
74 setTimeout(() => {
75 console.log('Auto-connecting based on URL parameter...');
76 connect();
77 }, 500);
78 }
79}
80
81function toggleConnection() {
82 if (isConnected) {
83 disconnect();
84 } else {
85 connect();
86 }
87}
88
89function connect() {
90 const baseURL = serverInput.value.trim();
91 const endpoint = 'json'; // Always use JSON endpoint
92
93 if (!baseURL) {
94 showError('Please enter a CogServer URL');
95 return;
96 }
97
98 // Ensure URL ends with /
99 const normalizedURL = baseURL.endsWith('/') ? baseURL : baseURL + '/';
100 serverURL = normalizedURL + endpoint;
101
102 // Save the base URL to localStorage so other pages can use it
103 localStorage.setItem('cogserver-url', normalizedURL);
104
105 console.log('Connecting to:', serverURL);
106
107 try {
108 socket = new WebSocket(serverURL);
109 socket.addEventListener('open', onConnect);
110 socket.addEventListener('close', onDisconnect);
111 socket.addEventListener('message', onMessage);
112 socket.addEventListener('error', onError);
113
114 // Update UI to connecting state
115 connectBtn.disabled = true;
116 connectionStatus.textContent = 'Connecting...';
117 connectionStatus.className = 'status-value';
118 hideError();
119 } catch (err) {
120 showError('Failed to create WebSocket connection: ' + err.message);
121 }
122}
123
124function disconnect() {
125 if (socket) {
126 console.log('Disconnecting from:', serverURL);
127 socket.close();
128 }
129}
130
131function onConnect() {
132 console.log('Connected to:', serverURL);
133 isConnected = true;
134
135 // Update UI
136 connectBtn.disabled = false;
137 connectBtn.innerHTML = '<span class="btn-icon">🔌</span><span class="btn-text">Disconnect</span>';
138 connectBtn.classList.add('connected');
139
140 connectionStatus.textContent = 'Connected';
141 connectionStatus.className = 'status-value connected';
142
143 serverDisplay.textContent = serverInput.value + 'json';
144
145 // Enable controls
146 serverInput.disabled = true;
147 refreshBtn.disabled = false;
148 debugCommand.disabled = false;
149 sendCommand.disabled = false;
150
151 // Show stats panel
152 atomspaceStats.classList.remove('hidden');
153
154 // First test with a simple version command
155 console.log('Testing connection with version command...');
156 sendMessage('AtomSpace.version()');
157
158 // Then fetch initial stats after a short delay
159 setTimeout(() => {
160 fetchAtomSpaceStats();
161 }, 1000);
162}
163
164function onDisconnect() {
165 console.log('Disconnected from:', serverURL);
166 isConnected = false;
167
168 // Update UI
169 connectBtn.disabled = false;
170 connectBtn.innerHTML = '<span class="btn-icon">⚡</span><span class="btn-text">Connect</span>';
171 connectBtn.classList.remove('connected');
172
173 connectionStatus.textContent = 'Disconnected';
174 connectionStatus.className = 'status-value disconnected';
175
176 serverDisplay.textContent = 'Not connected';
177
178 // Disable controls
179 serverInput.disabled = false;
180 refreshBtn.disabled = true;
181 debugCommand.disabled = true;
182 sendCommand.disabled = true;
183
184 // Hide stats panel, types breakdown, and atom listing
185 atomspaceStats.classList.add('hidden');
186 atomTypesBreakdown.classList.add('hidden');
187 atomListingPanel.classList.add('hidden');
188
189 socket = null;
190}
191
192function onMessage(event) {
193 console.log('Received message:', event.data);
194
195 try {
196 // Parse JSON response
197 const data = JSON.parse(event.data);
198 console.log('Parsed JSON:', data);
199
200 // Display in debug console
201 debugResponse.textContent = JSON.stringify(data, null, 2);
202
203 // Check if this is an MCP content-based response
204 if (data.content && Array.isArray(data.content)) {
205 // Check for error first
206 if (data.isError === true) {
207 const errorText = data.content[0]?.text || 'Unknown error';
208 console.error('Server returned error:', errorText);
209 showError('Server error: ' + errorText);
210 return;
211 }
212
213 // Parse the content text (may be JSON string)
214 const contentText = data.content[0]?.text || '';
215 let result;
216 try {
217 result = JSON.parse(contentText);
218 } catch {
219 result = contentText;
220 }
221
222 // Handle different result types
223 if (typeof result === 'string') {
224 // Check if this is a null value response for getValueAtKey
225 if (atomData.pendingValueRequest && result === 'null') {
226 console.log('Received null value at key');
227 const { display } = atomData.pendingValueRequest;
228 displayKeyValue(null, display);
229 atomData.pendingValueRequest = null;
230 } else {
231 // Version response or other string results
232 console.log('Received string result:', result);
233 // If it looks like a version number, just log it
234 if (result.match(/^\d+\.\d+\.\d+/)) {
235 console.log('CogServer JSON API version:', result);
236 }
237 }
238 } else if (Array.isArray(result)) {
239 // Check if this is a keys response
240 if (atomData.pendingKeysRequest) {
241 console.log('Received keys response:', result);
242 const { display, atom } = atomData.pendingKeysRequest;
243 displayAtomKeys(result, display, atom);
244 atomData.pendingKeysRequest = null;
245 return; // Don't process further
246 } else if (result.length === 0) {
247 // Empty array - could be empty atom list
248 console.log('Received empty array');
249 processAtomList(result);
250 } else if (typeof result[0] === 'string') {
251 // Array of strings = types list
252 console.log('Received types list with', result.length, 'types');
253 processTypeList(result);
254 } else if (typeof result[0] === 'object') {
255 // Array of objects = atoms list
256 console.log('Received atoms list with', result.length, 'atoms');
257 processAtomList(result);
258 }
259 } else if (typeof result === 'boolean') {
260 // Response from makeAtom or other boolean operations
261 console.log('Received boolean result:', result);
262 } else if (typeof result === 'object' && result !== null) {
263 // Check if this is a value response for getValueAtKey
264 if (atomData.pendingValueRequest) {
265 console.log('Received value at key:', result);
266 const { display } = atomData.pendingValueRequest;
267 displayKeyValue(result, display);
268 atomData.pendingValueRequest = null;
269 } else {
270 // Check if it's the reportCounts response (object with type names as keys)
271 const keys = Object.keys(result);
272 // Handle both empty objects (empty atomspace) and populated count objects
273 if (keys.length === 0 || keys.every(key => typeof result[key] === 'number')) {
274 console.log('Received atom counts:', result);
275 processAtomCounts(result);
276 } else {
277 // Could be a single atom or other object
278 console.log('Received object result:', result);
279 }
280 }
281 }
282 } else {
283 // Unknown response format
284 console.warn('Unknown response format:', data);
285 }
286 } catch (err) {
287 // Failed to parse JSON
288 console.error('Failed to parse JSON:', err);
289 console.error('Raw message was:', event.data);
290 debugResponse.textContent = 'Error parsing JSON: ' + err.message + '\n\nRaw response:\n' + event.data;
291 showError('Invalid response from server');
292 }
293}
294
295function onError(event) {
296 console.error('WebSocket error:', event);
297 showError('Connection error: Unable to connect to ' + serverURL);
298}
299
300function processAtomList(atoms) {
301 // Handle empty or invalid atom list
302 if (!atoms || !Array.isArray(atoms)) {
303 console.log('Invalid or empty atom list received');
304 atoms = [];
305 }
306
307 console.log('Processing atom list:', atoms.length, 'atoms');
308
309 // Check if this is for displaying atoms of a specific type
310 if (atomData.pendingTypeDisplay) {
311 const type = atomData.pendingTypeDisplay;
312 atomData.pendingTypeDisplay = null;
313
314 // Update the listing panel with the atoms
315 if (atoms.length === 0) {
316 atomListingContent.innerHTML = '<div class="no-atoms">No atoms of this type found</div>';
317 } else {
318 // Create a container for the clickable atoms
319 const container = document.createElement('div');
320 container.className = 'atom-sexpr-list';
321
322 // Store these atoms temporarily for s-expression conversion
323 const tempAtoms = atomData.atoms;
324 atomData.atoms = atoms;
325
326 // Create clickable atom elements
327 atoms.forEach(atom => {
328 const atomElement = createClickableAtom(atom);
329 container.appendChild(atomElement);
330 });
331
332 // Restore the original atoms
333 atomData.atoms = tempAtoms;
334
335 atomListingContent.innerHTML = '';
336 atomListingContent.appendChild(container);
337 }
338
339 console.log(`Displayed ${atoms.length} atoms of type ${type}`);
340 return;
341 }
342
343 // This is the old full atom list processing - keeping for backward compatibility
344 // but it shouldn't be called anymore since we're using reportCounts()
345 atomData.atoms = atoms;
346 atomData.totalCount = atoms.length;
347
348 // Count nodes and links, and track types
349 let nodes = 0;
350 let links = 0;
351 const types = new Set();
352 const typeCountMap = new Map();
353
354 atoms.forEach(atom => {
355 if (atom.type) {
356 types.add(atom.type);
357 // Count atoms by type
358 const currentCount = typeCountMap.get(atom.type) || 0;
359 typeCountMap.set(atom.type, currentCount + 1);
360 }
361
362 // Check if it's a node or link
363 // Links have an 'outgoing' array with references to other atoms
364 // Nodes typically don't have outgoing connections or have an empty array
365 if (atom.outgoing && Array.isArray(atom.outgoing) && atom.outgoing.length > 0) {
366 links++;
367 } else {
368 nodes++;
369 }
370 });
371
372 console.log(`Stats - Total: ${atoms.length}, Nodes: ${nodes}, Links: ${links}, Types: ${types.size}`);
373
374 // Update UI even if empty
375 updateStats({
376 total: atoms.length,
377 nodes: nodes,
378 links: links,
379 types: types.size
380 });
381
382 // Update atom types breakdown
383 updateAtomTypesBreakdown(typeCountMap);
384}
385
386function processTypeList(types) {
387 if (!types || !Array.isArray(types)) {
388 console.log('Invalid or empty types list received');
389 types = [];
390 }
391
392 console.log('Processing type list:', types.length, 'types');
393
394 atomData.types = types;
395 typeCount.textContent = types.length.toLocaleString();
396}
397
398function processAtomCounts(counts) {
399 console.log('Processing atom counts from reportCounts()');
400
401 // Calculate totals
402 let totalAtoms = 0;
403 let nodes = 0;
404 let links = 0;
405 const typeCountMap = new Map();
406
407 for (const [typeName, count] of Object.entries(counts)) {
408 totalAtoms += count;
409 typeCountMap.set(typeName, count);
410
411 // Determine if it's a Node or Link based on the type name
412 if (typeName.endsWith('Node')) {
413 nodes += count;
414 } else if (typeName.endsWith('Link')) {
415 links += count;
416 } else {
417 // For types that don't follow the naming convention,
418 // we'll need to check the type hierarchy
419 // For now, assume it's a node if not explicitly a link
420 nodes += count;
421 }
422 }
423
424 console.log(`Stats from reportCounts - Total: ${totalAtoms}, Nodes: ${nodes}, Links: ${links}, Types: ${typeCountMap.size}`);
425
426 // Update UI
427 updateStats({
428 total: totalAtoms,
429 nodes: nodes,
430 links: links,
431 types: typeCountMap.size
432 });
433
434 // Update atom types breakdown
435 updateAtomTypesBreakdown(typeCountMap);
436
437 // Store the counts for later use
438 atomData.counts = counts;
439 atomData.totalCount = totalAtoms;
440}
441
442function updateStats(stats) {
443 atomCount.textContent = stats.total.toLocaleString();
444 nodeCount.textContent = stats.nodes.toLocaleString();
445 linkCount.textContent = stats.links.toLocaleString();
446 typeCount.textContent = stats.types.toLocaleString();
447
448 // Update timestamp
449 const now = new Date();
450 lastUpdate.textContent = `Last updated: ${now.toLocaleTimeString()}`;
451
452 // Add pulse animation to updated values
453 [atomCount, nodeCount, linkCount, typeCount].forEach(elem => {
454 elem.parentElement.classList.add('pulse');
455 setTimeout(() => elem.parentElement.classList.remove('pulse'), 2000);
456 });
457}
458
459function updateAtomTypesBreakdown(typeCountMap) {
460 // Clear existing content
461 typesList.innerHTML = '';
462
463 if (typeCountMap.size === 0) {
464 // Hide the breakdown panel if no types
465 atomTypesBreakdown.classList.add('hidden');
466 return;
467 }
468
469 // Show the breakdown panel
470 atomTypesBreakdown.classList.remove('hidden');
471
472 // Sort types by count (descending) and then by name
473 const sortedTypes = Array.from(typeCountMap.entries())
474 .filter(([type, count]) => count > 0) // Only include types with count > 0
475 .sort((a, b) => {
476 if (b[1] !== a[1]) {
477 return b[1] - a[1]; // Sort by count descending
478 }
479 return a[0].localeCompare(b[0]); // Then by name ascending
480 });
481
482 // Create type items as buttons
483 sortedTypes.forEach(([type, count]) => {
484 const typeButton = document.createElement('button');
485 typeButton.className = 'type-item-button';
486 typeButton.setAttribute('data-type', type);
487 typeButton.addEventListener('click', () => showAtomsOfType(type));
488
489 const typeName = document.createElement('span');
490 typeName.className = 'type-name';
491 typeName.textContent = type;
492
493 const typeCount = document.createElement('span');
494 typeCount.className = 'type-count';
495 typeCount.textContent = count.toLocaleString();
496
497 typeButton.appendChild(typeName);
498 typeButton.appendChild(typeCount);
499 typesList.appendChild(typeButton);
500 });
501
502 console.log(`Displayed ${sortedTypes.length} atom types`);
503}
504
505function fetchAtomSpaceStats() {
506 if (!isConnected || !socket) {
507 showError('Not connected to CogServer');
508 return;
509 }
510
511 console.log('Fetching AtomSpace stats...');
512
513 // Use the new reportCounts() command for efficient stats gathering
514 const command = 'AtomSpace.reportCounts()';
515 console.log('Sending command:', command);
516 sendMessage(command);
517
518 // Also fetch types after a short delay for additional type information
519 setTimeout(() => {
520 const typesCommand = 'AtomSpace.getSubTypes("TopType", true)';
521 console.log('Sending types command:', typesCommand);
522 sendMessage(typesCommand);
523 }, 500);
524}
525
526function sendDebugCommand() {
527 const command = debugCommand.value.trim();
528 if (!command) return;
529
530 sendMessage(command);
531 debugCommand.value = '';
532}
533
534function sendMessage(message) {
535 if (!isConnected || !socket || socket.readyState !== WebSocket.OPEN) {
536 showError('Not connected to CogServer');
537 return;
538 }
539
540 console.log('Sending message:', message);
541 socket.send(message);
542}
543
544function showError(message) {
545 errorMessage.textContent = message;
546 errorPanel.classList.remove('hidden');
547
548 // Auto-hide after 5 seconds
549 setTimeout(hideError, 5000);
550}
551
552function hideError() {
553 errorPanel.classList.add('hidden');
554}
555
556function createClickableAtom(atom) {
557 // Create a container for the atom and its keys
558 const atomContainer = document.createElement('div');
559 atomContainer.className = 'atom-container';
560
561 // Create graph visualization checkbox
562 const graphCheckbox = document.createElement('input');
563 graphCheckbox.type = 'checkbox';
564 graphCheckbox.className = 'graph-checkbox';
565 graphCheckbox.title = 'Select for graph visualization';
566
567 // Generate unique ID for tracking
568 const checkboxId = `checkbox-${atom.type}-${atom.name || 'link'}-${Math.random().toString(36).substr(2, 9)}`;
569 graphCheckbox.id = checkboxId;
570
571 graphCheckbox.addEventListener('change', (e) => {
572 if (e.target.checked) {
573 checkedAtoms.set(checkboxId, atom);
574 } else {
575 checkedAtoms.delete(checkboxId);
576 }
577 });
578
579 // Create the clickable atom element
580 const atomElement = document.createElement('div');
581 atomElement.className = 'atom-clickable';
582
583 // Generate unique ID for this atom display
584 const atomId = `atom-${atom.type}-${atom.name || 'link'}-${Math.random().toString(36).substr(2, 9)}`;
585 atomElement.setAttribute('data-atom-id', atomId);
586
587 // Set the s-expression as the content
588 const sexpr = atomToSExpression(atom);
589 atomElement.textContent = sexpr;
590
591 // Create keys display area (initially hidden)
592 const keysDisplay = document.createElement('div');
593 keysDisplay.className = 'atom-keys-display hidden';
594 keysDisplay.id = `keys-${atomId}`;
595
596 // Add click handler
597 atomElement.addEventListener('click', () => {
598 handleAtomClick(atom, keysDisplay, atomElement);
599 });
600
601 // Add all elements to container
602 atomContainer.appendChild(graphCheckbox);
603 atomContainer.appendChild(atomElement);
604 atomContainer.appendChild(keysDisplay);
605
606 return atomContainer;
607}
608
609function handleAtomClick(atom, keysDisplay, atomElement) {
610 // Toggle keys display
611 if (!keysDisplay.classList.contains('hidden')) {
612 keysDisplay.classList.add('hidden');
613 atomElement.classList.remove('expanded');
614 return;
615 }
616
617 // Show loading state
618 keysDisplay.innerHTML = '<span class="loading-keys">Loading...</span>';
619 keysDisplay.classList.remove('hidden');
620 atomElement.classList.add('expanded');
621
622 // Construct the command to get keys
623 // For nodes with names, create the atom specification
624 // For links, we need to include the full outgoing set
625 let atomSpec;
626 if (atom.name !== undefined) {
627 // It's a node - escape the name properly for JSON
628 const escapedName = JSON.stringify(atom.name);
629 atomSpec = `{"type": "${atom.type}", "name": ${escapedName}}`;
630 } else {
631 // It's a link or complex atom - use full JSON serialization
632 atomSpec = JSON.stringify(atom);
633 }
634
635 const command = `AtomSpace.getKeys(${atomSpec})`;
636 console.log('Getting keys for atom:', command);
637
638 // Store callback for when we receive the response
639 atomData.pendingKeysRequest = {
640 atom: atom,
641 display: keysDisplay,
642 element: atomElement
643 };
644
645 // Send the command
646 if (socket && socket.readyState === WebSocket.OPEN) {
647 socket.send(command);
648 } else {
649 keysDisplay.innerHTML = '<span class="error">Not connected to server</span>';
650 }
651}
652
653function displayAtomKeys(keys, keysDisplay, parentAtom) {
654 if (!keys || keys.length === 0) {
655 keysDisplay.innerHTML = '<span class="no-keys">No keys</span>';
656 } else {
657 // Clear the display
658 keysDisplay.innerHTML = '';
659
660 // Create container for all keys
661 const keysContainer = document.createElement('div');
662 keysContainer.className = 'keys-container';
663
664 keys.forEach((key, index) => {
665 // Create a container for each key and its value
666 const keyRow = document.createElement('div');
667 keyRow.className = index === 0 ? 'key-row-first' : 'key-row';
668
669 // Create a clickable key element
670 const keyElement = document.createElement('span');
671 keyElement.className = 'key-clickable';
672 keyElement.textContent = atomToSExpression(key);
673
674 // Create value display area (initially hidden)
675 const valueDisplay = document.createElement('span');
676 valueDisplay.className = 'key-value-display hidden';
677
678 // Add click handler to fetch value at this key
679 keyElement.addEventListener('click', () => {
680 handleKeyClick(parentAtom, key, valueDisplay, keyElement);
681 });
682
683 keyRow.appendChild(keyElement);
684 keyRow.appendChild(valueDisplay);
685 keysContainer.appendChild(keyRow);
686 });
687
688 keysDisplay.appendChild(keysContainer);
689 }
690}
691
692function handleKeyClick(atom, key, valueDisplay, keyElement) {
693 // Toggle value display
694 if (!valueDisplay.classList.contains('hidden')) {
695 valueDisplay.classList.add('hidden');
696 keyElement.classList.remove('expanded');
697 return;
698 }
699
700 // Show loading state
701 valueDisplay.innerHTML = '<span class="loading-value">...</span>';
702 valueDisplay.classList.remove('hidden');
703 keyElement.classList.add('expanded');
704
705 // Construct the getValueAtKey command
706 const atomSpec = atom.name !== undefined ?
707 `{"type": "${atom.type}", "name": ${JSON.stringify(atom.name)}` :
708 JSON.stringify(atom).slice(0, -1); // Remove closing brace to add key
709
710 const keySpec = key.name !== undefined ?
711 `{"type": "${key.type}", "name": ${JSON.stringify(key.name)}}` :
712 JSON.stringify(key);
713
714 const command = `AtomSpace.getValueAtKey(${atomSpec}, "key": ${keySpec}})`;
715 console.log('Getting value at key:', command);
716
717 // Store callback for when we receive the response
718 atomData.pendingValueRequest = {
719 atom: atom,
720 key: key,
721 display: valueDisplay,
722 element: keyElement
723 };
724
725 // Send the command
726 if (socket && socket.readyState === WebSocket.OPEN) {
727 socket.send(command);
728 } else {
729 valueDisplay.innerHTML = '<span class="error">Not connected to server</span>';
730 }
731}
732
733function displayKeyValue(value, valueDisplay) {
734 if (!value || value === null) {
735 valueDisplay.innerHTML = '<span class="no-value">No value</span>';
736 } else {
737 // Display the value in s-expression format inline
738 const valueContent = document.createElement('span');
739 valueContent.className = 'value-content-inline';
740 valueContent.textContent = '→ ' + valueToSExpression(value);
741 valueDisplay.innerHTML = '';
742 valueDisplay.appendChild(valueContent);
743 }
744}
745
746function valueToSExpression(value) {
747 // Convert a value object to s-expression format
748 if (!value || !value.type) {
749 return String(value);
750 }
751
752 // Get the value type
753 const valueType = value.type;
754
755 // Get the actual values
756 let values = value.value;
757
758 // Handle different value types
759 if (valueType === 'StringValue' && Array.isArray(values)) {
760 // StringValue: quote each string
761 const quotedValues = values.map(v => JSON.stringify(v));
762 return `(${valueType} ${quotedValues.join(' ')})`;
763 } else if (Array.isArray(values)) {
764 // FloatValue, LinkValue, etc.: just space-separated values
765 return `(${valueType} ${values.join(' ')})`;
766 } else if (valueType === 'SimpleTruthValue' && values && Array.isArray(values.value)) {
767 // SimpleTruthValue has nested structure
768 return `(${valueType} ${values.value.join(' ')})`;
769 } else {
770 // Fallback: try to stringify the value part
771 const valueStr = typeof values === 'object' ? JSON.stringify(values) : String(values);
772 return `(${valueType} ${valueStr})`;
773 }
774}
775
776function atomToSExpression(atom, indent = 0) {
777 // Convert an atom to s-expression format with proper indentation
778 // Remove "Node" and "Link" suffixes from type for s-expression format
779 const typeBase = atom.type.replace(/Node$/, '').replace(/Link$/, '');
780 const indentStr = ' '.repeat(indent);
781
782 if (!atom.outgoing || atom.outgoing.length === 0) {
783 // It's a node
784 if (atom.name !== undefined) {
785 // Quote the name if it contains spaces or special characters
786 const quotedName = JSON.stringify(atom.name);
787 return `(${typeBase} ${quotedName})`;
788 } else {
789 return `(${typeBase})`;
790 }
791 } else {
792 // It's a link - recursively show its outgoing connections with indentation
793 const nextIndent = indent + 1;
794 const nextIndentStr = ' '.repeat(nextIndent);
795
796 const outgoingStrs = atom.outgoing.map(outgoingItem => {
797 // The outgoing item could be:
798 // 1. An atom object directly (nested atom)
799 // 2. A reference/handle to another atom
800 // 3. A UUID/ID string
801
802 let result;
803 if (typeof outgoingItem === 'object' && outgoingItem !== null) {
804 // It's already an atom object, convert it directly
805 if (outgoingItem.type) {
806 result = atomToSExpression(outgoingItem, nextIndent);
807 }
808 }
809
810 if (!result) {
811 // Try to find the referenced atom in our data
812 const referencedAtom = atomData.atoms?.find(a => {
813 // Check various possible handle/id formats
814 if (typeof outgoingItem === 'string' || typeof outgoingItem === 'number') {
815 return (a.handle === outgoingItem) ||
816 (a.uuid === outgoingItem) ||
817 (a.id === outgoingItem) ||
818 (a.name === outgoingItem); // Sometimes might reference by name
819 }
820 return false;
821 });
822
823 if (referencedAtom) {
824 result = atomToSExpression(referencedAtom, nextIndent);
825 } else {
826 // Fallback for unresolved references
827 result = `<unresolved:${JSON.stringify(outgoingItem)}>`;
828 }
829 }
830
831 return nextIndentStr + result;
832 });
833
834 // Return the link with its nested s-expressions on separate lines
835 if (outgoingStrs.length > 0) {
836 return `(${typeBase}\n${outgoingStrs.join('\n')})`;
837 } else {
838 return `(${typeBase})`;
839 }
840 }
841}
842
843function showAtomsOfType(type) {
844 console.log(`Showing atoms of type: ${type}`);
845
846 // Clear all checked atoms when switching panes
847 checkedAtoms.clear();
848
849 // Get the count from reportCounts if available
850 const count = atomData.counts?.[type] || 0;
851
852 // Check if the count exceeds safe limits
853 const isNode = type.endsWith('Node');
854 const isLink = type.endsWith('Link');
855 const maxNodes = 10000;
856 const maxLinks = 5000;
857
858 if ((isNode && count > maxNodes) || (isLink && count > maxLinks)) {
859 const maxAllowed = isNode ? maxNodes : maxLinks;
860 const atomType = isNode ? 'nodes' : 'links';
861 showError(`Cannot download ${count} ${atomType}. Maximum allowed is ${maxAllowed}. ` +
862 `Downloading this many atoms would take too long and overwhelm the browser.`);
863 return;
864 }
865
866 // Update title with count
867 atomListingTitle.textContent = `${type} Atoms (${count})`;
868
869 // Clear content
870 atomListingContent.innerHTML = '';
871
872 // Show loading message
873 atomListingContent.innerHTML = '<div class="loading">Loading atoms...</div>';
874
875 // Show the panel
876 atomListingPanel.classList.remove('hidden');
877
878 // Fetch atoms of this specific type
879 const command = `AtomSpace.getAtoms("${type}", false)`;
880 console.log('Fetching atoms of type:', type);
881
882 // Store the type we're fetching for later processing
883 atomData.pendingTypeDisplay = type;
884
885 // Send the command
886 if (socket && socket.readyState === WebSocket.OPEN) {
887 socket.send(command);
888 } else {
889 atomListingContent.innerHTML = '<div class="error">Not connected to server</div>';
890 }
891}
892
893function hideAtomListing() {
894 atomListingPanel.classList.add('hidden');
895 atomListingContent.innerHTML = '';
896 // Clear all checked atoms when closing the panel
897 checkedAtoms.clear();
898}
899
900function openStatsPage() {
901 // Get the current server URL from the input field
902 const serverUrl = serverInput.value.trim();
903
904 if (!serverUrl) {
905 showError('Please enter a CogServer URL first');
906 return;
907 }
908
909 // Convert ws:// to http:// and remove trailing slash if present
910 let statsUrl = serverUrl.replace(/^ws:\/\//, 'http://').replace(/^wss:\/\//, 'https://');
911
912 // Remove trailing slash
913 if (statsUrl.endsWith('/')) {
914 statsUrl = statsUrl.slice(0, -1);
915 }
916
917 // Add /stats path
918 statsUrl = statsUrl + '/stats';
919
920 console.log('Opening stats page:', statsUrl);
921
922 // Open in new tab
923 window.open(statsUrl, '_blank');
924}
925
926function openGraphVisualization(atom) {
927 // Encode the atom data in the URL
928 const atomData = encodeURIComponent(JSON.stringify(atom));
929 const graphUrl = `tree-view.html?atom=${atomData}`;
930
931 // Open in new tab
932 window.open(graphUrl, '_blank');
933}
934
935function visualizeCheckedAtoms() {
936 if (checkedAtoms.size === 0) {
937 showError('No atoms selected. Please check some atoms first.');
938 return;
939 }
940
941 // Convert Map values to array
942 const atoms = Array.from(checkedAtoms.values());
943
944 // Encode the atoms data in the URL
945 const atomsData = encodeURIComponent(JSON.stringify(atoms));
946 const graphUrl = `tree-view.html?atoms=${atomsData}`;
947
948 // Open in new tab
949 window.open(graphUrl, '_blank');
950
951 // Keep checkboxes checked - don't clear them
952}
examples/visualizer/styles.css +0 -766
……@@ -1,766 +0,0 @@
1/* AtomSpace Visualizer Stylesheet */
2
3/* Light mode colors (default fallback) */
4:root {
5 --primary-color: #2196F3;
6 --primary-dark: #1976D2;
7 --primary-light: #BBDEFB;
8 --success-color: #4CAF50;
9 --error-color: #F44336;
10 --warning-color: #FF9800;
11 --background: #F5F5F5;
12 --surface: #FFFFFF;
13 --text-primary: #212121;
14 --text-secondary: #757575;
15 --border-color: #E0E0E0;
16 --shadow-sm: 0 2px 4px rgba(0,0,0,0.1);
17 --shadow-md: 0 4px 8px rgba(0,0,0,0.15);
18 --shadow-lg: 0 8px 16px rgba(0,0,0,0.2);
19 --input-bg: #FFFFFF;
20 --code-bg: #F5F5F5;
21 --stat-gradient-start: #BBDEFB;
22 --stat-gradient-end: #FFFFFF;
23 --hover-bg: rgba(33, 150, 243, 0.1);
24 --hover-expanded: rgba(33, 150, 243, 0.15);
25 --border-radius: 8px;
26 --transition: all 0.3s ease;
27}
28
29/* Dark mode colors */
30[data-theme="dark"] {
31 --primary-color: #42A5F5;
32 --primary-dark: #1E88E5;
33 --primary-light: #1E3A5F;
34 --success-color: #66BB6A;
35 --error-color: #EF5350;
36 --warning-color: #FFA726;
37 --background: #0D1117;
38 --surface: #161B22;
39 --text-primary: #E6EDF3;
40 --text-secondary: #8B949E;
41 --border-color: #30363D;
42 --shadow-sm: 0 2px 4px rgba(0,0,0,0.4);
43 --shadow-md: 0 4px 8px rgba(0,0,0,0.5);
44 --shadow-lg: 0 8px 16px rgba(0,0,0,0.6);
45 --input-bg: #0D1117;
46 --code-bg: #0D1117;
47 --stat-gradient-start: #1E3A5F;
48 --stat-gradient-end: #161B22;
49 --hover-bg: rgba(66, 165, 245, 0.15);
50 --hover-expanded: rgba(66, 165, 245, 0.25);
51}
52
53* {
54 margin: 0;
55 padding: 0;
56 box-sizing: border-box;
57}
58
59body {
60 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
61 background: var(--background);
62 color: var(--text-primary);
63 line-height: 1.6;
64}
65
66.container {
67 max-width: 1200px;
68 margin: 0 auto;
69 padding: 20px;
70}
71
72/* Header */
73header {
74 text-align: center;
75 padding: 40px 0;
76 background: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
77 color: white;
78 border-radius: var(--border-radius);
79 margin-bottom: 30px;
80 box-shadow: var(--shadow-md);
81}
82
83header h1 {
84 font-size: 2.5rem;
85 font-weight: 300;
86 margin-bottom: 10px;
87 letter-spacing: -1px;
88}
89
90.subtitle {
91 font-size: 1.1rem;
92 opacity: 0.95;
93}
94
95/* Panels */
96section {
97 background: var(--surface);
98 border-radius: var(--border-radius);
99 padding: 25px;
100 margin-bottom: 20px;
101 box-shadow: var(--shadow-sm);
102 transition: var(--transition);
103}
104
105section:hover {
106 box-shadow: var(--shadow-md);
107}
108
109section h2 {
110 font-size: 1.4rem;
111 margin-bottom: 20px;
112 color: var(--text-primary);
113 font-weight: 500;
114 border-bottom: 2px solid var(--primary-light);
115 padding-bottom: 10px;
116}
117
118/* Connection Form */
119.connection-form {
120 display: flex;
121 flex-direction: column;
122 gap: 20px;
123}
124
125.form-group {
126 display: flex;
127 flex-direction: column;
128 gap: 8px;
129}
130
131.form-group label {
132 font-weight: 500;
133 color: var(--text-primary);
134 font-size: 0.95rem;
135}
136
137.form-group input[type="text"],
138.form-group select {
139 padding: 12px;
140 border: 2px solid var(--border-color);
141 border-radius: 6px;
142 font-size: 1rem;
143 transition: var(--transition);
144 background: var(--input-bg);
145 color: var(--text-primary);
146}
147
148.form-group input[type="text"]:focus,
149.form-group select:focus {
150 outline: none;
151 border-color: var(--primary-color);
152 box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.1);
153}
154
155.hint {
156 font-size: 0.85rem;
157 color: var(--text-secondary);
158 font-style: italic;
159}
160
161/* Buttons */
162.button-group {
163 display: flex;
164 gap: 10px;
165 margin-top: 10px;
166}
167
168button {
169 display: inline-flex;
170 align-items: center;
171 gap: 8px;
172 padding: 12px 24px;
173 border: none;
174 border-radius: 6px;
175 font-size: 1rem;
176 font-weight: 500;
177 cursor: pointer;
178 transition: var(--transition);
179}
180
181.btn-primary {
182 background: var(--primary-color);
183 color: white;
184}
185
186.btn-primary:hover:not(:disabled) {
187 background: var(--primary-dark);
188 transform: translateY(-2px);
189 box-shadow: var(--shadow-md);
190}
191
192.btn-primary.connected {
193 background: var(--error-color);
194}
195
196.btn-secondary {
197 background: var(--surface);
198 color: var(--primary-color);
199 border: 2px solid var(--primary-color);
200}
201
202.btn-secondary:hover:not(:disabled) {
203 background: var(--primary-light);
204 transform: translateY(-2px);
205}
206
207button:disabled {
208 opacity: 0.5;
209 cursor: not-allowed;
210}
211
212.btn-icon {
213 font-size: 1.2rem;
214}
215
216/* Status Panel */
217.status-grid {
218 display: grid;
219 grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
220 gap: 20px;
221}
222
223.status-item {
224 display: flex;
225 justify-content: space-between;
226 align-items: center;
227 padding: 12px;
228 background: var(--background);
229 border-radius: 6px;
230}
231
232.status-label {
233 font-weight: 500;
234 color: var(--text-secondary);
235}
236
237.status-value {
238 font-weight: 600;
239 color: var(--text-primary);
240}
241
242.status-value.connected {
243 color: var(--success-color);
244}
245
246.status-value.disconnected {
247 color: var(--error-color);
248}
249
250/* Statistics Panel */
251.stats-grid {
252 display: grid;
253 grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
254 gap: 20px;
255 margin-bottom: 20px;
256}
257
258.stat-card {
259 background: linear-gradient(135deg, var(--stat-gradient-start), var(--stat-gradient-end));
260 padding: 25px;
261 border-radius: var(--border-radius);
262 text-align: center;
263 transition: var(--transition);
264 border: 1px solid var(--border-color);
265}
266
267.stat-card:hover {
268 transform: translateY(-5px);
269 box-shadow: var(--shadow-md);
270}
271
272.stat-card.clickable {
273 cursor: pointer;
274}
275
276.stat-card.clickable:hover {
277 transform: translateY(-5px);
278 box-shadow: var(--shadow-lg);
279 border-color: var(--primary-color);
280}
281
282.stat-value {
283 font-size: 2.5rem;
284 font-weight: 700;
285 color: var(--primary-dark);
286 margin-bottom: 5px;
287}
288
289.stat-label {
290 font-size: 0.95rem;
291 color: var(--text-secondary);
292 text-transform: uppercase;
293 letter-spacing: 1px;
294}
295
296/* Refresh Panel */
297.refresh-panel {
298 display: flex;
299 align-items: center;
300 justify-content: space-between;
301 padding-top: 20px;
302 border-top: 1px solid var(--border-color);
303}
304
305.last-update {
306 font-size: 0.85rem;
307 color: var(--text-secondary);
308}
309
310/* Error Panel */
311.error-panel {
312 background: var(--surface);
313 border-left: 4px solid var(--error-color);
314 border: 1px solid var(--error-color);
315}
316
317.error-content {
318 display: flex;
319 align-items: center;
320 gap: 15px;
321 color: var(--error-color);
322}
323
324.error-icon {
325 font-size: 1.5rem;
326}
327
328/* Atom Types Breakdown Panel */
329.types-breakdown-panel {
330 margin-top: 20px;
331}
332
333.types-list {
334 display: grid;
335 grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
336 gap: 10px;
337 margin-top: 15px;
338}
339
340.type-item-button {
341 display: flex;
342 justify-content: space-between;
343 align-items: center;
344 padding: 10px 15px;
345 background: var(--background);
346 border-radius: 6px;
347 border: 1px solid var(--border-color);
348 transition: var(--transition);
349 cursor: pointer;
350 width: 100%;
351 text-align: left;
352 font-family: inherit;
353 font-size: inherit;
354}
355
356.type-item-button:hover {
357 background: var(--primary-light);
358 border-color: var(--primary-color);
359 transform: translateX(5px);
360 box-shadow: var(--shadow-sm);
361}
362
363.type-item-button:active {
364 transform: translateX(3px);
365}
366
367.type-name {
368 font-weight: 500;
369 color: var(--text-primary);
370 flex: 1;
371 margin-right: 10px;
372 overflow: hidden;
373 text-overflow: ellipsis;
374 white-space: nowrap;
375}
376
377.type-count {
378 font-weight: 700;
379 color: var(--primary-dark);
380 background: var(--surface);
381 padding: 2px 8px;
382 border-radius: 12px;
383 font-size: 0.9rem;
384 min-width: 30px;
385 text-align: center;
386}
387
388/* Atom Listing Panel */
389.atom-listing-panel {
390 margin-top: 20px;
391 max-height: 500px;
392 display: flex;
393 flex-direction: column;
394}
395
396.atom-listing-header {
397 display: flex;
398 justify-content: space-between;
399 align-items: center;
400 padding-bottom: 15px;
401 border-bottom: 2px solid var(--primary-light);
402 margin-bottom: 15px;
403}
404
405.header-buttons {
406 display: flex;
407 gap: 10px;
408 align-items: center;
409}
410
411.atom-listing-content {
412 flex: 1;
413 overflow-y: auto;
414 background: var(--background);
415 border-radius: 6px;
416 padding: 15px;
417 max-height: 400px;
418}
419
420.atom-sexpr-list {
421 font-family: 'Courier New', Consolas, monospace;
422 font-size: 14px;
423 line-height: 1.6;
424 color: var(--text-primary);
425 white-space: pre-wrap;
426 word-wrap: break-word;
427 margin: 0;
428 padding: 10px;
429 background: var(--surface);
430 border: 1px solid var(--border-color);
431 border-radius: 4px;
432}
433
434.no-atoms {
435 text-align: center;
436 color: var(--text-secondary);
437 font-style: italic;
438 padding: 20px;
439}
440
441/* Clickable atom styles */
442.atom-container {
443 margin-bottom: 8px;
444 display: flex;
445 align-items: flex-start;
446}
447
448/* Graph visualization checkbox */
449.graph-checkbox {
450 margin-right: 8px;
451 margin-top: 6px;
452 cursor: pointer;
453 flex-shrink: 0;
454}
455
456.atom-clickable {
457 display: inline-block;
458 cursor: pointer;
459 padding: 4px 8px;
460 border-radius: 4px;
461 transition: all 0.2s ease;
462 font-family: monospace;
463 white-space: pre-wrap;
464 flex-shrink: 0;
465}
466
467.atom-clickable:hover {
468 background-color: var(--hover-bg);
469 color: var(--primary-color);
470}
471
472.atom-clickable.expanded {
473 background-color: var(--hover-expanded);
474 font-weight: bold;
475}
476
477/* Keys display styles */
478.atom-keys-display {
479 display: inline-block;
480 margin-left: 15px;
481 padding-left: 15px;
482 border-left: 3px solid var(--primary-color);
483 vertical-align: top;
484}
485
486.atom-keys-display.hidden {
487 display: none;
488}
489
490.keys-container {
491 display: inline-block;
492}
493
494.key-row-first {
495 display: inline-block;
496 margin-bottom: 4px;
497}
498
499.key-row {
500 display: block;
501 margin-bottom: 4px;
502}
503
504.keys-arrow {
505 color: var(--text-secondary);
506 font-weight: bold;
507 margin-right: 8px;
508}
509
510/* Clickable key styles */
511.key-clickable {
512 cursor: pointer;
513 display: inline-block;
514 padding: 2px 6px;
515 border-radius: 3px;
516 transition: all 0.2s ease;
517 flex-shrink: 0;
518}
519
520.key-clickable:hover {
521 background-color: var(--hover-expanded);
522 color: var(--primary-color);
523}
524
525.key-clickable.expanded {
526 background-color: var(--hover-expanded);
527 font-weight: bold;
528}
529
530/* Value display for keys */
531.key-value-display {
532 display: inline;
533 margin-left: 8px;
534 font-size: 0.9em;
535}
536
537.key-value-display.hidden {
538 display: none;
539}
540
541.value-content-inline {
542 font-family: monospace;
543 color: #28a745;
544 font-weight: 500;
545}
546
547.no-value {
548 color: var(--text-secondary);
549 font-style: italic;
550 font-size: 0.85em;
551}
552
553.loading-value {
554 color: var(--text-secondary);
555 font-style: italic;
556 animation: pulse 1s infinite;
557}
558
559.no-keys {
560 color: var(--text-secondary);
561 font-style: italic;
562 font-size: 0.9em;
563}
564
565.loading-keys {
566 color: var(--text-secondary);
567 font-style: italic;
568 animation: pulse 1s infinite;
569}
570
571/* Debug Panel */
572.debug-panel details {
573 cursor: pointer;
574}
575
576.debug-panel summary {
577 font-weight: 500;
578 padding: 10px;
579 background: var(--background);
580 border-radius: 6px;
581 user-select: none;
582 transition: var(--transition);
583}
584
585.debug-panel summary:hover {
586 background: var(--primary-light);
587}
588
589.debug-content {
590 margin-top: 20px;
591 padding-top: 20px;
592 border-top: 1px solid var(--border-color);
593}
594
595.debug-input {
596 display: flex;
597 gap: 10px;
598 margin-bottom: 20px;
599}
600
601.debug-input input {
602 flex: 1;
603 padding: 10px;
604 border: 2px solid var(--border-color);
605 border-radius: 6px;
606 font-family: 'Courier New', monospace;
607}
608
609.debug-input input:focus {
610 outline: none;
611 border-color: var(--primary-color);
612}
613
614.debug-output label {
615 display: block;
616 font-weight: 500;
617 margin-bottom: 10px;
618 color: var(--text-secondary);
619}
620
621#debug-response {
622 background: var(--code-bg);
623 padding: 15px;
624 border-radius: 6px;
625 font-family: 'Courier New', monospace;
626 font-size: 0.9rem;
627 min-height: 100px;
628 max-height: 300px;
629 overflow-y: auto;
630 white-space: pre-wrap;
631 word-break: break-all;
632 border: 1px solid var(--border-color);
633 color: var(--text-primary);
634}
635
636/* Footer */
637footer {
638 text-align: center;
639 padding: 30px 0;
640 color: var(--text-secondary);
641 font-size: 0.9rem;
642}
643
644footer a {
645 color: var(--primary-color);
646 text-decoration: none;
647 transition: var(--transition);
648}
649
650footer a:hover {
651 text-decoration: underline;
652}
653
654/* Utility Classes */
655.hidden {
656 display: none !important;
657}
658
659.loading {
660 text-align: center;
661 padding: 20px;
662 color: var(--text-secondary);
663 font-style: italic;
664}
665
666.error {
667 text-align: center;
668 padding: 20px;
669 color: var(--error-color);
670}
671
672/* Theme Toggle Button */
673.theme-toggle {
674 position: fixed;
675 top: 20px;
676 right: 20px;
677 width: 50px;
678 height: 50px;
679 border-radius: 50%;
680 background: var(--surface);
681 border: 2px solid var(--border-color);
682 cursor: pointer;
683 display: flex;
684 align-items: center;
685 justify-content: center;
686 font-size: 1.5rem;
687 transition: var(--transition);
688 box-shadow: var(--shadow-md);
689 z-index: 1000;
690}
691
692.theme-toggle:hover {
693 transform: scale(1.1) rotate(15deg);
694 box-shadow: var(--shadow-lg);
695 border-color: var(--primary-color);
696}
697
698.theme-toggle:active {
699 transform: scale(0.95);
700}
701
702/* Animations */
703@keyframes pulse {
704 0% {
705 transform: scale(1);
706 }
707 50% {
708 transform: scale(1.05);
709 }
710 100% {
711 transform: scale(1);
712 }
713}
714
715.pulse {
716 animation: pulse 2s infinite;
717}
718
719/* Responsive Design */
720@media (max-width: 768px) {
721 .theme-toggle {
722 top: 10px;
723 right: 10px;
724 width: 45px;
725 height: 45px;
726 font-size: 1.3rem;
727 }
728
729 header h1 {
730 font-size: 2rem;
731 }
732
733 .stats-grid {
734 grid-template-columns: repeat(2, 1fr);
735 }
736
737 .status-grid {
738 grid-template-columns: 1fr;
739 }
740
741 .types-list {
742 grid-template-columns: 1fr;
743 }
744
745 .atom-listing-content {
746 max-height: 300px;
747 }
748
749 .atom-listing-header {
750 flex-direction: column;
751 gap: 10px;
752 }
753
754 .container {
755 padding: 10px;
756 }
757
758 section {
759 padding: 20px;
760 }
761
762 .refresh-panel {
763 flex-direction: column;
764 gap: 15px;
765 }
766}
examples/visualizer/theme.js +0 -40
……@@ -1,40 +0,0 @@
1// Theme management for AtomSpace Visualizer
2// Shared across all visualizer pages
3
4function initTheme() {
5 // Check URL parameter first, then saved preference, otherwise default to dark
6 const urlParams = new URLSearchParams(window.location.search);
7 const urlTheme = urlParams.get('theme');
8 const savedTheme = localStorage.getItem('theme') || 'dark';
9 const theme = urlTheme || savedTheme;
10 setTheme(theme);
11}
12
13function setTheme(theme) {
14 document.body.setAttribute('data-theme', theme);
15 localStorage.setItem('theme', theme);
16
17 // Update icon
18 const themeIcon = document.getElementById('theme-icon');
19 if (themeIcon) {
20 themeIcon.textContent = theme === 'dark' ? '☀️' : '🌙';
21 }
22}
23
24function toggleTheme() {
25 const currentTheme = document.body.getAttribute('data-theme');
26 const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
27 setTheme(newTheme);
28}
29
30// Set up theme when DOM is ready
31document.addEventListener('DOMContentLoaded', function() {
32 // Initialize theme first
33 initTheme();
34
35 // Then set up the toggle button
36 const themeToggle = document.getElementById('theme-toggle');
37 if (themeToggle) {
38 themeToggle.addEventListener('click', toggleTheme);
39 }
40});
examples/visualizer/tree-view.html +0 -316
……@@ -1,316 +0,0 @@
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>AtomSpace Graph Visualization</title>
7 <link rel="stylesheet" href="styles.css">
8 <script type="text/javascript" src="vis-network/vis-network.min.js"></script>
9 <script src="theme.js"></script>
10 <style>
11 /* Additional CSS variables for tree-view specific elements */
12 :root {
13 --overlay-bg: rgba(255, 255, 255, 0.9);
14 --warning-bg: #FFF3CD;
15 --warning-text: #856404;
16 --warning-border: #FFE69C;
17 --dialog-bg: #FFFFFF;
18 --cancel-btn-bg: #f0f0f0;
19 --cancel-btn-text: #333;
20 }
21
22 [data-theme="dark"] {
23 --overlay-bg: rgba(22, 27, 34, 0.9);
24 --warning-bg: #3D2E00;
25 --warning-text: #FFA726;
26 --warning-border: #6B5300;
27 --dialog-bg: #161B22;
28 --cancel-btn-bg: #21262D;
29 --cancel-btn-text: #E6EDF3;
30 }
31
32 body {
33 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
34 margin: 0;
35 padding: 0;
36 overflow: hidden;
37 background: var(--background);
38 color: var(--text-primary);
39 }
40 #header {
41 background: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
42 color: white;
43 padding: 15px 20px;
44 box-shadow: 0 2px 4px var(--shadow);
45 }
46 #header h1 {
47 margin: 0;
48 font-size: 1.5rem;
49 font-weight: 300;
50 }
51 #controls {
52 background: var(--surface);
53 padding: 10px 20px;
54 border-bottom: 1px solid var(--border-color);
55 display: flex;
56 gap: 10px;
57 align-items: center;
58 }
59 #controls button {
60 padding: 8px 16px;
61 background: var(--primary-color);
62 color: white;
63 border: none;
64 border-radius: 4px;
65 cursor: pointer;
66 font-size: 14px;
67 }
68 #controls button:hover {
69 background: var(--primary-dark);
70 }
71 #controls label {
72 font-size: 14px;
73 color: var(--text-secondary);
74 }
75 #controls input, #controls select {
76 padding: 6px;
77 border: 1px solid var(--border-color);
78 border-radius: 4px;
79 font-size: 14px;
80 background: var(--background) !important;
81 color: var(--text-primary);
82 }
83 #controls input[type="number"] {
84 width: 80px;
85 }
86 /* Number input spinner buttons styling */
87 #controls input[type="number"]::-webkit-inner-spin-button,
88 #controls input[type="number"]::-webkit-outer-spin-button {
89 opacity: 1;
90 cursor: pointer;
91 background-color: var(--background);
92 }
93 /* Ensure spinner arrows are visible in dark mode */
94 [data-theme="dark"] #controls input[type="number"]::-webkit-inner-spin-button,
95 [data-theme="dark"] #controls input[type="number"]::-webkit-outer-spin-button {
96 filter: invert(1);
97 }
98 #controls input[type="number"]:hover,
99 #controls input[type="number"]:focus {
100 border-color: var(--primary-color);
101 outline: none;
102 }
103 #cacheInfo {
104 margin-left: auto;
105 display: flex;
106 gap: 15px;
107 align-items: center;
108 font-size: 14px;
109 }
110 #cacheCount {
111 font-weight: bold;
112 color: var(--primary-color);
113 }
114 #cacheWarning {
115 display: none;
116 position: fixed;
117 top: 0;
118 left: 0;
119 right: 0;
120 background: var(--warning-bg);
121 color: var(--warning-text);
122 padding: 10px 20px;
123 border-bottom: 2px solid var(--warning-border);
124 font-size: 14px;
125 z-index: 500;
126 }
127 #cacheWarning.visible {
128 display: block;
129 }
130 #mynetwork {
131 width: 100%;
132 height: calc(100vh - 120px);
133 border: none;
134 }
135 #mynetwork.with-warning {
136 height: calc(100vh - 160px);
137 margin-top: 40px;
138 }
139 #status {
140 position: absolute;
141 bottom: 20px;
142 left: 20px;
143 background: var(--overlay-bg);
144 padding: 10px 15px;
145 border-radius: 4px;
146 box-shadow: 0 2px 4px var(--shadow);
147 font-size: 14px;
148 color: var(--text-primary);
149 }
150 .loading {
151 color: var(--warning-color);
152 }
153 .connected {
154 color: var(--success-color);
155 }
156 .error {
157 color: var(--error-color);
158 }
159 /* Warning dialog styles */
160 #warningDialog {
161 display: none;
162 position: fixed;
163 top: 50%;
164 left: 50%;
165 transform: translate(-50%, -50%);
166 background: var(--dialog-bg);
167 border-radius: 8px;
168 box-shadow: 0 4px 20px var(--shadow-md);
169 padding: 20px;
170 z-index: 1000;
171 max-width: 400px;
172 border: 1px solid var(--border-color);
173 }
174 #warningDialog h3 {
175 margin-top: 0;
176 color: var(--warning-color);
177 }
178 #warningDialog p {
179 color: var(--text-primary);
180 }
181 #warningDialog .button-group {
182 margin-top: 20px;
183 display: flex;
184 gap: 10px;
185 justify-content: flex-end;
186 }
187 #warningDialog button {
188 padding: 8px 16px;
189 border: none;
190 border-radius: 4px;
191 cursor: pointer;
192 font-size: 14px;
193 }
194 #warningDialog .proceed-btn {
195 background: var(--primary-color);
196 color: white;
197 }
198 #warningDialog .cancel-btn {
199 background: var(--cancel-btn-bg);
200 color: var(--cancel-btn-text);
201 }
202 /* Stop button styles */
203 #stopButton {
204 display: none;
205 position: fixed;
206 top: 50%;
207 left: 50%;
208 transform: translate(-50%, -50%);
209 padding: 12px 24px;
210 background: var(--error-color);
211 color: white;
212 border: none;
213 border-radius: 4px;
214 cursor: pointer;
215 font-size: 16px;
216 z-index: 1001;
217 box-shadow: 0 4px 12px var(--shadow-md);
218 }
219 #stopButton:hover {
220 background: #D32F2F;
221 }
222 /* Overlay for dialogs */
223 #overlay {
224 display: none;
225 position: fixed;
226 top: 0;
227 left: 0;
228 width: 100%;
229 height: 100%;
230 background: rgba(0,0,0,0.5);
231 z-index: 999;
232 }
233 /* Theme Toggle Button */
234 .theme-toggle {
235 position: fixed;
236 top: 20px;
237 right: 20px;
238 width: 50px;
239 height: 50px;
240 border-radius: 50%;
241 background: var(--surface);
242 border: 2px solid var(--border-color);
243 cursor: pointer;
244 display: flex;
245 align-items: center;
246 justify-content: center;
247 font-size: 1.5rem;
248 transition: all 0.3s ease;
249 box-shadow: 0 4px 8px var(--shadow);
250 z-index: 1000;
251 }
252 .theme-toggle:hover {
253 transform: scale(1.1) rotate(15deg);
254 box-shadow: 0 8px 16px var(--shadow-md);
255 border-color: var(--primary-color);
256 }
257 .theme-toggle:active {
258 transform: scale(0.95);
259 }
260 </style>
261</head>
262<body data-theme="dark">
263 <!-- Theme Toggle Button -->
264 <button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark/light mode">
265 <span id="theme-icon">☀️</span>
266 </button>
267
268 <!-- Warning Dialog -->
269 <div id="overlay"></div>
270 <div id="warningDialog">
271 <h3>Large Graph Warning</h3>
272 <p id="warningMessage">The operation will fetch a large number of atoms. This may take some time and could affect performance.</p>
273 <div class="button-group">
274 <button class="cancel-btn" onclick="cancelLargeOperation()">Cancel</button>
275 <button class="proceed-btn" onclick="proceedWithLargeOperation()">Proceed</button>
276 </div>
277 </div>
278
279 <!-- Stop Button -->
280 <button id="stopButton" onclick="stopCurrentOperation()">Stop Processing</button>
281 <!-- Cache Warning -->
282 <div id="cacheWarning">
283 <strong>Warning:</strong> Cache limit reached. Not all atoms from incoming sets are being displayed. Some atoms were skipped to maintain performance.
284 </div>
285 <div id="header">
286 <h1>AtomSpace Graph Visualization</h1>
287 <ul style="text-align: left; display: inline-block; margin-top: 10px; font-size: 14px;">
288 <li>Click on Atom to fetch and display its incoming set</li>
289 <li>Click on arrow to stop displaying the atoms it comes from</li>
290 </ul>
291 </div>
292 <div id="controls">
293 <button id="resetBtn">Reset View</button>
294 <label>Layout:
295 <select id="layoutSelect">
296 <option value="hierarchical" selected>Hierarchical</option>
297 <option value="network">Network</option>
298 <option value="graph">Graph</option>
299 </select>
300 </label>
301 <button id="refreshBtn">Refresh</button>
302 <div id="cacheInfo">
303 <label>Cache limit:
304 <input type="number" id="cacheLimit" value="250" min="10" max="10000">
305 </label>
306 <span>Cache size: <span id="cacheCount">0</span></span>
307 </div>
308 </div>
309 <div id="mynetwork"></div>
310 <div id="status" class="loading">Initializing...</div>
311
312 <script src="atomspace-cache.js"></script>
313 <script src="tree-view.js"></script>
314 <script src="graph-view.js"></script>
315</body>
316</html>
examples/visualizer/tree-view.js +0 -1184
……@@ -1,1184 +0,0 @@
1// AtomSpace Graph Visualization using vis-network
2// This file handles the graph rendering and interaction logic
3
4// Helper function to get current edge color from theme
5function getEdgeColor() {
6 const color = getComputedStyle(document.body).getPropertyValue('--text-primary').trim();
7 return color || '#212121'; // Fallback to light mode color
8}
9
10// Global variables
11let network = null;
12let vertices = null; // vis-network vertices (not to be confused with AtomSpace Nodes)
13let edges = null;
14let rootAtoms = [];
15let serverUrl = null;
16let atomVertexMap = new Map(); // Maps atom keys to vertex IDs
17let vertexIdCounter = 1;
18
19// Operation control variables
20let operationCancelled = false;
21let pendingOperation = null;
22let operationStartTime = null;
23let stopButtonTimer = null;
24const LARGE_ATOM_THRESHOLD = 300; // Warn if more than 300 atoms
25const STOP_BUTTON_DELAY = 5000; // Show stop button after 5 seconds
26
27// Initialize on page load
28document.addEventListener('DOMContentLoaded', function() {
29 // Parse URL parameters
30 const urlParams = new URLSearchParams(window.location.search);
31 const atomParam = urlParams.get('atom');
32 const atomsParam = urlParams.get('atoms');
33
34 // Handle single atom parameter
35 if (atomParam) {
36 try {
37 const atom = JSON.parse(decodeURIComponent(atomParam));
38 rootAtoms = [atom];
39 // Add to atom cache
40 atomSpaceCache.clear();
41 atomSpaceCache.addAtom(atom);
42 console.log('Root atom:', atom);
43 } catch (e) {
44 console.error('Failed to parse atom data:', e);
45 updateStatus('Failed to parse atom data', 'error');
46 return;
47 }
48 }
49
50 // Handle multiple atoms parameter
51 if (atomsParam) {
52 try {
53 rootAtoms = JSON.parse(decodeURIComponent(atomsParam));
54 // Add to atom cache
55 atomSpaceCache.clear();
56 rootAtoms.forEach(atom => atomSpaceCache.addAtom(atom));
57 console.log('Root atoms:', rootAtoms);
58 } catch (e) {
59 console.error('Failed to parse atoms data:', e);
60 updateStatus('Failed to parse atoms data', 'error');
61 return;
62 }
63 }
64
65 // Get server URL from localStorage (same as type-view)
66 const savedBaseUrl = localStorage.getItem('cogserver-url');
67 serverUrl = savedBaseUrl || `ws://${window.location.hostname}:18080/`;
68 console.log('Server URL:', serverUrl, savedBaseUrl ? '(from localStorage)' : '(default)');
69
70 // Initialize the graph
71 initializeGraph();
72
73 // Connect to server if URL provided
74 if (serverUrl) {
75 connectToServer();
76 }
77
78 // Set up event handlers
79 setupEventHandlers();
80
81 // Set up theme change listener
82 const observer = new MutationObserver(function(mutations) {
83 mutations.forEach(function(mutation) {
84 if (mutation.type === 'attributes' && mutation.attributeName === 'data-theme') {
85 console.log('Theme changed, updating edge colors');
86 updateEdgeColorsForTheme();
87 }
88 });
89 });
90
91 observer.observe(document.body, {
92 attributes: true,
93 attributeFilter: ['data-theme']
94 });
95});
96
97function initializeGraph() {
98 // Check if vis is loaded
99 if (typeof vis === 'undefined') {
100 console.error('vis-network library not loaded');
101 updateStatus('Error: vis-network library not loaded', 'error');
102 return;
103 }
104
105 // Create initial vertices and edges arrays
106 vertices = new vis.DataSet();
107 edges = new vis.DataSet();
108
109 // Get the container
110 const container = document.getElementById('mynetwork');
111
112 if (!container) {
113 console.error('Container element #mynetwork not found');
114 updateStatus('Error: Container element not found', 'error');
115 return;
116 }
117
118 // Create the network
119 const data = {
120 nodes: vertices, // vis-network expects 'nodes' property
121 edges: edges
122 };
123
124 const options = {
125 nodes: { // vis-network configuration expects 'nodes' key
126 shape: 'box',
127 font: {
128 size: 14,
129 face: 'monospace'
130 },
131 margin: 5,
132 widthConstraint: {
133 maximum: 150,
134 minimum: 40
135 }
136 },
137 edges: {
138 arrows: {
139 to: {
140 enabled: true,
141 scaleFactor: 0.5
142 }
143 },
144 smooth: {
145 enabled: false // Straight lines
146 },
147 color: {
148 color: getEdgeColor(),
149 highlight: getEdgeColor(),
150 hover: getEdgeColor()
151 }
152 },
153 physics: {
154 enabled: true,
155 solver: 'hierarchicalRepulsion',
156 hierarchicalRepulsion: {
157 nodeDistance: 150,
158 centralGravity: 0.0,
159 springLength: 100,
160 springConstant: 0.01,
161 damping: 0.09
162 },
163 stabilization: {
164 iterations: 150
165 }
166 },
167 layout: {
168 hierarchical: {
169 enabled: true,
170 direction: 'UD', // Up-Down: root at top, nodes at bottom
171 sortMethod: 'hubsize', // This preserves insertion order better
172 levelSeparation: 150,
173 nodeSpacing: 100,
174 treeSpacing: 200,
175 blockShifting: false, // Prevent reordering of siblings
176 edgeMinimization: false // Don't minimize edge crossings to preserve order
177 }
178 },
179 interaction: {
180 hover: true,
181 tooltipDelay: 200
182 }
183 };
184
185 network = new vis.Network(container, data, options);
186
187 // Add network event handlers
188 network.on('click', function(params) {
189 // Handle vertex clicks
190 if (params.nodes.length > 0) { // vis-network API uses 'nodes'
191 const vertexId = params.nodes[0];
192 const vertex = vertices.get(vertexId);
193 if (vertex && vertex.atom) {
194 // Check if we're in graph view mode
195 const layoutSelect = document.getElementById('layoutSelect');
196 const layoutType = layoutSelect ? layoutSelect.value : 'hierarchical';
197
198 // Check current atom count and warn if getting large
199 const currentAtomCount = atomSpaceCache.getStats().totalAtoms;
200 if (currentAtomCount > LARGE_ATOM_THRESHOLD) {
201 showWarningDialog(currentAtomCount, function() {
202 atomSpaceCache.fetchIncomingSet(vertex.atom);
203 });
204 } else {
205 // Start operation tracking for stop button
206 startOperation();
207 // Fetch incoming set via cache
208 atomSpaceCache.fetchIncomingSet(vertex.atom);
209 }
210 }
211 }
212 // Handle edge clicks
213 else if (params.edges.length > 0) {
214 const edgeId = params.edges[0];
215 const edge = edges.get(edgeId);
216 if (edge) {
217 // Check if we're in graph view mode
218 const layoutSelect = document.getElementById('layoutSelect');
219 const layoutType = layoutSelect ? layoutSelect.value : 'hierarchical';
220
221 if (layoutType === 'graph') {
222 // In graph view, only remove the tail (source) vertex
223 removeSingleVertex(edge.from);
224 } else {
225 // In tree view, remove the vertex and its parents
226 removeVertexAndParents(edge.from);
227 }
228 }
229 }
230 });
231
232 // Add the root atoms to the graph
233 if (rootAtoms && rootAtoms.length > 0) {
234 console.log('Adding root atoms to graph:', rootAtoms);
235 rootAtoms.forEach(atom => {
236 addAtomToGraph(atom, null, 0);
237 });
238 network.fit();
239 updateStatus(`Graph initialized with ${rootAtoms.length} atom(s)`, 'connected');
240 } else {
241 updateStatus('No atoms to display', 'error');
242 console.warn('No root atoms found');
243 }
244}
245
246function connectToServer() {
247 if (!serverUrl) {
248 updateStatus('No server URL provided', 'error');
249 return;
250 }
251
252 // Ensure the URL ends with /json for the JSON endpoint
253 let jsonUrl = serverUrl;
254 if (!jsonUrl.endsWith('/json')) {
255 if (!jsonUrl.endsWith('/')) {
256 jsonUrl += '/';
257 }
258 jsonUrl += 'json';
259 }
260
261 console.log('Attempting to connect to:', jsonUrl);
262 updateStatus('Connecting to server...', 'loading');
263
264 // Connect via atom cache
265 atomSpaceCache.connect(jsonUrl);
266}
267
268function addAtomToGraph(atom, parentId, depth, order = 0) {
269 // Create a unique identifier for this atom
270 const atomKey = atomToKey(atom);
271
272 // Check if we've already processed this atom
273 if (atomVertexMap.has(atomKey)) {
274 const existingVertexId = atomVertexMap.get(atomKey);
275
276 // If we have a parent, we need to ensure proper hierarchy
277 if (parentId !== null) {
278 const parentVertex = vertices.get(parentId);
279 const existingVertex = vertices.get(existingVertexId);
280
281 if (parentVertex && existingVertex) {
282 // If this vertex's current level is not deeper than parent's level,
283 // we need to move it down to maintain hierarchy
284 if (existingVertex.level <= parentVertex.level) {
285 // Place it one level below the parent
286 const newLevel = parentVertex.level + 1;
287 vertices.update({
288 id: existingVertexId,
289 level: newLevel
290 });
291
292 // Recursively update all children of this node to maintain hierarchy
293 updateChildrenLevels(existingVertexId, newLevel);
294 }
295 // Always add the edge from parent to child
296 addEdgeIfNotExists(parentId, existingVertexId);
297 }
298 }
299 return existingVertexId;
300 }
301
302 // Create a new vertex
303 const vertexId = vertexIdCounter++;
304 const vertexLabel = createCompactLabel(atom);
305 const vertexColor = getVertexColor(atom.type);
306
307 vertices.add({
308 id: vertexId,
309 label: vertexLabel,
310 color: vertexColor,
311 atom: atom,
312 level: depth,
313 x: order * 150, // Use order to hint at horizontal position
314 title: atomToSExpression(atom) // Full format for tooltip
315 });
316
317 atomVertexMap.set(atomKey, vertexId);
318
319 // Add edge from parent if exists
320 if (parentId !== null) {
321 edges.add({
322 from: parentId,
323 to: vertexId,
324 arrows: {
325 to: {
326 enabled: true
327 }
328 }
329 });
330 }
331
332 // Process outgoing links if this is a link (no depth limit)
333 if (atom.outgoing && atom.outgoing.length > 0) {
334 atom.outgoing.forEach((outgoing, index) => {
335 if (typeof outgoing === 'object' && outgoing !== null) {
336 addAtomToGraph(outgoing, vertexId, depth + 1, index);
337 }
338 });
339 }
340
341 return vertexId;
342}
343
344function updateChildrenLevels(vertexId, parentLevel) {
345 // Find all edges where this vertex is the parent
346 const childEdges = edges.get({
347 filter: function(edge) {
348 return edge.from === vertexId;
349 }
350 });
351
352 // Update each child's level if needed
353 childEdges.forEach(edge => {
354 const childVertex = vertices.get(edge.to);
355 if (childVertex && childVertex.level <= parentLevel) {
356 const newChildLevel = parentLevel + 1;
357 vertices.update({
358 id: edge.to,
359 level: newChildLevel
360 });
361 // Recursively update this child's children
362 updateChildrenLevels(edge.to, newChildLevel);
363 }
364 });
365}
366
367function removeVertexAndParents(vertexId) {
368 // Get the atom associated with this vertex
369 const vertex = vertices.get(vertexId);
370 if (!vertex || !vertex.atom) {
371 return;
372 }
373
374 // Remove the atom and its parents from the cache
375 const removedCount = atomSpaceCache.removeAtomAndParents(vertex.atom);
376
377 // Collect all vertices to remove (this vertex and all its parents)
378 const verticesToRemove = new Set();
379 const edgesToRemove = new Set();
380
381 // Recursive function to find all parent vertices
382 function collectParents(currentVertexId) {
383 if (verticesToRemove.has(currentVertexId)) {
384 return; // Already processed
385 }
386
387 verticesToRemove.add(currentVertexId);
388
389 // Find all edges where this vertex is the parent (from)
390 const childEdges = edges.get({
391 filter: function(edge) {
392 return edge.from === currentVertexId;
393 }
394 });
395 childEdges.forEach(edge => {
396 edgesToRemove.add(edge.id);
397 });
398
399 // Find all edges where this vertex is the child (to)
400 const parentEdges = edges.get({
401 filter: function(edge) {
402 return edge.to === currentVertexId;
403 }
404 });
405
406 // For each parent edge, recursively collect the parent vertex
407 parentEdges.forEach(edge => {
408 edgesToRemove.add(edge.id);
409 collectParents(edge.from);
410 });
411 }
412
413 // Start collection from the clicked vertex
414 collectParents(vertexId);
415
416 // Remove all collected edges
417 edges.remove(Array.from(edgesToRemove));
418
419 // Remove all collected vertices
420 const vertexIdsToRemove = Array.from(verticesToRemove);
421 vertices.remove(vertexIdsToRemove);
422
423 // Clean up atomVertexMap
424 atomVertexMap.forEach((value, key) => {
425 if (verticesToRemove.has(value)) {
426 atomVertexMap.delete(key);
427 }
428 });
429
430 // Update status
431 updateStatus(`Removed ${verticesToRemove.size} vertex/vertices from display and ${removedCount} atom(s) from cache`, 'connected');
432}
433
434// Remove only a single vertex (used in graph view for edge clicks)
435function removeSingleVertex(vertexId) {
436 // Get the atom associated with this vertex
437 const vertex = vertices.get(vertexId);
438 if (!vertex || !vertex.atom) {
439 return;
440 }
441
442 // Remove only this atom from the cache
443 const removedCount = atomSpaceCache.removeAtom(vertex.atom);
444
445 // Find all edges connected to this vertex
446 const edgesToRemove = edges.get({
447 filter: function(edge) {
448 return edge.from === vertexId || edge.to === vertexId;
449 }
450 });
451
452 // Remove the edges
453 const edgeIds = edgesToRemove.map(edge => edge.id);
454 edges.remove(edgeIds);
455
456 // Remove the vertex
457 vertices.remove(vertexId);
458
459 // Clean up atomVertexMap
460 const atomKey = atomToKey(vertex.atom);
461 atomVertexMap.delete(atomKey);
462
463 // Update status
464 updateStatus(`Removed 1 vertex from display and ${removedCount} atom(s) from cache`, 'connected');
465}
466
467function addEdgeIfNotExists(from, to) {
468 const existingEdges = edges.get({
469 filter: function(edge) {
470 return edge.from === from && edge.to === to;
471 }
472 });
473
474 if (existingEdges.length === 0) {
475 edges.add({
476 from: from,
477 to: to,
478 arrows: {
479 to: {
480 enabled: true
481 }
482 }
483 });
484 }
485}
486
487function createCompactLabel(atom) {
488 // Create a compact label for display in the graph
489 const typeBase = atom.type.replace(/Node$/, '').replace(/Link$/, '');
490
491 if (!atom.outgoing || atom.outgoing.length === 0) {
492 // It's a Node
493 if (atom.name !== undefined) {
494 // Show only first 14 characters of the name, without quotes
495 const name = String(atom.name);
496 return name.length > 14 ? name.substring(0, 14) : name;
497 }
498 // If no name, show truncated type
499 return typeBase.length > 14 ? typeBase.substring(0, 14) : typeBase;
500 } else {
501 // It's a Link - show only first 4 letters without parenthesis
502 return typeBase.length > 4 ? typeBase.substring(0, 4) : typeBase;
503 }
504}
505
506function atomToKey(atom) {
507 // Create a unique key for an atom
508 if (atom.name !== undefined) {
509 return `${atom.type}:${atom.name}`;
510 } else if (atom.outgoing) {
511 return `${atom.type}:[${atom.outgoing.map(o =>
512 typeof o === 'object' ? atomToKey(o) : o
513 ).join(',')}]`;
514 } else {
515 return `${atom.type}:${JSON.stringify(atom)}`;
516 }
517}
518
519function atomToSExpression(atom, indent = 0) {
520 const typeBase = atom.type.replace(/Node$/, '').replace(/Link$/, '');
521
522 if (!atom.outgoing || atom.outgoing.length === 0) {
523 if (atom.name !== undefined) {
524 const quotedName = JSON.stringify(atom.name);
525 return `(${typeBase} ${quotedName})`;
526 }
527 return `(${typeBase})`;
528 } else {
529 // Links with proper indentation using non-breaking spaces
530 const nextIndent = indent + 1;
531 // Use non-breaking spaces (\u00A0) for indentation to preserve it in tooltips
532 const nextIndentStr = '\u00A0\u00A0\u00A0\u00A0'.repeat(nextIndent);
533 const outgoingStrs = atom.outgoing.map(item => {
534 if (typeof item === 'object' && item !== null) {
535 return nextIndentStr + atomToSExpression(item, nextIndent);
536 } else if (typeof item === 'string') {
537 // It's a reference to another atom by ID or handle
538 return nextIndentStr + `(Atom "${item}")`;
539 } else {
540 return nextIndentStr + String(item);
541 }
542 });
543 return `(${typeBase}\n${outgoingStrs.join('\n')})`;
544 }
545}
546
547function getVertexColor(type) {
548 // Color scheme for different atom types (for graph vertices)
549 const colors = {
550 'ConceptNode': '#4CAF50',
551 'PredicateNode': '#2196F3',
552 'NumberNode': '#FF9800',
553 'TypeNode': '#9C27B0',
554 'ListLink': '#00BCD4',
555 'EvaluationLink': '#FFC107',
556 'InheritanceLink': '#795548',
557 'MemberLink': '#607D8B',
558 'DefineLink': '#E91E63',
559 'ImplicationLink': '#3F51B5'
560 };
561
562 return {
563 background: colors[type] || '#9E9E9E',
564 border: '#000000',
565 highlight: {
566 background: '#FFD700',
567 border: '#000000'
568 }
569 };
570}
571
572
573function setupEventHandlers() {
574 // Set up cache status listener
575 atomSpaceCache.addEventListener('cache-status', function(event) {
576 const { size, maxSize, nearFull, skippedAtoms } = event.detail;
577
578 // Update cache count display and color
579 const cacheCountElement = document.getElementById('cacheCount');
580 if (cacheCountElement) {
581 cacheCountElement.textContent = size + '/' + maxSize;
582 // Turn red when above 96% full, otherwise use normal color
583 if (nearFull) {
584 cacheCountElement.style.color = '#F44336'; // Red
585 } else {
586 cacheCountElement.style.color = '#2196F3'; // Normal blue
587 }
588 }
589
590 // Show/hide warning
591 const warningElement = document.getElementById('cacheWarning');
592 const networkElement = document.getElementById('mynetwork');
593 if (warningElement && networkElement) {
594 if (nearFull && skippedAtoms) {
595 warningElement.classList.add('visible');
596 networkElement.classList.add('with-warning');
597 } else {
598 warningElement.classList.remove('visible');
599 networkElement.classList.remove('with-warning');
600 }
601 }
602 });
603
604 // Set up cache event listeners
605 atomSpaceCache.addEventListener('connection', function(event) {
606 const status = event.detail.status;
607 const message = event.detail.message;
608 if (status === 'connected') {
609 updateStatus(message, 'connected');
610 } else if (status === 'disconnected' || status === 'error') {
611 updateStatus(message, 'error');
612 }
613 });
614
615 atomSpaceCache.addEventListener('update', function(event) {
616 const updateType = event.detail.type;
617
618 // Handle cancellation event
619 if (updateType === 'operations-cancelled') {
620 endOperation();
621 return;
622 }
623
624 // Handle atoms-removed event - no need to rebuild as removal is already done
625 if (updateType === 'atoms-removed') {
626 // The visual removal is already handled by removeVertexAndParents
627 // This event just confirms cache is in sync
628 return;
629 }
630
631 // Check if operation was cancelled
632 if (operationCancelled) {
633 endOperation();
634 return;
635 }
636
637 if (updateType === 'incoming-set') {
638 const parent = event.detail.parent;
639 const atoms = event.detail.atoms;
640
641 // Check current layout mode
642 const layoutSelect = document.getElementById('layoutSelect');
643 const layoutType = layoutSelect ? layoutSelect.value : 'hierarchical';
644
645 if (layoutType === 'graph') {
646 // For graph view, delegate to graph-view.js handler
647 if (typeof handleGraphViewCacheUpdate === 'function') {
648 handleGraphViewCacheUpdate(parent, atoms);
649 }
650 } else {
651 // For hierarchical/network view, rebuild the entire graph with new atoms
652 // This ensures proper bottom-up level calculation
653 if (!operationCancelled) {
654 rebuildFromAtomCache();
655
656 // Refit the network to show the new nodes
657 network.fit();
658 updateStatus(`Added ${atoms.length} incoming links`, 'connected');
659
660 // The operations-complete event will handle calling endOperation
661 }
662 }
663 } else if (updateType === 'listlinks-complete' || updateType === 'operations-complete') {
664 endOperation();
665 updateStatus('Ready', 'connected');
666 }
667 });
668
669 atomSpaceCache.addEventListener('error', function(event) {
670 updateStatus(event.detail.message, 'error');
671 });
672
673 // Reset view button
674 document.getElementById('resetBtn').addEventListener('click', function() {
675 network.fit();
676 });
677
678
679 // Layout select
680 document.getElementById('layoutSelect').addEventListener('change', function(e) {
681 const layoutType = e.target.value;
682 const previousLayout = this.getAttribute('data-previous-layout');
683
684 // Destroy and recreate network to ensure clean state
685 if (network) {
686 network.destroy();
687 network = null;
688 }
689
690 // Clear all data structures
691 nodes = new vis.DataSet();
692 edges = new vis.DataSet();
693 atomVertexMap.clear();
694 vertexIdCounter = 1;
695
696 // Recreate network with fresh options
697 const container = document.getElementById('mynetwork');
698 let options = {};
699
700 if (layoutType === 'graph') {
701 // Use graph view mode with special edge handling
702 initializeGraphViewWithAtomCache();
703 options = getGraphViewOptions();
704 } else {
705 // Rebuild from cache for hierarchical/network view
706 rebuildFromAtomCache();
707
708 if (layoutType === 'hierarchical') {
709 options = {
710 nodes: {
711 shape: 'box',
712 font: {
713 size: 14,
714 face: 'monospace'
715 },
716 margin: 5,
717 widthConstraint: {
718 maximum: 150,
719 minimum: 40
720 }
721 },
722 edges: {
723 smooth: {
724 enabled: false // Straight lines
725 },
726 arrows: {
727 to: {
728 enabled: true,
729 scaleFactor: 0.5
730 }
731 },
732 color: {
733 color: getEdgeColor(),
734 highlight: getEdgeColor(),
735 hover: getEdgeColor()
736 }
737 },
738 physics: {
739 enabled: true,
740 solver: 'hierarchicalRepulsion',
741 hierarchicalRepulsion: {
742 nodeDistance: 150,
743 centralGravity: 0.0,
744 springLength: 100,
745 springConstant: 0.01,
746 damping: 0.09
747 },
748 stabilization: {
749 enabled: true,
750 iterations: 1000,
751 updateInterval: 100
752 }
753 },
754 layout: {
755 hierarchical: {
756 enabled: true,
757 direction: 'UD', // Up-Down: root at top, nodes at bottom
758 sortMethod: 'hubsize',
759 levelSeparation: 150,
760 nodeSpacing: 100,
761 treeSpacing: 200,
762 blockShifting: true,
763 edgeMinimization: true,
764 parentCentralization: true
765 }
766 }
767 };
768 } else {
769 // Network view
770 options = {
771 nodes: {
772 shape: 'box',
773 font: {
774 size: 14,
775 face: 'monospace'
776 },
777 margin: 5,
778 widthConstraint: {
779 maximum: 150,
780 minimum: 40
781 }
782 },
783 edges: {
784 smooth: {
785 enabled: true, // Allow curves in network mode
786 type: 'dynamic'
787 },
788 arrows: {
789 to: {
790 enabled: true,
791 scaleFactor: 0.5
792 }
793 },
794 color: {
795 color: getEdgeColor(),
796 highlight: getEdgeColor(),
797 hover: getEdgeColor()
798 }
799 },
800 physics: {
801 enabled: true,
802 solver: 'forceAtlas2Based',
803 forceAtlas2Based: {
804 gravitationalConstant: -50,
805 centralGravity: 0.01,
806 springLength: 100,
807 springConstant: 0.08
808 }
809 },
810 layout: {
811 hierarchical: {
812 enabled: false
813 }
814 }
815 };
816 }
817 }
818
819 // Create new network with the appropriate options
820 const data = { nodes: vertices, edges: edges }; // vis-network expects 'nodes' property
821 network = new vis.Network(container, data, options);
822
823 // Re-attach event handlers
824 network.on('click', function(params) {
825 if (params.nodes.length > 0) { // vis-network API uses 'nodes'
826 const vertexId = params.nodes[0];
827 const vertex = vertices.get(vertexId);
828 if (vertex && vertex.atom) {
829 // Check current atom count and warn if getting large
830 const currentAtomCount = atomSpaceCache.getStats().totalAtoms;
831 if (currentAtomCount > LARGE_ATOM_THRESHOLD) {
832 showWarningDialog(currentAtomCount, function() {
833 atomSpaceCache.fetchIncomingSet(vertex.atom);
834 });
835 } else {
836 // Start operation tracking for stop button
837 startOperation();
838 // Fetch via cache
839 atomSpaceCache.fetchIncomingSet(vertex.atom);
840 }
841 }
842 } else if (params.edges.length > 0) {
843 const edgeId = params.edges[0];
844 const edge = edges.get(edgeId);
845 if (edge) {
846 // Check current layout mode
847 const layoutSelect = document.getElementById('layoutSelect');
848 const layoutType = layoutSelect ? layoutSelect.value : 'hierarchical';
849
850 if (layoutType === 'graph') {
851 // In graph view, only remove the tail (source) vertex
852 removeSingleVertex(edge.from);
853 } else {
854 // In tree view, remove the vertex and its parents
855 removeVertexAndParents(edge.from);
856 }
857 }
858 }
859 });
860
861 this.setAttribute('data-previous-layout', layoutType);
862
863 // Stabilize and fit
864 network.stabilize();
865 network.fit();
866 });
867
868 // Refresh button
869 document.getElementById('refreshBtn').addEventListener('click', function() {
870 refreshGraph();
871 });
872
873 // Cache limit input
874 const cacheLimitInput = document.getElementById('cacheLimit');
875 if (cacheLimitInput) {
876 cacheLimitInput.addEventListener('change', function() {
877 const newLimit = parseInt(this.value, 10);
878 if (!isNaN(newLimit) && newLimit > 0) {
879 atomSpaceCache.setMaxCacheSize(newLimit);
880 }
881 });
882 // Set initial value
883 atomSpaceCache.setMaxCacheSize(parseInt(cacheLimitInput.value, 10));
884 }
885
886 // Trigger initial cache status update
887 atomSpaceCache.checkCacheWarning();
888}
889
890function refreshGraph() {
891 // Clear the graph
892 vertices.clear();
893 edges.clear();
894 atomVertexMap.clear();
895 vertexIdCounter = 1;
896
897 // Check current layout mode
898 const layoutSelect = document.getElementById('layoutSelect');
899 const layoutType = layoutSelect ? layoutSelect.value : 'hierarchical';
900
901 if (layoutType === 'graph') {
902 // Use graph view with atom cache
903 initializeGraphViewWithAtomCache();
904 } else {
905 // Rebuild from cache for hierarchical/network view
906 rebuildFromAtomCache();
907 network.fit();
908 }
909
910 updateStatus('Graph refreshed', 'connected');
911}
912
913function updateStatus(message, className) {
914 const statusElement = document.getElementById('status');
915 statusElement.textContent = message;
916 statusElement.className = className || '';
917}
918
919// Update all edge colors when theme changes
920function updateEdgeColorsForTheme() {
921 if (!edges) return;
922
923 const newColor = getEdgeColor();
924 const newBackground = getComputedStyle(document.body).getPropertyValue('--surface').trim() || '#FFFFFF';
925 console.log('Updating edge colors to:', newColor, 'background:', newBackground);
926
927 // Get all edge IDs
928 const allEdges = edges.get();
929
930 // Update each edge with new color and font color
931 const updatedEdges = allEdges.map(edge => ({
932 id: edge.id,
933 color: {
934 color: newColor,
935 highlight: newColor,
936 hover: newColor
937 },
938 font: {
939 ...edge.font,
940 color: newColor,
941 background: newBackground
942 }
943 }));
944
945 // Batch update all edges
946 edges.update(updatedEdges);
947}
948
949// Warning and cancellation functions
950function showWarningDialog(atomCount, callback) {
951 const dialog = document.getElementById('warningDialog');
952 const overlay = document.getElementById('overlay');
953 const message = document.getElementById('warningMessage');
954
955 message.textContent = `This operation will process approximately ${atomCount} atoms. This may take some time and could affect performance. Do you want to continue?`;
956
957 dialog.style.display = 'block';
958 overlay.style.display = 'block';
959
960 pendingOperation = callback;
961}
962
963function cancelLargeOperation() {
964 const dialog = document.getElementById('warningDialog');
965 const overlay = document.getElementById('overlay');
966
967 dialog.style.display = 'none';
968 overlay.style.display = 'none';
969
970 pendingOperation = null;
971 updateStatus('Operation cancelled', 'connected');
972}
973
974function proceedWithLargeOperation() {
975 const dialog = document.getElementById('warningDialog');
976 const overlay = document.getElementById('overlay');
977
978 dialog.style.display = 'none';
979 overlay.style.display = 'none';
980
981 if (pendingOperation) {
982 startOperation(); // This will reset cancellation flag in cache
983 pendingOperation();
984 pendingOperation = null;
985 }
986}
987
988function startOperation() {
989 operationCancelled = false;
990 operationStartTime = Date.now();
991
992 // Reset cancellation flag in cache
993 atomSpaceCache.resetCancellation();
994
995 // Show stop button after a delay
996 stopButtonTimer = setTimeout(() => {
997 if (!operationCancelled) {
998 document.getElementById('stopButton').style.display = 'block';
999 }
1000 }, STOP_BUTTON_DELAY);
1001}
1002
1003function stopCurrentOperation() {
1004 operationCancelled = true;
1005
1006 // Cancel all pending operations in the cache
1007 atomSpaceCache.cancelAllOperations();
1008
1009 // Hide stop button
1010 document.getElementById('stopButton').style.display = 'none';
1011
1012 // Clear timer if still pending
1013 if (stopButtonTimer) {
1014 clearTimeout(stopButtonTimer);
1015 stopButtonTimer = null;
1016 }
1017
1018 // Cancel any pending graph updates in graph-view
1019 if (typeof pendingGraphUpdate !== 'undefined' && pendingGraphUpdate) {
1020 clearTimeout(pendingGraphUpdate);
1021 pendingGraphUpdate = null;
1022 }
1023 if (typeof batchUpdateTimer !== 'undefined' && batchUpdateTimer) {
1024 clearTimeout(batchUpdateTimer);
1025 batchUpdateTimer = null;
1026 }
1027 if (typeof isProcessingBatch !== 'undefined') {
1028 isProcessingBatch = false;
1029 }
1030 if (typeof pendingListLinkFetches !== 'undefined') {
1031 pendingListLinkFetches = 0;
1032 }
1033
1034 updateStatus('Processing stopped', 'connected');
1035
1036 // Ensure the graph remains functional
1037 if (network) {
1038 network.stabilize();
1039 }
1040}
1041
1042function endOperation() {
1043 // Hide stop button
1044 document.getElementById('stopButton').style.display = 'none';
1045
1046 // Clear timer if still pending
1047 if (stopButtonTimer) {
1048 clearTimeout(stopButtonTimer);
1049 stopButtonTimer = null;
1050 }
1051
1052 operationCancelled = false;
1053 operationStartTime = null;
1054}
1055
1056// Removed handleServerResponse - now handled via cache events
1057
1058// Helper function to check if two atoms match
1059function isMatchingAtom(atom1, atom2) {
1060 if (typeof atom1 === 'string' || typeof atom2 === 'string') {
1061 return false; // Can't match string references accurately
1062 }
1063 if (atom1.type !== atom2.type) {
1064 return false;
1065 }
1066 if (atom1.name !== undefined && atom2.name !== undefined) {
1067 return atom1.name === atom2.name;
1068 }
1069 // For links, would need to compare outgoing, but that gets complex
1070 return atomToKey(atom1) === atomToKey(atom2);
1071}
1072
1073// Removed pendingIncomingRequest - now handled by cache
1074
1075// Calculate the maximum depth of an atom (distance to its deepest leaf)
1076function calculateMaxDepth(atom, depthCache = new Map()) {
1077 const atomKey = atomSpaceCache.atomToKey(atom);
1078
1079 // Check cache
1080 if (depthCache.has(atomKey)) {
1081 return depthCache.get(atomKey);
1082 }
1083
1084 let maxDepth = 0;
1085
1086 // For Links, check their outgoing atoms
1087 if (atom.outgoing && atom.outgoing.length > 0) {
1088 // Has children, so depth is 1 + max depth of children
1089 atom.outgoing.forEach(child => {
1090 if (typeof child === 'object' && child !== null) {
1091 const childDepth = calculateMaxDepth(child, depthCache);
1092 maxDepth = Math.max(maxDepth, childDepth + 1);
1093 }
1094 });
1095 }
1096 // For Nodes or empty Links, depth is 0 (they are leaves)
1097
1098 depthCache.set(atomKey, maxDepth);
1099 return maxDepth;
1100}
1101
1102// Rebuild visualization from atom cache for hierarchical/network view
1103function rebuildFromAtomCache() {
1104 // Check if operation was cancelled
1105 if (operationCancelled) {
1106 return;
1107 }
1108
1109 // Clear existing
1110 vertices.clear();
1111 edges.clear();
1112 atomVertexMap.clear();
1113 vertexIdCounter = 1;
1114
1115 // Calculate depths for all atoms
1116 const depthCache = new Map();
1117 const allAtoms = atomSpaceCache.getAllAtoms();
1118 let maxDepthInGraph = 0;
1119
1120 // First pass: calculate max depth for each atom
1121 allAtoms.forEach(atom => {
1122 const depth = calculateMaxDepth(atom, depthCache);
1123 maxDepthInGraph = Math.max(maxDepthInGraph, depth);
1124 });
1125
1126 // Second pass: add all atoms with inverted levels (bottom-up)
1127 allAtoms.forEach(atom => {
1128 const atomKey = atomSpaceCache.atomToKey(atom);
1129 if (atomVertexMap.has(atomKey)) {
1130 return; // Already added
1131 }
1132
1133 const maxDepth = depthCache.get(atomKey);
1134 // Invert the level: leaves at bottom (high level number), roots at top (level 0)
1135 const level = maxDepthInGraph - maxDepth;
1136
1137 // Create vertex
1138 const vertexId = vertexIdCounter++;
1139 const vertexLabel = createCompactLabel(atom);
1140 const vertexColor = getVertexColor(atom.type);
1141
1142 vertices.add({
1143 id: vertexId,
1144 label: vertexLabel,
1145 color: vertexColor,
1146 atom: atom,
1147 level: level,
1148 title: atomToSExpression(atom)
1149 });
1150
1151 atomVertexMap.set(atomKey, vertexId);
1152 });
1153
1154 // Third pass: add edges for parent-child relationships
1155 allAtoms.forEach(atom => {
1156 const atomKey = atomSpaceCache.atomToKey(atom);
1157 const parentVertexId = atomVertexMap.get(atomKey);
1158
1159 if (parentVertexId && atom.outgoing && atom.outgoing.length > 0) {
1160 atom.outgoing.forEach(child => {
1161 if (typeof child === 'object' && child !== null) {
1162 const childKey = atomSpaceCache.atomToKey(child);
1163 const childVertexId = atomVertexMap.get(childKey);
1164
1165 if (childVertexId) {
1166 edges.add({
1167 from: parentVertexId,
1168 to: childVertexId,
1169 arrows: {
1170 to: {
1171 enabled: true,
1172 scaleFactor: 0.5
1173 }
1174 }
1175 });
1176 }
1177 }
1178 });
1179 }
1180 });
1181}
1182
1183// Removed fetchIncomingSet - now handled by atomspace-cache
1184// Removed initializeGraphViewWithAtomCache - moved to graph-view.js
examples/visualizer/type-view.html +0 -197
……@@ -1,197 +0,0 @@
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>AtomType Hierarchy - AtomSpace Visualizer</title>
7 <link rel="stylesheet" href="styles.css">
8 <script src="theme.js"></script>
9 <style>
10 .type-tree-container {
11 background: var(--surface);
12 border-radius: var(--border-radius);
13 box-shadow: var(--shadow-sm);
14 padding: 30px;
15 margin-top: 20px;
16 overflow: auto;
17 min-height: 700px;
18 height: 80vh;
19 position: relative;
20 }
21
22 #type-tree {
23 display: block;
24 width: 100%;
25 height: auto;
26 cursor: grab;
27 background: var(--surface) !important;
28 }
29
30 #type-tree.grabbing {
31 cursor: grabbing;
32 }
33
34 /* SVG background rectangle should match theme */
35 .svg-background {
36 fill: var(--surface);
37 }
38
39 .tree-controls {
40 display: flex;
41 gap: 10px;
42 margin-bottom: 20px;
43 }
44
45 .tree-controls span {
46 color: var(--text-secondary);
47 }
48
49 .tree-node {
50 cursor: pointer;
51 user-select: none;
52 }
53
54 .tree-node text {
55 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
56 font-size: 12px;
57 fill: var(--text-primary);
58 }
59
60 .tree-node rect {
61 fill: var(--surface);
62 stroke: var(--text-primary);
63 stroke-width: 1px;
64 }
65
66 .tree-node:hover rect {
67 fill: var(--primary-light);
68 }
69
70 .tree-link {
71 fill: none;
72 stroke: var(--text-primary);
73 stroke-width: 1.5px;
74 }
75
76 .tree-link.secondary {
77 stroke: var(--text-secondary);
78 stroke-width: 1px;
79 stroke-dasharray: 2,2;
80 }
81
82 .tree-link.distant {
83 stroke: var(--border-color);
84 stroke-width: 0.5px;
85 }
86
87 .loading {
88 text-align: center;
89 padding: 50px;
90 color: var(--text-secondary);
91 }
92
93 .error {
94 color: var(--error-color);
95 padding: 20px;
96 background: var(--surface);
97 border: 1px solid var(--error-color);
98 border-radius: var(--border-radius);
99 margin-top: 20px;
100 }
101
102 .info-panel {
103 background: var(--background);
104 padding: 15px;
105 border-radius: var(--border-radius);
106 margin-bottom: 20px;
107 }
108
109 .info-panel h3 {
110 margin: 0 0 10px 0;
111 color: var(--primary-dark);
112 }
113
114 .selected-type {
115 background: var(--primary-light);
116 padding: 10px;
117 border-radius: 4px;
118 margin-top: 10px;
119 }
120
121 .stats-row {
122 display: flex;
123 gap: 20px;
124 margin-bottom: 10px;
125 }
126
127 .stat-item {
128 flex: 1;
129 }
130 </style>
131 <script src="type-view.js"></script>
132</head>
133<body data-theme="dark">
134 <!-- Theme Toggle Button -->
135 <button class="theme-toggle" id="theme-toggle" aria-label="Toggle dark/light mode">
136 <span id="theme-icon">☀️</span>
137 </button>
138
139 <div class="container">
140 <header>
141 <h1>AtomType Hierarchy</h1>
142 <p class="subtitle">Visualization of the AtomSpace type inheritance hierarchy</p>
143 </header>
144
145 <main>
146 <section id="info-panel" class="info-panel">
147 <h3>Type Information</h3>
148 <div class="stats-row">
149 <div class="stat-item">
150 <strong>Total Types:</strong> <span id="types-loaded">Loading...</span>
151 </div>
152 <div class="stat-item">
153 <strong>Status:</strong> <span id="connection-status">Connecting...</span>
154 </div>
155 </div>
156 <div id="selected-type" class="selected-type hidden">
157 <strong>Selected Type:</strong> <span id="type-name">None</span><br>
158 <strong>Parents:</strong> <span id="type-parents">None</span><br>
159 <strong>Children:</strong> <span id="type-children">None</span>
160 </div>
161 </section>
162
163 <section id="tree-container" class="type-tree-container hidden">
164 <div class="tree-controls">
165 <button id="reset-view" class="btn-secondary">
166 <span class="btn-icon">⟲</span>
167 <span class="btn-text">Reset View</span>
168 </button>
169 <button id="refresh-btn" class="btn-secondary">
170 <span class="btn-icon">🔄</span>
171 <span class="btn-text">Refresh</span>
172 </button>
173 <span style="margin-left: auto; color: #666; font-size: 0.9em;">
174 Use mouse wheel to zoom, drag to pan
175 </span>
176 </div>
177 <svg id="type-tree"></svg>
178 </section>
179
180 <section id="loading-panel" class="loading">
181 <p>Loading type hierarchy...</p>
182 </section>
183
184 <section id="error-panel" class="error-panel hidden">
185 <div class="error-content">
186 <span class="error-icon">⚠️</span>
187 <span id="error-message"></span>
188 </div>
189 </section>
190 </main>
191
192 <footer>
193 <p>AtomSpace Type Visualizer • <a href="https://wiki.opencog.org/w/AtomSpace" target="_blank">Documentation</a></p>
194 </footer>
195 </div>
196</body>
197</html>
examples/visualizer/type-view.js +0 -907
……@@ -1,907 +0,0 @@
1// AtomType Hierarchy Visualizer
2// Displays the inheritance hierarchy of AtomSpace types using a left-to-right tree
3
4// Helper function to get CSS variable value
5function getCSSVar(varName) {
6 // Read computed style from body element
7 const value = getComputedStyle(document.body).getPropertyValue(varName).trim();
8 console.log(`getCSSVar(${varName}) = "${value}" (theme: ${document.body.getAttribute('data-theme')})`);
9
10 // If we got an empty value, something is wrong - log it
11 if (!value) {
12 console.error(`CSS variable ${varName} returned empty! Theme: ${document.body.getAttribute('data-theme')}`);
13 }
14
15 return value;
16}
17
18let ws = null;
19let typeHierarchy = null;
20let svgElement = null;
21let currentZoom = 1;
22let currentX = 0;
23let currentY = 0;
24let typeData = {};
25let allTypes = [];
26let queryQueue = [];
27let currentPhase = '';
28let pendingResponses = 0;
29let typeIndex = 0;
30
31document.addEventListener('DOMContentLoaded', () => {
32 setupEventListeners();
33 // Auto-connect on page load
34 connect();
35});
36
37function setupEventListeners() {
38 const refreshBtn = document.getElementById('refresh-btn');
39 const resetViewBtn = document.getElementById('reset-view');
40
41 refreshBtn.addEventListener('click', loadTypes);
42 resetViewBtn.addEventListener('click', resetView);
43}
44
45function connect() {
46 const statusElement = document.getElementById('connection-status');
47
48 // Try to get saved server URL from localStorage, otherwise use default
49 const savedBaseUrl = localStorage.getItem('cogserver-url');
50 const baseUrl = savedBaseUrl || `ws://${window.location.hostname}:18080/`;
51 const serverUrl = baseUrl + 'json';
52
53 console.log('Connecting to:', serverUrl, savedBaseUrl ? '(from localStorage)' : '(default)');
54
55 showLoading(true);
56 showError(null);
57
58 try {
59 ws = new WebSocket(serverUrl);
60
61 ws.onopen = () => {
62 console.log('Connected to CogServer');
63 statusElement.textContent = 'Connected';
64 statusElement.style.color = 'green';
65
66 // Load types immediately after connection
67 loadTypes();
68 };
69
70 ws.onmessage = (event) => {
71 try {
72 const response = JSON.parse(event.data);
73 handleResponse(response);
74 } catch (error) {
75 console.error('Error parsing response:', error);
76 console.log('Raw response:', event.data);
77 showError('Invalid response from server: ' + error.message);
78 }
79 };
80
81 ws.onerror = (error) => {
82 console.error('WebSocket error:', error);
83 statusElement.textContent = 'Connection Error';
84 statusElement.style.color = 'red';
85 showError('Connection error - make sure CogServer is running on localhost:18080');
86 showLoading(false);
87 };
88
89 ws.onclose = () => {
90 console.log('Disconnected from CogServer');
91 statusElement.textContent = 'Disconnected';
92 statusElement.style.color = 'red';
93 showLoading(false);
94
95 // Try to reconnect after 3 seconds
96 setTimeout(() => {
97 statusElement.textContent = 'Reconnecting...';
98 statusElement.style.color = 'orange';
99 connect();
100 }, 3000);
101 };
102
103 } catch (error) {
104 console.error('Connection error:', error);
105 statusElement.textContent = 'Connection Failed';
106 statusElement.style.color = 'red';
107 showError('Failed to connect: ' + error.message);
108 showLoading(false);
109 }
110}
111
112function loadTypes() {
113 if (!ws || ws.readyState !== WebSocket.OPEN) {
114 showError('Not connected to server');
115 return;
116 }
117
118 showLoading(true);
119 showError(null);
120
121 // Reset type data
122 typeData = {};
123 allTypes = [];
124 queryQueue = [];
125 currentPhase = 'get-all-types';
126 typeIndex = 0;
127
128 // First, get ALL types with one recursive query
129 const command = 'AtomSpace.getSubTypes("TopType", true)';
130 sendCommand(command);
131}
132
133function queryNextType() {
134 if (typeIndex >= allTypes.length) {
135 // All done
136 console.log('All subtype queries complete');
137 showLoading(false);
138 buildHierarchyLevels();
139 renderHierarchy();
140 return;
141 }
142
143 const typeName = allTypes[typeIndex];
144 queryQueue.push(typeName); // Track which type we're querying
145 const command = `AtomSpace.getSubTypes("${typeName}", false)`;
146 sendCommand(command);
147}
148
149function buildHierarchyLevels() {
150 console.log('Building hierarchy levels using shortest path...');
151
152 // Make sure TopType exists
153 if (!typeData['TopType']) {
154 console.error('TopType not found! Creating it.');
155 typeData['TopType'] = {
156 name: 'TopType',
157 parents: [],
158 children: [],
159 queried: true,
160 level: 0
161 };
162 }
163
164 // Build a set of Arg's immediate children
165 const argChildren = new Set(typeData['Arg']?.children || []);
166 console.log('Arg children:', Array.from(argChildren));
167
168 // Calculate the SHORTEST path level for each type using BFS
169 // This handles multiple inheritance correctly
170 const levels = {};
171 const queue = [{ type: 'TopType', level: 0 }];
172 const visited = new Set();
173
174 // Initialize all types to max level
175 Object.keys(typeData).forEach(type => {
176 levels[type] = Number.MAX_SAFE_INTEGER;
177 });
178 levels['TopType'] = 0;
179
180 // BFS to find shortest path to each type
181 while (queue.length > 0) {
182 const { type, level } = queue.shift();
183
184 // Skip if we've already found a shorter or equal path to this type
185 if (level > levels[type]) {
186 continue;
187 }
188
189 levels[type] = level;
190
191 // Process children
192 if (typeData[type] && typeData[type].children) {
193 typeData[type].children.forEach(child => {
194 // Only process if this gives a shorter path
195 if (level + 1 < levels[child]) {
196 queue.push({ type: child, level: level + 1 });
197 }
198 });
199 }
200 }
201
202 // Apply the calculated levels
203 Object.entries(levels).forEach(([type, level]) => {
204 if (typeData[type]) {
205 if (level === Number.MAX_SAFE_INTEGER) {
206 // Orphaned type - not connected to TopType
207 console.warn('Orphaned type (not connected to TopType):', type);
208 typeData[type].level = 0;
209 typeData[type].orphaned = true;
210 } else {
211 typeData[type].level = level;
212 }
213 }
214 });
215
216 // Find the primary parent for each type (parent with shortest path to TopType)
217 // BUT ignore parents that are children of Arg
218 Object.entries(typeData).forEach(([typeName, typeInfo]) => {
219 if (typeInfo.parents.length > 0) {
220 // Filter out any parents that are Arg children
221 const validParents = typeInfo.parents.filter(parent => !argChildren.has(parent));
222
223 if (validParents.length > 0) {
224 // Find parent with lowest level from valid parents only
225 let primaryParent = null;
226 let minLevel = Number.MAX_SAFE_INTEGER;
227
228 validParents.forEach(parent => {
229 if (typeData[parent] && typeData[parent].level < minLevel) {
230 minLevel = typeData[parent].level;
231 primaryParent = parent;
232 }
233 });
234
235 typeInfo.primaryParent = primaryParent;
236 typeInfo.secondaryParents = typeInfo.parents.filter(p => p !== primaryParent);
237 } else {
238 // All parents are Arg children, use the original logic
239 let primaryParent = null;
240 let minLevel = Number.MAX_SAFE_INTEGER;
241
242 typeInfo.parents.forEach(parent => {
243 if (typeData[parent] && typeData[parent].level < minLevel) {
244 minLevel = typeData[parent].level;
245 primaryParent = parent;
246 }
247 });
248
249 typeInfo.primaryParent = primaryParent;
250 typeInfo.secondaryParents = typeInfo.parents.filter(p => p !== primaryParent);
251 }
252
253 console.log(`${typeName} has multiple parents. Primary: ${typeInfo.primaryParent}, Secondary: ${typeInfo.secondaryParents}`);
254 }
255 });
256
257 const maxLevel = Math.max(...Object.values(typeData).map(t => t.level).filter(l => l < Number.MAX_SAFE_INTEGER));
258 console.log('Hierarchy levels built. Total levels:', maxLevel + 1);
259
260 // Count types at each level
261 const levelCounts = {};
262 Object.values(typeData).forEach(type => {
263 if (!type.orphaned) {
264 levelCounts[type.level] = (levelCounts[type.level] || 0) + 1;
265 }
266 });
267
268 console.log('Types per level:', levelCounts);
269 console.log('TopType children:', typeData['TopType']?.children);
270
271 if (typeData['Value']) {
272 console.log('Value info:', {
273 level: typeData['Value'].level,
274 children: typeData['Value'].children.slice(0, 5),
275 parents: typeData['Value'].parents
276 });
277 }
278
279 if (typeData['BoolValue']) {
280 console.log('BoolValue info:', {
281 level: typeData['BoolValue'].level,
282 parents: typeData['BoolValue'].parents,
283 primaryParent: typeData['BoolValue'].primaryParent,
284 secondaryParents: typeData['BoolValue'].secondaryParents
285 });
286 }
287}
288
289function sendCommand(command) {
290 if (!ws || ws.readyState !== WebSocket.OPEN) {
291 showError('Not connected to server');
292 return;
293 }
294
295 console.log('Sending command:', command);
296 ws.send(command + '\n');
297}
298
299function handleResponse(response) {
300 console.log('Received response for phase:', currentPhase);
301
302 // Handle MCP content-based response
303 if (response.content && Array.isArray(response.content)) {
304 // Check for error
305 if (response.isError === true) {
306 const errorText = response.content[0]?.text || 'Unknown error';
307 showError('Server error: ' + errorText);
308 showLoading(false);
309 return;
310 }
311
312 // Parse content text (may be JSON string)
313 const contentText = response.content[0]?.text || '';
314 try {
315 response = JSON.parse(contentText);
316 } catch {
317 response = contentText;
318 }
319 }
320
321 // Extract the array from response
322 let types = [];
323 if (Array.isArray(response)) {
324 types = response;
325 } else if (response.result && Array.isArray(response.result)) {
326 types = response.result;
327 }
328
329 if (currentPhase === 'get-all-types') {
330 // Phase 1: We got all type names
331 allTypes = types;
332 console.log(`Received ${allTypes.length} total types`);
333
334 // Initialize typeData for all types
335 allTypes.forEach(typeName => {
336 typeData[typeName] = {
337 name: typeName,
338 parents: [],
339 children: [],
340 queried: false
341 };
342 });
343
344 // Add TopType if not present
345 if (!typeData['TopType']) {
346 console.log('TopType not in response, adding it manually');
347 typeData['TopType'] = {
348 name: 'TopType',
349 parents: [],
350 children: [],
351 queried: false
352 };
353 allTypes.unshift('TopType');
354 } else {
355 console.log('TopType found in response');
356 }
357
358 // Phase 2: Query each type for its immediate children
359 currentPhase = 'get-subtypes';
360 pendingResponses = allTypes.length;
361 queryQueue = []; // Reset queue
362
363 console.log('Starting to query immediate subtypes for each type...');
364
365 // Send queries one at a time to maintain order
366 // Start with the first type
367 queryNextType();
368
369 } else if (currentPhase === 'get-subtypes') {
370 // Phase 2: Process immediate subtypes for a type
371 const parentType = queryQueue.shift();
372
373 if (parentType && typeData[parentType]) {
374 typeData[parentType].children = types;
375 typeData[parentType].queried = true;
376
377 // Update parent relationships for children
378 types.forEach(childType => {
379 if (typeData[childType]) {
380 if (!typeData[childType].parents.includes(parentType)) {
381 typeData[childType].parents.push(parentType);
382 }
383 }
384 });
385
386 if (types.length > 0) {
387 console.log(`${parentType} → [${types.slice(0, 5).join(', ')}${types.length > 5 ? '...' : ''}]`);
388 }
389 }
390
391 // Move to next type
392 typeIndex++;
393 queryNextType();
394 }
395}
396
397// buildTypeHierarchy removed - now using incremental queries
398
399function renderHierarchy() {
400 console.log('renderHierarchy called');
401
402 // Update status
403 document.getElementById('types-loaded').textContent = Object.keys(typeData).length;
404
405 // Show panels
406 const treeContainer = document.getElementById('tree-container');
407 if (treeContainer) {
408 treeContainer.classList.remove('hidden');
409 console.log('Tree container shown, classes:', treeContainer.className);
410
411 // Check container dimensions
412 const rect = treeContainer.getBoundingClientRect();
413 console.log('Tree container dimensions:', rect.width, 'x', rect.height);
414
415 if (rect.width === 0 || rect.height === 0) {
416 console.error('Tree container has zero dimensions!');
417 }
418 } else {
419 console.error('Tree container not found!');
420 }
421
422 // Render the tree
423 renderTree();
424}
425
426// Removed old processTypeList and processTypeHierarchy functions
427// Now using incremental hierarchy building with querySubtypes
428
429function renderTree() {
430 const container = document.getElementById('type-tree');
431
432 console.log('renderTree called. TypeData size:', Object.keys(typeData).length);
433 console.log('Container element:', container);
434 console.log('Container parent:', container?.parentElement);
435
436 // Clear previous content
437 while (container.firstChild) {
438 container.removeChild(container.firstChild);
439 }
440
441 // Now continue with the real tree
442 if (Object.keys(typeData).length === 0) {
443 showError('No type data available');
444 return;
445 }
446
447 // Calculate tree dimensions - make sure container has size
448 const containerRect = container.getBoundingClientRect();
449 const width = containerRect.width || 1200;
450 // Ensure adequate height for all nodes - use more space per node
451 const height = Math.max(800, Object.keys(typeData).length * 30);
452
453 console.log('Container getBoundingClientRect:', containerRect);
454 console.log('Container dimensions:', width, 'x', height);
455
456 // Container IS the SVG element, so use it directly
457 const svg = container;
458 svg.setAttribute('width', width);
459 svg.setAttribute('height', height);
460 svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
461
462 // Background color is now handled by CSS (see #type-tree rule)
463 // Don't set inline style as it would override CSS theme changes
464
465 // Add a background rectangle to capture all mouse events
466 // Fill color is controlled by CSS via .svg-background class
467 const bgRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
468 bgRect.setAttribute('width', width);
469 bgRect.setAttribute('height', height);
470 bgRect.setAttribute('pointer-events', 'all');
471 bgRect.setAttribute('class', 'svg-background');
472 svg.appendChild(bgRect);
473
474 // Create main group for zooming/panning
475 const mainGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
476 mainGroup.setAttribute('id', 'main-group');
477 svg.appendChild(mainGroup);
478
479 // TopType is the root
480 let rootTypes = ['TopType'];
481
482 // Make sure TopType exists and has no parents
483 if (typeData['TopType']) {
484 typeData['TopType'].parents = [];
485 console.log('TopType found with children:', typeData['TopType'].children);
486 } else {
487 console.error('TopType not found in hierarchy!');
488 console.log('Available types sample:', Object.keys(typeData).slice(0, 10));
489 // Try to continue anyway with what we have
490 // showError('TopType not found in hierarchy');
491 // return;
492 }
493
494 console.log('Root type: TopType');
495 console.log('TopType children:', typeData['TopType'].children);
496 console.log('Total types:', Object.keys(typeData).length);
497
498 // Layout the tree
499 const nodePositions = layoutTree(rootTypes, width, height);
500
501 console.log('Node positions calculated:', Object.keys(nodePositions).length);
502 console.log('Sample positions:', Object.entries(nodePositions).slice(0, 3));
503
504 // Only render if we have positions
505 if (Object.keys(nodePositions).length === 0) {
506 console.error('No node positions calculated!');
507 showError('Failed to calculate node positions');
508 return;
509 }
510
511 // Recalculate height based on actual positions
512 const actualHeight = Math.max(...Object.values(nodePositions).map(p => p.y)) + 50;
513 if (actualHeight > height) {
514 svg.setAttribute('height', actualHeight);
515 svg.setAttribute('viewBox', `0 0 ${width} ${actualHeight}`);
516 bgRect.setAttribute('height', actualHeight);
517 console.log('Adjusted SVG height to:', actualHeight);
518 }
519
520 // Draw edges (connections)
521 drawEdges(mainGroup, nodePositions);
522
523 // Draw nodes
524 drawNodes(mainGroup, nodePositions);
525
526 // Don't append svg since container IS the svg
527 svgElement = svg;
528
529 console.log('SVG appended to container');
530 console.log('SVG dimensions:', svg.getAttribute('width'), 'x', svg.getAttribute('height'));
531 console.log('Container now has', container.children.length, 'children');
532
533 // Check the main group
534 const mainGroupCheck = document.getElementById('main-group');
535 console.log('Main group found:', mainGroupCheck ? 'yes' : 'no');
536 if (mainGroupCheck) {
537 console.log('Main group children:', mainGroupCheck.children.length);
538 }
539
540 // Enable panning
541 enablePanning(svg, mainGroup);
542}
543
544function layoutTree(rootTypes, width, height) {
545 const positions = {};
546 const levelWidth = 150; // Horizontal spacing between levels (columns)
547 const nodeHeight = 35; // Vertical spacing between nodes
548 const padding = 20;
549 const subtreeSpacing = 20; // Extra space between subtrees
550
551 // Use recursive approach to layout subtrees properly
552 let currentY = padding;
553
554 // Use the argChildren set from buildHierarchyLevels (already defined earlier)
555 const argChildrenSet = new Set(typeData['Arg']?.children || []);
556
557 function layoutSubtree(nodeName, level, parentY = null) {
558 if (positions[nodeName]) return 0; // Already positioned
559
560 const nodeInfo = typeData[nodeName];
561 if (!nodeInfo) return 0;
562
563 // Position this node
564 positions[nodeName] = {
565 x: padding + level * levelWidth,
566 y: currentY,
567 level: level
568 };
569
570 let subtreeHeight = nodeHeight;
571 currentY += nodeHeight;
572
573 // If this is an Arg child, stop here - don't layout its children
574 if (argChildrenSet.has(nodeName)) {
575 console.log(`Stopping at ${nodeName} (Arg child)`);
576 return subtreeHeight;
577 }
578
579 // Get children and group them by this parent
580 const children = nodeInfo.children || [];
581
582 // Layout all children
583 children.forEach((child, idx) => {
584 if (typeData[child] && typeData[child].primaryParent === nodeName) {
585 // Only layout if this is the primary parent
586 const childHeight = layoutSubtree(child, level + 1, positions[nodeName].y);
587 subtreeHeight += childHeight;
588 }
589 });
590
591 return subtreeHeight;
592 }
593
594 // Start with TopType
595 if (typeData['TopType']) {
596 // Layout TopType itself
597 positions['TopType'] = {
598 x: padding,
599 y: currentY,
600 level: 0
601 };
602 currentY += nodeHeight;
603
604 // Layout Arg subtree
605 if (typeData['Arg']) {
606 const argHeight = layoutSubtree('Arg', 1);
607 // Add extra spacing after Arg subtree
608 currentY += subtreeSpacing * 2;
609 }
610
611 // Layout Value subtree
612 if (typeData['Value']) {
613 layoutSubtree('Value', 1);
614 }
615
616 // Layout any other direct children of TopType
617 const topChildren = typeData['TopType'].children || [];
618 topChildren.forEach(child => {
619 if (child !== 'Arg' && child !== 'Value' && !positions[child]) {
620 layoutSubtree(child, 1);
621 }
622 });
623 }
624
625 // Handle any orphaned nodes (shouldn't happen but just in case)
626 Object.keys(typeData).forEach(typeName => {
627 if (!positions[typeName]) {
628 const nodeInfo = typeData[typeName];
629 positions[typeName] = {
630 x: padding + (nodeInfo.level || 0) * levelWidth,
631 y: currentY,
632 level: nodeInfo.level || 0
633 };
634 currentY += nodeHeight;
635 }
636 });
637
638 // Calculate actual tree bounds
639 const maxLevel = Math.max(0, ...Object.values(positions).map(p => p.level));
640 const maxY = Math.max(...Object.values(positions).map(p => p.y)) + nodeHeight;
641
642 console.log('Layout complete. Total levels:', maxLevel + 1);
643 console.log('Total nodes positioned:', Object.keys(positions).length);
644 console.log('Tree height:', maxY);
645
646 // Log the structure
647 const level1Nodes = Object.entries(positions)
648 .filter(([name, pos]) => pos.level === 1)
649 .map(([name]) => name);
650 const argChildren = typeData['Arg']?.children || [];
651 const valueChildren = typeData['Value']?.children || [];
652
653 console.log('Level 1 nodes:', level1Nodes);
654 console.log('Arg children:', argChildren.slice(0, 5), '...');
655 console.log('Value children:', valueChildren.slice(0, 5), '...');
656
657 return positions;
658}
659
660function drawEdges(container, positions) {
661 const edgeGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
662 edgeGroup.setAttribute('id', 'edges');
663
664 let edgeCount = 0;
665
666 for (const [typeName, typeInfo] of Object.entries(typeData)) {
667 if (!positions[typeName]) continue;
668 if (typeInfo.orphaned) continue; // Skip orphaned types
669
670 const childPos = positions[typeName];
671
672 // Only draw edge to primary parent for now (shortest path)
673 if (typeInfo.primaryParent && positions[typeInfo.primaryParent]) {
674 const parentPos = positions[typeInfo.primaryParent];
675
676 // Create squared-off path
677 const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
678
679 // Calculate path with right angles
680 const startX = parentPos.x + 100; // Box width
681 const startY = parentPos.y + 15; // Half box height
682 const endX = childPos.x;
683 const endY = childPos.y + 15;
684 const midX = startX + (endX - startX) / 2;
685
686 const d = `M ${startX} ${startY} L ${midX} ${startY} L ${midX} ${endY} L ${endX} ${endY}`;
687 path.setAttribute('d', d);
688 // Stroke color now controlled by CSS via .tree-link class
689 path.setAttribute('class', 'tree-link');
690
691 edgeGroup.appendChild(path);
692 edgeCount++;
693 }
694
695 // Optionally draw secondary parents with dashed lines
696 // Commented out for now to keep it simple
697 /*
698 if (typeInfo.secondaryParents) {
699 typeInfo.secondaryParents.forEach(parent => {
700 if (positions[parent]) {
701 // Draw dashed line for secondary parents
702 // ...
703 }
704 });
705 }
706 */
707 }
708
709 console.log('Drew', edgeCount, 'edges');
710 container.appendChild(edgeGroup);
711}
712
713function drawNodes(container, positions) {
714 console.log('drawNodes called with', Object.keys(positions).length, 'positions');
715
716 const nodeGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');
717 nodeGroup.setAttribute('id', 'nodes');
718
719 let nodeCount = 0;
720 for (const [typeName, position] of Object.entries(positions)) {
721 const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');
722 g.setAttribute('class', 'tree-node');
723 g.setAttribute('transform', `translate(${position.x}, ${position.y})`);
724
725 // Rectangle background - styling controlled by CSS
726 const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
727 rect.setAttribute('width', '100');
728 rect.setAttribute('height', '30');
729 rect.setAttribute('rx', '3');
730 rect.setAttribute('ry', '3');
731 // Fill and stroke controlled by .tree-node rect CSS rule
732
733 // Text label - styling controlled by CSS
734 const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
735 text.setAttribute('x', '50');
736 text.setAttribute('y', '20');
737 text.setAttribute('text-anchor', 'middle');
738 // Fill controlled by .tree-node text CSS rule
739 text.textContent = typeName;
740
741 // Add tooltip
742 const title = document.createElementNS('http://www.w3.org/2000/svg', 'title');
743 title.textContent = `Click to open documentation for ${typeName}`;
744 g.appendChild(title);
745
746 // Add click handler to open wiki documentation
747 g.addEventListener('click', (e) => {
748 // Open wiki documentation in new tab
749 const wikiUrl = `https://wiki.opencog.org/w/${typeName}`;
750 window.open(wikiUrl, '_blank');
751
752 // Also update the info panel
753 selectType(typeName);
754
755 // Prevent event bubbling
756 e.stopPropagation();
757 });
758
759 // Hover effects are now controlled by CSS (.tree-node:hover rect)
760
761 // Change cursor to pointer
762 g.style.cursor = 'pointer';
763
764 g.appendChild(rect);
765 g.appendChild(text);
766 nodeGroup.appendChild(g);
767 nodeCount++;
768 }
769
770 console.log('Created', nodeCount, 'node elements');
771 container.appendChild(nodeGroup);
772
773 // Check if nodes are actually in the DOM
774 const addedNodes = container.querySelectorAll('.tree-node');
775 console.log('Nodes in DOM after adding:', addedNodes.length);
776}
777
778function selectType(typeName) {
779 const info = typeData[typeName];
780 if (!info) return;
781
782 document.getElementById('selected-type').classList.remove('hidden');
783 document.getElementById('type-name').textContent = typeName;
784 document.getElementById('type-parents').textContent =
785 info.parents.length > 0 ? info.parents.join(', ') : 'None (Root Type)';
786 document.getElementById('type-children').textContent =
787 info.children.length > 0 ? info.children.join(', ') : 'None (Leaf Type)';
788}
789
790function enablePanning(svg, group) {
791 let isPanning = false;
792 let startX = 0;
793 let startY = 0;
794
795 // Mouse drag for panning
796 svg.addEventListener('mousedown', (e) => {
797 if (e.button === 0) { // Left mouse button only
798 isPanning = true;
799 startX = e.clientX - currentX;
800 startY = e.clientY - currentY;
801 svg.classList.add('grabbing');
802 e.preventDefault();
803 e.stopPropagation();
804 }
805 });
806
807 svg.addEventListener('mousemove', (e) => {
808 if (!isPanning) return;
809 e.preventDefault();
810
811 currentX = e.clientX - startX;
812 currentY = e.clientY - startY;
813
814 group.setAttribute('transform',
815 `translate(${currentX}, ${currentY}) scale(${currentZoom})`);
816 });
817
818 svg.addEventListener('mouseup', (e) => {
819 if (isPanning) {
820 isPanning = false;
821 svg.classList.remove('grabbing');
822 e.preventDefault();
823 }
824 });
825
826 svg.addEventListener('mouseleave', () => {
827 if (isPanning) {
828 isPanning = false;
829 svg.classList.remove('grabbing');
830 }
831 });
832
833 // Mouse wheel for zooming - attached to container for better capture
834 const container = svg.parentElement;
835 const zoomHandler = (e) => {
836 // Only handle if mouse is over the SVG area
837 const rect = svg.getBoundingClientRect();
838 if (e.clientX < rect.left || e.clientX > rect.right ||
839 e.clientY < rect.top || e.clientY > rect.bottom) {
840 return;
841 }
842
843 e.preventDefault();
844 e.stopPropagation();
845
846 // Get mouse position relative to SVG
847 const mouseX = e.clientX - rect.left;
848 const mouseY = e.clientY - rect.top;
849
850 // Calculate zoom factor
851 const zoomFactor = e.deltaY > 0 ? 0.9 : 1.1;
852 const newZoom = currentZoom * zoomFactor;
853
854 // Limit zoom range
855 if (newZoom < 0.1 || newZoom > 5) return;
856
857 // Calculate new position to zoom towards mouse cursor
858 // We need to adjust for the current transform
859 const scaleDiff = newZoom / currentZoom;
860 const dx = mouseX * (1 - scaleDiff);
861 const dy = mouseY * (1 - scaleDiff);
862
863 currentX = currentX * scaleDiff + dx;
864 currentY = currentY * scaleDiff + dy;
865 currentZoom = newZoom;
866
867 group.setAttribute('transform',
868 `translate(${currentX}, ${currentY}) scale(${currentZoom})`);
869 };
870
871 // Add wheel event to both svg and container for better capture
872 svg.addEventListener('wheel', zoomHandler, { passive: false });
873 if (container) {
874 container.addEventListener('wheel', zoomHandler, { passive: false });
875 }
876}
877
878function resetView() {
879 currentZoom = 1;
880 currentX = 0;
881 currentY = 0;
882 const group = document.getElementById('main-group');
883 if (group) {
884 group.setAttribute('transform', 'translate(0, 0) scale(1)');
885 }
886}
887
888function showLoading(show) {
889 const panel = document.getElementById('loading-panel');
890 if (show) {
891 panel.classList.remove('hidden');
892 } else {
893 panel.classList.add('hidden');
894 }
895}
896
897function showError(message) {
898 const panel = document.getElementById('error-panel');
899 const messageElement = document.getElementById('error-message');
900
901 if (message) {
902 messageElement.textContent = message;
903 panel.classList.remove('hidden');
904 } else {
905 panel.classList.add('hidden');
906 }
907}
examples/visualizer/vis-network/vis-network.min.js +0 -85
……@@ -1,85 +0,0 @@
1/**
2 * vis-network
3 * https://visjs.github.io/vis-network/
4 *
5 * A dynamic, browser-based visualization library.
6 *
7 * @version 10.0.1
8 * @date 2025-07-13T08:15:32.270Z
9 *
10 * @copyright (c) 2011-2017 Almende B.V, http://almende.com
11 * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs
12 *
13 * @license
14 * vis.js is dual licensed under both
15 *
16 * 1. The Apache 2.0 License
17 * http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * and
20 *
21 * 2. The MIT License
22 * http://opensource.org/licenses/MIT
23 *
24 * vis.js may be distributed under either license.
25 */
26!function(g,A){"object"==typeof exports&&"undefined"!=typeof module?A(exports):"function"==typeof define&&define.amd?define(["exports"],A):A((g="undefined"!=typeof globalThis?globalThis:g||self).vis=g.vis||{})}(this,function(g){function A(g,A){void 0===A&&(A={});var t=A.insertAt;if(g&&"undefined"!=typeof document){var C=document.head||document.getElementsByTagName("head")[0],I=document.createElement("style");I.type="text/css","top"===t&&C.firstChild?C.insertBefore(I,C.firstChild):C.appendChild(I),I.styleSheet?I.styleSheet.cssText=g:I.appendChild(document.createTextNode(g))}}A('div.vis-network div.vis-manipulation{background:#fff;background:-moz-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#fff),color-stop(48%,#fcfcfc),color-stop(50%,#fafafa),color-stop(100%,#fcfcfc));background:-webkit-linear-gradient(top,#fff,#fcfcfc 48%,#fafafa 50%,#fcfcfc);background:-o-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:-ms-linear-gradient(top,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc 100%);background:linear-gradient(180deg,#fff 0,#fcfcfc 48%,#fafafa 50%,#fcfcfc);border:0 solid #d6d9d8;border-bottom:1px;box-sizing:content-box;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffffff",endColorstr="#fcfcfc",GradientType=0);height:28px;left:0;padding-top:4px;position:absolute;top:0;width:100%}div.vis-network button.vis-edit-mode,div.vis-network div.vis-edit-mode{height:30px;left:0;position:absolute;top:5px}div.vis-network button.vis-close{-webkit-touch-callout:none;background-color:transparent;background-image:url("data:image/png;base64,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/GMzLdsAADvGaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTQtMDItMTRUMTE6NTU6MzUrMDE6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDE0LTAyLTE0VDEyOjA1OjE3KzAxOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNC0wMi0xNFQxMjowNToxNyswMTowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NjU0YmM5YmQtMWI2Yi1jYjRhLTllOWQtNWY2MzgxNDVjZjk0PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjk4MmM2MGIwLWUzZjMtMDk0MC04MjU0LTFiZTliNWE0ZTE4MzwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjk4MmM2MGIwLWUzZjMtMDk0MC04MjU0LTFiZTliNWE0ZTE4MzwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo5ODJjNjBiMC1lM2YzLTA5NDAtODI1NC0xYmU5YjVhNGUxODM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMTRUMTE6NTU6MzUrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjIxODYxNmM2LTM1MWMtNDI0OS04YWFkLWJkZDQ2ZTczNWE0NDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0xNFQxMTo1NTozNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NjU0YmM5YmQtMWI2Yi1jYjRhLTllOWQtNWY2MzgxNDVjZjk0PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAyLTE0VDEyOjA1OjE3KzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOkhpc3Rvcnk+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjc8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NzwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+cZUZMwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAA2ElEQVR42gDLADT/AS0tLUQFBQUVFxcXtPHx8fPl5eUNCAgITCkpKesEHx8fGgYGBjH+/v4a+Pj4qgQEBFU6OjodMTExzwQUFBSvEBAQEfX19SD19fVqNDQ0CElJSd/9/f2vAwEBAfrn5+fkBwcHLRYWFgsXFxfz29vbo9LS0uwDDQ0NDfPz81orKysXIyMj+ODg4Avh4eEa/f391gMkJCRYPz8/KUhISOMCAgKh8fHxHRsbGx4UFBQQBDk5OeY7Ozv7CAgItPb29vMEBASaJSUlTQ0NDesDAEwpT0Ko8Ri2AAAAAElFTkSuQmCC");background-position:20px 3px;background-repeat:no-repeat;border:none;cursor:pointer;height:30px;position:absolute;right:0;top:0;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:30px}div.vis-network button.vis-close:hover{opacity:.6}div.vis-network div.vis-edit-mode button.vis-button,div.vis-network div.vis-manipulation button.vis-button{-webkit-touch-callout:none;background-color:transparent;background-position:0 0;background-repeat:no-repeat;border:none;-moz-border-radius:15px;border-radius:15px;box-sizing:content-box;cursor:pointer;float:left;font-family:verdana;font-size:12px;height:24px;margin-left:10px;padding:0 8px;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div.vis-network div.vis-manipulation button.vis-button:hover{box-shadow:1px 1px 8px rgba(0,0,0,.2)}div.vis-network div.vis-manipulation button.vis-button:active{box-shadow:1px 1px 8px rgba(0,0,0,.5)}div.vis-network div.vis-manipulation button.vis-button.vis-back{background-image:url("data:image/png;base64,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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNTowMTowOSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTU6MDE6MDkrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOmI2YjQwMjVkLTAxNjQtMzU0OC1hOTdlLTQ4ZmYxMWM3NTYzMzwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpmOWQ3OGY4ZC1lNzY0LTc1NDgtODZiNy1iNmQ1OGMzZDg2OTc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTU6MDE6MDkrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOmI2YjQwMjVkLTAxNjQtMzU0OC1hOTdlLTQ4ZmYxMWM3NTYzMzwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNTowMTowOSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOmY5ZDc4ZjhkLWU3NjQtNzU0OC04NmI3LWI2ZDU4YzNkODY5Nzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4jq1U/AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAVTSURBVHjanFVfTFNnFP+d77ve8qeVFbBrpcVgRrCRFikFByLxwSAaE32oRCHD6JMxxhhn8G2RxxH3MsOTbyYsmCAxPMmMMYtkIUYmK60OO0qAK23BFlNob0uh3x7WS5jLZPpLbm6+k/P9zrm5v9855PF4UFhYCABgjIExBgAgIqRSqRIi6gDQRkQ1RGTB3wgR0e8AHgH4Sa/XR/EBiAiJRAJ04cIF5Ofng4g2n0gkUkxENwF0c843LzHGQEQQQkCLExEA9ALotVgsUQAQQmgNQhJCbF5kjCEUCl0moj4t5na7fTU1NUpVVVXUYrEkASAcDhe8efOmxOfzWScmJqoBdBNR99LS0hWz2dynNSSEAF28eBGFhYVgjCEcDn9HRD1EhIMHD3o9Hs9kWVlZAh9BKBQqGB4edr58+dKZ+6JbJpOpBwBWV1fB6+rqIMsyIpHIFcZYL2MMra2tY5cuXRrfuXNnBtvAYDBk3G63oqpqZm5uzgrgSDKZjBoMhueZTAbc5XIhFouVEtFTxhiOHTs2dv78eS8+Efv374+oqpqZnZ21cs5PJJPJPlmWkyynnBuMMTQ0NHi7uro+mVyDx+Pxulwu71ZOlkqlSonoJhGhvb39s8k1nDx50ss5hyRJN9PpdKlERB2aWjSVaEilUvzBgwcORVEs5eXloXPnzk1sV8BkMiUdDofP7/dXZ7PZDilnIhw4cGBeS1pbW2P37t1zBwKBikQiUUREWFhYsHHO0d7evm0Ru90+/+rVq2rO+XGJiJxEhMrKyhgAjI6OWoeHh5tWVla+4JzDZrO9bW5unhwcHGzz+/32np4e+xaDbfoHAMxmc6ijo2O0oqIiJkkSNjY2HBIRmRljMJvNyWfPnln7+/tPMMZQXl6+0NbW9qK2tjYcj8floaEhqKpq+HCkbD3PzMwYBgYG0NXV9UuusFna2kEgELAQEQ4dOvSis7PzN41Ar9dnrl27NqCNkv/C3bt3zy4tLVmICJxzEBFJRBQmorLFxcWCqqqq0Pj4eO3Y2JhbUZTdra2tL2pra8OJRGLHnTt3zkqS9K+huHU4EhHMZnMoGo0W5OIh7nK5jjLGKq1W69vDhw8rRqMxMjc3t2t5eXnX5ORklc/nM+fl5SWnpqa+0uv1K/n5+Ws6nW5NluXNd15e3ppOp1uz2WyzZ86cGQ0Gg6ZAIFCZzWZ/lYjokRDiuN/vt7W0tMw3NTUpbrd78P79++5gMFgRiUTKHj58WMYYQ3V19etTp05tq6Lp6Wkb5xxCiEfc7XZPM8a6FxcXTfX19a/1en2Gcy5qamreNjY2/qGq6joRZe12+9Tp06e3JY/FYgWPHz8+mhvr3/CWlpbk+vp6PmOseWVlBS6XS9GSJUkSdrs93NDQ8Oe+ffvC/8fJIyMjddFo9Esi6pVleVjT2m0A8Hq9zqGhIefnjoknT544A4GAM/eDbxMReFNTE0pKSpKqqsaI6Pj8/LxVVdWM3W6PfCr5xMTE1zllXS0uLn6aSqXAGxsbodPpoNfrn6uqCs75EUVRrJFIZMfevXsXdTrdxseIE4mEPDIyUu/3++tynd8yGo29RIR0Og26fv06ioqKwBgD5xzv3r27zBjrIyJIkgSHwzFZWVmp7NmzJ1ZaWpoAgGg0WqgoSvHMzIw1GAw6tvjhitFo7NPW5fv370Hd3d0oKCgA53zTQMvLy+VCiKuSJH0rSdLmztZytIWv5RPRD0T0Y3Fx8dzWfby6ugopHo//w4mcc8iyPMc5v5FOp7/PZrOdQohWInIC2C2EgBBigYi8Qoifs9lsv06nWyIiaFxagXg8jr8GAGxuIe7LBeWhAAAAAElFTkSuQmCC")}div.vis-network div.vis-manipulation div.vis-none:hover{box-shadow:1px 1px 8px transparent;cursor:default}div.vis-network div.vis-manipulation div.vis-none:active{box-shadow:1px 1px 8px transparent}div.vis-network div.vis-manipulation div.vis-none{line-height:23px;padding:0}div.vis-network div.vis-manipulation div.notification{font-weight:700;margin:2px}div.vis-network div.vis-manipulation button.vis-button.vis-add{background-image:url("data:image/png;base64,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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNDo0MDoyOSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6NDA6MjkrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjVkNWIwNmQwLTVmMjAtOGE0NC1hMzIwLWZmMTEzMzQwNDc0YjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo2OWVmYWE1NS01ZTI5LTIzNGUtYTUzMy0xNDkxYjM1NDNmYmE8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6NDA6MjkrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjVkNWIwNmQwLTVmMjAtOGE0NC1hMzIwLWZmMTEzMzQwNDc0Yjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNDo0MDoyOSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjY5ZWZhYTU1LTVlMjktMjM0ZS1hNTMzLTE0OTFiMzU0M2ZiYTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz5WKqp9AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYXSURBVHjafFZtUFTXGX7e9z27sveuMCwYV8ElrA7YSFYHtJUPkaaI0aRqG8wP00zUzljDINNSA/2ROtpO24SxnahlxjYd7SSjmUkymcxYlDhQPzHGisEVp8HwYWCVVVgEsrsuLnL74+5uqTF9Z+7cO/d8PO95zvO851BlZSV0XQcAMDOYGQBARDhX3JRmMDYZwLPMWAzGHACYIgwS46oBNBNwtOL8CwE8EkSEUCgE2rJlC2w2G4go8Zwo/bMDgnoG6gxLfAAAYvPDMCCszKTAMIAGAhrWnf15AAAMwwARIRKJgDZv3gy73Q4iAjPjxIr9VVOMRhbAYKB8zvrO0llrfEsdKwLZek6YAPSFvtSu3GtLawu0ZJ6625SHGBQB1T88t6MxvopgMAjaunUrdF0HM+P4yv27DMYeJmB1RqW3Jnf3tQX2p0L4P9EXuqEd7PmDp+XuMU9sRbvXnnt1TxxACgoKYLVacbzsQDUJGkSATe6qi28uPtzusM6Kxie6NHLGUX3lxVUNX9StPHnn4wy3njuUYcu6n2pNi66avcEXnByP/nv8aiaIyrqz2gO5A9+9FI1GIfn5+WhZdTAdjFMkwMvZOy7uWnTAOz3L4Yk71m3t69fdfTDoUGTBeHTUfiHQ6lo7Z2OXJvpDAChKe+aOCdKRKWxZ2+1qb3yyd3GYmRkQ7GQBVs99wfv6on3eR2k4PdTkDEbH7IuS8/svld/561PJS/pDk1/bzwx94pze7xc5v/H+YPY6r5BAkdrJzODTK46lE6PeYEJt7u+8j+OZwCBiEAgAoNgKJoEQf6PvNvdrXgtZoNhSf7q0KZ3B2AQmVMze0Jmt54S/DcDCVig2NcvEUGxJAE4Pl+YOr0iv6BRSIPAmBeBZAmHlE2sH4p1uhrq1s0MnnEQMBsf8wRASAICQQCCITN1X7/sOuc0kgOVp3/fPs2WHv+coG7gQOJUnLGsUCTxEjPzUohEA+NfIWUdtx0+efzA1kSSkIGyBAQNCKgHAEBAJ3u79U7kiAcWoem/gb5Fd33nrH3kp+SMWtuAB+GllMJxMjCx9QRgA3uiqL5kwHiTlpxb3smlfMDGYGPP1hcMAkJvs8ScpfdJspdj+MK6Pf+5+u29vyb4lR4+BGEziVESAkEpw6Av1OhUpHCz4qOXbzFWz4Ncdj/v/o08Lt92ODDgZDCEFJYoUGH4mzugP92puPTf0pD3H7wvfdFZdqSxnMtWjoGAAmG9fOLxjwesdjT2/XzIQ7ks3sycYMSEwGHNtWf5bkX5NkYCJBxUBXiGV0XHvosOt54Zey33j/K+8P33++vjnbiGJbbLE+J9SANAb6nJ2B79wcUwETAwQQ7fMjPzMvfP8ja87HUIKMOiaAqMZhrGmLdAy78eZrwwsTS0eObTs+IdtgVanxBUExqGbb5VzrIISGIoUXsmqbgEhJldCQWqRf27SvPAn/o8XmgLhZsUkR4ll37mhk3n94Z4OlzY/7NLcYZfm7o1z2zT4vsvUNSXqprBCkmiTFbPX90/fh8GIT2sf+zTPdDMf4dVnNg4z+E0ixsGeBs9jd5ViSgLHjCb/peaR+MD3d4/ZJg2llyuG2Vwy7QWAs8PNnn1f7vkGSGxAzE6mk+kxkx/p/4unffSCR0hAoL1EBCYiPNdWNcwkNQTCR7feWX6g+7f/A7I8rcw/U6UEe0Ndrhc/W7mtL9ztmqlSgstSS/zTJ28dalpOpkRryrwbhwBACgsLMWPGDOT4ll3qyeqAkJTdCF7P/CrUY/GkLL1rE+2hTbSH8+0Lb/WEuhzhyaA905blf9Vd/895WnZwLHrPevir/cvOB1oLYpTtLrm6oYGIMDExAaqtrUVKSgqYGSKCk0WHq5ikkWEWtNL0imv5qUW+RclLRjJsrhBAuH1/QL8R7HR4xy5nescuP23E6hOA6mLv+sb4uTw6Ogqqq6uDpmkQkcStorX4XRcM1FjZ+kvFFjCJKU1WpkNJJUqIMtX1RyLeX3JtQ0JRhmGYZ/L27duRnJycuFGISOJ9pqh5lrB6iYgqGOxRrOaa54DcZmKvkJxk8JHC9rKh+KVhOsD4+Dj+MwADIf8n5m4xGwAAAABJRU5ErkJggg==")}div.vis-network div.vis-edit-mode button.vis-button.vis-edit,div.vis-network div.vis-manipulation button.vis-button.vis-edit{background-image:url("data:image/png;base64,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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNVQxNDoxMjoyNSswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDVUMTQ6MTI6MjUrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjY5OTM3ZGZjLTJjNzQtYTU0YS05OTIzLTQyMmZhNDNkMjljNDwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDozOWNhNzE5ZC03YzNlLTUyNGEtYmY1NS03NGVmMmM1MzE0YTc8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDVUMTQ6MTI6MjUrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjY5OTM3ZGZjLTJjNzQtYTU0YS05OTIzLTQyMmZhNDNkMjljNDwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNVQxNDoxMjoyNSswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjM5Y2E3MTlkLTdjM2UtNTI0YS1iZjU1LTc0ZWYyYzUzMTRhNzwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4ykninAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYpSURBVHjafFZtTFvnFX7Oea+NudiY2Hwam4CBlgQwXdKREDKUoYg0jbRJ29RJ2VZ1mjRFUxSpA3VTfkzJfkQbS7spU6rtx5Z2UtppScjaHxvLuiatWi2jLEoMIUDCh23g2gbj7+tPuPvhOurawPl1dc99n+c55z33fV46ceIEZFkGADAziAgAQERoe/9ZK4GPM/AcgbsIXAcABCgMvkfAqAa89eDoJyF8LogIqqqChoaGYDAYHr8kItS8uc8iIH6iAa9IkAo5EAQX8pqmgUVBCBggYFgDhv0/GAsBgKZpICJkMhnQ4OAgZFkGEYGZUXmp+0cS+CKBwWA0DVRPOg5Zl2q6zaHyJlnVAMQXVTkwHrUqH0Xsvn+tdQAAMQDgpPLS2MViFY8rkGUZzIzaS/t/xqCzGggtz9e697zsnKhoLUtim4jOq/LE6x7X0nsh16dEZ5a/O3a2SCAOHjwInU6Hujd6ThJ4mCDQ+b2G232v7v6vwarPbQn8MGlMr+X0kpE3Wr5Zt5hL5HPhqYSdQIfKJ+yhxDPKWC6Xg+jt7UXD5b5KBt1kCHS85Ljd8/On3NupfnhFaZj4rWff1B98B1R/hnUmKd36bdtCNl4g0en4edNE/cXwLq8qMTMIPAQwmo/WuHvObA8+9c58k/dKtD0TyZWXN5YGA7ej7epKxspM//7SoNOdWc/Jyq2wiwhDzPxT8cP0jys3VMM7OmL0/77zn4Ydui3b8uiK0jD7RrA77c9Wd57cefPpF+2T6bWsFPWkaiPTCWvTsZpHFU+XrS+8G3AR08F6X+1FJvBxQQzHQOWk2SmrW4FPX/U2LVwPuDZj+fJKl2khPpeyAqA9rzR/YqwuiWXX8taN/CabGkrVuq9YJlkQQDjOAJ5jAhz9Vt9W4N5/rNp8I+vtMV/aZm4zLnUNNt0urdYnF68HWoJj4Wo1mLGUNRr8LEgDgNqeCh8xQIKOsgC7iAjVe83rT9zQa8uNM28u70kspessu8q8zq/V3NcZpVzb9+0zmVhOvvvrhaMVzrJg0zeq7xMVCCwdpnWSGBqjUyJwLTFgbvxie3w31uoWR1Y74r60rdxZqrR8q85t2W2MGCp12bm/KC3hyaSTiMhxuGrKcahqpbjOaDOoEhOEoFqJQCCJvqA85I6bfTdDjQlf2lbxVNlS6wt19yy7jRHZZlDnrinNj/6sHMhnNw2Ogco7O79e5fm/xQywRBBCEAuwn4gQ96bkYj4Vyuq9N1Z3Bj4Od5bs0MXt/dZZ21ctiqFan174q985P+Lfp+U1g7XDON/1ctP458WlVjLyJhOISZE0wM0S1QfuRC3lTjkJAKKEtNC9eIOhSh9xHLZOJRZTFuXDsEoStLkR/768ummsaJG9Pb9oe+9J+xaeSVokiQDSJphAo5uaBuWjiKP4QTqS1cUWU7ayesN66wu22frD1vmVW6GW6T8u9eVjGyZzs+w78Nqu0a2mbvVu1KEJQAgeZRL0liQYyx+GOmKeQpu0rMYsAJPNEFGD2dLodLIy6c9Ys7G8yeSUl3tf2/X3rcBVJSOv34l3sCBogi7z1LH/rBHjl4IJ93/ncQFAnjeImJD0Z8zuCwu9q3djDXqTlAKID5xv+9t2R8n8VcUFBljQ8Gyfe40BYBM4DwDLt8Kue79ZcFkbzfEdbUbv+oN4c9KTtsfm1MbYQqqh+2zrVZYKs/7Ef+byimt1POYiJhDhPBFBIiIEXhxfs7/dfYoIF+auBfYTE/pebx/V8hqBP2ODvD34yvuh/WCAmU75Bx6sIgaI/v5+6PV6JLqUsYr7dpDAoehs0h73pHTWrvKgThYbRSt9UmSjef3MpaUvBz4O72UmADgTOPJguGiZor+/HyUlJWBmJFz+D8xTtlUiOpbwpmrmrweeSXrT+g11k4SBN3RGKUcAVCVdFhyP1nreDbY//NPyEXUlU/Pp4XYycGT6V0Ux2WwWdO7cOZSWlkII8diX7SPPNgDaKdbxoNAxwATBAEkEEgSWCEQAqPAMwqvMdCEwMO0tVqZpWsGTT58+DaPR+PhGIYQAAAgh0P7B3ioW/B0iGiCGiwXbCuOHFSJys6AbYFye2T+xWhT3WYJEIoH/DQBMw3kes8OJPgAAAABJRU5ErkJggg==")}div.vis-network div.vis-edit-mode button.vis-button.vis-edit.vis-edit-mode{background-color:#fcfcfc;border:1px solid #ccc}div.vis-network div.vis-manipulation button.vis-button.vis-connect{background-image:url("data:image/png;base64,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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNDozODo1NyswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6Mzg6NTcrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjlmYjUwMDU0LWE3ODEtMWQ0OC05ZTllLTU2ZWQ5YzhlYjdjNjwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDo3ZWRhMjI0MC0yYTQxLTNlNDQtYWM2My1iNzNiYTE5OWI3Y2E8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6Mzg6NTcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjlmYjUwMDU0LWE3ODEtMWQ0OC05ZTllLTU2ZWQ5YzhlYjdjNjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNDozODo1NyswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjdlZGEyMjQwLTJhNDEtM2U0NC1hYzYzLWI3M2JhMTk5YjdjYTwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4ubxs+AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAUtSURBVHjajJZ/bNT1Gcdfz/P53PV6B4W7VltLqdAaplIOiMOoyxxJCSs/Gv/yB4gzJroAosmmDklwkYWR0bQsdmkykoojTpcsWYLxD/lRZdMQkTHRtkLZRqG0tIVe7662vTu43n32x/VKZ/jh89cn38/zvN7P5/l88zwf2blzJz6fDwARQUSm1n8s31CM0/VAnbNmsUPuAsDpgEO+Bg4C7//iyv5hvmMiQiqVQpqamvB6vVNwEeG1JZtCBrYi/MrkAwDNgjhwAlbzICBLA0rDb0+/839C6XQaaWxspLCw8Dp86cbNmqVFJQddE6KzdjZ9D89g+B6fSyCOcyn1nxil+O9xKg5HqWFSHGXLjrP7W/ICqVQK2bNnDz6fDxFh65KNvxbHDhF4rJj2bXPo+IGfcW5h5xL4f99P+FCEMIAob75x9t0dAMlkElNXV4e1lteXbNqiQoMaeOFOjrdU868SD2luYyEP6dUh+sYmSHeOU6GO5Z8VLx5+NNZxIpPJ5AS2L3upROCoCvz8Lo7vnkf77cAHhpiz/zIL9vWz8L8p/NvupmM0Q7pjnAoLqz8tDrc8MnQqYVUVhVdF4LEg7b+rvDn8wDDlH0WoPpukLJImSBaMwjcJqmwWts2jPZLG/8kwYVFeVdXXZcFf4yVDc2cNKfBFmD9X+0ncCP58F48eG+Feo2CAUkvs4dl0V/uJvdXLiiV+ut++n7YLSfxPfMMG54ChzB3WIesVWB2i82bw1AR6fJR7C4VsfYiv6u/k3A9nEgP4zXke8DiYHyAOMK+QxPIgnZ9GqSHr1itQJ8DK2fTerDQ+S/bHRXQJaHSCwNIZ2Xh+7+S3VAmwNMBA/tuPZtErgKquUmdMWIFlRURvdamRNEXGwIWrlP47pTMzLiunxghGMwTLvcTWlHAp77s4QNSrYMQtss6ZMgWqCm5cHoDHO1nbk6K8zEN8+3zatv2Hn1b59EqJZdxmYUERg9P9KwpIiAOTdWUWBXuLzB/vZG3P1Un4PNp2d1MbmyD45TWCxuCsQm0x56bHGHFYEZwxok7toAA9Sfw3hCcoL/NOwi9QO5wmWO1j4JEgZxTkodmcWRGkf3pcX0r8xoAaBixKu4U5/xwndM+0tpAvS6mP+PZK2nb1UBvPEKwKMLDvPj4ESGc55lGy303sdJKQdZB2rkMdctAB/4gzN+/Q2ENNd4LyUi/xN+bTtquX2thk5nk4wI3gAF+OMNcA1nFQDfK+BY5GqbkwWabTY5QZhXWlnNx1ntrY1Rz87fuvw29m/Sn8J+PUGAFj5T19baA1IspuBZp7cx1x4SwG1cEf+lgRSROs8jGwb+Ht4QB/GSSsAhYano39LWIBxNEIbP14hPDuiyS2VtJuHXQlKKvxM/jiXDq/D/xPlwifGMkJZB2NIoKpr69nxeiZxLHicFSFVWfGqBidIP3LSjrWltD94CyufF/4kQgPuVz2Lz93+dDRa9eu5QQ8Hg8/iXee+Dy4CKMs7xqn4nwKz9IirhQqmVuB42m8ey+x7LMoD6iAON782eChhqmRuXfvXgKBAKqKqtI0/8nNKrQI4BVYXkzHgzPpC88gWuHL/caXrhLoGiN0apSKr0ZZRBZM7q2w5ZnLR1oAnHOMjY0hra2tFBQUYIyZmstvVT1Z6eDlAuEVq7merxmwueNPDXy9PvybjKP5mctHLk4/XTKZRJqbm/H7/VNw1VyEMYbW4FN3WNWnnchKoy5sHeVGBRX6VWi3ymFx7r11Ix8MTX/y5C2RSPC/AQB61erowbpqSwAAAABJRU5ErkJggg==")}div.vis-network div.vis-manipulation button.vis-button.vis-delete{background-image:url("data:image/png;base64,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/GMzLdsAAEEOaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjUtYzAyMSA3OS4xNTQ5MTEsIDIwMTMvMTAvMjktMTE6NDc6MTYgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiCiAgICAgICAgICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC94bXA6Q3JlYXRlRGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNC0wMi0wNFQxNDo0MTowNCswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMTQtMDItMDRUMTQ6NDE6MDQrMDE6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjc3NDkzYmUxLTEyZGItOTg0NC1iNDYyLTg2NGVmNGIzMzM3MTwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC94bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE0LTAxLTIyVDE5OjI0OjUxKzAxOjAwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6RUE2MEEyNEUxOTg0RTMxMUFEQUZFRkU2RUMzMzNFMDM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDEtMjNUMTk6MTg6MDcrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpPC9zdEV2dDpzb2Z0d2FyZUFnZW50PgogICAgICAgICAgICAgICAgICA8c3RFdnQ6Y2hhbmdlZD4vPC9zdEV2dDpjaGFuZ2VkPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDowNmE3NWYwMy04MDdhLWUzNGYtYjk1Zi1jZGU2MjM0Mzg4OGY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTQtMDItMDRUMTQ6NDE6MDQrMDE6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAoV2luZG93cyk8L3N0RXZ0OnNvZnR3YXJlQWdlbnQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpjaGFuZ2VkPi88L3N0RXZ0OmNoYW5nZWQ+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5jb252ZXJ0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmRlcml2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnBhcmFtZXRlcnM+Y29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmc8L3N0RXZ0OnBhcmFtZXRlcnM+CiAgICAgICAgICAgICAgIDwvcmRmOmxpPgogICAgICAgICAgICAgICA8cmRmOmxpIHJkZjpwYXJzZVR5cGU9IlJlc291cmNlIj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmFjdGlvbj5zYXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6aW5zdGFuY2VJRD54bXAuaWlkOjc3NDkzYmUxLTEyZGItOTg0NC1iNDYyLTg2NGVmNGIzMzM3MTwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNC0wMi0wNFQxNDo0MTowNCswMTowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OnNvZnR3YXJlQWdlbnQ+QWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjA2YTc1ZjAzLTgwN2EtZTM0Zi1iOTVmLWNkZTYyMzQzODg4Zjwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpFQTc2MkY5Njc0ODNFMzExOTQ4QkQxM0UyQkU3OTlBMTwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjczQjYyQUFEOTE4M0UzMTE5NDhCRDEzRTJCRTc5OUExPC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyMDA5MC8xMDAwMDwvdGlmZjpYUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6WVJlc29sdXRpb24+NzIwMDkwLzEwMDAwPC90aWZmOllSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpSZXNvbHV0aW9uVW5pdD4yPC90aWZmOlJlc29sdXRpb25Vbml0PgogICAgICAgICA8ZXhpZjpDb2xvclNwYWNlPjE8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjI0PC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4aYJzYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAYGSURBVHjalJZ7UJTnFcZ/73m/72PdJY1RbhoQp6lkXRAvmIYxdCUadLVOozPNtGObap1JsKipjiShbdoRbeKEiQHpQK3xj0xa03aamTbaTGyAYV1QGeqFi+JyiZFLAlmESBkWRmS3fyzslGkmnZ5/v/M873Oe75zzvqqoqAibzQaAiKCUAkApRdHIK/NFsx2NR91nOSILADDoJyzNaM4xxbtvPHh0iC+JiYkJ1OHDh4mJiUEpFSXPv/ziPC28TIiXDCOSrAClQDSEpsCwJPIhrEBRQpiSytXlQwDhcBilFPfu3UMVFxdjt9ujFTzfcLBADCoEEAFr1ZbrrNjch2vtEImPBgHob7fTcWE+bVXJNJ/NiFQlEGLvieXHKmYqGB8fRx05cgSbzYaIsPvywV8pKFaA7fGtLTzz61YWpo/xVTHQbufsq5lcez9zWuWhk5mvFwMEg0H0+vXrMU2Tn1wp3CtCiQ5DjGd3A/m/v8IDCZP8r4iNmyRrWx/j/5qktykZpXKzAjVDVxPzGqemptDr1q1jX3NRnIJarcDKK2hgR2ULXRfncv7UYv7xpovhnhiW5Mz+kefeSKO6LJ1A1xzEuk/Ojm4mRibpuZaMZW3OCtRUND60NmiICCIUShisx7a2sLMiQn4s77uEQgIabnqdfHIlgT1/qQeg8vs5dHhdCNB1wYn3RIiC995j26stjAbsNH+YiZJCESnS1Y/XxIXu8r4YIPv/VkVs3CTnTy2ms34xro1+sp9po6sxlTu34ultmsPVvy6is86FCHgO+DDs49zpjufBpCG+seYOC9OHaTidieicb9ouVAhKtouAseI710ma7pLuqwmgYfHqAFt+6WdLoQ/LBl11Lm7VudAa8vb72PCin9TlAWIsGGhLACD+kSAZnusYBii1XQAPYWDllt6ov2lrBkDBR2+6Ofuak2//3M+G/T4wAAPW7fPhKfRTVeqk9qQbFKRmDUTxS3N7QYGYmwzCkqklBGlPDEcTNv+sg9tNCbTXuvBWujE0bHrZj9JE1B/wU1Pm5PwJN6YBS9a2kVvQEcWnrh5GTFD3lxkYkqRMgYQlwVldUvDnen73LHTUuqitdKM0eAr9AFQfd1J/yo2aJn+2sn4Wdn5qEFODJskgBIjx5T0uCrQA08pnIjS9PERDjPnfOKXAMEBECUoGEIHBj+2zkt76UQ6dXheGAev3+cg74Kf6uJPqcicbfuond7cPy4SOiy7+tD9nFvZurx00KOk3CNEC+mE+vjSPBc7IWqgqTaPT60IMcO/xsXGa3HfKjRgRdbl7/KDg0jtubje6aHj7c7J3dgLQ2zoPwwQ91SooOQdAW1VKVMHty0kA5Bb48BycJn/LjWFGbLv4thvvb53kFvjJ+XEdWkPfjQVR/CcNKYgGMc8JWt5Fa2j+MIPPuyI2pa4IoHSkt6vLIuRaQ9q32khzt4GCxtNu6k46GeiIR2lIfDQQsafPzq1LGRGL9Gk9d+vrwewvfHPQOoexQVjxdB/auk/zmaUMdsfz6bVUtIalT7bxveP1ZHh6GPDPYeSzeD69kcpIfxymFWLNrka+ljhBTWkWwz2JiJT84YHnz2iPx0P20PkmRF5i6HYiwZFJsn/YzdezbzE3cQibY5xV266z6RfXohakb+xB9CjanCD9qTbW7Grk4WV38VZm0l6dhQiEw9taHSuDqrS0FIfDwXM3X9mHMsvRAk/sauDpQy38P+GtzOTGB9mEpkD0C2dS8n8zOjqK9ng8WJZFU+JTjasGvaCNXPpvJBPoMlm0OoDNMfWVxONfWNSUPUZ7TUQ56tCZlPwSgMnJSVRpaSmxsbFE1raw82ZxAZZRQUiBYUKGp5UlOX2krBzmoUVjiIKhHge9rfPo+Wcy3ZeXIYASgL1/X5RfMXMvj46OosrLy7HZbGitUUohIuzoem0RofALaOsghgWGjky0MiJTL8b0lOvI8hN1DKXKP0jd3TNTWDgcJhgMoo4ePYrD4Yi+KmaeLlprnrtXFo9h/AAlG1AqE8yFmBrC+jO0bgH9EVpO/1F2Dc5g//OAsbEx/j0Af+USsQynL1UAAAAASUVORK5CYII=")}div.vis-network div.vis-edit-mode div.vis-label,div.vis-network div.vis-manipulation div.vis-label{line-height:25px;margin:0 0 0 23px}div.vis-network div.vis-manipulation div.vis-separator-line{background-color:#bdbdbd;display:inline-block;float:left;height:21px;margin:0 7px 0 15px;width:1px}');A('div.vis-network div.vis-navigation div.vis-button{-webkit-touch-callout:none;background-position:2px 2px;background-repeat:no-repeat;-moz-border-radius:17px;border-radius:17px;cursor:pointer;display:inline-block;height:34px;position:absolute;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:34px}div.vis-network div.vis-navigation div.vis-button:hover{box-shadow:0 0 3px 3px rgba(56,207,21,.3)}div.vis-network div.vis-navigation div.vis-button:active{box-shadow:0 0 1px 3px rgba(56,207,21,.95)}div.vis-network div.vis-navigation div.vis-button.vis-up{background-image:url("data:image/png;base64,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");bottom:50px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-down{background-image:url("data:image/png;base64,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");bottom:10px;left:55px}div.vis-network div.vis-navigation div.vis-button.vis-left{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAABt5JREFUeNqsl2lUlOcVx//3Pi9DZRsGBgYiS2RYBQKIjAhEJW4pNrXNMbZpWtTGNkttYmJMG5soSZckRk+0p+dYPYY0Gk0ihlhRj63GhVUgBhDD5oIOy8AAMwzD4lCYtx+GqCQKuNyP7/Pc+3u2+7/3JUzEZFBYLh62S7yIZDmVBEIBqOwsQ4DNdtBFASq2A4cuZAwVgCCPF5LGHM0Chz+E1XamzUyAzCMO7IhMI+5MDCK+HpCANd+U2rYgC/Y7BoflYgVA2RAOoNYtyjDTe45+hk96e5QywaJR+NsAwDhocK61VCjLTYWaclNB0OW+en8mhl22g8C/rn7U+uGEwdov+C0i+Q0mIFWzoD7zwVU1czQ/6pjIreR3HPX5VL9jalHXiQgmBoH+XLHAtH5csDaXtxDLLzIBv5jyfOmG2H9U4S7snbpX43KaPpgBIhDx1rPzOlbfPC5GQT/nd1mS1zABa6PfPf5y5F/rcJeWpp7fPkly6f7KXBRCoOSATFfXll19x74HDsvFCghsJAG8HrvlvytCXm7EPVqc5wyzp5NX15muE1omKXXyMnd9yy5r5Q3wPghvJzrLAlimXV38+7D1DbhPFq1M6O4b6rPVWKsCBfHi5EWWv9TkQBYAEPpLvERMC9N8FtRvjt9dPl6wwo5jPvuas7WV5jNqEjz8wA+CBsaan+w9x1hrrXJtuaZX97ooLfqPLCUEGRR+iOwAsF2X98Uc30W3fb02u41frVqeVmo6FUkkwCAwCWxJ2Ls/0TPFNBb8TNdp9WvnVz4OAKdmX2QOzcMsAAjziDGMBd3asCF6SXHyknJTfqQTK+zpvhnVKT5zawCgzFTgN94pJXvP7gxxjTAIkpB+MnSWRMQZYEDnPVt/K4ejbZ/77726Lb6h95tAAiPELaJ1bcTbRfGeM8xv1azWSeyEa0P9igk+Nr1+oNFfkpwzJCJKIQA679ntN08yDXYo3qh+LuUrc0E4EcNL4dP7VNDzpU8FP3vpekoQQ5CEw4bPdEfa9+sAgEZUmkmAAAS5hLQ9p11XGO+pM8V5JLUfMeQARDMlEMKIGFOVCZYb0C7Fz0oeXmIZ6nZzYoV9od/jVS+GbahUOnn9b7T6sEOviUGyA8bMDlUa0W79wBW/bZf+lrY98cDBUI8YCxGDgHCJiVVEDN8R7QWAE8Z/+1mGut2i3eP1r0S+XRztkdBzq6NbF7WpbF3UprKxjvfHxbrfttla/QBArVDbJJIAQCURMRg8ugrKIAKBSNxzHtN3VdmxY0iQYSZmTeegwTlgknYAAB7RZBh2Nm7urbeeC1r19ROT52kWn3shfH2Fu1AO3RxjY/0fdac7/hPPJMDE11GC+HpBJmIEuAS3Oa6w01lybMbMgvgCE6O255zy24DeCr/Bvckn9+u8ZjXYIYvjxoMJy8oeXZrT9GHIqMWTwA2oI6cFMeDIcAiSEOyibXsmZG0hAFzuq1OyY6xBAnMJgdPOmks08zU/bbsB9x18P37PqS/b8+o/a96ZcLm3PmBH46Z5x40HW1eFvl4Uq0w0MwiCBOb7/qTsd6GvVY537DXWas1Iw1AiNJnOgwJi+bXhAbE08OnvaXSIW0TvYw88eaF/uM/WNdju3m5r9TlhPBzVNNDoPGC/5tRma/GJ80xqjPPUjVuvP2narrMOWd1Jlv/E1fN782UiNPZf9C/qOKa+ndOz2j+cz046sn+6KrVOsODirpOxld0lUxmEBK/ktvGgFd2l6taBZn9BAtEz5xYIvAn4/8rFKkgstAyZ6Yf+S67ezlkiSU73XXRV6xqh93TyssR4JF75efBvymLdE03jgT/Wb5tutLWpGbTm7wHZxQQAT+yDuKLyHRIk4cnAZ4pfCF9/HvfR9uh3xBxtz00BANsVDylnac6wAICaHMiBmW5NRLy4trcq0MtZ3RnpHme5H9AvjYeCc1t3pzMJgOSVnyw4eHZUB9Kyu68iMFPpysSppab8UJVC3Rnp/pDlXqF7mnYsdKQbv7cr6fDGW/Zczbt6jgUtV6kIlFxuyg/tH+6zJXmlGe8G+mlzdsyB1j3pTAwZ9q3/Sspbc9tmDwD0H3UffXCFlyuTlFpnPRdYb612c5c8+idPCu6fCLDKUubzsf6fSaWm0wmO9hbvZU8fDR2zoZ97OuppAu0UJEDEmOISZohT6q7Gek5rD3GN6FEp1DaAYB7sdNYPXPao7anS1Fmrg402g7+jYhGIaOXOaQc+uONfmCwZXJIf8xKx2KRgxYgOS+CROuyoyQKCxIhkOr4T6JWgxGnvZ1HWnf/CfHcBXxcnpRHxYwRKkUjSErFKkAQiNjP4kmBRTHbKm5KkKxwL+K39fwDX1XGF8ct++QAAAABJRU5ErkJggg==");bottom:10px;left:15px}div.vis-network div.vis-navigation div.vis-button.vis-right{background-image:url("data:image/png;base64,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");bottom:10px;left:95px}div.vis-network div.vis-navigation div.vis-button.vis-zoomIn{background-image:url("data:image/png;base64,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");bottom:10px;right:15px}div.vis-network div.vis-navigation div.vis-button.vis-zoomOut{background-image:url("data:image/png;base64,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");bottom:10px;right:55px}div.vis-network div.vis-navigation div.vis-button.vis-zoomExtends{background-image:url("data:image/png;base64,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");bottom:50px;right:15px}');A(".vis-overlay{bottom:0;left:0;position:absolute;right:0;top:0;z-index:10}.vis-active{box-shadow:0 0 10px #86d5f8}");A(".vis [class*=span]{min-height:0;width:auto}");A('div.vis-color-picker{background-color:#fff;border-radius:15px;box-shadow:0 0 10px 0 rgba(0,0,0,.5);display:none;height:444px;left:30px;margin-left:30px;margin-top:-140px;padding:10px;position:absolute;top:0;width:310px;z-index:1}div.vis-color-picker div.vis-arrow{left:5px;position:absolute;top:147px}div.vis-color-picker div.vis-arrow:after,div.vis-color-picker div.vis-arrow:before{border:solid transparent;content:" ";height:0;pointer-events:none;position:absolute;right:100%;top:50%;width:0}div.vis-color-picker div.vis-arrow:after{border-color:hsla(0,0%,100%,0) #fff hsla(0,0%,100%,0) hsla(0,0%,100%,0);border-width:30px;margin-top:-30px}div.vis-color-picker div.vis-color{cursor:pointer;height:289px;position:absolute;width:289px}div.vis-color-picker div.vis-brightness{position:absolute;top:313px}div.vis-color-picker div.vis-opacity{position:absolute;top:350px}div.vis-color-picker div.vis-selector{background:#4c4c4c;background:-moz-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4c4c4c),color-stop(12%,#595959),color-stop(25%,#666),color-stop(39%,#474747),color-stop(50%,#2c2c2c),color-stop(51%,#000),color-stop(60%,#111),color-stop(76%,#2b2b2b),color-stop(91%,#1c1c1c),color-stop(100%,#131313));background:-webkit-linear-gradient(top,#4c4c4c,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313);background:-o-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:-ms-linear-gradient(top,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313 100%);background:linear-gradient(180deg,#4c4c4c 0,#595959 12%,#666 25%,#474747 39%,#2c2c2c 50%,#000 51%,#111 60%,#2b2b2b 76%,#1c1c1c 91%,#131313);border:1px solid #fff;border-radius:15px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#4c4c4c",endColorstr="#131313",GradientType=0);height:15px;left:137px;position:absolute;top:137px;width:15px}div.vis-color-picker div.vis-new-color{left:159px;padding-right:2px;text-align:right}div.vis-color-picker div.vis-initial-color,div.vis-color-picker div.vis-new-color{border:1px solid rgba(0,0,0,.1);border-radius:5px;color:rgba(0,0,0,.4);font-size:10px;height:20px;line-height:20px;position:absolute;top:380px;vertical-align:middle;width:140px}div.vis-color-picker div.vis-initial-color{left:10px;padding-left:2px;text-align:left}div.vis-color-picker div.vis-label{left:10px;position:absolute;width:300px}div.vis-color-picker div.vis-label.vis-brightness{top:300px}div.vis-color-picker div.vis-label.vis-opacity{top:338px}div.vis-color-picker div.vis-button{background-color:#f7f7f7;border:2px solid #d9d9d9;border-radius:10px;cursor:pointer;height:25px;line-height:25px;position:absolute;text-align:center;top:410px;vertical-align:middle;width:68px}div.vis-color-picker div.vis-button.vis-cancel{left:5px}div.vis-color-picker div.vis-button.vis-load{left:82px}div.vis-color-picker div.vis-button.vis-apply{left:159px}div.vis-color-picker div.vis-button.vis-save{left:236px}div.vis-color-picker input.vis-range{height:20px;width:290px}');A('div.vis-configuration{display:block;float:left;font-size:12px;position:relative}div.vis-configuration-wrapper{display:block;width:700px}div.vis-configuration-wrapper:after{clear:both;content:"";display:block}div.vis-configuration.vis-config-option-container{background-color:#fff;border:2px solid #f7f8fa;border-radius:4px;display:block;left:10px;margin-top:20px;padding-left:5px;width:495px}div.vis-configuration.vis-config-button{background-color:#f7f8fa;border:2px solid #ceced0;border-radius:4px;cursor:pointer;display:block;height:25px;left:10px;line-height:25px;margin-bottom:30px;margin-top:20px;padding-left:5px;vertical-align:middle;width:495px}div.vis-configuration.vis-config-button.hover{background-color:#4588e6;border:2px solid #214373;color:#fff}div.vis-configuration.vis-config-item{display:block;float:left;height:25px;line-height:25px;vertical-align:middle;width:495px}div.vis-configuration.vis-config-item.vis-config-s2{background-color:#f7f8fa;border-radius:3px;left:10px;padding-left:5px}div.vis-configuration.vis-config-item.vis-config-s3{background-color:#e4e9f0;border-radius:3px;left:20px;padding-left:5px}div.vis-configuration.vis-config-item.vis-config-s4{background-color:#cfd8e6;border-radius:3px;left:30px;padding-left:5px}div.vis-configuration.vis-config-header{font-size:18px;font-weight:700}div.vis-configuration.vis-config-label{height:25px;line-height:25px;width:120px}div.vis-configuration.vis-config-label.vis-config-s3{width:110px}div.vis-configuration.vis-config-label.vis-config-s4{width:100px}div.vis-configuration.vis-config-colorBlock{border:1px solid #444;border-radius:2px;cursor:pointer;height:19px;margin:0;padding:0;top:1px;width:30px}input.vis-configuration.vis-config-checkbox{left:-5px}input.vis-configuration.vis-config-rangeinput{margin:0;padding:1px;pointer-events:none;position:relative;top:-5px;width:60px}input.vis-configuration.vis-config-range{-webkit-appearance:none;background-color:transparent;border:0 solid #fff;height:20px;width:300px}input.vis-configuration.vis-config-range::-webkit-slider-runnable-track{background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(180deg,#dedede 0,#c8c8c8 99%);border:1px solid #999;border-radius:3px;box-shadow:0 0 3px 0 #aaa;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#dedede",endColorstr="#c8c8c8",GradientType=0);height:5px;width:300px}input.vis-configuration.vis-config-range::-webkit-slider-thumb{-webkit-appearance:none;background:#3876c2;background:-moz-linear-gradient(top,#3876c2 0,#385380 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#3876c2),color-stop(100%,#385380));background:-webkit-linear-gradient(top,#3876c2,#385380);background:-o-linear-gradient(top,#3876c2 0,#385380 100%);background:-ms-linear-gradient(top,#3876c2 0,#385380 100%);background:linear-gradient(180deg,#3876c2 0,#385380);border:1px solid #14334b;border-radius:50%;box-shadow:0 0 1px 0 #111927;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#3876c2",endColorstr="#385380",GradientType=0);height:17px;margin-top:-7px;width:17px}input.vis-configuration.vis-config-range:focus{outline:none}input.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track{background:#9d9d9d;background:-moz-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#9d9d9d),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#9d9d9d,#c8c8c8 99%);background:-o-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#9d9d9d 0,#c8c8c8 99%);background:linear-gradient(180deg,#9d9d9d 0,#c8c8c8 99%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#9d9d9d",endColorstr="#c8c8c8",GradientType=0)}input.vis-configuration.vis-config-range::-moz-range-track{background:#dedede;background:-moz-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#dedede),color-stop(99%,#c8c8c8));background:-webkit-linear-gradient(top,#dedede,#c8c8c8 99%);background:-o-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:-ms-linear-gradient(top,#dedede 0,#c8c8c8 99%);background:linear-gradient(180deg,#dedede 0,#c8c8c8 99%);border:1px solid #999;border-radius:3px;box-shadow:0 0 3px 0 #aaa;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#dedede",endColorstr="#c8c8c8",GradientType=0);height:10px;width:300px}input.vis-configuration.vis-config-range::-moz-range-thumb{background:#385380;border:none;border-radius:50%;height:16px;width:16px}input.vis-configuration.vis-config-range:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}input.vis-configuration.vis-config-range::-ms-track{background:transparent;border-color:transparent;border-width:6px 0;color:transparent;height:5px;width:300px}input.vis-configuration.vis-config-range::-ms-fill-lower{background:#777;border-radius:10px}input.vis-configuration.vis-config-range::-ms-fill-upper{background:#ddd;border-radius:10px}input.vis-configuration.vis-config-range::-ms-thumb{background:#385380;border:none;border-radius:50%;height:16px;width:16px}input.vis-configuration.vis-config-range:focus::-ms-fill-lower{background:#888}input.vis-configuration.vis-config-range:focus::-ms-fill-upper{background:#ccc}.vis-configuration-popup{background:rgba(57,76,89,.85);border:2px solid #f2faff;border-radius:4px;color:#fff;font-size:14px;height:30px;line-height:30px;position:absolute;text-align:center;-webkit-transition:opacity .3s ease-in-out;-moz-transition:opacity .3s ease-in-out;transition:opacity .3s ease-in-out;width:150px}.vis-configuration-popup:after,.vis-configuration-popup:before{border:solid transparent;content:" ";height:0;left:100%;pointer-events:none;position:absolute;top:50%;width:0}.vis-configuration-popup:after{border-color:rgba(136,183,213,0) rgba(136,183,213,0) rgba(136,183,213,0) rgba(57,76,89,.85);border-width:8px;margin-top:-8px}.vis-configuration-popup:before{border-color:rgba(194,225,245,0) rgba(194,225,245,0) rgba(194,225,245,0) #f2faff;border-width:12px;margin-top:-12px}');A("div.vis-tooltip{background-color:#f5f4ed;border:1px solid #808074;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;box-shadow:3px 3px 10px rgba(0,0,0,.2);color:#000;font-family:verdana;font-size:14px;padding:5px;pointer-events:none;position:absolute;visibility:hidden;white-space:nowrap;z-index:5}");var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function C(g){return g&&g.__esModule&&Object.prototype.hasOwnProperty.call(g,"default")?g.default:g}var I,e,i,o,n,s,r,a,d,h,l,c,u,p,f,v,b={};function m(){if(e)return I;e=1;var g=function(g){return g&&g.Math===Math&&g};return I=g("object"==typeof globalThis&&globalThis)||g("object"==typeof window&&window)||g("object"==typeof self&&self)||g("object"==typeof t&&t)||g("object"==typeof I&&I)||function(){return this}()||Function("return this")()}function y(){return o?i:(o=1,i=function(g){try{return!!g()}catch(g){return!0}})}function w(){return s?n:(s=1,n=!y()(function(){var g=function(){}.bind();return"function"!=typeof g||g.hasOwnProperty("prototype")}))}function x(){if(a)return r;a=1;var g=w(),A=Function.prototype,t=A.apply,C=A.call;return r="object"==typeof Reflect&&Reflect.apply||(g?C.bind(t):function(){return C.apply(t,arguments)}),r}function E(){if(h)return d;h=1;var g=w(),A=Function.prototype,t=A.call,C=g&&A.bind.bind(t,t);return d=g?C:function(g){return function(){return t.apply(g,arguments)}},d}function O(){if(c)return l;c=1;var g=E(),A=g({}.toString),t=g("".slice);return l=function(g){return t(A(g),8,-1)},l}function T(){if(p)return u;p=1;var g=O(),A=E();return u=function(t){if("Function"===g(t))return A(t)}}function D(){if(v)return f;v=1;var g="object"==typeof document&&document.all;return f=void 0===g&&void 0!==g?function(A){return"function"==typeof A||A===g}:function(g){return"function"==typeof g}}var N,k,R,P,M={};function z(){return k?N:(k=1,N=!y()(function(){return 7!==Object.defineProperty({},1,{get:function(){return 7}})[1]}))}function B(){if(P)return R;P=1;var g=w(),A=Function.prototype.call;return R=g?A.bind(A):function(){return A.apply(A,arguments)},R}var Z,S,F,G,j,L,V,Y,W,Q,U,K,H,_,X,J,q,$,gg,Ag,tg,Cg,Ig,eg,ig,og,ng,sg,rg,ag,dg,hg,lg,cg,ug,pg,fg,vg={};function bg(){if(Z)return vg;Z=1;var g={}.propertyIsEnumerable,A=Object.getOwnPropertyDescriptor,t=A&&!g.call({1:2},1);return vg.f=t?function(g){var t=A(this,g);return!!t&&t.enumerable}:g,vg}function mg(){return F?S:(F=1,S=function(g,A){return{enumerable:!(1&g),configurable:!(2&g),writable:!(4&g),value:A}})}function yg(){if(j)return G;j=1;var g=E(),A=y(),t=O(),C=Object,I=g("".split);return G=A(function(){return!C("z").propertyIsEnumerable(0)})?function(g){return"String"===t(g)?I(g,""):C(g)}:C,G}function wg(){return V||(V=1,L=function(g){return null==g}),L}function xg(){if(W)return Y;W=1;var g=wg(),A=TypeError;return Y=function(t){if(g(t))throw new A("Can't call method on "+t);return t},Y}function Eg(){if(U)return Q;U=1;var g=yg(),A=xg();return Q=function(t){return g(A(t))},Q}function Og(){if(H)return K;H=1;var g=D();return K=function(A){return"object"==typeof A?null!==A:g(A)},K}function Tg(){return X?_:(X=1,_={})}function Dg(){if(q)return J;q=1;var g=Tg(),A=m(),t=D(),C=function(g){return t(g)?g:void 0};return J=function(t,I){return arguments.length<2?C(g[t])||C(A[t]):g[t]&&g[t][I]||A[t]&&A[t][I]},J}function Ng(){return gg?$:(gg=1,$=E()({}.isPrototypeOf))}function kg(){if(tg)return Ag;tg=1;var g=m().navigator,A=g&&g.userAgent;return Ag=A?String(A):""}function Rg(){if(Ig)return Cg;Ig=1;var g,A,t=m(),C=kg(),I=t.process,e=t.Deno,i=I&&I.versions||e&&e.version,o=i&&i.v8;return o&&(A=(g=o.split("."))[0]>0&&g[0]<4?1:+(g[0]+g[1])),!A&&C&&(!(g=C.match(/Edge\/(\d+)/))||g[1]>=74)&&(g=C.match(/Chrome\/(\d+)/))&&(A=+g[1]),Cg=A}function Pg(){if(ig)return eg;ig=1;var g=Rg(),A=y(),t=m().String;return eg=!!Object.getOwnPropertySymbols&&!A(function(){var A=Symbol("symbol detection");return!t(A)||!(Object(A)instanceof Symbol)||!Symbol.sham&&g&&g<41}),eg}function Mg(){return ng?og:(ng=1,og=Pg()&&!Symbol.sham&&"symbol"==typeof Symbol.iterator)}function zg(){if(rg)return sg;rg=1;var g=Dg(),A=D(),t=Ng(),C=Object;return sg=Mg()?function(g){return"symbol"==typeof g}:function(I){var e=g("Symbol");return A(e)&&t(e.prototype,C(I))},sg}function Bg(){if(dg)return ag;dg=1;var g=String;return ag=function(A){try{return g(A)}catch(g){return"Object"}}}function Zg(){if(lg)return hg;lg=1;var g=D(),A=Bg(),t=TypeError;return hg=function(C){if(g(C))return C;throw new t(A(C)+" is not a function")}}function Sg(){if(ug)return cg;ug=1;var g=Zg(),A=wg();return cg=function(t,C){var I=t[C];return A(I)?void 0:g(I)}}function Fg(){if(fg)return pg;fg=1;var g=B(),A=D(),t=Og(),C=TypeError;return pg=function(I,e){var i,o;if("string"===e&&A(i=I.toString)&&!t(o=g(i,I)))return o;if(A(i=I.valueOf)&&!t(o=g(i,I)))return o;if("string"!==e&&A(i=I.toString)&&!t(o=g(i,I)))return o;throw new C("Can't convert object to primitive value")}}var Gg,jg,Lg,Vg,Yg,Wg,Qg,Ug,Kg,Hg,_g,Xg,Jg,qg,$g,gA,AA,tA,CA,IA,eA,iA,oA,nA,sA,rA,aA,dA,hA={exports:{}};function lA(){return jg?Gg:(jg=1,Gg=!0)}function cA(){if(Vg)return Lg;Vg=1;var g=m(),A=Object.defineProperty;return Lg=function(t,C){try{A(g,t,{value:C,configurable:!0,writable:!0})}catch(A){g[t]=C}return C}}function uA(){if(Yg)return hA.exports;Yg=1;var g=lA(),A=m(),t=cA(),C="__core-js_shared__",I=hA.exports=A[C]||t(C,{});return(I.versions||(I.versions=[])).push({version:"3.44.0",mode:g?"pure":"global",copyright:"© 2014-2025 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.44.0/LICENSE",source:"https://github.com/zloirock/core-js"}),hA.exports}function pA(){if(Qg)return Wg;Qg=1;var g=uA();return Wg=function(A,t){return g[A]||(g[A]=t||{})}}function fA(){if(Kg)return Ug;Kg=1;var g=xg(),A=Object;return Ug=function(t){return A(g(t))}}function vA(){if(_g)return Hg;_g=1;var g=E(),A=fA(),t=g({}.hasOwnProperty);return Hg=Object.hasOwn||function(g,C){return t(A(g),C)},Hg}function bA(){if(Jg)return Xg;Jg=1;var g=E(),A=0,t=Math.random(),C=g(1.1.toString);return Xg=function(g){return"Symbol("+(void 0===g?"":g)+")_"+C(++A+t,36)}}function mA(){if($g)return qg;$g=1;var g=m(),A=pA(),t=vA(),C=bA(),I=Pg(),e=Mg(),i=g.Symbol,o=A("wks"),n=e?i.for||i:i&&i.withoutSetter||C;return qg=function(g){return t(o,g)||(o[g]=I&&t(i,g)?i[g]:n("Symbol."+g)),o[g]}}function yA(){if(AA)return gA;AA=1;var g=B(),A=Og(),t=zg(),C=Sg(),I=Fg(),e=TypeError,i=mA()("toPrimitive");return gA=function(o,n){if(!A(o)||t(o))return o;var s,r=C(o,i);if(r){if(void 0===n&&(n="default"),s=g(r,o,n),!A(s)||t(s))return s;throw new e("Can't convert object to primitive value")}return void 0===n&&(n="number"),I(o,n)}}function wA(){if(CA)return tA;CA=1;var g=yA(),A=zg();return tA=function(t){var C=g(t,"string");return A(C)?C:C+""}}function xA(){if(eA)return IA;eA=1;var g=m(),A=Og(),t=g.document,C=A(t)&&A(t.createElement);return IA=function(g){return C?t.createElement(g):{}},IA}function EA(){if(oA)return iA;oA=1;var g=z(),A=y(),t=xA();return iA=!g&&!A(function(){return 7!==Object.defineProperty(t("div"),"a",{get:function(){return 7}}).a})}function OA(){if(nA)return M;nA=1;var g=z(),A=B(),t=bg(),C=mg(),I=Eg(),e=wA(),i=vA(),o=EA(),n=Object.getOwnPropertyDescriptor;return M.f=g?n:function(g,s){if(g=I(g),s=e(s),o)try{return n(g,s)}catch(g){}if(i(g,s))return C(!A(t.f,g,s),g[s])},M}function TA(){if(rA)return sA;rA=1;var g=y(),A=D(),t=/#|\.prototype\./,C=function(t,C){var n=e[I(t)];return n===o||n!==i&&(A(C)?g(C):!!C)},I=C.normalize=function(g){return String(g).replace(t,".").toLowerCase()},e=C.data={},i=C.NATIVE="N",o=C.POLYFILL="P";return sA=C}function DA(){if(dA)return aA;dA=1;var g=T(),A=Zg(),t=w(),C=g(g.bind);return aA=function(g,I){return A(g),void 0===I?g:t?C(g,I):function(){return g.apply(I,arguments)}},aA}var NA,kA,RA,PA,MA,zA,BA,ZA,SA,FA,GA,jA,LA,VA,YA,WA,QA,UA,KA,HA,_A,XA,JA,qA,$A,gt,At,tt,Ct,It={};function et(){return kA?NA:(kA=1,NA=z()&&y()(function(){return 42!==Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype}))}function it(){if(PA)return RA;PA=1;var g=Og(),A=String,t=TypeError;return RA=function(C){if(g(C))return C;throw new t(A(C)+" is not an object")}}function ot(){if(MA)return It;MA=1;var g=z(),A=EA(),t=et(),C=it(),I=wA(),e=TypeError,i=Object.defineProperty,o=Object.getOwnPropertyDescriptor,n="enumerable",s="configurable",r="writable";return It.f=g?t?function(g,A,t){if(C(g),A=I(A),C(t),"function"==typeof g&&"prototype"===A&&"value"in t&&r in t&&!t[r]){var e=o(g,A);e&&e[r]&&(g[A]=t.value,t={configurable:s in t?t[s]:e[s],enumerable:n in t?t[n]:e[n],writable:!1})}return i(g,A,t)}:i:function(g,t,o){if(C(g),t=I(t),C(o),A)try{return i(g,t,o)}catch(g){}if("get"in o||"set"in o)throw new e("Accessors not supported");return"value"in o&&(g[t]=o.value),g},It}function nt(){if(BA)return zA;BA=1;var g=z(),A=ot(),t=mg();return zA=g?function(g,C,I){return A.f(g,C,t(1,I))}:function(g,A,t){return g[A]=t,g},zA}function st(){if(SA)return ZA;SA=1;var g=m(),A=x(),t=T(),C=D(),I=OA().f,e=TA(),i=Tg(),o=DA(),n=nt(),s=vA(),r=function(g){var t=function(C,I,e){if(this instanceof t){switch(arguments.length){case 0:return new g;case 1:return new g(C);case 2:return new g(C,I)}return new g(C,I,e)}return A(g,this,arguments)};return t.prototype=g.prototype,t};return ZA=function(A,a){var d,h,l,c,u,p,f,v,b,m=A.target,y=A.global,w=A.stat,x=A.proto,E=y?g:w?g[m]:g[m]&&g[m].prototype,O=y?i:i[m]||n(i,m,{})[m],T=O.prototype;for(c in a)h=!(d=e(y?c:m+(w?".":"#")+c,A.forced))&&E&&s(E,c),p=O[c],h&&(f=A.dontCallGetSet?(b=I(E,c))&&b.value:E[c]),u=h&&f?f:a[c],(d||x||typeof p!=typeof u)&&(v=A.bind&&h?o(u,g):A.wrap&&h?r(u):x&&C(u)?t(u):u,(A.sham||u&&u.sham||p&&p.sham)&&n(v,"sham",!0),n(O,c,v),x&&(s(i,l=m+"Prototype")||n(i,l,{}),n(i[l],c,u),A.real&&T&&(d||!T[c])&&n(T,c,u)))},ZA}function rt(){if(GA)return FA;GA=1;var g=Math.ceil,A=Math.floor;return FA=Math.trunc||function(t){var C=+t;return(C>0?A:g)(C)}}function at(){if(LA)return jA;LA=1;var g=rt();return jA=function(A){var t=+A;return t!=t||0===t?0:g(t)},jA}function dt(){if(YA)return VA;YA=1;var g=at(),A=Math.max,t=Math.min;return VA=function(C,I){var e=g(C);return e<0?A(e+I,0):t(e,I)},VA}function ht(){if(QA)return WA;QA=1;var g=at(),A=Math.min;return WA=function(t){var C=g(t);return C>0?A(C,9007199254740991):0}}function lt(){if(KA)return UA;KA=1;var g=ht();return UA=function(A){return g(A.length)}}function ct(){if(_A)return HA;_A=1;var g=Eg(),A=dt(),t=lt(),C=function(C){return function(I,e,i){var o=g(I),n=t(o);if(0===n)return!C&&-1;var s,r=A(i,n);if(C&&e!=e){for(;n>r;)if((s=o[r++])!=s)return!0}else for(;n>r;r++)if((C||r in o)&&o[r]===e)return C||r||0;return!C&&-1}};return HA={includes:C(!0),indexOf:C(!1)}}function ut(){return JA?XA:(JA=1,XA={})}function pt(){if($A)return qA;$A=1;var g=E(),A=vA(),t=Eg(),C=ct().indexOf,I=ut(),e=g([].push);return qA=function(g,i){var o,n=t(g),s=0,r=[];for(o in n)!A(I,o)&&A(n,o)&&e(r,o);for(;i.length>s;)A(n,o=i[s++])&&(~C(r,o)||e(r,o));return r},qA}function ft(){return At?gt:(At=1,gt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"])}function vt(){if(Ct)return tt;Ct=1;var g=pt(),A=ft();return tt=Object.keys||function(t){return g(t,A)}}var bt,mt,yt,wt,xt,Et,Ot,Tt,Dt,Nt,kt={};function Rt(){return bt||(bt=1,kt.f=Object.getOwnPropertySymbols),kt}function Pt(){if(yt)return mt;yt=1;var g=z(),A=E(),t=B(),C=y(),I=vt(),e=Rt(),i=bg(),o=fA(),n=yg(),s=Object.assign,r=Object.defineProperty,a=A([].concat);return mt=!s||C(function(){if(g&&1!==s({b:1},s(r({},"a",{enumerable:!0,get:function(){r(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var A={},t={},C=Symbol("assign detection"),e="abcdefghijklmnopqrst";return A[C]=7,e.split("").forEach(function(g){t[g]=g}),7!==s({},A)[C]||I(s({},t)).join("")!==e})?function(A,C){for(var s=o(A),r=arguments.length,d=1,h=e.f,l=i.f;r>d;)for(var c,u=n(arguments[d++]),p=h?a(I(u),h(u)):I(u),f=p.length,v=0;f>v;)c=p[v++],g&&!t(l,u,c)||(s[c]=u[c]);return s}:s,mt}function Mt(){return Et?xt:(Et=1,function(){if(wt)return b;wt=1;var g=st(),A=Pt();g({target:"Object",stat:!0,arity:2,forced:Object.assign!==A},{assign:A})}(),xt=Tg().Object.assign)}function zt(){return Tt?Ot:(Tt=1,Ot=Mt())}var Bt,Zt,St,Ft,Gt,jt,Lt,Vt,Yt,Wt,Qt,Ut,Kt,Ht,_t,Xt=C(Nt?Dt:(Nt=1,Dt=zt())),Jt={};function qt(){return Zt?Bt:(Zt=1,Bt=E()([].slice))}function $t(){if(Ft)return St;Ft=1;var g=E(),A=Zg(),t=Og(),C=vA(),I=qt(),e=w(),i=Function,o=g([].concat),n=g([].join),s={};return St=e?i.bind:function(g){var e=A(this),r=e.prototype,a=I(arguments,1),d=function(){var A=o(a,I(arguments));return this instanceof d?function(g,A,t){if(!C(s,A)){for(var I=[],e=0;e<A;e++)I[e]="a["+e+"]";s[A]=i("C,a","return new C("+n(I,",")+")")}return s[A](g,t)}(e,A.length,A):e.apply(g,A)};return t(r)&&(d.prototype=r),d},St}function gC(){if(Lt)return jt;Lt=1;var g=m(),A=Tg();return jt=function(t,C){var I=A[t+"Prototype"],e=I&&I[C];if(e)return e;var i=g[t],o=i&&i.prototype;return o&&o[C]}}function AC(){return Yt?Vt:(Yt=1,function(){if(Gt)return Jt;Gt=1;var g=st(),A=$t();g({target:"Function",proto:!0,forced:Function.bind!==A},{bind:A})}(),Vt=gC()("Function","bind"))}function tC(){if(Qt)return Wt;Qt=1;var g=Ng(),A=AC(),t=Function.prototype;return Wt=function(C){var I=C.bind;return C===t||g(t,C)&&I===t.bind?A:I},Wt}function CC(){return Kt?Ut:(Kt=1,Ut=tC())}var IC=C(_t?Ht:(_t=1,Ht=CC()));function eC(g,A,t,C){g.beginPath(),g.arc(A,t,C,0,2*Math.PI,!1),g.closePath()}function iC(g,A,t,C,I,e){const i=Math.PI/180;C-2*e<0&&(e=C/2),I-2*e<0&&(e=I/2),g.beginPath(),g.moveTo(A+e,t),g.lineTo(A+C-e,t),g.arc(A+C-e,t+e,e,270*i,360*i,!1),g.lineTo(A+C,t+I-e),g.arc(A+C-e,t+I-e,e,0,90*i,!1),g.lineTo(A+e,t+I),g.arc(A+e,t+I-e,e,90*i,180*i,!1),g.lineTo(A,t+e),g.arc(A+e,t+e,e,180*i,270*i,!1),g.closePath()}function oC(g,A,t,C,I){const e=.5522848,i=C/2*e,o=I/2*e,n=A+C,s=t+I,r=A+C/2,a=t+I/2;g.beginPath(),g.moveTo(A,a),g.bezierCurveTo(A,a-o,r-i,t,r,t),g.bezierCurveTo(r+i,t,n,a-o,n,a),g.bezierCurveTo(n,a+o,r+i,s,r,s),g.bezierCurveTo(r-i,s,A,a+o,A,a),g.closePath()}function nC(g,A,t,C,I){const e=I*(1/3),i=.5522848,o=C/2*i,n=e/2*i,s=A+C,r=t+e,a=A+C/2,d=t+e/2,h=t+(I-e/2),l=t+I;g.beginPath(),g.moveTo(s,d),g.bezierCurveTo(s,d+n,a+o,r,a,r),g.bezierCurveTo(a-o,r,A,d+n,A,d),g.bezierCurveTo(A,d-n,a-o,t,a,t),g.bezierCurveTo(a+o,t,s,d-n,s,d),g.lineTo(s,h),g.bezierCurveTo(s,h+n,a+o,l,a,l),g.bezierCurveTo(a-o,l,A,h+n,A,h),g.lineTo(A,d)}function sC(g,A,t,C,I,e){g.beginPath(),g.moveTo(A,t);const i=e.length,o=C-A,n=I-t,s=n/o;let r=Math.sqrt(o*o+n*n),a=0,d=!0,h=0,l=+e[0];for(;r>=.1;)l=+e[a++%i],l>r&&(l=r),h=Math.sqrt(l*l/(1+s*s)),h=o<0?-h:h,A+=h,t+=s*h,!0===d?g.lineTo(A,t):g.moveTo(A,t),r-=l,d=!d}const rC={circle:eC,dashedLine:sC,database:nC,diamond:function(g,A,t,C){g.beginPath(),g.lineTo(A,t+C),g.lineTo(A+C,t),g.lineTo(A,t-C),g.lineTo(A-C,t),g.closePath()},ellipse:oC,ellipse_vis:oC,hexagon:function(g,A,t,C){g.beginPath();const I=2*Math.PI/6;g.moveTo(A+C,t);for(let e=1;e<6;e++)g.lineTo(A+C*Math.cos(I*e),t+C*Math.sin(I*e));g.closePath()},roundRect:iC,square:function(g,A,t,C){g.beginPath(),g.rect(A-C,t-C,2*C,2*C),g.closePath()},star:function(g,A,t,C){g.beginPath(),t+=.1*(C*=.82);for(let I=0;I<10;I++){const e=I%2==0?1.3*C:.5*C;g.lineTo(A+e*Math.sin(2*I*Math.PI/10),t-e*Math.cos(2*I*Math.PI/10))}g.closePath()},triangle:function(g,A,t,C){g.beginPath(),t+=.275*(C*=1.15);const I=2*C,e=I/2,i=Math.sqrt(3)/6*I,o=Math.sqrt(I*I-e*e);g.moveTo(A,t-(o-i)),g.lineTo(A+e,t+i),g.lineTo(A-e,t+i),g.lineTo(A,t-(o-i)),g.closePath()},triangleDown:function(g,A,t,C){g.beginPath(),t-=.275*(C*=1.15);const I=2*C,e=I/2,i=Math.sqrt(3)/6*I,o=Math.sqrt(I*I-e*e);g.moveTo(A,t+(o-i)),g.lineTo(A+e,t-i),g.lineTo(A-e,t-i),g.lineTo(A,t+(o-i)),g.closePath()}};var aC,dC={exports:{}};var hC,lC=(aC||(aC=1,function(g){function A(g){if(g)return function(g){for(var t in A.prototype)g[t]=A.prototype[t];return g}(g)}g.exports=A,A.prototype.on=A.prototype.addEventListener=function(g,A){return this._callbacks=this._callbacks||{},(this._callbacks["$"+g]=this._callbacks["$"+g]||[]).push(A),this},A.prototype.once=function(g,A){function t(){this.off(g,t),A.apply(this,arguments)}return t.fn=A,this.on(g,t),this},A.prototype.off=A.prototype.removeListener=A.prototype.removeAllListeners=A.prototype.removeEventListener=function(g,A){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var t,C=this._callbacks["$"+g];if(!C)return this;if(1==arguments.length)return delete this._callbacks["$"+g],this;for(var I=0;I<C.length;I++)if((t=C[I])===A||t.fn===A){C.splice(I,1);break}return 0===C.length&&delete this._callbacks["$"+g],this},A.prototype.emit=function(g){this._callbacks=this._callbacks||{};for(var A=new Array(arguments.length-1),t=this._callbacks["$"+g],C=1;C<arguments.length;C++)A[C-1]=arguments[C];if(t){C=0;for(var I=(t=t.slice(0)).length;C<I;++C)t[C].apply(this,A)}return this},A.prototype.listeners=function(g){return this._callbacks=this._callbacks||{},this._callbacks["$"+g]||[]},A.prototype.hasListeners=function(g){return!!this.listeners(g).length}}(dC)),dC.exports),cC=C(lC);
27/*! Hammer.JS - v2.0.17-rc - 2019-12-16
28 * http://naver.github.io/egjs
29 *
30 * Forked By Naver egjs
31 * Copyright (c) hammerjs
32 * Licensed under the MIT license */
33function uC(){return uC=Object.assign||function(g){for(var A=1;A<arguments.length;A++){var t=arguments[A];for(var C in t)Object.prototype.hasOwnProperty.call(t,C)&&(g[C]=t[C])}return g},uC.apply(this,arguments)}function pC(g,A){g.prototype=Object.create(A.prototype),g.prototype.constructor=g,g.__proto__=A}function fC(g){if(void 0===g)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return g}hC="function"!=typeof Object.assign?function(g){if(null==g)throw new TypeError("Cannot convert undefined or null to object");for(var A=Object(g),t=1;t<arguments.length;t++){var C=arguments[t];if(null!=C)for(var I in C)C.hasOwnProperty(I)&&(A[I]=C[I])}return A}:Object.assign;var vC,bC=hC,mC=["","webkit","Moz","MS","ms","o"],yC="undefined"==typeof document?{style:{}}:document.createElement("div"),wC=Math.round,xC=Math.abs,EC=Date.now;function OC(g,A){for(var t,C,I=A[0].toUpperCase()+A.slice(1),e=0;e<mC.length;){if((C=(t=mC[e])?t+I:A)in g)return C;e++}}vC="undefined"==typeof window?{}:window;var TC=OC(yC.style,"touchAction"),DC=void 0!==TC;var NC="compute",kC="auto",RC="manipulation",PC="none",MC="pan-x",zC="pan-y",BC=function(){if(!DC)return!1;var g={},A=vC.CSS&&vC.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach(function(t){return g[t]=!A||vC.CSS.supports("touch-action",t)}),g}(),ZC="ontouchstart"in vC,SC=void 0!==OC(vC,"PointerEvent"),FC=ZC&&/mobile|tablet|ip(ad|hone|od)|android/i.test(navigator.userAgent),GC="touch",jC="mouse",LC=16,VC=24,YC=["x","y"],WC=["clientX","clientY"];function QC(g,A,t){var C;if(g)if(g.forEach)g.forEach(A,t);else if(void 0!==g.length)for(C=0;C<g.length;)A.call(t,g[C],C,g),C++;else for(C in g)g.hasOwnProperty(C)&&A.call(t,g[C],C,g)}function UC(g,A){return"function"==typeof g?g.apply(A&&A[0]||void 0,A):g}function KC(g,A){return g.indexOf(A)>-1}var HC=function(){function g(g,A){this.manager=g,this.set(A)}var A=g.prototype;return A.set=function(g){g===NC&&(g=this.compute()),DC&&this.manager.element.style&&BC[g]&&(this.manager.element.style[TC]=g),this.actions=g.toLowerCase().trim()},A.update=function(){this.set(this.manager.options.touchAction)},A.compute=function(){var g=[];return QC(this.manager.recognizers,function(A){UC(A.options.enable,[A])&&(g=g.concat(A.getTouchAction()))}),function(g){if(KC(g,PC))return PC;var A=KC(g,MC),t=KC(g,zC);return A&&t?PC:A||t?A?MC:zC:KC(g,RC)?RC:kC}(g.join(" "))},A.preventDefaults=function(g){var A=g.srcEvent,t=g.offsetDirection;if(this.manager.session.prevented)A.preventDefault();else{var C=this.actions,I=KC(C,PC)&&!BC[PC],e=KC(C,zC)&&!BC[zC],i=KC(C,MC)&&!BC[MC];if(I){var o=1===g.pointers.length,n=g.distance<2,s=g.deltaTime<250;if(o&&n&&s)return}if(!i||!e)return I||e&&6&t||i&&t&VC?this.preventSrc(A):void 0}},A.preventSrc=function(g){this.manager.session.prevented=!0,g.preventDefault()},g}();function _C(g,A){for(;g;){if(g===A)return!0;g=g.parentNode}return!1}function XC(g){var A=g.length;if(1===A)return{x:wC(g[0].clientX),y:wC(g[0].clientY)};for(var t=0,C=0,I=0;I<A;)t+=g[I].clientX,C+=g[I].clientY,I++;return{x:wC(t/A),y:wC(C/A)}}function JC(g){for(var A=[],t=0;t<g.pointers.length;)A[t]={clientX:wC(g.pointers[t].clientX),clientY:wC(g.pointers[t].clientY)},t++;return{timeStamp:EC(),pointers:A,center:XC(A),deltaX:g.deltaX,deltaY:g.deltaY}}function qC(g,A,t){t||(t=YC);var C=A[t[0]]-g[t[0]],I=A[t[1]]-g[t[1]];return Math.sqrt(C*C+I*I)}function $C(g,A,t){t||(t=YC);var C=A[t[0]]-g[t[0]],I=A[t[1]]-g[t[1]];return 180*Math.atan2(I,C)/Math.PI}function gI(g,A){return g===A?1:xC(g)>=xC(A)?g<0?2:4:A<0?8:LC}function AI(g,A,t){return{x:A/g||0,y:t/g||0}}function tI(g,A){var t=g.session,C=A.pointers,I=C.length;t.firstInput||(t.firstInput=JC(A)),I>1&&!t.firstMultiple?t.firstMultiple=JC(A):1===I&&(t.firstMultiple=!1);var e=t.firstInput,i=t.firstMultiple,o=i?i.center:e.center,n=A.center=XC(C);A.timeStamp=EC(),A.deltaTime=A.timeStamp-e.timeStamp,A.angle=$C(o,n),A.distance=qC(o,n),function(g,A){var t=A.center,C=g.offsetDelta||{},I=g.prevDelta||{},e=g.prevInput||{};1!==A.eventType&&4!==e.eventType||(I=g.prevDelta={x:e.deltaX||0,y:e.deltaY||0},C=g.offsetDelta={x:t.x,y:t.y}),A.deltaX=I.x+(t.x-C.x),A.deltaY=I.y+(t.y-C.y)}(t,A),A.offsetDirection=gI(A.deltaX,A.deltaY);var s,r,a=AI(A.deltaTime,A.deltaX,A.deltaY);A.overallVelocityX=a.x,A.overallVelocityY=a.y,A.overallVelocity=xC(a.x)>xC(a.y)?a.x:a.y,A.scale=i?(s=i.pointers,qC((r=C)[0],r[1],WC)/qC(s[0],s[1],WC)):1,A.rotation=i?function(g,A){return $C(A[1],A[0],WC)+$C(g[1],g[0],WC)}(i.pointers,C):0,A.maxPointers=t.prevInput?A.pointers.length>t.prevInput.maxPointers?A.pointers.length:t.prevInput.maxPointers:A.pointers.length,function(g,A){var t,C,I,e,i=g.lastInterval||A,o=A.timeStamp-i.timeStamp;if(8!==A.eventType&&(o>25||void 0===i.velocity)){var n=A.deltaX-i.deltaX,s=A.deltaY-i.deltaY,r=AI(o,n,s);C=r.x,I=r.y,t=xC(r.x)>xC(r.y)?r.x:r.y,e=gI(n,s),g.lastInterval=A}else t=i.velocity,C=i.velocityX,I=i.velocityY,e=i.direction;A.velocity=t,A.velocityX=C,A.velocityY=I,A.direction=e}(t,A);var d,h=g.element,l=A.srcEvent;_C(d=l.composedPath?l.composedPath()[0]:l.path?l.path[0]:l.target,h)&&(h=d),A.target=h}function CI(g,A,t){var C=t.pointers.length,I=t.changedPointers.length,e=1&A&&C-I===0,i=12&A&&C-I===0;t.isFirst=!!e,t.isFinal=!!i,e&&(g.session={}),t.eventType=A,tI(g,t),g.emit("hammer.input",t),g.recognize(t),g.session.prevInput=t}function II(g){return g.trim().split(/\s+/g)}function eI(g,A,t){QC(II(A),function(A){g.addEventListener(A,t,!1)})}function iI(g,A,t){QC(II(A),function(A){g.removeEventListener(A,t,!1)})}function oI(g){var A=g.ownerDocument||g;return A.defaultView||A.parentWindow||window}var nI=function(){function g(g,A){var t=this;this.manager=g,this.callback=A,this.element=g.element,this.target=g.options.inputTarget,this.domHandler=function(A){UC(g.options.enable,[g])&&t.handler(A)},this.init()}var A=g.prototype;return A.handler=function(){},A.init=function(){this.evEl&&eI(this.element,this.evEl,this.domHandler),this.evTarget&&eI(this.target,this.evTarget,this.domHandler),this.evWin&&eI(oI(this.element),this.evWin,this.domHandler)},A.destroy=function(){this.evEl&&iI(this.element,this.evEl,this.domHandler),this.evTarget&&iI(this.target,this.evTarget,this.domHandler),this.evWin&&iI(oI(this.element),this.evWin,this.domHandler)},g}();function sI(g,A,t){if(g.indexOf&&!t)return g.indexOf(A);for(var C=0;C<g.length;){if(t&&g[C][t]==A||!t&&g[C]===A)return C;C++}return-1}var rI={pointerdown:1,pointermove:2,pointerup:4,pointercancel:8,pointerout:8},aI={2:GC,3:"pen",4:jC,5:"kinect"},dI="pointerdown",hI="pointermove pointerup pointercancel";vC.MSPointerEvent&&!vC.PointerEvent&&(dI="MSPointerDown",hI="MSPointerMove MSPointerUp MSPointerCancel");var lI=function(g){function A(){var t,C=A.prototype;return C.evEl=dI,C.evWin=hI,(t=g.apply(this,arguments)||this).store=t.manager.session.pointerEvents=[],t}return pC(A,g),A.prototype.handler=function(g){var A=this.store,t=!1,C=g.type.toLowerCase().replace("ms",""),I=rI[C],e=aI[g.pointerType]||g.pointerType,i=e===GC,o=sI(A,g.pointerId,"pointerId");1&I&&(0===g.button||i)?o<0&&(A.push(g),o=A.length-1):12&I&&(t=!0),o<0||(A[o]=g,this.callback(this.manager,I,{pointers:A,changedPointers:[g],pointerType:e,srcEvent:g}),t&&A.splice(o,1))},A}(nI);function cI(g){return Array.prototype.slice.call(g,0)}function uI(g,A,t){for(var C=[],I=[],e=0;e<g.length;){var i=A?g[e][A]:g[e];sI(I,i)<0&&C.push(g[e]),I[e]=i,e++}return t&&(C=A?C.sort(function(g,t){return g[A]>t[A]}):C.sort()),C}var pI={touchstart:1,touchmove:2,touchend:4,touchcancel:8},fI=function(g){function A(){var t;return A.prototype.evTarget="touchstart touchmove touchend touchcancel",(t=g.apply(this,arguments)||this).targetIds={},t}return pC(A,g),A.prototype.handler=function(g){var A=pI[g.type],t=vI.call(this,g,A);t&&this.callback(this.manager,A,{pointers:t[0],changedPointers:t[1],pointerType:GC,srcEvent:g})},A}(nI);function vI(g,A){var t,C,I=cI(g.touches),e=this.targetIds;if(3&A&&1===I.length)return e[I[0].identifier]=!0,[I,I];var i=cI(g.changedTouches),o=[],n=this.target;if(C=I.filter(function(g){return _C(g.target,n)}),1===A)for(t=0;t<C.length;)e[C[t].identifier]=!0,t++;for(t=0;t<i.length;)e[i[t].identifier]&&o.push(i[t]),12&A&&delete e[i[t].identifier],t++;return o.length?[uI(C.concat(o),"identifier",!0),o]:void 0}var bI={mousedown:1,mousemove:2,mouseup:4},mI=function(g){function A(){var t,C=A.prototype;return C.evEl="mousedown",C.evWin="mousemove mouseup",(t=g.apply(this,arguments)||this).pressed=!1,t}return pC(A,g),A.prototype.handler=function(g){var A=bI[g.type];1&A&&0===g.button&&(this.pressed=!0),2&A&&1!==g.which&&(A=4),this.pressed&&(4&A&&(this.pressed=!1),this.callback(this.manager,A,{pointers:[g],changedPointers:[g],pointerType:jC,srcEvent:g}))},A}(nI);function yI(g){var A=g.changedPointers[0];if(A.identifier===this.primaryTouch){var t={x:A.clientX,y:A.clientY},C=this.lastTouches;this.lastTouches.push(t);setTimeout(function(){var g=C.indexOf(t);g>-1&&C.splice(g,1)},2500)}}function wI(g,A){1&g?(this.primaryTouch=A.changedPointers[0].identifier,yI.call(this,A)):12&g&&yI.call(this,A)}function xI(g){for(var A=g.srcEvent.clientX,t=g.srcEvent.clientY,C=0;C<this.lastTouches.length;C++){var I=this.lastTouches[C],e=Math.abs(A-I.x),i=Math.abs(t-I.y);if(e<=25&&i<=25)return!0}return!1}var EI=function(){return function(g){function A(A,t){var C;return(C=g.call(this,A,t)||this).handler=function(g,A,t){var I=t.pointerType===GC,e=t.pointerType===jC;if(!(e&&t.sourceCapabilities&&t.sourceCapabilities.firesTouchEvents)){if(I)wI.call(fC(fC(C)),A,t);else if(e&&xI.call(fC(fC(C)),t))return;C.callback(g,A,t)}},C.touch=new fI(C.manager,C.handler),C.mouse=new mI(C.manager,C.handler),C.primaryTouch=null,C.lastTouches=[],C}return pC(A,g),A.prototype.destroy=function(){this.touch.destroy(),this.mouse.destroy()},A}(nI)}();function OI(g,A,t){return!!Array.isArray(g)&&(QC(g,t[A],t),!0)}var TI=32,DI=1;function NI(g,A){var t=A.manager;return t?t.get(g):g}function kI(g){return 16&g?"cancel":8&g?"end":4&g?"move":2&g?"start":""}var RI=function(){function g(g){void 0===g&&(g={}),this.options=uC({enable:!0},g),this.id=DI++,this.manager=null,this.state=1,this.simultaneous={},this.requireFail=[]}var A=g.prototype;return A.set=function(g){return bC(this.options,g),this.manager&&this.manager.touchAction.update(),this},A.recognizeWith=function(g){if(OI(g,"recognizeWith",this))return this;var A=this.simultaneous;return A[(g=NI(g,this)).id]||(A[g.id]=g,g.recognizeWith(this)),this},A.dropRecognizeWith=function(g){return OI(g,"dropRecognizeWith",this)||(g=NI(g,this),delete this.simultaneous[g.id]),this},A.requireFailure=function(g){if(OI(g,"requireFailure",this))return this;var A=this.requireFail;return-1===sI(A,g=NI(g,this))&&(A.push(g),g.requireFailure(this)),this},A.dropRequireFailure=function(g){if(OI(g,"dropRequireFailure",this))return this;g=NI(g,this);var A=sI(this.requireFail,g);return A>-1&&this.requireFail.splice(A,1),this},A.hasRequireFailures=function(){return this.requireFail.length>0},A.canRecognizeWith=function(g){return!!this.simultaneous[g.id]},A.emit=function(g){var A=this,t=this.state;function C(t){A.manager.emit(t,g)}t<8&&C(A.options.event+kI(t)),C(A.options.event),g.additionalEvent&&C(g.additionalEvent),t>=8&&C(A.options.event+kI(t))},A.tryEmit=function(g){if(this.canEmit())return this.emit(g);this.state=TI},A.canEmit=function(){for(var g=0;g<this.requireFail.length;){if(!(33&this.requireFail[g].state))return!1;g++}return!0},A.recognize=function(g){var A=bC({},g);if(!UC(this.options.enable,[this,A]))return this.reset(),void(this.state=TI);56&this.state&&(this.state=1),this.state=this.process(A),30&this.state&&this.tryEmit(A)},A.process=function(g){},A.getTouchAction=function(){},A.reset=function(){},g}(),PI=function(g){function A(A){var t;return void 0===A&&(A={}),(t=g.call(this,uC({event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},A))||this).pTime=!1,t.pCenter=!1,t._timer=null,t._input=null,t.count=0,t}pC(A,g);var t=A.prototype;return t.getTouchAction=function(){return[RC]},t.process=function(g){var A=this,t=this.options,C=g.pointers.length===t.pointers,I=g.distance<t.threshold,e=g.deltaTime<t.time;if(this.reset(),1&g.eventType&&0===this.count)return this.failTimeout();if(I&&e&&C){if(4!==g.eventType)return this.failTimeout();var i=!this.pTime||g.timeStamp-this.pTime<t.interval,o=!this.pCenter||qC(this.pCenter,g.center)<t.posThreshold;if(this.pTime=g.timeStamp,this.pCenter=g.center,o&&i?this.count+=1:this.count=1,this._input=g,0===this.count%t.taps)return this.hasRequireFailures()?(this._timer=setTimeout(function(){A.state=8,A.tryEmit()},t.interval),2):8}return TI},t.failTimeout=function(){var g=this;return this._timer=setTimeout(function(){g.state=TI},this.options.interval),TI},t.reset=function(){clearTimeout(this._timer)},t.emit=function(){8===this.state&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))},A}(RI),MI=function(g){function A(A){return void 0===A&&(A={}),g.call(this,uC({pointers:1},A))||this}pC(A,g);var t=A.prototype;return t.attrTest=function(g){var A=this.options.pointers;return 0===A||g.pointers.length===A},t.process=function(g){var A=this.state,t=g.eventType,C=6&A,I=this.attrTest(g);return C&&(8&t||!I)?16|A:C||I?4&t?8|A:2&A?4|A:2:TI},A}(RI);function zI(g){return g===LC?"down":8===g?"up":2===g?"left":4===g?"right":""}var BI=function(g){function A(A){var t;return void 0===A&&(A={}),(t=g.call(this,uC({event:"pan",threshold:10,pointers:1,direction:30},A))||this).pX=null,t.pY=null,t}pC(A,g);var t=A.prototype;return t.getTouchAction=function(){var g=this.options.direction,A=[];return 6&g&&A.push(zC),g&VC&&A.push(MC),A},t.directionTest=function(g){var A=this.options,t=!0,C=g.distance,I=g.direction,e=g.deltaX,i=g.deltaY;return I&A.direction||(6&A.direction?(I=0===e?1:e<0?2:4,t=e!==this.pX,C=Math.abs(g.deltaX)):(I=0===i?1:i<0?8:LC,t=i!==this.pY,C=Math.abs(g.deltaY))),g.direction=I,t&&C>A.threshold&&I&A.direction},t.attrTest=function(g){return MI.prototype.attrTest.call(this,g)&&(2&this.state||!(2&this.state)&&this.directionTest(g))},t.emit=function(A){this.pX=A.deltaX,this.pY=A.deltaY;var t=zI(A.direction);t&&(A.additionalEvent=this.options.event+t),g.prototype.emit.call(this,A)},A}(MI),ZI=function(g){function A(A){return void 0===A&&(A={}),g.call(this,uC({event:"swipe",threshold:10,velocity:.3,direction:30,pointers:1},A))||this}pC(A,g);var t=A.prototype;return t.getTouchAction=function(){return BI.prototype.getTouchAction.call(this)},t.attrTest=function(A){var t,C=this.options.direction;return 30&C?t=A.overallVelocity:6&C?t=A.overallVelocityX:C&VC&&(t=A.overallVelocityY),g.prototype.attrTest.call(this,A)&&C&A.offsetDirection&&A.distance>this.options.threshold&&A.maxPointers===this.options.pointers&&xC(t)>this.options.velocity&&4&A.eventType},t.emit=function(g){var A=zI(g.offsetDirection);A&&this.manager.emit(this.options.event+A,g),this.manager.emit(this.options.event,g)},A}(MI),SI=function(g){function A(A){return void 0===A&&(A={}),g.call(this,uC({event:"pinch",threshold:0,pointers:2},A))||this}pC(A,g);var t=A.prototype;return t.getTouchAction=function(){return[PC]},t.attrTest=function(A){return g.prototype.attrTest.call(this,A)&&(Math.abs(A.scale-1)>this.options.threshold||2&this.state)},t.emit=function(A){if(1!==A.scale){var t=A.scale<1?"in":"out";A.additionalEvent=this.options.event+t}g.prototype.emit.call(this,A)},A}(MI),FI=function(g){function A(A){return void 0===A&&(A={}),g.call(this,uC({event:"rotate",threshold:0,pointers:2},A))||this}pC(A,g);var t=A.prototype;return t.getTouchAction=function(){return[PC]},t.attrTest=function(A){return g.prototype.attrTest.call(this,A)&&(Math.abs(A.rotation)>this.options.threshold||2&this.state)},A}(MI),GI=function(g){function A(A){var t;return void 0===A&&(A={}),(t=g.call(this,uC({event:"press",pointers:1,time:251,threshold:9},A))||this)._timer=null,t._input=null,t}pC(A,g);var t=A.prototype;return t.getTouchAction=function(){return[kC]},t.process=function(g){var A=this,t=this.options,C=g.pointers.length===t.pointers,I=g.distance<t.threshold,e=g.deltaTime>t.time;if(this._input=g,!I||!C||12&g.eventType&&!e)this.reset();else if(1&g.eventType)this.reset(),this._timer=setTimeout(function(){A.state=8,A.tryEmit()},t.time);else if(4&g.eventType)return 8;return TI},t.reset=function(){clearTimeout(this._timer)},t.emit=function(g){8===this.state&&(g&&4&g.eventType?this.manager.emit(this.options.event+"up",g):(this._input.timeStamp=EC(),this.manager.emit(this.options.event,this._input)))},A}(RI),jI={domEvents:!1,touchAction:NC,enable:!0,inputTarget:null,inputClass:null,cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},LI=[[FI,{enable:!1}],[SI,{enable:!1},["rotate"]],[ZI,{direction:6}],[BI,{direction:6},["swipe"]],[PI],[PI,{event:"doubletap",taps:2},["tap"]],[GI]];function VI(g,A){var t,C=g.element;C.style&&(QC(g.options.cssProps,function(I,e){t=OC(C.style,e),A?(g.oldCssProps[t]=C.style[t],C.style[t]=I):C.style[t]=g.oldCssProps[t]||""}),A||(g.oldCssProps={}))}var YI=function(){function g(g,A){var t,C=this;this.options=bC({},jI,A||{}),this.options.inputTarget=this.options.inputTarget||g,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=g,this.input=new((t=this).options.inputClass||(SC?lI:FC?fI:ZC?EI:mI))(t,CI),this.touchAction=new HC(this,this.options.touchAction),VI(this,!0),QC(this.options.recognizers,function(g){var A=C.add(new g[0](g[1]));g[2]&&A.recognizeWith(g[2]),g[3]&&A.requireFailure(g[3])},this)}var A=g.prototype;return A.set=function(g){return bC(this.options,g),g.touchAction&&this.touchAction.update(),g.inputTarget&&(this.input.destroy(),this.input.target=g.inputTarget,this.input.init()),this},A.stop=function(g){this.session.stopped=g?2:1},A.recognize=function(g){var A=this.session;if(!A.stopped){var t;this.touchAction.preventDefaults(g);var C=this.recognizers,I=A.curRecognizer;(!I||I&&8&I.state)&&(A.curRecognizer=null,I=null);for(var e=0;e<C.length;)t=C[e],2===A.stopped||I&&t!==I&&!t.canRecognizeWith(I)?t.reset():t.recognize(g),!I&&14&t.state&&(A.curRecognizer=t,I=t),e++}},A.get=function(g){if(g instanceof RI)return g;for(var A=this.recognizers,t=0;t<A.length;t++)if(A[t].options.event===g)return A[t];return null},A.add=function(g){if(OI(g,"add",this))return this;var A=this.get(g.options.event);return A&&this.remove(A),this.recognizers.push(g),g.manager=this,this.touchAction.update(),g},A.remove=function(g){if(OI(g,"remove",this))return this;var A=this.get(g);if(g){var t=this.recognizers,C=sI(t,A);-1!==C&&(t.splice(C,1),this.touchAction.update())}return this},A.on=function(g,A){if(void 0===g||void 0===A)return this;var t=this.handlers;return QC(II(g),function(g){t[g]=t[g]||[],t[g].push(A)}),this},A.off=function(g,A){if(void 0===g)return this;var t=this.handlers;return QC(II(g),function(g){A?t[g]&&t[g].splice(sI(t[g],A),1):delete t[g]}),this},A.emit=function(g,A){this.options.domEvents&&function(g,A){var t=document.createEvent("Event");t.initEvent(g,!0,!0),t.gesture=A,A.target.dispatchEvent(t)}(g,A);var t=this.handlers[g]&&this.handlers[g].slice();if(t&&t.length){A.type=g,A.preventDefault=function(){A.srcEvent.preventDefault()};for(var C=0;C<t.length;)t[C](A),C++}},A.destroy=function(){this.element&&VI(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null},g}(),WI={touchstart:1,touchmove:2,touchend:4,touchcancel:8},QI=function(g){function A(){var t,C=A.prototype;return C.evTarget="touchstart",C.evWin="touchstart touchmove touchend touchcancel",(t=g.apply(this,arguments)||this).started=!1,t}return pC(A,g),A.prototype.handler=function(g){var A=WI[g.type];if(1===A&&(this.started=!0),this.started){var t=UI.call(this,g,A);12&A&&t[0].length-t[1].length===0&&(this.started=!1),this.callback(this.manager,A,{pointers:t[0],changedPointers:t[1],pointerType:GC,srcEvent:g})}},A}(nI);function UI(g,A){var t=cI(g.touches),C=cI(g.changedTouches);return 12&A&&(t=uI(t.concat(C),"identifier",!0)),[t,C]}function KI(g,A,t){var C="DEPRECATED METHOD: "+A+"\n"+t+" AT \n";return function(){var A=new Error("get-stack-trace"),t=A&&A.stack?A.stack.replace(/^[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^Object.<anonymous>\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",I=window.console&&(window.console.warn||window.console.log);return I&&I.call(window.console,C,t),g.apply(this,arguments)}}var HI=KI(function(g,A,t){for(var C=Object.keys(A),I=0;I<C.length;)(!t||t&&void 0===g[C[I]])&&(g[C[I]]=A[C[I]]),I++;return g},"extend","Use `assign`."),_I=KI(function(g,A){return HI(g,A,!0)},"merge","Use `assign`.");function XI(g,A,t){var C,I=A.prototype;(C=g.prototype=Object.create(I)).constructor=g,C._super=I,t&&bC(C,t)}function JI(g,A){return function(){return g.apply(A,arguments)}}var qI=function(){var g=function(g,A){return void 0===A&&(A={}),new YI(g,uC({recognizers:LI.concat()},A))};return g.VERSION="2.0.17-rc",g.DIRECTION_ALL=30,g.DIRECTION_DOWN=LC,g.DIRECTION_LEFT=2,g.DIRECTION_RIGHT=4,g.DIRECTION_UP=8,g.DIRECTION_HORIZONTAL=6,g.DIRECTION_VERTICAL=VC,g.DIRECTION_NONE=1,g.DIRECTION_DOWN=LC,g.INPUT_START=1,g.INPUT_MOVE=2,g.INPUT_END=4,g.INPUT_CANCEL=8,g.STATE_POSSIBLE=1,g.STATE_BEGAN=2,g.STATE_CHANGED=4,g.STATE_ENDED=8,g.STATE_RECOGNIZED=8,g.STATE_CANCELLED=16,g.STATE_FAILED=TI,g.Manager=YI,g.Input=nI,g.TouchAction=HC,g.TouchInput=fI,g.MouseInput=mI,g.PointerEventInput=lI,g.TouchMouseInput=EI,g.SingleTouchInput=QI,g.Recognizer=RI,g.AttrRecognizer=MI,g.Tap=PI,g.Pan=BI,g.Swipe=ZI,g.Pinch=SI,g.Rotate=FI,g.Press=GI,g.on=eI,g.off=iI,g.each=QC,g.merge=_I,g.extend=HI,g.bindFn=JI,g.assign=bC,g.inherit=XI,g.bindFn=JI,g.prefixed=OC,g.toArray=cI,g.inArray=sI,g.uniqueArray=uI,g.splitStr=II,g.boolOrFn=UC,g.hasParent=_C,g.addEventListeners=eI,g.removeEventListeners=iI,g.defaults=bC({},jI,{preset:LI}),g}();qI.defaults;
34/**
35 * vis-util
36 * https://github.com/visjs/vis-util
37 *
38 * utilitie collection for visjs
39 *
40 * @version 6.0.0
41 * @date 2025-07-12T18:02:43.836Z
42 *
43 * @copyright (c) 2011-2017 Almende B.V, http://almende.com
44 * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs
45 *
46 * @license
47 * vis.js is dual licensed under both
48 *
49 * 1. The Apache 2.0 License
50 * http://www.apache.org/licenses/LICENSE-2.0
51 *
52 * and
53 *
54 * 2. The MIT License
55 * http://opensource.org/licenses/MIT
56 *
57 * vis.js may be distributed under either license.
58 */
59const $I=Symbol("DELETE");function ge(...g){const A=Ae(...g);return Ce(A),A}function Ae(...g){if(g.length<2)return g[0];if(g.length>2)return Ae(ge(g[0],g[1]),...g.slice(2));const A=g[0],t=g[1];if(A instanceof Date&&t instanceof Date)return A.setTime(t.getTime()),A;for(const g of Reflect.ownKeys(t))Object.prototype.propertyIsEnumerable.call(t,g)&&(t[g]===$I?delete A[g]:null===A[g]||null===t[g]||"object"!=typeof A[g]||"object"!=typeof t[g]||Array.isArray(A[g])||Array.isArray(t[g])?A[g]=te(t[g]):A[g]=Ae(A[g],t[g]));return A}function te(g){return Array.isArray(g)?g.map(g=>te(g)):"object"==typeof g&&null!==g?g instanceof Date?new Date(g.getTime()):Ae({},g):g}function Ce(g){for(const A of Object.keys(g))g[A]===$I?delete g[A]:"object"==typeof g[A]&&null!==g[A]&&Ce(g[A])}function Ie(...g){return function(g){let[A,t,C]=function(...g){const A=function(){let g=4022871197;return function(A){const t=A.toString();for(let A=0;A<t.length;A++){g+=t.charCodeAt(A);let C=.02519603282416938*g;g=C>>>0,C-=g,C*=g,g=C>>>0,C-=g,g+=4294967296*C}return 2.3283064365386963e-10*(g>>>0)}}();let t=A(" "),C=A(" "),I=A(" ");for(let e=0;e<g.length;e++)t-=A(g[e]),t<0&&(t+=1),C-=A(g[e]),C<0&&(C+=1),I-=A(g[e]),I<0&&(I+=1);return[t,C,I]}(g),I=1;const e=()=>{const g=2091639*A+2.3283064365386963e-10*I;return A=t,t=C,C=g-(I=0|g)};return e.uint32=()=>4294967296*e(),e.fract53=()=>e()+11102230246251565e-32*(2097152*e()|0),e.algorithm="Alea",e.seed=g,e.version="0.9",e}(g.length?g:[Date.now()])}const ee="undefined"!=typeof window?window.Hammer||qI:function(){return function(){const g=()=>{};return{on:g,off:g,destroy:g,emit:g,get:()=>({set:g})}}()};function ie(g){this._cleanupQueue=[],this.active=!1,this._dom={container:g,overlay:document.createElement("div")},this._dom.overlay.classList.add("vis-overlay"),this._dom.container.appendChild(this._dom.overlay),this._cleanupQueue.push(()=>{this._dom.overlay.parentNode.removeChild(this._dom.overlay)});const A=ee(this._dom.overlay);A.on("tap",this._onTapOverlay.bind(this)),this._cleanupQueue.push(()=>{A.destroy()});["tap","doubletap","press","pinch","pan","panstart","panmove","panend"].forEach(g=>{A.on(g,g=>{g.srcEvent.stopPropagation()})}),document&&document.body&&(this._onClick=A=>{(function(g,A){for(;g;){if(g===A)return!0;g=g.parentNode}return!1})(A.target,g)||this.deactivate()},document.body.addEventListener("click",this._onClick),this._cleanupQueue.push(()=>{document.body.removeEventListener("click",this._onClick)})),this._escListener=g=>{("key"in g?"Escape"===g.key:27===g.keyCode)&&this.deactivate()}}cC(ie.prototype),ie.current=null,ie.prototype.destroy=function(){this.deactivate();for(const g of this._cleanupQueue.splice(0).reverse())g()},ie.prototype.activate=function(){ie.current&&ie.current.deactivate(),ie.current=this,this.active=!0,this._dom.overlay.style.display="none",this._dom.container.classList.add("vis-active"),this.emit("change"),this.emit("activate"),document.body.addEventListener("keydown",this._escListener)},ie.prototype.deactivate=function(){this.active=!1,this._dom.overlay.style.display="block",this._dom.container.classList.remove("vis-active"),document.body.removeEventListener("keydown",this._escListener),this.emit("change"),this.emit("deactivate")},ie.prototype._onTapOverlay=function(g){this.activate(),g.srcEvent.stopPropagation()};const oe=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,ne=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,se=/^rgb\( *(1?\d{1,2}|2[0-4]\d|25[0-5]) *, *(1?\d{1,2}|2[0-4]\d|25[0-5]) *, *(1?\d{1,2}|2[0-4]\d|25[0-5]) *\)$/i,re=/^rgba\( *(1?\d{1,2}|2[0-4]\d|25[0-5]) *, *(1?\d{1,2}|2[0-4]\d|25[0-5]) *, *(1?\d{1,2}|2[0-4]\d|25[0-5]) *, *([01]|0?\.\d+) *\)$/i;function ae(g){if(g)for(;!0===g.hasChildNodes();){const A=g.firstChild;A&&(ae(A),g.removeChild(A))}}function de(g){return g instanceof String||"string"==typeof g}function he(g){return"object"==typeof g&&null!==g}function le(g,A,t,C){let I=!1;!0===C&&(I=null===A[t]&&void 0!==g[t]),I?delete g[t]:g[t]=A[t]}function ce(g,A,t=!1){for(const C in g)if(void 0!==A[C])if(null===A[C]||"object"!=typeof A[C])le(g,A,C,t);else{const I=g[C],e=A[C];he(I)&&he(e)&&ce(I,e,t)}}function ue(g,A,t,C=!1){if(Array.isArray(t))throw new TypeError("Arrays are not supported by deepExtend");for(let I=0;I<g.length;I++){const e=g[I];if(Object.prototype.hasOwnProperty.call(t,e))if(t[e]&&t[e].constructor===Object)void 0===A[e]&&(A[e]={}),A[e].constructor===Object?fe(A[e],t[e],!1,C):le(A,t,e,C);else{if(Array.isArray(t[e]))throw new TypeError("Arrays are not supported by deepExtend");le(A,t,e,C)}}return A}function pe(g,A,t,C=!1){if(Array.isArray(t))throw new TypeError("Arrays are not supported by deepExtend");for(const I in t)if(Object.prototype.hasOwnProperty.call(t,I)&&!g.includes(I))if(t[I]&&t[I].constructor===Object)void 0===A[I]&&(A[I]={}),A[I].constructor===Object?fe(A[I],t[I]):le(A,t,I,C);else if(Array.isArray(t[I])){A[I]=[];for(let g=0;g<t[I].length;g++)A[I].push(t[I][g])}else le(A,t,I,C);return A}function fe(g,A,t=!1,C=!1){for(const I in A)(Object.prototype.hasOwnProperty.call(A,I)||!0===t)&&("object"==typeof A[I]&&null!==A[I]&&Object.getPrototypeOf(A[I])===Object.prototype?void 0===g[I]?g[I]=fe({},A[I],t):"object"==typeof g[I]&&null!==g[I]&&Object.getPrototypeOf(g[I])===Object.prototype?fe(g[I],A[I],t):le(g,A,I,C):Array.isArray(A[I])?g[I]=A[I].slice():le(g,A,I,C));return g}function ve(g,A){return[...g,A]}function be(g){return g.slice()}function me(g){return g.getBoundingClientRect().top}function ye(g,A){if(Array.isArray(g)){const t=g.length;for(let C=0;C<t;C++)A(g[C],C,g)}else for(const t in g)Object.prototype.hasOwnProperty.call(g,t)&&A(g[t],t,g)}function we(g){let A;switch(g.length){case 3:case 4:return A=ne.exec(g),A?{r:parseInt(A[1]+A[1],16),g:parseInt(A[2]+A[2],16),b:parseInt(A[3]+A[3],16)}:null;case 6:case 7:return A=oe.exec(g),A?{r:parseInt(A[1],16),g:parseInt(A[2],16),b:parseInt(A[3],16)}:null;default:return null}}function xe(g,A){if(g.includes("rgba"))return g;if(g.includes("rgb")){const t=g.substr(g.indexOf("(")+1).replace(")","").split(",");return"rgba("+t[0]+","+t[1]+","+t[2]+","+A+")"}{const t=we(g);return null==t?g:"rgba("+t.r+","+t.g+","+t.b+","+A+")"}}function Ee(g,A,t){return"#"+((1<<24)+(g<<16)+(A<<8)+t).toString(16).slice(1)}function Oe(g,A){if(de(g)){let A=g;if(Re(A)){const g=A.substr(4).substr(0,A.length-5).split(",").map(function(g){return parseInt(g)});A=Ee(g[0],g[1],g[2])}if(!0===ke(A)){const g=function(g){const A=we(g);if(!A)throw new TypeError(`'${g}' is not a valid color.`);return Te(A.r,A.g,A.b)}(A),t={h:g.h,s:.8*g.s,v:Math.min(1,1.02*g.v)},C={h:g.h,s:Math.min(1,1.25*g.s),v:.8*g.v},I=Ne(C.h,C.s,C.v),e=Ne(t.h,t.s,t.v);return{background:A,border:I,highlight:{background:e,border:I},hover:{background:e,border:I}}}return{background:A,border:A,highlight:{background:A,border:A},hover:{background:A,border:A}}}return{background:g.background||void 0,border:g.border||void 0,highlight:de(g.highlight)?{border:g.highlight,background:g.highlight}:{background:g.highlight&&g.highlight.background||void 0,border:g.highlight&&g.highlight.border||void 0},hover:de(g.hover)?{border:g.hover,background:g.hover}:{border:g.hover&&g.hover.border||void 0,background:g.hover&&g.hover.background||void 0}}}function Te(g,A,t){g/=255,A/=255,t/=255;const C=Math.min(g,Math.min(A,t)),I=Math.max(g,Math.max(A,t));if(C===I)return{h:0,s:0,v:C};return{h:60*((g===C?3:t===C?1:5)-(g===C?A-t:t===C?g-A:t-g)/(I-C))/360,s:(I-C)/I,v:I}}function De(g,A,t){let C,I,e;const i=Math.floor(6*g),o=6*g-i,n=t*(1-A),s=t*(1-o*A),r=t*(1-(1-o)*A);switch(i%6){case 0:C=t,I=r,e=n;break;case 1:C=s,I=t,e=n;break;case 2:C=n,I=t,e=r;break;case 3:C=n,I=s,e=t;break;case 4:C=r,I=n,e=t;break;case 5:C=t,I=n,e=s}return{r:Math.floor(255*C),g:Math.floor(255*I),b:Math.floor(255*e)}}function Ne(g,A,t){const C=De(g,A,t);return Ee(C.r,C.g,C.b)}function ke(g){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(g)}function Re(g){return se.test(g)}function Pe(g){if(null===g||"object"!=typeof g)return null;if(g instanceof Element)return g;const A=Object.create(g);for(const t in g)Object.prototype.hasOwnProperty.call(g,t)&&"object"==typeof g[t]&&(A[t]=Pe(g[t]));return A}function Me(g,A,t,C={}){const I=function(g){return null!=g},e=function(g){return null!==g&&"object"==typeof g};if(!e(g))throw new Error("Parameter mergeTarget must be an object");if(!e(A))throw new Error("Parameter options must be an object");if(!I(t))throw new Error("Parameter option must have a value");if(!e(C))throw new Error("Parameter globalOptions must be an object");const i=A[t],o=e(C)&&!function(g){for(const A in g)if(Object.prototype.hasOwnProperty.call(g,A))return!1;return!0}(C)?C[t]:void 0,n=o?o.enabled:void 0;if(void 0===i)return;if("boolean"==typeof i)return e(g[t])||(g[t]={}),void(g[t].enabled=i);if(null===i&&!e(g[t])){if(!I(o))return;g[t]=Object.create(o)}if(!e(i))return;let s=!0;void 0!==i.enabled?s=i.enabled:void 0!==n&&(s=o.enabled),function(g,A,t){e(g[t])||(g[t]={});const C=A[t],I=g[t];for(const g in C)Object.prototype.hasOwnProperty.call(C,g)&&(I[g]=C[g])}(g,A,t),g[t].enabled=s}const ze={linear:g=>g,easeInQuad:g=>g*g,easeOutQuad:g=>g*(2-g),easeInOutQuad:g=>g<.5?2*g*g:(4-2*g)*g-1,easeInCubic:g=>g*g*g,easeOutCubic:g=>--g*g*g+1,easeInOutCubic:g=>g<.5?4*g*g*g:(g-1)*(2*g-2)*(2*g-2)+1,easeInQuart:g=>g*g*g*g,easeOutQuart:g=>1- --g*g*g*g,easeInOutQuart:g=>g<.5?8*g*g*g*g:1-8*--g*g*g*g,easeInQuint:g=>g*g*g*g*g,easeOutQuint:g=>1+--g*g*g*g*g,easeInOutQuint:g=>g<.5?16*g*g*g*g*g:1+16*--g*g*g*g*g};function Be(g,A){let t;Array.isArray(A)||(A=[A]);for(const C of g)if(C){t=C[A[0]];for(let g=1;g<A.length;g++)t&&(t=t[A[g]]);if(void 0!==t)break}return t}const Ze={black:"#000000",navy:"#000080",darkblue:"#00008B",mediumblue:"#0000CD",blue:"#0000FF",darkgreen:"#006400",green:"#008000",teal:"#008080",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",lime:"#00FF00",springgreen:"#00FF7F",aqua:"#00FFFF",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",mediumaquamarine:"#66CDAA",dimgray:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",lightslategray:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",maroon:"#800000",purple:"#800080",olive:"#808000",gray:"#808080",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370D8",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",silver:"#C0C0C0",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgrey:"#D3D3D3",palevioletred:"#D87093",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",red:"#FF0000",fuchsia:"#FF00FF",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",yellow:"#FFFF00",lightyellow:"#FFFFE0",ivory:"#FFFFF0",white:"#FFFFFF"};let Se=class{constructor(g=1){this.pixelRatio=g,this.generated=!1,this.centerCoordinates={x:144.5,y:144.5},this.r=289*.49,this.color={r:255,g:255,b:255,a:1},this.hueCircle=void 0,this.initialColor={r:255,g:255,b:255,a:1},this.previousColor=void 0,this.applied=!1,this.updateCallback=()=>{},this.closeCallback=()=>{},this._create()}insertTo(g){void 0!==this.hammer&&(this.hammer.destroy(),this.hammer=void 0),this.container=g,this.container.appendChild(this.frame),this._bindHammer(),this._setSize()}setUpdateCallback(g){if("function"!=typeof g)throw new Error("Function attempted to set as colorPicker update callback is not a function.");this.updateCallback=g}setCloseCallback(g){if("function"!=typeof g)throw new Error("Function attempted to set as colorPicker closing callback is not a function.");this.closeCallback=g}_isColorString(g){if("string"==typeof g)return Ze[g]}setColor(g,A=!0){if("none"===g)return;let t;const C=this._isColorString(g);if(void 0!==C&&(g=C),!0===de(g)){if(!0===Re(g)){const A=g.substr(4).substr(0,g.length-5).split(",");t={r:A[0],g:A[1],b:A[2],a:1}}else if(!0===function(g){return re.test(g)}(g)){const A=g.substr(5).substr(0,g.length-6).split(",");t={r:A[0],g:A[1],b:A[2],a:A[3]}}else if(!0===ke(g)){const A=we(g);t={r:A.r,g:A.g,b:A.b,a:1}}}else if(g instanceof Object&&void 0!==g.r&&void 0!==g.g&&void 0!==g.b){const A=void 0!==g.a?g.a:"1.0";t={r:g.r,g:g.g,b:g.b,a:A}}if(void 0===t)throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: "+JSON.stringify(g));this._setColor(t,A)}show(){void 0!==this.closeCallback&&(this.closeCallback(),this.closeCallback=void 0),this.applied=!1,this.frame.style.display="block",this._generateHueCircle()}_hide(g=!0){!0===g&&(this.previousColor=Object.assign({},this.color)),!0===this.applied&&this.updateCallback(this.initialColor),this.frame.style.display="none",setTimeout(()=>{void 0!==this.closeCallback&&(this.closeCallback(),this.closeCallback=void 0)},0)}_save(){this.updateCallback(this.color),this.applied=!1,this._hide()}_apply(){this.applied=!0,this.updateCallback(this.color),this._updatePicker(this.color)}_loadLast(){void 0!==this.previousColor?this.setColor(this.previousColor,!1):alert("There is no last color to load...")}_setColor(g,A=!0){!0===A&&(this.initialColor=Object.assign({},g)),this.color=g;const t=Te(g.r,g.g,g.b),C=2*Math.PI,I=this.r*t.s,e=this.centerCoordinates.x+I*Math.sin(C*t.h),i=this.centerCoordinates.y+I*Math.cos(C*t.h);this.colorPickerSelector.style.left=e-.5*this.colorPickerSelector.clientWidth+"px",this.colorPickerSelector.style.top=i-.5*this.colorPickerSelector.clientHeight+"px",this._updatePicker(g)}_setOpacity(g){this.color.a=g/100,this._updatePicker(this.color)}_setBrightness(g){const A=Te(this.color.r,this.color.g,this.color.b);A.v=g/100;const t=De(A.h,A.s,A.v);t.a=this.color.a,this.color=t,this._updatePicker()}_updatePicker(g=this.color){const A=Te(g.r,g.g,g.b),t=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)),t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);const C=this.colorPickerCanvas.clientWidth,I=this.colorPickerCanvas.clientHeight;t.clearRect(0,0,C,I),t.putImageData(this.hueCircle,0,0),t.fillStyle="rgba(0,0,0,"+(1-A.v)+")",t.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),t.fill(),this.brightnessRange.value=100*A.v,this.opacityRange.value=100*g.a,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}_setSize(){this.colorPickerCanvas.style.width="100%",this.colorPickerCanvas.style.height="100%",this.colorPickerCanvas.width=289*this.pixelRatio,this.colorPickerCanvas.height=289*this.pixelRatio}_create(){if(this.frame=document.createElement("div"),this.frame.className="vis-color-picker",this.colorPickerDiv=document.createElement("div"),this.colorPickerSelector=document.createElement("div"),this.colorPickerSelector.className="vis-selector",this.colorPickerDiv.appendChild(this.colorPickerSelector),this.colorPickerCanvas=document.createElement("canvas"),this.colorPickerDiv.appendChild(this.colorPickerCanvas),this.colorPickerCanvas.getContext){const g=this.colorPickerCanvas.getContext("2d");this.pixelRatio=(window.devicePixelRatio||1)/(g.webkitBackingStorePixelRatio||g.mozBackingStorePixelRatio||g.msBackingStorePixelRatio||g.oBackingStorePixelRatio||g.backingStorePixelRatio||1),this.colorPickerCanvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{const g=document.createElement("DIV");g.style.color="red",g.style.fontWeight="bold",g.style.padding="10px",g.innerText="Error: your browser does not support HTML canvas",this.colorPickerCanvas.appendChild(g)}this.colorPickerDiv.className="vis-color",this.opacityDiv=document.createElement("div"),this.opacityDiv.className="vis-opacity",this.brightnessDiv=document.createElement("div"),this.brightnessDiv.className="vis-brightness",this.arrowDiv=document.createElement("div"),this.arrowDiv.className="vis-arrow",this.opacityRange=document.createElement("input");try{this.opacityRange.type="range",this.opacityRange.min="0",this.opacityRange.max="100"}catch(g){}this.opacityRange.value="100",this.opacityRange.className="vis-range",this.brightnessRange=document.createElement("input");try{this.brightnessRange.type="range",this.brightnessRange.min="0",this.brightnessRange.max="100"}catch(g){}this.brightnessRange.value="100",this.brightnessRange.className="vis-range",this.opacityDiv.appendChild(this.opacityRange),this.brightnessDiv.appendChild(this.brightnessRange);const g=this;this.opacityRange.onchange=function(){g._setOpacity(this.value)},this.opacityRange.oninput=function(){g._setOpacity(this.value)},this.brightnessRange.onchange=function(){g._setBrightness(this.value)},this.brightnessRange.oninput=function(){g._setBrightness(this.value)},this.brightnessLabel=document.createElement("div"),this.brightnessLabel.className="vis-label vis-brightness",this.brightnessLabel.innerText="brightness:",this.opacityLabel=document.createElement("div"),this.opacityLabel.className="vis-label vis-opacity",this.opacityLabel.innerText="opacity:",this.newColorDiv=document.createElement("div"),this.newColorDiv.className="vis-new-color",this.newColorDiv.innerText="new",this.initialColorDiv=document.createElement("div"),this.initialColorDiv.className="vis-initial-color",this.initialColorDiv.innerText="initial",this.cancelButton=document.createElement("div"),this.cancelButton.className="vis-button vis-cancel",this.cancelButton.innerText="cancel",this.cancelButton.onclick=this._hide.bind(this,!1),this.applyButton=document.createElement("div"),this.applyButton.className="vis-button vis-apply",this.applyButton.innerText="apply",this.applyButton.onclick=this._apply.bind(this),this.saveButton=document.createElement("div"),this.saveButton.className="vis-button vis-save",this.saveButton.innerText="save",this.saveButton.onclick=this._save.bind(this),this.loadButton=document.createElement("div"),this.loadButton.className="vis-button vis-load",this.loadButton.innerText="load last",this.loadButton.onclick=this._loadLast.bind(this),this.frame.appendChild(this.colorPickerDiv),this.frame.appendChild(this.arrowDiv),this.frame.appendChild(this.brightnessLabel),this.frame.appendChild(this.brightnessDiv),this.frame.appendChild(this.opacityLabel),this.frame.appendChild(this.opacityDiv),this.frame.appendChild(this.newColorDiv),this.frame.appendChild(this.initialColorDiv),this.frame.appendChild(this.cancelButton),this.frame.appendChild(this.applyButton),this.frame.appendChild(this.saveButton),this.frame.appendChild(this.loadButton)}_bindHammer(){this.drag={},this.pinch={},this.hammer=new ee(this.colorPickerCanvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.on("hammer.input",g=>{g.isFirst&&this._moveSelector(g)}),this.hammer.on("tap",g=>{this._moveSelector(g)}),this.hammer.on("panstart",g=>{this._moveSelector(g)}),this.hammer.on("panmove",g=>{this._moveSelector(g)}),this.hammer.on("panend",g=>{this._moveSelector(g)})}_generateHueCircle(){if(!1===this.generated){const g=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(g.webkitBackingStorePixelRatio||g.mozBackingStorePixelRatio||g.msBackingStorePixelRatio||g.oBackingStorePixelRatio||g.backingStorePixelRatio||1)),g.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);const A=this.colorPickerCanvas.clientWidth,t=this.colorPickerCanvas.clientHeight;let C,I,e,i;g.clearRect(0,0,A,t),this.centerCoordinates={x:.5*A,y:.5*t},this.r=.49*A;const o=2*Math.PI/360,n=1/360,s=1/this.r;let r;for(e=0;e<360;e++)for(i=0;i<this.r;i++)C=this.centerCoordinates.x+i*Math.sin(o*e),I=this.centerCoordinates.y+i*Math.cos(o*e),r=De(e*n,i*s,1),g.fillStyle="rgb("+r.r+","+r.g+","+r.b+")",g.fillRect(C-.5,I-.5,2,2);g.strokeStyle="rgba(0,0,0,1)",g.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),g.stroke(),this.hueCircle=g.getImageData(0,0,A,t)}this.generated=!0}_moveSelector(g){const A=this.colorPickerDiv.getBoundingClientRect(),t=g.center.x-A.left,C=g.center.y-A.top,I=.5*this.colorPickerDiv.clientHeight,e=.5*this.colorPickerDiv.clientWidth,i=t-e,o=C-I,n=Math.atan2(i,o),s=.98*Math.min(Math.sqrt(i*i+o*o),e),r=Math.cos(n)*s+I,a=Math.sin(n)*s+e;this.colorPickerSelector.style.top=r-.5*this.colorPickerSelector.clientHeight+"px",this.colorPickerSelector.style.left=a-.5*this.colorPickerSelector.clientWidth+"px";let d=n/(2*Math.PI);d=d<0?d+1:d;const h=s/this.r,l=Te(this.color.r,this.color.g,this.color.b);l.h=d,l.s=h;const c=De(l.h,l.s,l.v);c.a=this.color.a,this.color=c,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}};function Fe(...g){if(g.length<1)throw new TypeError("Invalid arguments.");if(1===g.length)return document.createTextNode(g[0]);{const A=document.createElement(g[0]);return A.appendChild(Fe(...g.slice(1))),A}}let Ge,je=!1;const Le="background: #FFeeee; color: #dd0000";const Ve=ie,Ye=class{constructor(g,A,t,C=1,I=()=>!1){this.parent=g,this.changedOptions=[],this.container=A,this.allowCreation=!1,this.hideOption=I,this.options={},this.initialized=!1,this.popupCounter=0,this.defaultOptions={enabled:!1,filter:!0,container:void 0,showButton:!0},Object.assign(this.options,this.defaultOptions),this.configureOptions=t,this.moduleOptions={},this.domElements=[],this.popupDiv={},this.popupLimit=5,this.popupHistory={},this.colorPicker=new Se(C),this.wrapper=void 0}setOptions(g){if(void 0!==g){this.popupHistory={},this._removePopup();let A=!0;if("string"==typeof g)this.options.filter=g;else if(Array.isArray(g))this.options.filter=g.join();else if("object"==typeof g){if(null==g)throw new TypeError("options cannot be null");void 0!==g.container&&(this.options.container=g.container),void 0!==g.filter&&(this.options.filter=g.filter),void 0!==g.showButton&&(this.options.showButton=g.showButton),void 0!==g.enabled&&(A=g.enabled)}else"boolean"==typeof g?(this.options.filter=!0,A=g):"function"==typeof g&&(this.options.filter=g,A=!0);!1===this.options.filter&&(A=!1),this.options.enabled=A}this._clean()}setModuleOptions(g){this.moduleOptions=g,!0===this.options.enabled&&(this._clean(),void 0!==this.options.container&&(this.container=this.options.container),this._create())}_create(){this._clean(),this.changedOptions=[];const g=this.options.filter;let A=0,t=!1;for(const C in this.configureOptions)Object.prototype.hasOwnProperty.call(this.configureOptions,C)&&(this.allowCreation=!1,t=!1,"function"==typeof g?(t=g(C,[]),t=t||this._handleObject(this.configureOptions[C],[C],!0)):!0!==g&&-1===g.indexOf(C)||(t=!0),!1!==t&&(this.allowCreation=!0,A>0&&this._makeItem([]),this._makeHeader(C),this._handleObject(this.configureOptions[C],[C])),A++);this._makeButton(),this._push()}_push(){this.wrapper=document.createElement("div"),this.wrapper.className="vis-configuration-wrapper",this.container.appendChild(this.wrapper);for(let g=0;g<this.domElements.length;g++)this.wrapper.appendChild(this.domElements[g]);this._showPopupIfNeeded()}_clean(){for(let g=0;g<this.domElements.length;g++)this.wrapper.removeChild(this.domElements[g]);void 0!==this.wrapper&&(this.container.removeChild(this.wrapper),this.wrapper=void 0),this.domElements=[],this._removePopup()}_getValue(g){let A=this.moduleOptions;for(let t=0;t<g.length;t++){if(void 0===A[g[t]]){A=void 0;break}A=A[g[t]]}return A}_makeItem(g,...A){if(!0===this.allowCreation){const t=document.createElement("div");return t.className="vis-configuration vis-config-item vis-config-s"+g.length,A.forEach(g=>{t.appendChild(g)}),this.domElements.push(t),this.domElements.length}return 0}_makeHeader(g){const A=document.createElement("div");A.className="vis-configuration vis-config-header",A.innerText=g,this._makeItem([],A)}_makeLabel(g,A,t=!1){const C=document.createElement("div");if(C.className="vis-configuration vis-config-label vis-config-s"+A.length,!0===t){for(;C.firstChild;)C.removeChild(C.firstChild);C.appendChild(Fe("i","b",g))}else C.innerText=g+":";return C}_makeDropdown(g,A,t){const C=document.createElement("select");C.className="vis-configuration vis-config-select";let I=0;void 0!==A&&-1!==g.indexOf(A)&&(I=g.indexOf(A));for(let A=0;A<g.length;A++){const t=document.createElement("option");t.value=g[A],A===I&&(t.selected="selected"),t.innerText=g[A],C.appendChild(t)}const e=this;C.onchange=function(){e._update(this.value,t)};const i=this._makeLabel(t[t.length-1],t);this._makeItem(t,i,C)}_makeRange(g,A,t){const C=g[0],I=g[1],e=g[2],i=g[3],o=document.createElement("input");o.className="vis-configuration vis-config-range";try{o.type="range",o.min=I,o.max=e}catch(g){}o.step=i;let n="",s=0;if(void 0!==A){const g=1.2;A<0&&A*g<I?(o.min=Math.ceil(A*g),s=o.min,n="range increased"):A/g<I&&(o.min=Math.ceil(A/g),s=o.min,n="range increased"),A*g>e&&1!==e&&(o.max=Math.ceil(A*g),s=o.max,n="range increased"),o.value=A}else o.value=C;const r=document.createElement("input");r.className="vis-configuration vis-config-rangeinput",r.value=o.value;const a=this;o.onchange=function(){r.value=this.value,a._update(Number(this.value),t)},o.oninput=function(){r.value=this.value};const d=this._makeLabel(t[t.length-1],t),h=this._makeItem(t,d,o,r);""!==n&&this.popupHistory[h]!==s&&(this.popupHistory[h]=s,this._setupPopup(n,h))}_makeButton(){if(!0===this.options.showButton){const g=document.createElement("div");g.className="vis-configuration vis-config-button",g.innerText="generate options",g.onclick=()=>{this._printOptions()},g.onmouseover=()=>{g.className="vis-configuration vis-config-button hover"},g.onmouseout=()=>{g.className="vis-configuration vis-config-button"},this.optionsContainer=document.createElement("div"),this.optionsContainer.className="vis-configuration vis-config-option-container",this.domElements.push(this.optionsContainer),this.domElements.push(g)}}_setupPopup(g,A){if(!0===this.initialized&&!0===this.allowCreation&&this.popupCounter<this.popupLimit){const t=document.createElement("div");t.id="vis-configuration-popup",t.className="vis-configuration-popup",t.innerText=g,t.onclick=()=>{this._removePopup()},this.popupCounter+=1,this.popupDiv={html:t,index:A}}}_removePopup(){void 0!==this.popupDiv.html&&(this.popupDiv.html.parentNode.removeChild(this.popupDiv.html),clearTimeout(this.popupDiv.hideTimeout),clearTimeout(this.popupDiv.deleteTimeout),this.popupDiv={})}_showPopupIfNeeded(){if(void 0!==this.popupDiv.html){const g=this.domElements[this.popupDiv.index].getBoundingClientRect();this.popupDiv.html.style.left=g.left+"px",this.popupDiv.html.style.top=g.top-30+"px",document.body.appendChild(this.popupDiv.html),this.popupDiv.hideTimeout=setTimeout(()=>{this.popupDiv.html.style.opacity=0},1500),this.popupDiv.deleteTimeout=setTimeout(()=>{this._removePopup()},1800)}}_makeCheckbox(g,A,t){const C=document.createElement("input");C.type="checkbox",C.className="vis-configuration vis-config-checkbox",C.checked=g,void 0!==A&&(C.checked=A,A!==g&&("object"==typeof g?A!==g.enabled&&this.changedOptions.push({path:t,value:A}):this.changedOptions.push({path:t,value:A})));const I=this;C.onchange=function(){I._update(this.checked,t)};const e=this._makeLabel(t[t.length-1],t);this._makeItem(t,e,C)}_makeTextInput(g,A,t){const C=document.createElement("input");C.type="text",C.className="vis-configuration vis-config-text",C.value=A,A!==g&&this.changedOptions.push({path:t,value:A});const I=this;C.onchange=function(){I._update(this.value,t)};const e=this._makeLabel(t[t.length-1],t);this._makeItem(t,e,C)}_makeColorField(g,A,t){const C=g[1],I=document.createElement("div");"none"!==(A=void 0===A?C:A)?(I.className="vis-configuration vis-config-colorBlock",I.style.backgroundColor=A):I.className="vis-configuration vis-config-colorBlock none",A=void 0===A?C:A,I.onclick=()=>{this._showColorPicker(A,I,t)};const e=this._makeLabel(t[t.length-1],t);this._makeItem(t,e,I)}_showColorPicker(g,A,t){A.onclick=function(){},this.colorPicker.insertTo(A),this.colorPicker.show(),this.colorPicker.setColor(g),this.colorPicker.setUpdateCallback(g=>{const C="rgba("+g.r+","+g.g+","+g.b+","+g.a+")";A.style.backgroundColor=C,this._update(C,t)}),this.colorPicker.setCloseCallback(()=>{A.onclick=()=>{this._showColorPicker(g,A,t)}})}_handleObject(g,A=[],t=!1){let C=!1;const I=this.options.filter;let e=!1;for(const i in g)if(Object.prototype.hasOwnProperty.call(g,i)){C=!0;const o=g[i],n=ve(A,i);if("function"==typeof I&&(C=I(i,A),!1===C&&!Array.isArray(o)&&"string"!=typeof o&&"boolean"!=typeof o&&o instanceof Object&&(this.allowCreation=!1,C=this._handleObject(o,n,!0),this.allowCreation=!1===t)),!1!==C){e=!0;const g=this._getValue(n);if(Array.isArray(o))this._handleArray(o,g,n);else if("string"==typeof o)this._makeTextInput(o,g,n);else if("boolean"==typeof o)this._makeCheckbox(o,g,n);else if(o instanceof Object){if(!this.hideOption(A,i,this.moduleOptions))if(void 0!==o.enabled){const g=ve(n,"enabled"),A=this._getValue(g);if(!0===A){const g=this._makeLabel(i,n,!0);this._makeItem(n,g),e=this._handleObject(o,n)||e}else this._makeCheckbox(o,A,n)}else{const g=this._makeLabel(i,n,!0);this._makeItem(n,g),e=this._handleObject(o,n)||e}}else console.error("dont know how to handle",o,i,n)}}return e}_handleArray(g,A,t){"string"==typeof g[0]&&"color"===g[0]?(this._makeColorField(g,A,t),g[1]!==A&&this.changedOptions.push({path:t,value:A})):"string"==typeof g[0]?(this._makeDropdown(g,A,t),g[0]!==A&&this.changedOptions.push({path:t,value:A})):"number"==typeof g[0]&&(this._makeRange(g,A,t),g[0]!==A&&this.changedOptions.push({path:t,value:Number(A)}))}_update(g,A){const t=this._constructOptions(g,A);this.parent.body&&this.parent.body.emitter&&this.parent.body.emitter.emit&&this.parent.body.emitter.emit("configChange",t),this.initialized=!0,this.parent.setOptions(t)}_constructOptions(g,A,t={}){let C=t;g="false"!==(g="true"===g||g)&&g;for(let t=0;t<A.length;t++)"global"!==A[t]&&(void 0===C[A[t]]&&(C[A[t]]={}),t!==A.length-1?C=C[A[t]]:C[A[t]]=g);return t}_printOptions(){const g=this.getOptions();for(;this.optionsContainer.firstChild;)this.optionsContainer.removeChild(this.optionsContainer.firstChild);this.optionsContainer.appendChild(Fe("pre","const options = "+JSON.stringify(g,null,2)))}getOptions(){const g={};for(let A=0;A<this.changedOptions.length;A++)this._constructOptions(this.changedOptions[A].value,this.changedOptions[A].path,g);return g}},We=ee,Qe=class{constructor(g,A){this.container=g,this.overflowMethod=A||"cap",this.x=0,this.y=0,this.padding=5,this.hidden=!1,this.frame=document.createElement("div"),this.frame.className="vis-tooltip",this.container.appendChild(this.frame)}setPosition(g,A){this.x=parseInt(g),this.y=parseInt(A)}setText(g){if(g instanceof Element){for(;this.frame.firstChild;)this.frame.removeChild(this.frame.firstChild);this.frame.appendChild(g)}else this.frame.innerText=g}show(g){if(void 0===g&&(g=!0),!0===g){const g=this.frame.clientHeight,A=this.frame.clientWidth,t=this.frame.parentNode.clientHeight,C=this.frame.parentNode.clientWidth;let I=0,e=0;if("flip"==this.overflowMethod){let t=!1,i=!0;this.y-g<this.padding&&(i=!1),this.x+A>C-this.padding&&(t=!0),I=t?this.x-A:this.x,e=i?this.y-g:this.y}else e=this.y-g,e+g+this.padding>t&&(e=t-g-this.padding),e<this.padding&&(e=this.padding),I=this.x,I+A+this.padding>C&&(I=C-A-this.padding),I<this.padding&&(I=this.padding);this.frame.style.left=I+"px",this.frame.style.top=e+"px",this.frame.style.visibility="visible",this.hidden=!1}else this.hide()}hide(){this.hidden=!0,this.frame.style.left="0",this.frame.style.top="0",this.frame.style.visibility="hidden"}destroy(){this.frame.parentNode.removeChild(this.frame)}},Ue=Le,Ke=class g{static validate(A,t,C){je=!1,Ge=t;let I=t;return void 0!==C&&(I=t[C]),g.parse(A,I,[]),je}static parse(A,t,C){for(const I in A)Object.prototype.hasOwnProperty.call(A,I)&&g.check(I,A,t,C)}static check(A,t,C,I){if(void 0===C[A]&&void 0===C.__any__)return void g.getSuggestion(A,C,I);let e=A,i=!0;void 0===C[A]&&void 0!==C.__any__&&(e="__any__",i="object"===g.getType(t[A]));let o=C[e];i&&void 0!==o.__type__&&(o=o.__type__),g.checkFields(A,t,C,e,o,I)}static checkFields(A,t,C,I,e,i){const o=function(t){console.error("%c"+t+g.printLocation(i,A),Le)},n=g.getType(t[A]),s=e[n];void 0!==s?"array"===g.getType(s)&&-1===s.indexOf(t[A])?(o('Invalid option detected in "'+A+'". Allowed values are:'+g.print(s)+' not "'+t[A]+'". '),je=!0):"object"===n&&"__any__"!==I&&(i=ve(i,A),g.parse(t[A],C[I],i)):void 0===e.any&&(o('Invalid type received for "'+A+'". Expected: '+g.print(Object.keys(e))+". Received ["+n+'] "'+t[A]+'"'),je=!0)}static getType(g){const A=typeof g;return"object"===A?null===g?"null":g instanceof Boolean?"boolean":g instanceof Number?"number":g instanceof String?"string":Array.isArray(g)?"array":g instanceof Date?"date":void 0!==g.nodeType?"dom":!0===g._isAMomentObject?"moment":"object":"number"===A?"number":"boolean"===A?"boolean":"string"===A?"string":void 0===A?"undefined":A}static getSuggestion(A,t,C){const I=g.findInOptions(A,t,C,!1),e=g.findInOptions(A,Ge,[],!0);let i;i=void 0!==I.indexMatch?" in "+g.printLocation(I.path,A,"")+'Perhaps it was incomplete? Did you mean: "'+I.indexMatch+'"?\n\n':e.distance<=4&&I.distance>e.distance?" in "+g.printLocation(I.path,A,"")+"Perhaps it was misplaced? Matching option found at: "+g.printLocation(e.path,e.closestMatch,""):I.distance<=8?'. Did you mean "'+I.closestMatch+'"?'+g.printLocation(I.path,A):". Did you mean one of these: "+g.print(Object.keys(t))+g.printLocation(C,A),console.error('%cUnknown option detected: "'+A+'"'+i,Le),je=!0}static findInOptions(A,t,C,I=!1){let e=1e9,i="",o=[];const n=A.toLowerCase();let s;for(const r in t){let a;if(void 0!==t[r].__type__&&!0===I){const I=g.findInOptions(A,t[r],ve(C,r));e>I.distance&&(i=I.closestMatch,o=I.path,e=I.distance,s=I.indexMatch)}else-1!==r.toLowerCase().indexOf(n)&&(s=r),a=g.levenshteinDistance(A,r),e>a&&(i=r,o=be(C),e=a)}return{closestMatch:i,path:o,distance:e,indexMatch:s}}static printLocation(g,A,t="Problem value found at: \n"){let C="\n\n"+t+"options = {\n";for(let A=0;A<g.length;A++){for(let g=0;g<A+1;g++)C+=" ";C+=g[A]+": {\n"}for(let A=0;A<g.length+1;A++)C+=" ";C+=A+"\n";for(let A=0;A<g.length+1;A++){for(let t=0;t<g.length-A;t++)C+=" ";C+="}\n"}return C+"\n\n"}static print(g){return JSON.stringify(g).replace(/(")|(\[)|(\])|(,"__type__")/g,"").replace(/(,)/g,", ")}static levenshteinDistance(g,A){if(0===g.length)return A.length;if(0===A.length)return g.length;const t=[];let C,I;for(C=0;C<=A.length;C++)t[C]=[C];for(I=0;I<=g.length;I++)t[0][I]=I;for(C=1;C<=A.length;C++)for(I=1;I<=g.length;I++)A.charAt(C-1)==g.charAt(I-1)?t[C][I]=t[C-1][I-1]:t[C][I]=Math.min(t[C-1][I-1]+1,Math.min(t[C][I-1]+1,t[C-1][I]+1));return t[A.length][g.length]}};var He,_e,Xe,Je,qe,$e,gi,Ai,ti,Ci,Ii,ei,ii,oi,ni={};function si(){if(He)return ni;He=1;var g=z(),A=et(),t=ot(),C=it(),I=Eg(),e=vt();return ni.f=g&&!A?Object.defineProperties:function(g,A){C(g);for(var i,o=I(A),n=e(A),s=n.length,r=0;s>r;)t.f(g,i=n[r++],o[i]);return g},ni}function ri(){return Xe?_e:(Xe=1,_e=Dg()("document","documentElement"))}function ai(){if(qe)return Je;qe=1;var g=pA(),A=bA(),t=g("keys");return Je=function(g){return t[g]||(t[g]=A(g))}}function di(){if(gi)return $e;gi=1;var g,A=it(),t=si(),C=ft(),I=ut(),e=ri(),i=xA(),o="prototype",n="script",s=ai()("IE_PROTO"),r=function(){},a=function(g){return"<"+n+">"+g+"</"+n+">"},d=function(g){g.write(a("")),g.close();var A=g.parentWindow.Object;return g=null,A},h=function(){try{g=new ActiveXObject("htmlfile")}catch(g){}var A,t,I;h="undefined"!=typeof document?document.domain&&g?d(g):(t=i("iframe"),I="java"+n+":",t.style.display="none",e.appendChild(t),t.src=String(I),(A=t.contentWindow.document).open(),A.write(a("document.F=Object")),A.close(),A.F):d(g);for(var s=C.length;s--;)delete h[o][C[s]];return h()};return I[s]=!0,$e=Object.create||function(g,C){var I;return null!==g?(r[o]=A(g),I=new r,r[o]=null,I[s]=g):I=h(),void 0===C?I:t.f(I,C)}}function hi(){if(Ci)return ti;Ci=1,Ai||(Ai=1,st()({target:"Object",stat:!0,sham:!z()},{create:di()}));var g=Tg().Object;return ti=function(A,t){return g.create(A,t)}}function li(){return ei?Ii:(ei=1,Ii=hi())}var ci,ui,pi,fi,vi,bi,mi,yi,wi,xi,Ei,Oi=C(oi?ii:(oi=1,ii=li())),Ti={};function Di(){if(ui)return ci;ui=1;var g=y();return ci=function(A,t){var C=[][A];return!!C&&g(function(){C.call(null,t||function(){return 1},1)})}}function Ni(){return vi?fi:(vi=1,function(){if(pi)return Ti;pi=1;var g=st(),A=T(),t=ct().indexOf,C=Di(),I=A([].indexOf),e=!!I&&1/I([1],1,-0)<0;g({target:"Array",proto:!0,forced:e||!C("indexOf")},{indexOf:function(g){var A=arguments.length>1?arguments[1]:void 0;return e?I(this,g,A)||0:t(this,g,A)}})}(),fi=gC()("Array","indexOf"))}function ki(){if(mi)return bi;mi=1;var g=Ng(),A=Ni(),t=Array.prototype;return bi=function(C){var I=C.indexOf;return C===t||g(t,C)&&I===t.indexOf?A:I},bi}function Ri(){return wi?yi:(wi=1,yi=ki())}var Pi,Mi,zi,Bi,Zi,Si=C(Ei?xi:(Ei=1,xi=Ri())),Fi={};function Gi(){return Mi?Pi:(Mi=1,Pi=function(){})}function ji(){return Zi?Bi:(Zi=1,function(){if(zi)return Fi;zi=1;var g=st(),A=ct().includes,t=y(),C=Gi();g({target:"Array",proto:!0,forced:t(function(){return!Array(1).includes()})},{includes:function(g){return A(this,g,arguments.length>1?arguments[1]:void 0)}}),C("includes")}(),Bi=gC()("Array","includes"))}var Li,Vi,Yi,Wi,Qi,Ui,Ki,Hi,_i,Xi,Ji,qi,$i,go,Ao,to,Co,Io,eo,io,oo,no={};function so(){if(Vi)return Li;Vi=1;var g=Og(),A=O(),t=mA()("match");return Li=function(C){var I;return g(C)&&(void 0!==(I=C[t])?!!I:"RegExp"===A(C))},Li}function ro(){if(Wi)return Yi;Wi=1;var g=so(),A=TypeError;return Yi=function(t){if(g(t))throw new A("The method doesn't accept regular expressions");return t},Yi}function ao(){if(Ui)return Qi;Ui=1;var g={};return g[mA()("toStringTag")]="z",Qi="[object z]"===String(g)}function ho(){if(Hi)return Ki;Hi=1;var g=ao(),A=D(),t=O(),C=mA()("toStringTag"),I=Object,e="Arguments"===t(function(){return arguments}());return Ki=g?t:function(g){var i,o,n;return void 0===g?"Undefined":null===g?"Null":"string"==typeof(o=function(g,A){try{return g[A]}catch(g){}}(i=I(g),C))?o:e?t(i):"Object"===(n=t(i))&&A(i.callee)?"Arguments":n},Ki}function lo(){if(Xi)return _i;Xi=1;var g=ho(),A=String;return _i=function(t){if("Symbol"===g(t))throw new TypeError("Cannot convert a Symbol value to a string");return A(t)}}function co(){if(qi)return Ji;qi=1;var g=mA()("match");return Ji=function(A){var t=/./;try{"/./"[A](t)}catch(C){try{return t[g]=!1,"/./"[A](t)}catch(g){}}return!1}}function uo(){return Ao?go:(Ao=1,function(){if($i)return no;$i=1;var g=st(),A=E(),t=ro(),C=xg(),I=lo(),e=co(),i=A("".indexOf);g({target:"String",proto:!0,forced:!e("includes")},{includes:function(g){return!!~i(I(C(this)),I(t(g)),arguments.length>1?arguments[1]:void 0)}})}(),go=gC()("String","includes"))}function po(){if(Co)return to;Co=1;var g=Ng(),A=ji(),t=uo(),C=Array.prototype,I=String.prototype;return to=function(e){var i=e.includes;return e===C||g(C,e)&&i===C.includes?A:"string"==typeof e||e===I||g(I,e)&&i===I.includes?t:i},to}function fo(){return eo?Io:(eo=1,Io=po())}var vo,bo,mo,yo,wo,xo,Eo,Oo,To,Do,No,ko,Ro,Po,Mo,zo,Bo,Zo,So,Fo,Go,jo,Lo,Vo,Yo,Wo,Qo,Uo,Ko,Ho=C(oo?io:(oo=1,io=fo())),_o={};function Xo(){if(bo)return vo;bo=1;var g=O();return vo=Array.isArray||function(A){return"Array"===g(A)}}function Jo(){if(yo)return mo;yo=1;var g=z(),A=Xo(),t=TypeError,C=Object.getOwnPropertyDescriptor,I=g&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(g){return g instanceof TypeError}}();return mo=I?function(g,I){if(A(g)&&!C(g,"length").writable)throw new t("Cannot set read only .length");return g.length=I}:function(g,A){return g.length=A}}function qo(){if(xo)return wo;xo=1;var g=TypeError;return wo=function(A){if(A>9007199254740991)throw g("Maximum allowed index exceeded");return A},wo}function $o(){if(Oo)return Eo;Oo=1;var g=E(),A=D(),t=uA(),C=g(Function.toString);return A(t.inspectSource)||(t.inspectSource=function(g){return C(g)}),Eo=t.inspectSource}function gn(){if(Do)return To;Do=1;var g=E(),A=y(),t=D(),C=ho(),I=Dg(),e=$o(),i=function(){},o=I("Reflect","construct"),n=/^\s*(?:class|function)\b/,s=g(n.exec),r=!n.test(i),a=function(g){if(!t(g))return!1;try{return o(i,[],g),!0}catch(g){return!1}},d=function(g){if(!t(g))return!1;switch(C(g)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return r||!!s(n,e(g))}catch(g){return!0}};return d.sham=!0,To=!o||A(function(){var g;return a(a.call)||!a(Object)||!a(function(){g=!0})||g})?d:a}function An(){if(ko)return No;ko=1;var g=Xo(),A=gn(),t=Og(),C=mA()("species"),I=Array;return No=function(e){var i;return g(e)&&(i=e.constructor,(A(i)&&(i===I||g(i.prototype))||t(i)&&null===(i=i[C]))&&(i=void 0)),void 0===i?I:i}}function tn(){if(Po)return Ro;Po=1;var g=An();return Ro=function(A,t){return new(g(A))(0===t?0:t)}}function Cn(){if(zo)return Mo;zo=1;var g=z(),A=ot(),t=mg();return Mo=function(C,I,e){g?A.f(C,I,t(0,e)):C[I]=e},Mo}function In(){if(Zo)return Bo;Zo=1;var g=Bg(),A=TypeError;return Bo=function(t,C){if(!delete t[C])throw new A("Cannot delete property "+g(C)+" of "+g(t))}}function en(){if(Fo)return So;Fo=1;var g=y(),A=mA(),t=Rg(),C=A("species");return So=function(A){return t>=51||!g(function(){var g=[];return(g.constructor={})[C]=function(){return{foo:1}},1!==g[A](Boolean).foo})},So}function on(){return Lo?jo:(Lo=1,function(){if(Go)return _o;Go=1;var g=st(),A=fA(),t=dt(),C=at(),I=lt(),e=Jo(),i=qo(),o=tn(),n=Cn(),s=In(),r=en()("splice"),a=Math.max,d=Math.min;g({target:"Array",proto:!0,forced:!r},{splice:function(g,r){var h,l,c,u,p,f,v=A(this),b=I(v),m=t(g,b),y=arguments.length;for(0===y?h=l=0:1===y?(h=0,l=b-m):(h=y-2,l=d(a(C(r),0),b-m)),i(b+h-l),c=o(v,l),u=0;u<l;u++)(p=m+u)in v&&n(c,u,v[p]);if(c.length=l,h<l){for(u=m;u<b-l;u++)f=u+h,(p=u+l)in v?v[f]=v[p]:s(v,f);for(u=b;u>b-l+h;u--)s(v,u-1)}else if(h>l)for(u=b-l;u>m;u--)f=u+h-1,(p=u+l-1)in v?v[f]=v[p]:s(v,f);for(u=0;u<h;u++)v[u+m]=arguments[u+2];return e(v,b-l+h),c}})}(),jo=gC()("Array","splice"))}function nn(){if(Yo)return Vo;Yo=1;var g=Ng(),A=on(),t=Array.prototype;return Vo=function(C){var I=C.splice;return C===t||g(t,C)&&I===t.splice?A:I},Vo}function sn(){return Qo?Wo:(Qo=1,Wo=nn())}var rn,an,dn,hn,ln,cn,un,pn=C(Ko?Uo:(Ko=1,Uo=sn()));function fn(){return dn?an:(dn=1,rn||(rn=1,st()({target:"Array",stat:!0},{isArray:Xo()})),an=Tg().Array.isArray)}function vn(){return ln?hn:(ln=1,hn=fn())}var bn,mn,yn,wn,xn,En,On,Tn,Dn,Nn,kn,Rn,Pn,Mn=C(un?cn:(un=1,cn=vn())),zn={};function Bn(){if(mn)return bn;mn=1;var g=DA(),A=E(),t=yg(),C=fA(),I=lt(),e=tn(),i=A([].push),o=function(A){var o=1===A,n=2===A,s=3===A,r=4===A,a=6===A,d=7===A,h=5===A||a;return function(l,c,u,p){for(var f,v,b=C(l),m=t(b),y=I(m),w=g(c,u),x=0,E=p||e,O=o?E(l,y):n||d?E(l,0):void 0;y>x;x++)if((h||x in m)&&(v=w(f=m[x],x,b),A))if(o)O[x]=v;else if(v)switch(A){case 3:return!0;case 5:return f;case 6:return x;case 2:i(O,f)}else switch(A){case 4:return!1;case 7:i(O,f)}return a?-1:s||r?r:O}};return bn={forEach:o(0),map:o(1),filter:o(2),some:o(3),every:o(4),find:o(5),findIndex:o(6),filterReject:o(7)}}function Zn(){if(wn)return yn;wn=1;var g=Bn().forEach,A=Di()("forEach");return yn=A?[].forEach:function(A){return g(this,A,arguments.length>1?arguments[1]:void 0)},yn}function Sn(){return On?En:(On=1,function(){if(xn)return zn;xn=1;var g=st(),A=Zn();g({target:"Array",proto:!0,forced:[].forEach!==A},{forEach:A})}(),En=gC()("Array","forEach"))}function Fn(){return Dn?Tn:(Dn=1,Tn=Sn())}function Gn(){if(kn)return Nn;kn=1;var g=ho(),A=vA(),t=Ng(),C=Fn(),I=Array.prototype,e={DOMTokenList:!0,NodeList:!0};return Nn=function(i){var o=i.forEach;return i===I||t(I,i)&&o===I.forEach||A(e,g(i))?C:o},Nn}var jn=C(Pn?Rn:(Pn=1,Rn=Gn()));function Ln(g){return Un=g,function(){var g={};Kn=0,void(Hn=Un.charAt(0)),es(),"strict"===_n&&(g.strict=!0,es());"graph"!==_n&&"digraph"!==_n||(g.type=_n,es());Xn===Wn.IDENTIFIER&&(g.id=_n,es());if("{"!=_n)throw as("Angle bracket { expected");if(es(),is(g),"}"!=_n)throw as("Angle bracket } expected");if(es(),""!==_n)throw as("End of file expected");return es(),delete g.node,delete g.edge,delete g.graph,g}()}var Vn={fontsize:"font.size",fontcolor:"font.color",labelfontcolor:"font.color",fontname:"font.face",color:["color.border","color.background"],fillcolor:"color.background",tooltip:"title",labeltooltip:"title"},Yn=Oi(Vn);Yn.color="color.color",Yn.style="dashes";var Wn={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},Qn={"{":!0,"}":!0,"[":!0,"]":!0,";":!0,"=":!0,",":!0,"->":!0,"--":!0},Un="",Kn=0,Hn="",_n="",Xn=Wn.NULL;function Jn(){Kn++,Hn=Un.charAt(Kn)}function qn(){return Un.charAt(Kn+1)}function $n(g){var A=g.charCodeAt(0);return A<47?35===A||46===A:A<59?A>47:A<91?A>64:A<96?95===A:A<123&&A>96}function gs(g,A){if(g||(g={}),A)for(var t in A)A.hasOwnProperty(t)&&(g[t]=A[t]);return g}function As(g,A,t){for(var C=A.split("."),I=g;C.length;){var e=C.shift();C.length?(I[e]||(I[e]={}),I=I[e]):I[e]=t}}function ts(g,A){for(var t,C,I=null,e=[g],i=g;i.parent;)e.push(i.parent),i=i.parent;if(i.nodes)for(t=0,C=i.nodes.length;t<C;t++)if(A.id===i.nodes[t].id){I=i.nodes[t];break}for(I||(I={id:A.id},g.node&&(I.attr=gs(I.attr,g.node))),t=e.length-1;t>=0;t--){var o,n=e[t];n.nodes||(n.nodes=[]),-1===Si(o=n.nodes).call(o,I)&&n.nodes.push(I)}A.attr&&(I.attr=gs(I.attr,A.attr))}function Cs(g,A){if(g.edges||(g.edges=[]),g.edges.push(A),g.edge){var t=gs({},g.edge);A.attr=gs(t,A.attr)}}function Is(g,A,t,C,I){var e={from:A,to:t,type:C};return g.edge&&(e.attr=gs({},g.edge)),e.attr=gs(e.attr||{},I),null!=I&&I.hasOwnProperty("arrows")&&null!=I.arrows&&(e.arrows={to:{enabled:!0,type:I.arrows.type}},I.arrows=null),e}function es(){for(Xn=Wn.NULL,_n="";" "===Hn||"\t"===Hn||"\n"===Hn||"\r"===Hn;)Jn();do{var g=!1;if("#"===Hn){for(var A=Kn-1;" "===Un.charAt(A)||"\t"===Un.charAt(A);)A--;if("\n"===Un.charAt(A)||""===Un.charAt(A)){for(;""!=Hn&&"\n"!=Hn;)Jn();g=!0}}if("/"===Hn&&"/"===qn()){for(;""!=Hn&&"\n"!=Hn;)Jn();g=!0}if("/"===Hn&&"*"===qn()){for(;""!=Hn;){if("*"===Hn&&"/"===qn()){Jn(),Jn();break}Jn()}g=!0}for(;" "===Hn||"\t"===Hn||"\n"===Hn||"\r"===Hn;)Jn()}while(g);if(""!==Hn){var t=Hn+qn();if(Qn[t])return Xn=Wn.DELIMITER,_n=t,Jn(),void Jn();if(Qn[Hn])return Xn=Wn.DELIMITER,_n=Hn,void Jn();if($n(Hn)||"-"===Hn){for(_n+=Hn,Jn();$n(Hn);)_n+=Hn,Jn();return"false"===_n?_n=!1:"true"===_n?_n=!0:isNaN(Number(_n))||(_n=Number(_n)),void(Xn=Wn.IDENTIFIER)}if('"'===Hn){for(Jn();""!=Hn&&('"'!=Hn||'"'===Hn&&'"'===qn());)'"'===Hn?(_n+=Hn,Jn()):"\\"===Hn&&"n"===qn()?(_n+="\n",Jn()):_n+=Hn,Jn();if('"'!=Hn)throw as('End of string " expected');return Jn(),void(Xn=Wn.IDENTIFIER)}for(Xn=Wn.UNKNOWN;""!=Hn;)_n+=Hn,Jn();throw new SyntaxError('Syntax error in part "'+ds(_n,30)+'"')}Xn=Wn.DELIMITER}function is(g){for(;""!==_n&&"}"!=_n;)os(g),";"===_n&&es()}function os(g){var A=ns(g);if(A)ss(g,A);else{var t=function(g){if("node"===_n)return es(),g.node=rs(),"node";if("edge"===_n)return es(),g.edge=rs(),"edge";if("graph"===_n)return es(),g.graph=rs(),"graph";return null}(g);if(!t){if(Xn!=Wn.IDENTIFIER)throw as("Identifier expected");var C=_n;if(es(),"="===_n){if(es(),Xn!=Wn.IDENTIFIER)throw as("Identifier expected");g[C]=_n,es()}else!function(g,A){var t={id:A},C=rs();C&&(t.attr=C);ts(g,t),ss(g,A)}(g,C)}}}function ns(g){var A=null;if("subgraph"===_n&&((A={}).type="subgraph",es(),Xn===Wn.IDENTIFIER&&(A.id=_n,es())),"{"===_n){if(es(),A||(A={}),A.parent=g,A.node=g.node,A.edge=g.edge,A.graph=g.graph,is(A),"}"!=_n)throw as("Angle bracket } expected");es(),delete A.node,delete A.edge,delete A.graph,delete A.parent,g.subgraphs||(g.subgraphs=[]),g.subgraphs.push(A)}return A}function ss(g,A){for(;"->"===_n||"--"===_n;){var t,C=_n;es();var I=ns(g);if(I)t=I;else{if(Xn!=Wn.IDENTIFIER)throw as("Identifier or subgraph expected");ts(g,{id:t=_n}),es()}Cs(g,Is(g,A,t,C,rs())),A=t}}function rs(){for(var g,A,t=null,C={dashed:!0,solid:!1,dotted:[1,5]},I={dot:"circle",box:"box",crow:"crow",curve:"curve",icurve:"inv_curve",normal:"triangle",inv:"inv_triangle",diamond:"diamond",tee:"bar",vee:"vee"},e=new Array,i=new Array;"["===_n;){for(es(),t={};""!==_n&&"]"!=_n;){if(Xn!=Wn.IDENTIFIER)throw as("Attribute name expected");var o=_n;if(es(),"="!=_n)throw as("Equal sign = expected");if(es(),Xn!=Wn.IDENTIFIER)throw as("Attribute value expected");var n=_n;"style"===o&&(n=C[n]),"arrowhead"===o&&(o="arrows",n={to:{enabled:!0,type:I[n]}}),"arrowtail"===o&&(o="arrows",n={from:{enabled:!0,type:I[n]}}),e.push({attr:t,name:o,value:n}),i.push(o),es(),","==_n&&es()}if("]"!=_n)throw as("Bracket ] expected");es()}if(Ho(i).call(i,"dir")){var s={arrows:{}};for(g=0;g<e.length;g++)if("arrows"===e[g].name)if(null!=e[g].value.to)s.arrows.to=g;else{if(null==e[g].value.from)throw as("Invalid value of arrows");s.arrows.from=g}else"dir"===e[g].name&&(s.dir=g);var r,a,d=e[s.dir].value;if(!Ho(i).call(i,"arrows"))if("both"===d)e.push({attr:e[s.dir].attr,name:"arrows",value:{to:{enabled:!0}}}),s.arrows.to=e.length-1,e.push({attr:e[s.dir].attr,name:"arrows",value:{from:{enabled:!0}}}),s.arrows.from=e.length-1;else if("forward"===d)e.push({attr:e[s.dir].attr,name:"arrows",value:{to:{enabled:!0}}}),s.arrows.to=e.length-1;else if("back"===d)e.push({attr:e[s.dir].attr,name:"arrows",value:{from:{enabled:!0}}}),s.arrows.from=e.length-1;else{if("none"!==d)throw as('Invalid dir type "'+d+'"');e.push({attr:e[s.dir].attr,name:"arrows",value:""}),s.arrows.to=e.length-1}if("both"===d)s.arrows.to&&s.arrows.from?(a=e[s.arrows.to].value.to.type,r=e[s.arrows.from].value.from.type,e[s.arrows.to]={attr:e[s.arrows.to].attr,name:e[s.arrows.to].name,value:{to:{enabled:!0,type:a},from:{enabled:!0,type:r}}},pn(e).call(e,s.arrows.from,1)):s.arrows.to?(a=e[s.arrows.to].value.to.type,r="arrow",e[s.arrows.to]={attr:e[s.arrows.to].attr,name:e[s.arrows.to].name,value:{to:{enabled:!0,type:a},from:{enabled:!0,type:r}}}):s.arrows.from&&(a="arrow",r=e[s.arrows.from].value.from.type,e[s.arrows.from]={attr:e[s.arrows.from].attr,name:e[s.arrows.from].name,value:{to:{enabled:!0,type:a},from:{enabled:!0,type:r}}});else if("back"===d)s.arrows.to&&s.arrows.from?(a="",r=e[s.arrows.from].value.from.type,e[s.arrows.from]={attr:e[s.arrows.from].attr,name:e[s.arrows.from].name,value:{to:{enabled:!0,type:a},from:{enabled:!0,type:r}}}):s.arrows.to?(a="",r="arrow",s.arrows.from=s.arrows.to,e[s.arrows.from]={attr:e[s.arrows.from].attr,name:e[s.arrows.from].name,value:{to:{enabled:!0,type:a},from:{enabled:!0,type:r}}}):s.arrows.from&&(a="",r=e[s.arrows.from].value.from.type,e[s.arrows.to]={attr:e[s.arrows.from].attr,name:e[s.arrows.from].name,value:{to:{enabled:!0,type:a},from:{enabled:!0,type:r}}}),e[s.arrows.from]={attr:e[s.arrows.from].attr,name:e[s.arrows.from].name,value:{from:{enabled:!0,type:e[s.arrows.from].value.from.type}}};else if("none"===d){var h;e[h=s.arrows.to?s.arrows.to:s.arrows.from]={attr:e[h].attr,name:e[h].name,value:""}}else{if("forward"!==d)throw as('Invalid dir type "'+d+'"');s.arrows.to&&s.arrows.from||s.arrows.to?(a=e[s.arrows.to].value.to.type,r="",e[s.arrows.to]={attr:e[s.arrows.to].attr,name:e[s.arrows.to].name,value:{to:{enabled:!0,type:a},from:{enabled:!0,type:r}}}):s.arrows.from&&(a="arrow",r="",s.arrows.to=s.arrows.from,e[s.arrows.to]={attr:e[s.arrows.to].attr,name:e[s.arrows.to].name,value:{to:{enabled:!0,type:a},from:{enabled:!0,type:r}}}),e[s.arrows.to]={attr:e[s.arrows.to].attr,name:e[s.arrows.to].name,value:{to:{enabled:!0,type:e[s.arrows.to].value.to.type}}}}pn(e).call(e,s.dir,1)}if(Ho(i).call(i,"penwidth")){var l=[];for(A=e.length,g=0;g<A;g++)"width"!==e[g].name&&("penwidth"===e[g].name&&(e[g].name="width"),l.push(e[g]));e=l}for(A=e.length,g=0;g<A;g++)As(e[g].attr,e[g].name,e[g].value);return t}function as(g){return new SyntaxError(g+', got "'+ds(_n,30)+'" (char '+Kn+")")}function ds(g,A){return g.length<=A?g:g.substr(0,27)+"..."}function hs(g,A,t){for(var C=A.split("."),I=C.pop(),e=g,i=0;i<C.length;i++){var o=C[i];o in e||(e[o]={}),e=e[o]}return e[I]=t,g}function ls(g,A){var t={};for(var C in g)if(g.hasOwnProperty(C)){var I=A[C];Mn(I)?jn(I).call(I,function(A){hs(t,A,g[C])}):hs(t,"string"==typeof I?I:C,g[C])}return t}function cs(g){var A,t=Ln(g),C={nodes:[],edges:[],options:{}};t.nodes&&jn(A=t.nodes).call(A,function(g){var A={id:g.id,label:String(g.label||g.id)};gs(A,ls(g.attr,Vn)),A.image&&(A.shape="image"),C.nodes.push(A)});if(t.edges){var I,e=function(g){var A={from:g.from,to:g.to};return gs(A,ls(g.attr,Yn)),null==A.arrows&&"->"===g.type&&(A.arrows="to"),A};jn(I=t.edges).call(I,function(g){var A,t,I,i,o,n,s;(A=g.from instanceof Object?g.from.nodes:{id:g.from},t=g.to instanceof Object?g.to.nodes:{id:g.to},g.from instanceof Object&&g.from.edges)&&jn(I=g.from.edges).call(I,function(g){var A=e(g);C.edges.push(A)});(o=t,n=function(A,t){var I=Is(C,A.id,t.id,g.type,g.attr),i=e(I);C.edges.push(i)},Mn(i=A)?jn(i).call(i,function(g){Mn(o)?jn(o).call(o,function(A){n(g,A)}):n(g,o)}):Mn(o)?jn(o).call(o,function(g){n(i,g)}):n(i,o),g.to instanceof Object&&g.to.edges)&&jn(s=g.to.edges).call(s,function(g){var A=e(g);C.edges.push(A)})})}return t.attr&&(C.options=t.attr),C}var us,ps,fs,vs,bs,ms,ys,ws,xs,Es=Object.freeze({__proto__:null,DOTToGraph:cs,parseDOT:Ln}),Os={};function Ts(){return fs?ps:(fs=1,function(){if(us)return Os;us=1;var g=st(),A=Bn().map;g({target:"Array",proto:!0,forced:!en()("map")},{map:function(g){return A(this,g,arguments.length>1?arguments[1]:void 0)}})}(),ps=gC()("Array","map"))}function Ds(){if(bs)return vs;bs=1;var g=Ng(),A=Ts(),t=Array.prototype;return vs=function(C){var I=C.map;return C===t||g(t,C)&&I===t.map?A:I},vs}function Ns(){return ys?ms:(ys=1,ms=Ds())}var ks=C(xs?ws:(xs=1,ws=Ns()));function Rs(g,A){var t;const C={edges:{inheritColor:!1},nodes:{fixed:!1,parseColor:!1}};null!=A&&(null!=A.fixed&&(C.nodes.fixed=A.fixed),null!=A.parseColor&&(C.nodes.parseColor=A.parseColor),null!=A.inheritColor&&(C.edges.inheritColor=A.inheritColor));const I=g.edges,e=ks(I).call(I,g=>{const A={from:g.source,id:g.id,to:g.target};return null!=g.attributes&&(A.attributes=g.attributes),null!=g.label&&(A.label=g.label),null!=g.attributes&&null!=g.attributes.title&&(A.title=g.attributes.title),"Directed"===g.type&&(A.arrows="to"),g.color&&!1===C.edges.inheritColor&&(A.color=g.color),A});return{nodes:ks(t=g.nodes).call(t,g=>{const A={id:g.id,fixed:C.nodes.fixed&&null!=g.x&&null!=g.y};return null!=g.attributes&&(A.attributes=g.attributes),null!=g.label&&(A.label=g.label),null!=g.size&&(A.size=g.size),null!=g.attributes&&null!=g.attributes.title&&(A.title=g.attributes.title),null!=g.title&&(A.title=g.title),null!=g.x&&(A.x=g.x),null!=g.y&&(A.y=g.y),null!=g.color&&(!0===C.nodes.parseColor?A.color=g.color:A.color={background:g.color,border:g.color,highlight:{background:g.color,border:g.color},hover:{background:g.color,border:g.color}}),A}),edges:e}}var Ps=Object.freeze({__proto__:null,parseGephi:Rs});var Ms,zs,Bs,Zs,Ss,Fs,Gs,js,Ls,Vs=Object.freeze({__proto__:null,cn:{addDescription:"单击空白处放置新节点。",addEdge:"添加连接线",addNode:"添加节点",back:"返回",close:"關閉",createEdgeError:"无法将连接线连接到群集。",del:"删除选定",deleteClusterError:"无法删除群集。",edgeDescription:"单击某个节点并将该连接线拖动到另一个节点以连接它们。",edit:"编辑",editClusterError:"无法编辑群集。",editEdge:"编辑连接线",editEdgeDescription:"单击控制节点并将它们拖到节点上连接。",editNode:"编辑节点"},cs:{addDescription:"Kluknutím do prázdného prostoru můžete přidat nový vrchol.",addEdge:"Přidat hranu",addNode:"Přidat vrchol",back:"Zpět",close:"Zavřít",createEdgeError:"Nelze připojit hranu ke shluku.",del:"Smazat výběr",deleteClusterError:"Nelze mazat shluky.",edgeDescription:"Přetažením z jednoho vrcholu do druhého můžete spojit tyto vrcholy novou hranou.",edit:"Upravit",editClusterError:"Nelze upravovat shluky.",editEdge:"Upravit hranu",editEdgeDescription:"Přetažením kontrolního vrcholu hrany ji můžete připojit k jinému vrcholu.",editNode:"Upravit vrchol"},de:{addDescription:"Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.",addEdge:"Kante hinzufügen",addNode:"Knoten hinzufügen",back:"Zurück",close:"Schließen",createEdgeError:"Es ist nicht möglich, Kanten mit Clustern zu verbinden.",del:"Lösche Auswahl",deleteClusterError:"Cluster können nicht gelöscht werden.",edgeDescription:"Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.",edit:"Editieren",editClusterError:"Cluster können nicht editiert werden.",editEdge:"Kante editieren",editEdgeDescription:"Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.",editNode:"Knoten editieren"},en:{addDescription:"Click in an empty space to place a new node.",addEdge:"Add Edge",addNode:"Add Node",back:"Back",close:"Close",createEdgeError:"Cannot link edges to a cluster.",del:"Delete selected",deleteClusterError:"Clusters cannot be deleted.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",edit:"Edit",editClusterError:"Clusters cannot be edited.",editEdge:"Edit Edge",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",editNode:"Edit Node"},es:{addDescription:"Haga clic en un lugar vacío para colocar un nuevo nodo.",addEdge:"Añadir arista",addNode:"Añadir nodo",back:"Atrás",close:"Cerrar",createEdgeError:"No se puede conectar una arista a un grupo.",del:"Eliminar selección",deleteClusterError:"No es posible eliminar grupos.",edgeDescription:"Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.",edit:"Editar",editClusterError:"No es posible editar grupos.",editEdge:"Editar arista",editEdgeDescription:"Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.",editNode:"Editar nodo"},fr:{addDescription:"Cliquez dans un endroit vide pour placer un nœud.",addEdge:"Ajouter un lien",addNode:"Ajouter un nœud",back:"Retour",close:"Fermer",createEdgeError:"Impossible de créer un lien vers un cluster.",del:"Effacer la sélection",deleteClusterError:"Les clusters ne peuvent pas être effacés.",edgeDescription:"Cliquez sur un nœud et glissez le lien vers un autre nœud pour les connecter.",edit:"Éditer",editClusterError:"Les clusters ne peuvent pas être édités.",editEdge:"Éditer le lien",editEdgeDescription:"Cliquez sur les points de contrôle et glissez-les pour connecter un nœud.",editNode:"Éditer le nœud"},it:{addDescription:"Clicca per aggiungere un nuovo nodo",addEdge:"Aggiungi un vertice",addNode:"Aggiungi un nodo",back:"Indietro",close:"Chiudere",createEdgeError:"Non si possono collegare vertici ad un cluster",del:"Cancella la selezione",deleteClusterError:"I cluster non possono essere cancellati",edgeDescription:"Clicca su un nodo e trascinalo ad un altro nodo per connetterli.",edit:"Modifica",editClusterError:"I clusters non possono essere modificati.",editEdge:"Modifica il vertice",editEdgeDescription:"Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.",editNode:"Modifica il nodo"},nl:{addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",addEdge:"Link toevoegen",addNode:"Node toevoegen",back:"Terug",close:"Sluiten",createEdgeError:"Kan geen link maken naar een cluster.",del:"Selectie verwijderen",deleteClusterError:"Clusters kunnen niet worden verwijderd.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",edit:"Wijzigen",editClusterError:"Clusters kunnen niet worden aangepast.",editEdge:"Link wijzigen",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",editNode:"Node wijzigen"},pt:{addDescription:"Clique em um espaço em branco para adicionar um novo nó",addEdge:"Adicionar aresta",addNode:"Adicionar nó",back:"Voltar",close:"Fechar",createEdgeError:"Não foi possível linkar arestas a um cluster.",del:"Remover selecionado",deleteClusterError:"Clusters não puderam ser removidos.",edgeDescription:"Clique em um nó e arraste a aresta até outro nó para conectá-los",edit:"Editar",editClusterError:"Clusters não puderam ser editados.",editEdge:"Editar aresta",editEdgeDescription:"Clique nos pontos de controle e os arraste para um nó para conectá-los",editNode:"Editar nó"},ru:{addDescription:"Кликните в свободное место, чтобы добавить новый узел.",addEdge:"Добавить ребро",addNode:"Добавить узел",back:"Назад",close:"Закрывать",createEdgeError:"Невозможно соединить ребра в кластер.",del:"Удалить выбранное",deleteClusterError:"Кластеры не могут быть удалены",edgeDescription:"Кликните на узел и протяните ребро к другому узлу, чтобы соединить их.",edit:"Редактировать",editClusterError:"Кластеры недоступны для редактирования.",editEdge:"Редактировать ребро",editEdgeDescription:"Кликните на контрольные точки и перетащите их в узел, чтобы подключиться к нему.",editNode:"Редактировать узел"},uk:{addDescription:"Kлікніть на вільне місце, щоб додати новий вузол.",addEdge:"Додати край",addNode:"Додати вузол",back:"Назад",close:"Закрити",createEdgeError:"Не можливо об'єднати краї в групу.",del:"Видалити обране",deleteClusterError:"Групи не можуть бути видалені.",edgeDescription:"Клікніть на вузол і перетягніть край до іншого вузла, щоб їх з'єднати.",edit:"Редагувати",editClusterError:"Групи недоступні для редагування.",editEdge:"Редагувати край",editEdgeDescription:"Клікніть на контрольні точки і перетягніть їх у вузол, щоб підключитися до нього.",editNode:"Редагувати вузол"}}),Ys={};function Ws(){if(Ms)return Ys;Ms=1;var g=st(),A=y(),t=Xo(),C=Og(),I=fA(),e=lt(),i=qo(),o=Cn(),n=tn(),s=en(),r=mA(),a=Rg(),d=r("isConcatSpreadable"),h=a>=51||!A(function(){var g=[];return g[d]=!1,g.concat()[0]!==g}),l=function(g){if(!C(g))return!1;var A=g[d];return void 0!==A?!!A:t(g)};return g({target:"Array",proto:!0,arity:1,forced:!h||!s("concat")},{concat:function(g){var A,t,C,s,r,a=I(this),d=n(a,0),h=0;for(A=-1,C=arguments.length;A<C;A++)if(l(r=-1===A?a:arguments[A]))for(s=e(r),i(h+s),t=0;t<s;t++,h++)t in r&&o(d,h,r[t]);else i(h+1),o(d,h++,r);return d.length=h,d}}),Ys}function Qs(){return Bs?zs:(Bs=1,Ws(),zs=gC()("Array","concat"))}function Us(){if(Ss)return Zs;Ss=1;var g=Ng(),A=Qs(),t=Array.prototype;return Zs=function(C){var I=C.concat;return C===t||g(t,C)&&I===t.concat?A:I},Zs}function Ks(){return Gs?Fs:(Gs=1,Fs=Us())}var Hs,_s,Xs,Js,qs,$s,gr,Ar,tr,Cr,Ir,er,ir,or,nr,sr,rr,ar,dr,hr,lr,cr,ur,pr,fr,vr,br,mr,yr,wr,xr,Er,Or,Tr,Dr,Nr,kr=C(Ls?js:(Ls=1,js=Ks()));class Rr{constructor(){this.NUM_ITERATIONS=4,this.image=new Image,this.canvas=document.createElement("canvas")}init(){if(this.initialized())return;this.src=this.image.src;const g=this.image.width,A=this.image.height;this.width=g,this.height=A;const t=Math.floor(A/2),C=Math.floor(A/4),I=Math.floor(A/8),e=Math.floor(A/16),i=Math.floor(g/2),o=Math.floor(g/4),n=Math.floor(g/8),s=Math.floor(g/16);this.canvas.width=3*o,this.canvas.height=t,this.coordinates=[[0,0,i,t],[i,0,o,C],[i,C,n,I],[5*n,C,s,e]],this._fillMipMap()}initialized(){return void 0!==this.coordinates}_fillMipMap(){const g=this.canvas.getContext("2d"),A=this.coordinates[0];g.drawImage(this.image,A[0],A[1],A[2],A[3]);for(let A=1;A<this.NUM_ITERATIONS;A++){const t=this.coordinates[A-1],C=this.coordinates[A];g.drawImage(this.canvas,t[0],t[1],t[2],t[3],C[0],C[1],C[2],C[3])}}drawImageAtPosition(g,A,t,C,I,e){if(this.initialized())if(A>2){A*=.5;let i=0;for(;A>2&&i<this.NUM_ITERATIONS;)A*=.5,i+=1;i>=this.NUM_ITERATIONS&&(i=this.NUM_ITERATIONS-1);const o=this.coordinates[i];g.drawImage(this.canvas,o[0],o[1],o[2],o[3],t,C,I,e)}else g.drawImage(this.image,t,C,I,e)}}class Pr{constructor(g){this.images={},this.imageBroken={},this.callback=g}_tryloadBrokenUrl(g,A,t){void 0!==g&&void 0!==t&&(void 0!==A?(t.image.onerror=()=>{console.error("Could not load brokenImage:",A)},t.image.src=A):console.warn("No broken url image defined"))}_redrawWithImage(g){this.callback&&this.callback(g)}load(g,A){const t=this.images[g];if(t)return t;const C=new Rr;return this.images[g]=C,C.image.onload=()=>{this._fixImageCoordinates(C.image),C.init(),this._redrawWithImage(C)},C.image.onerror=()=>{console.error("Could not load image:",g),this._tryloadBrokenUrl(g,A,C)},C.image.src=g,C}_fixImageCoordinates(g){0===g.width&&(document.body.appendChild(g),g.width=g.offsetWidth,g.height=g.offsetHeight,document.body.removeChild(g))}}function Mr(){return _s?Hs:(_s=1,Hs={})}function zr(){if(Js)return Xs;Js=1;var g=m(),A=D(),t=g.WeakMap;return Xs=A(t)&&/native code/.test(String(t))}function Br(){if($s)return qs;$s=1;var g,A,t,C=zr(),I=m(),e=Og(),i=nt(),o=vA(),n=uA(),s=ai(),r=ut(),a="Object already initialized",d=I.TypeError,h=I.WeakMap;if(C||n.state){var l=n.state||(n.state=new h);l.get=l.get,l.has=l.has,l.set=l.set,g=function(g,A){if(l.has(g))throw new d(a);return A.facade=g,l.set(g,A),A},A=function(g){return l.get(g)||{}},t=function(g){return l.has(g)}}else{var c=s("state");r[c]=!0,g=function(g,A){if(o(g,c))throw new d(a);return A.facade=g,i(g,c,A),A},A=function(g){return o(g,c)?g[c]:{}},t=function(g){return o(g,c)}}return qs={set:g,get:A,has:t,enforce:function(C){return t(C)?A(C):g(C,{})},getterFor:function(g){return function(t){var C;if(!e(t)||(C=A(t)).type!==g)throw new d("Incompatible receiver, "+g+" required");return C}}},qs}function Zr(){if(Ar)return gr;Ar=1;var g=z(),A=vA(),t=Function.prototype,C=g&&Object.getOwnPropertyDescriptor,I=A(t,"name"),e=I&&"something"===function(){}.name,i=I&&(!g||g&&C(t,"name").configurable);return gr={EXISTS:I,PROPER:e,CONFIGURABLE:i}}function Sr(){return Cr?tr:(Cr=1,tr=!y()(function(){function g(){}return g.prototype.constructor=null,Object.getPrototypeOf(new g)!==g.prototype}))}function Fr(){if(er)return Ir;er=1;var g=vA(),A=D(),t=fA(),C=ai(),I=Sr(),e=C("IE_PROTO"),i=Object,o=i.prototype;return Ir=I?i.getPrototypeOf:function(C){var I=t(C);if(g(I,e))return I[e];var n=I.constructor;return A(n)&&I instanceof n?n.prototype:I instanceof i?o:null},Ir}function Gr(){if(or)return ir;or=1;var g=nt();return ir=function(A,t,C,I){return I&&I.enumerable?A[t]=C:g(A,t,C),A},ir}function jr(){if(sr)return nr;sr=1;var g,A,t,C=y(),I=D(),e=Og(),i=di(),o=Fr(),n=Gr(),s=mA(),r=lA(),a=s("iterator"),d=!1;return[].keys&&("next"in(t=[].keys())?(A=o(o(t)))!==Object.prototype&&(g=A):d=!0),!e(g)||C(function(){var A={};return g[a].call(A)!==A})?g={}:r&&(g=i(g)),I(g[a])||n(g,a,function(){return this}),nr={IteratorPrototype:g,BUGGY_SAFARI_ITERATORS:d}}function Lr(){if(ar)return rr;ar=1;var g=ao(),A=ho();return rr=g?{}.toString:function(){return"[object "+A(this)+"]"}}function Vr(){if(hr)return dr;hr=1;var g=ao(),A=ot().f,t=nt(),C=vA(),I=Lr(),e=mA()("toStringTag");return dr=function(i,o,n,s){var r=n?i:i&&i.prototype;r&&(C(r,e)||A(r,e,{configurable:!0,value:o}),s&&!g&&t(r,"toString",I))},dr}function Yr(){if(cr)return lr;cr=1;var g=jr().IteratorPrototype,A=di(),t=mg(),C=Vr(),I=Mr(),e=function(){return this};return lr=function(i,o,n,s){var r=o+" Iterator";return i.prototype=A(g,{next:t(+!s,n)}),C(i,r,!1,!0),I[r]=e,i},lr}function Wr(){if(pr)return ur;pr=1;var g=E(),A=Zg();return ur=function(t,C,I){try{return g(A(Object.getOwnPropertyDescriptor(t,C)[I]))}catch(g){}},ur}function Qr(){if(vr)return fr;vr=1;var g=Og();return fr=function(A){return g(A)||null===A}}function Ur(){if(mr)return br;mr=1;var g=Qr(),A=String,t=TypeError;return br=function(C){if(g(C))return C;throw new t("Can't set "+A(C)+" as a prototype")}}function Kr(){if(wr)return yr;wr=1;var g=Wr(),A=Og(),t=xg(),C=Ur();return yr=Object.setPrototypeOf||("__proto__"in{}?function(){var I,e=!1,i={};try{(I=g(Object.prototype,"__proto__","set"))(i,[]),e=i instanceof Array}catch(g){}return function(g,i){return t(g),C(i),A(g)?(e?I(g,i):g.__proto__=i,g):g}}():void 0)}function Hr(){if(Er)return xr;Er=1;var g=st(),A=B(),t=lA(),C=Zr(),I=D(),e=Yr(),i=Fr(),o=Kr(),n=Vr(),s=nt(),r=Gr(),a=mA(),d=Mr(),h=jr(),l=C.PROPER,c=C.CONFIGURABLE,u=h.IteratorPrototype,p=h.BUGGY_SAFARI_ITERATORS,f=a("iterator"),v="keys",b="values",m="entries",y=function(){return this};return xr=function(C,a,h,w,x,E,O){e(h,a,w);var T,D,N,k=function(g){if(g===x&&B)return B;if(!p&&g&&g in M)return M[g];switch(g){case v:case b:case m:return function(){return new h(this,g)}}return function(){return new h(this)}},R=a+" Iterator",P=!1,M=C.prototype,z=M[f]||M["@@iterator"]||x&&M[x],B=!p&&z||k(x),Z="Array"===a&&M.entries||z;if(Z&&(T=i(Z.call(new C)))!==Object.prototype&&T.next&&(t||i(T)===u||(o?o(T,u):I(T[f])||r(T,f,y)),n(T,R,!0,!0),t&&(d[R]=y)),l&&x===b&&z&&z.name!==b&&(!t&&c?s(M,"name",b):(P=!0,B=function(){return A(z,this)})),x)if(D={values:k(b),keys:E?B:k(v),entries:k(m)},O)for(N in D)(p||P||!(N in M))&&r(M,N,D[N]);else g({target:a,proto:!0,forced:p||P},D);return t&&!O||M[f]===B||r(M,f,B,{name:x}),d[a]=B,D},xr}function _r(){return Tr?Or:(Tr=1,Or=function(g,A){return{value:g,done:A}})}function Xr(){if(Nr)return Dr;Nr=1;var g=Eg(),A=Gi(),t=Mr(),C=Br(),I=ot().f,e=Hr(),i=_r(),o=lA(),n=z(),s="Array Iterator",r=C.set,a=C.getterFor(s);Dr=e(Array,"Array",function(A,t){r(this,{type:s,target:g(A),index:0,kind:t})},function(){var g=a(this),A=g.target,t=g.index++;if(!A||t>=A.length)return g.target=null,i(void 0,!0);switch(g.kind){case"keys":return i(t,!1);case"values":return i(A[t],!1)}return i([t,A[t]],!1)},"values");var d=t.Arguments=t.Array;if(A("keys"),A("values"),A("entries"),!o&&n&&"values"!==d.name)try{I(d,"name",{value:"values"})}catch(g){}return Dr}var Jr,qr={},$r={exports:{}},ga={};function Aa(){if(Jr)return ga;Jr=1;var g=pt(),A=ft().concat("length","prototype");return ga.f=Object.getOwnPropertyNames||function(t){return g(t,A)},ga}var ta,Ca,Ia,ea,ia,oa,na,sa,ra,aa,da,ha,la,ca,ua,pa,fa,va,ba,ma,ya,wa,xa,Ea,Oa,Ta,Da,Na,ka,Ra,Pa,Ma,za={};function Ba(){if(ta)return za;ta=1;var g=O(),A=Eg(),t=Aa().f,C=qt(),I="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];return za.f=function(e){return I&&"Window"===g(e)?function(g){try{return t(g)}catch(g){return C(I)}}(e):t(A(e))},za}function Za(){return Ia?Ca:(Ia=1,Ca=y()(function(){if("function"==typeof ArrayBuffer){var g=new ArrayBuffer(8);Object.isExtensible(g)&&Object.defineProperty(g,"a",{value:8})}}))}function Sa(){if(ia)return ea;ia=1;var g=y(),A=Og(),t=O(),C=Za(),I=Object.isExtensible,e=g(function(){});return ea=e||C?function(g){return!!A(g)&&((!C||"ArrayBuffer"!==t(g))&&(!I||I(g)))}:I,ea}function Fa(){return na?oa:(na=1,oa=!y()(function(){return Object.isExtensible(Object.preventExtensions({}))}))}function Ga(){if(sa)return $r.exports;sa=1;var g=st(),A=E(),t=ut(),C=Og(),I=vA(),e=ot().f,i=Aa(),o=Ba(),n=Sa(),s=bA(),r=Fa(),a=!1,d=s("meta"),h=0,l=function(g){e(g,d,{value:{objectID:"O"+h++,weakData:{}}})},c=$r.exports={enable:function(){c.enable=function(){},a=!0;var t=i.f,C=A([].splice),I={};I[d]=1,t(I).length&&(i.f=function(g){for(var A=t(g),I=0,e=A.length;I<e;I++)if(A[I]===d){C(A,I,1);break}return A},g({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:o.f}))},fastKey:function(g,A){if(!C(g))return"symbol"==typeof g?g:("string"==typeof g?"S":"P")+g;if(!I(g,d)){if(!n(g))return"F";if(!A)return"E";l(g)}return g[d].objectID},getWeakData:function(g,A){if(!I(g,d)){if(!n(g))return!0;if(!A)return!1;l(g)}return g[d].weakData},onFreeze:function(g){return r&&a&&n(g)&&!I(g,d)&&l(g),g}};return t[d]=!0,$r.exports}function ja(){if(aa)return ra;aa=1;var g=mA(),A=Mr(),t=g("iterator"),C=Array.prototype;return ra=function(g){return void 0!==g&&(A.Array===g||C[t]===g)},ra}function La(){if(ha)return da;ha=1;var g=ho(),A=Sg(),t=wg(),C=Mr(),I=mA()("iterator");return da=function(e){if(!t(e))return A(e,I)||A(e,"@@iterator")||C[g(e)]},da}function Va(){if(ca)return la;ca=1;var g=B(),A=Zg(),t=it(),C=Bg(),I=La(),e=TypeError;return la=function(i,o){var n=arguments.length<2?I(i):o;if(A(n))return t(g(n,i));throw new e(C(i)+" is not iterable")},la}function Ya(){if(pa)return ua;pa=1;var g=B(),A=it(),t=Sg();return ua=function(C,I,e){var i,o;A(C);try{if(!(i=t(C,"return"))){if("throw"===I)throw e;return e}i=g(i,C)}catch(g){o=!0,i=g}if("throw"===I)throw e;if(o)throw i;return A(i),e},ua}function Wa(){if(va)return fa;va=1;var g=DA(),A=B(),t=it(),C=Bg(),I=ja(),e=lt(),i=Ng(),o=Va(),n=La(),s=Ya(),r=TypeError,a=function(g,A){this.stopped=g,this.result=A},d=a.prototype;return fa=function(h,l,c){var u,p,f,v,b,m,y,w=c&&c.that,x=!(!c||!c.AS_ENTRIES),E=!(!c||!c.IS_RECORD),O=!(!c||!c.IS_ITERATOR),T=!(!c||!c.INTERRUPTED),D=g(l,w),N=function(g){return u&&s(u,"normal"),new a(!0,g)},k=function(g){return x?(t(g),T?D(g[0],g[1],N):D(g[0],g[1])):T?D(g,N):D(g)};if(E)u=h.iterator;else if(O)u=h;else{if(!(p=n(h)))throw new r(C(h)+" is not iterable");if(I(p)){for(f=0,v=e(h);v>f;f++)if((b=k(h[f]))&&i(d,b))return b;return new a(!1)}u=o(h,p)}for(m=E?h.next:u.next;!(y=A(m,u)).done;){try{b=k(y.value)}catch(g){s(u,"throw",g)}if("object"==typeof b&&b&&i(d,b))return b}return new a(!1)},fa}function Qa(){if(ma)return ba;ma=1;var g=Ng(),A=TypeError;return ba=function(t,C){if(g(C,t))return t;throw new A("Incorrect invocation")},ba}function Ua(){if(wa)return ya;wa=1;var g=st(),A=m(),t=Ga(),C=y(),I=nt(),e=Wa(),i=Qa(),o=D(),n=Og(),s=wg(),r=Vr(),a=ot().f,d=Bn().forEach,h=z(),l=Br(),c=l.set,u=l.getterFor;return ya=function(l,p,f){var v,b=-1!==l.indexOf("Map"),m=-1!==l.indexOf("Weak"),y=b?"set":"add",w=A[l],x=w&&w.prototype,E={};if(h&&o(w)&&(m||x.forEach&&!C(function(){(new w).entries().next()}))){var O=(v=p(function(g,A){c(i(g,O),{type:l,collection:new w}),s(A)||e(A,g[y],{that:g,AS_ENTRIES:b})})).prototype,T=u(l);d(["add","clear","delete","forEach","get","has","set","keys","values","entries"],function(g){var A="add"===g||"set"===g;!(g in x)||m&&"clear"===g||I(O,g,function(t,C){var I=T(this).collection;if(!A&&m&&!n(t))return"get"===g&&void 0;var e=I[g](0===t?0:t,C);return A?this:e})}),m||a(O,"size",{configurable:!0,get:function(){return T(this).collection.size}})}else v=f.getConstructor(p,l,b,y),t.enable();return r(v,l,!1,!0),E[l]=v,g({global:!0,forced:!0},E),m||f.setStrong(v,l,b),v}}function Ka(){if(Ea)return xa;Ea=1;var g=ot();return xa=function(A,t,C){return g.f(A,t,C)}}function Ha(){if(Ta)return Oa;Ta=1;var g=Gr();return Oa=function(A,t,C){for(var I in t)C&&C.unsafe&&A[I]?A[I]=t[I]:g(A,I,t[I],C);return A},Oa}function _a(){if(Na)return Da;Na=1;var g=Dg(),A=Ka(),t=mA(),C=z(),I=t("species");return Da=function(t){var e=g(t);C&&e&&!e[I]&&A(e,I,{configurable:!0,get:function(){return this}})}}function Xa(){if(Ra)return ka;Ra=1;var g=di(),A=Ka(),t=Ha(),C=DA(),I=Qa(),e=wg(),i=Wa(),o=Hr(),n=_r(),s=_a(),r=z(),a=Ga().fastKey,d=Br(),h=d.set,l=d.getterFor;return ka={getConstructor:function(o,n,s,d){var c=o(function(A,t){I(A,u),h(A,{type:n,index:g(null),first:null,last:null,size:0}),r||(A.size=0),e(t)||i(t,A[d],{that:A,AS_ENTRIES:s})}),u=c.prototype,p=l(n),f=function(g,A,t){var C,I,e=p(g),i=v(g,A);return i?i.value=t:(e.last=i={index:I=a(A,!0),key:A,value:t,previous:C=e.last,next:null,removed:!1},e.first||(e.first=i),C&&(C.next=i),r?e.size++:g.size++,"F"!==I&&(e.index[I]=i)),g},v=function(g,A){var t,C=p(g),I=a(A);if("F"!==I)return C.index[I];for(t=C.first;t;t=t.next)if(t.key===A)return t};return t(u,{clear:function(){for(var A=p(this),t=A.first;t;)t.removed=!0,t.previous&&(t.previous=t.previous.next=null),t=t.next;A.first=A.last=null,A.index=g(null),r?A.size=0:this.size=0},delete:function(g){var A=this,t=p(A),C=v(A,g);if(C){var I=C.next,e=C.previous;delete t.index[C.index],C.removed=!0,e&&(e.next=I),I&&(I.previous=e),t.first===C&&(t.first=I),t.last===C&&(t.last=e),r?t.size--:A.size--}return!!C},forEach:function(g){for(var A,t=p(this),I=C(g,arguments.length>1?arguments[1]:void 0);A=A?A.next:t.first;)for(I(A.value,A.key,this);A&&A.removed;)A=A.previous},has:function(g){return!!v(this,g)}}),t(u,s?{get:function(g){var A=v(this,g);return A&&A.value},set:function(g,A){return f(this,0===g?0:g,A)}}:{add:function(g){return f(this,g=0===g?0:g,g)}}),r&&A(u,"size",{configurable:!0,get:function(){return p(this).size}}),c},setStrong:function(g,A,t){var C=A+" Iterator",I=l(A),e=l(C);o(g,A,function(g,A){h(this,{type:C,target:g,state:I(g),kind:A,last:null})},function(){for(var g=e(this),A=g.kind,t=g.last;t&&t.removed;)t=t.previous;return g.target&&(g.last=t=t?t.next:g.state.first)?n("keys"===A?t.key:"values"===A?t.value:[t.key,t.value],!1):(g.target=null,n(void 0,!0))},t?"entries":"values",!t,!0),s(A)}},ka}function Ja(){return Ma||(Ma=1,Pa||(Pa=1,Ua()("Map",function(g){return function(){return g(this,arguments.length?arguments[0]:void 0)}},Xa()))),qr}var qa,$a,gd,Ad,td,Cd={};function Id(){return $a||($a=1,qa=function(g,A){return 1===A?function(A,t){return A[g](t)}:function(A,t,C){return A[g](t,C)}}),qa}function ed(){if(Ad)return gd;Ad=1;var g=Dg(),A=Id(),t=g("Map");return gd={Map:t,set:A("set",2),get:A("get",1),has:A("has",1),remove:A("delete",1),proto:t.prototype}}var id,od,nd,sd,rd,ad={};function dd(){if(od)return id;od=1;var g=E(),A=at(),t=lo(),C=xg(),I=g("".charAt),e=g("".charCodeAt),i=g("".slice),o=function(g){return function(o,n){var s,r,a=t(C(o)),d=A(n),h=a.length;return d<0||d>=h?g?"":void 0:(s=e(a,d))<55296||s>56319||d+1===h||(r=e(a,d+1))<56320||r>57343?g?I(a,d):s:g?i(a,d,d+2):r-56320+(s-55296<<10)+65536}};return id={codeAt:o(!1),charAt:o(!0)}}function hd(){if(nd)return ad;nd=1;var g=dd().charAt,A=lo(),t=Br(),C=Hr(),I=_r(),e="String Iterator",i=t.set,o=t.getterFor(e);return C(String,"String",function(g){i(this,{type:e,string:A(g),index:0})},function(){var A,t=o(this),C=t.string,e=t.index;return e>=C.length?I(void 0,!0):(A=g(C,e),t.index+=A.length,I(A,!1))}),ad}function ld(){return rd?sd:(rd=1,Xr(),Ja(),function(){if(td)return Cd;td=1;var g=st(),A=E(),t=Zg(),C=xg(),I=Wa(),e=ed(),i=lA(),o=y(),n=e.Map,s=e.has,r=e.get,a=e.set,d=A([].push),h=i||o(function(){return 1!==n.groupBy("ab",function(g){return g}).get("a").length});g({target:"Map",stat:!0,forced:i||h},{groupBy:function(g,A){C(g),t(A);var e=new n,i=0;return I(g,function(g){var t=A(g,i++);s(e,t)?d(r(e,t),g):a(e,t,[g])}),e}})}(),hd(),sd=Tg().Map)}var cd,ud,pd,fd,vd,bd,md,yd={};function wd(){return ud?cd:(ud=1,cd={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0})}function xd(){if(pd)return yd;pd=1,Xr();var g=wd(),A=m(),t=Vr(),C=Mr();for(var I in g)t(A[I],I),C[I]=C.Array;return yd}function Ed(){if(vd)return fd;vd=1;var g=ld();return xd(),fd=g}var Od=C(md?bd:(md=1,bd=Ed()));class Td{constructor(){this.clear(),this._defaultIndex=0,this._groupIndex=0,this._defaultGroups=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}},{border:"#990000",background:"#EE0000",highlight:{border:"#BB0000",background:"#FF3333"},hover:{border:"#BB0000",background:"#FF3333"}},{border:"#FF6000",background:"#FF6000",highlight:{border:"#FF6000",background:"#FF6000"},hover:{border:"#FF6000",background:"#FF6000"}},{border:"#97C2FC",background:"#2B7CE9",highlight:{border:"#D2E5FF",background:"#2B7CE9"},hover:{border:"#D2E5FF",background:"#2B7CE9"}},{border:"#399605",background:"#255C03",highlight:{border:"#399605",background:"#255C03"},hover:{border:"#399605",background:"#255C03"}},{border:"#B70054",background:"#FF007E",highlight:{border:"#B70054",background:"#FF007E"},hover:{border:"#B70054",background:"#FF007E"}},{border:"#AD85E4",background:"#7C29F0",highlight:{border:"#D3BDF0",background:"#7C29F0"},hover:{border:"#D3BDF0",background:"#7C29F0"}},{border:"#4557FA",background:"#000EA1",highlight:{border:"#6E6EFD",background:"#000EA1"},hover:{border:"#6E6EFD",background:"#000EA1"}},{border:"#FFC0CB",background:"#FD5A77",highlight:{border:"#FFD1D9",background:"#FD5A77"},hover:{border:"#FFD1D9",background:"#FD5A77"}},{border:"#C2FABC",background:"#74D66A",highlight:{border:"#E6FFE3",background:"#74D66A"},hover:{border:"#E6FFE3",background:"#74D66A"}},{border:"#EE0000",background:"#990000",highlight:{border:"#FF3333",background:"#BB0000"},hover:{border:"#FF3333",background:"#BB0000"}}],this.options={},this.defaultOptions={useDefaultGroups:!0},Xt(this.options,this.defaultOptions)}setOptions(g){const A=["useDefaultGroups"];if(void 0!==g)for(const t in g)if(Object.prototype.hasOwnProperty.call(g,t)&&-1===Si(A).call(A,t)){const A=g[t];this.add(t,A)}}clear(){this._groups=new Od,this._groupNames=[]}get(g){let A=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],t=this._groups.get(g);if(void 0===t&&A)if(!1===this.options.useDefaultGroups&&this._groupNames.length>0){const A=this._groupIndex%this._groupNames.length;++this._groupIndex,t={},t.color=this._groups.get(this._groupNames[A]),this._groups.set(g,t)}else{const A=this._defaultIndex%this._defaultGroups.length;this._defaultIndex++,t={},t.color=this._defaultGroups[A],this._groups.set(g,t)}return t}add(g,A){return this._groups.has(g)||this._groupNames.push(g),this._groups.set(g,A),A}}var Dd,Nd,kd,Rd,Pd,Md,zd;function Bd(){return kd?Nd:(kd=1,Dd||(Dd=1,st()({target:"Number",stat:!0},{isNaN:function(g){return g!=g}})),Nd=Tg().Number.isNaN)}function Zd(){return Pd?Rd:(Pd=1,Rd=Bd())}var Sd,Fd,Gd,jd,Ld,Vd,Yd,Wd,Qd,Ud=C(zd?Md:(zd=1,Md=Zd()));function Kd(){if(Fd)return Sd;Fd=1;var g=m().isFinite;return Sd=Number.isFinite||function(A){return"number"==typeof A&&g(A)},Sd}function Hd(){return Ld?jd:(Ld=1,Gd||(Gd=1,st()({target:"Number",stat:!0},{isFinite:Kd()})),jd=Tg().Number.isFinite)}function _d(){return Yd?Vd:(Yd=1,Vd=Hd())}var Xd,Jd,qd,$d,gh,Ah,th,Ch=C(Qd?Wd:(Qd=1,Wd=_d())),Ih={};function eh(){return qd?Jd:(qd=1,function(){if(Xd)return Ih;Xd=1;var g=st(),A=fA(),t=vt();g({target:"Object",stat:!0,forced:y()(function(){t(1)})},{keys:function(g){return t(A(g))}})}(),Jd=Tg().Object.keys)}function ih(){return gh?$d:(gh=1,$d=eh())}var oh,nh,sh,rh,ah,dh,hh,lh,ch,uh=C(th?Ah:(th=1,Ah=ih())),ph={};function fh(){return sh?nh:(sh=1,function(){if(oh)return ph;oh=1;var g=st(),A=Bn().some;g({target:"Array",proto:!0,forced:!Di()("some")},{some:function(g){return A(this,g,arguments.length>1?arguments[1]:void 0)}})}(),nh=gC()("Array","some"))}function vh(){if(ah)return rh;ah=1;var g=Ng(),A=fh(),t=Array.prototype;return rh=function(C){var I=C.some;return C===t||g(t,C)&&I===t.some?A:I},rh}function bh(){return hh?dh:(hh=1,dh=vh())}var mh,yh,wh,xh,Eh,Oh,Th,Dh=C(ch?lh:(ch=1,lh=bh())),Nh={},kh={};function Rh(){if(yh)return mh;yh=1;var g=m(),A=kg(),t=O(),C=function(g){return A.slice(0,g.length)===g};return mh=C("Bun/")?"BUN":C("Cloudflare-Workers")?"CLOUDFLARE":C("Deno/")?"DENO":C("Node.js/")?"NODE":g.Bun&&"string"==typeof Bun.version?"BUN":g.Deno&&"object"==typeof Deno.version?"DENO":"process"===t(g.process)?"NODE":g.window&&g.document?"BROWSER":"REST"}function Ph(){if(xh)return wh;xh=1;var g=TypeError;return wh=function(A,t){if(A<t)throw new g("Not enough arguments");return A}}function Mh(){if(Oh)return Eh;Oh=1;var g,A=m(),t=x(),C=D(),I=Rh(),e=kg(),i=qt(),o=Ph(),n=A.Function,s=/MSIE .\./.test(e)||"BUN"===I&&((g=A.Bun.version.split(".")).length<3||"0"===g[0]&&(g[1]<3||"3"===g[1]&&"0"===g[2]));return Eh=function(g,A){var I=A?2:1;return s?function(e,s){var r=o(arguments.length,1)>I,a=C(e)?e:n(e),d=r?i(arguments,I):[],h=r?function(){t(a,this,d)}:a;return A?g(h,s):g(h)}:g},Eh}var zh,Bh,Zh,Sh,Fh,Gh,jh={};function Lh(){return Bh||(Bh=1,function(){if(Th)return kh;Th=1;var g=st(),A=m(),t=Mh()(A.setInterval,!0);g({global:!0,bind:!0,forced:A.setInterval!==t},{setInterval:t})}(),function(){if(zh)return jh;zh=1;var g=st(),A=m(),t=Mh()(A.setTimeout,!0);g({global:!0,bind:!0,forced:A.setTimeout!==t},{setTimeout:t})}()),Nh}function Vh(){return Sh?Zh:(Sh=1,Lh(),Zh=Tg().setTimeout)}var Yh=C(Gh?Fh:(Gh=1,Fh=Vh()));const Wh=[];for(let g=0;g<256;++g)Wh.push((g+256).toString(16).slice(1));let Qh;const Uh=new Uint8Array(16);var Kh={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function Hh(g,A,t){if(Kh.randomUUID&&!g)return Kh.randomUUID();const C=(g=g||{}).random??g.rng?.()??function(){if(!Qh){if("undefined"==typeof crypto||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");Qh=crypto.getRandomValues.bind(crypto)}return Qh(Uh)}();if(C.length<16)throw new Error("Random bytes length must be >= 16");return C[6]=15&C[6]|64,C[8]=63&C[8]|128,function(g,A=0){return(Wh[g[A+0]]+Wh[g[A+1]]+Wh[g[A+2]]+Wh[g[A+3]]+"-"+Wh[g[A+4]]+Wh[g[A+5]]+"-"+Wh[g[A+6]]+Wh[g[A+7]]+"-"+Wh[g[A+8]]+Wh[g[A+9]]+"-"+Wh[g[A+10]]+Wh[g[A+11]]+Wh[g[A+12]]+Wh[g[A+13]]+Wh[g[A+14]]+Wh[g[A+15]]).toLowerCase()}(C)}
60/**
61 * vis-data
62 * http://visjs.org/
63 *
64 * Manage unstructured data using DataSet. Add, update, and remove data, and listen for changes in the data.
65 *
66 * @version 8.0.0
67 * @date 2025-07-12T18:33:36.028Z
68 *
69 * @copyright (c) 2011-2017 Almende B.V, http://almende.com
70 * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs
71 *
72 * @license
73 * vis.js is dual licensed under both
74 *
75 * 1. The Apache 2.0 License
76 * http://www.apache.org/licenses/LICENSE-2.0
77 *
78 * and
79 *
80 * 2. The MIT License
81 * http://opensource.org/licenses/MIT
82 *
83 * vis.js may be distributed under either license.
84 */class _h{_source;_transformers;_target;_listeners={add:this._add.bind(this),remove:this._remove.bind(this),update:this._update.bind(this)};constructor(g,A,t){this._source=g,this._transformers=A,this._target=t}all(){return this._target.update(this._transformItems(this._source.get())),this}start(){return this._source.on("add",this._listeners.add),this._source.on("remove",this._listeners.remove),this._source.on("update",this._listeners.update),this}stop(){return this._source.off("add",this._listeners.add),this._source.off("remove",this._listeners.remove),this._source.off("update",this._listeners.update),this}_transformItems(g){return this._transformers.reduce((g,A)=>A(g),g)}_add(g,A){null!=A&&this._target.add(this._transformItems(this._source.get(A.items)))}_update(g,A){null!=A&&this._target.update(this._transformItems(this._source.get(A.items)))}_remove(g,A){null!=A&&this._target.remove(this._transformItems(A.oldData))}}class Xh{_source;_transformers=[];constructor(g){this._source=g}filter(g){return this._transformers.push(A=>A.filter(g)),this}map(g){return this._transformers.push(A=>A.map(g)),this}flatMap(g){return this._transformers.push(A=>A.flatMap(g)),this}to(g){return new _h(this._source,this._transformers,g)}}function Jh(g){return"string"==typeof g||"number"==typeof g}class qh{delay;max;_queue=[];_timeout=null;_extended=null;constructor(g){this.delay=null,this.max=1/0,this.setOptions(g)}setOptions(g){g&&void 0!==g.delay&&(this.delay=g.delay),g&&void 0!==g.max&&(this.max=g.max),this._flushIfNeeded()}static extend(g,A){const t=new qh(A);if(void 0!==g.flush)throw new Error("Target object already has a property flush");g.flush=()=>{t.flush()};const C=[{name:"flush",original:void 0}];if(A&&A.replace)for(let I=0;I<A.replace.length;I++){const e=A.replace[I];C.push({name:e,original:g[e]}),t.replace(g,e)}return t._extended={object:g,methods:C},t}destroy(){if(this.flush(),this._extended){const g=this._extended.object,A=this._extended.methods;for(let t=0;t<A.length;t++){const C=A[t];C.original?g[C.name]=C.original:delete g[C.name]}this._extended=null}}replace(g,A){const t=this,C=g[A];if(!C)throw new Error("Method "+A+" undefined");g[A]=function(...g){t.queue({args:g,fn:C,context:this})}}queue(g){"function"==typeof g?this._queue.push({fn:g}):this._queue.push(g),this._flushIfNeeded()}_flushIfNeeded(){this._queue.length>this.max&&this.flush(),null!=this._timeout&&(clearTimeout(this._timeout),this._timeout=null),this.queue.length>0&&"number"==typeof this.delay&&(this._timeout=setTimeout(()=>{this.flush()},this.delay))}flush(){this._queue.splice(0).forEach(g=>{g.fn.apply(g.context||g.fn,g.args||[])})}}class $h{_subscribers={"*":[],add:[],remove:[],update:[]};_trigger(g,A,t){if("*"===g)throw new Error("Cannot trigger event *");[...this._subscribers[g],...this._subscribers["*"]].forEach(C=>{C(g,A,null!=t?t:null)})}on(g,A){"function"==typeof A&&this._subscribers[g].push(A)}off(g,A){this._subscribers[g]=this._subscribers[g].filter(g=>g!==A)}subscribe=$h.prototype.on;unsubscribe=$h.prototype.off;get testLeakSubscribers(){return this._subscribers}}class gl{_pairs;constructor(g){this._pairs=g}*[Symbol.iterator](){for(const[g,A]of this._pairs)yield[g,A]}*entries(){for(const[g,A]of this._pairs)yield[g,A]}*keys(){for(const[g]of this._pairs)yield g}*values(){for(const[,g]of this._pairs)yield g}toIdArray(){return[...this._pairs].map(g=>g[0])}toItemArray(){return[...this._pairs].map(g=>g[1])}toEntryArray(){return[...this._pairs]}toObjectMap(){const g=Object.create(null);for(const[A,t]of this._pairs)g[A]=t;return g}toMap(){return new Map(this._pairs)}toIdSet(){return new Set(this.toIdArray())}toItemSet(){return new Set(this.toItemArray())}cache(){return new gl([...this._pairs])}distinct(g){const A=new Set;for(const[t,C]of this._pairs)A.add(g(C,t));return A}filter(g){const A=this._pairs;return new gl({*[Symbol.iterator](){for(const[t,C]of A)g(C,t)&&(yield[t,C])}})}forEach(g){for(const[A,t]of this._pairs)g(t,A)}map(g){const A=this._pairs;return new gl({*[Symbol.iterator](){for(const[t,C]of A)yield[t,g(C,t)]}})}max(g){const A=this._pairs[Symbol.iterator]();let t=A.next();if(t.done)return null;let C=t.value[1],I=g(t.value[1],t.value[0]);for(;!(t=A.next()).done;){const[A,e]=t.value,i=g(e,A);i>I&&(I=i,C=e)}return C}min(g){const A=this._pairs[Symbol.iterator]();let t=A.next();if(t.done)return null;let C=t.value[1],I=g(t.value[1],t.value[0]);for(;!(t=A.next()).done;){const[A,e]=t.value,i=g(e,A);i<I&&(I=i,C=e)}return C}reduce(g,A){for(const[t,C]of this._pairs)A=g(A,C,t);return A}sort(g){return new gl({[Symbol.iterator]:()=>[...this._pairs].sort(([A,t],[C,I])=>g(t,I,A,C))[Symbol.iterator]()})}}class Al extends $h{flush;length;get idProp(){return this._idProp}_options;_data;_idProp;_queue=null;constructor(g,A){super(),g&&!Array.isArray(g)&&(A=g,g=[]),this._options=A||{},this._data=new Map,this.length=0,this._idProp=this._options.fieldId||"id",g&&g.length&&this.add(g),this.setOptions(A)}setOptions(g){g&&void 0!==g.queue&&(!1===g.queue?this._queue&&(this._queue.destroy(),this._queue=null):(this._queue||(this._queue=qh.extend(this,{replace:["add","update","remove"]})),g.queue&&"object"==typeof g.queue&&this._queue.setOptions(g.queue)))}add(g,A){const t=[];let C;if(Array.isArray(g)){if(g.map(g=>g[this._idProp]).some(g=>this._data.has(g)))throw new Error("A duplicate id was found in the parameter array.");for(let A=0,I=g.length;A<I;A++)C=this._addItem(g[A]),t.push(C)}else{if(!g||"object"!=typeof g)throw new Error("Unknown dataType");C=this._addItem(g),t.push(C)}return t.length&&this._trigger("add",{items:t},A),t}update(g,A){const t=[],C=[],I=[],e=[],i=this._idProp,o=g=>{const A=g[i];if(null!=A&&this._data.has(A)){const t=g,i=Object.assign({},this._data.get(A)),o=this._updateItem(t);C.push(o),e.push(t),I.push(i)}else{const A=this._addItem(g);t.push(A)}};if(Array.isArray(g))for(let A=0,t=g.length;A<t;A++)g[A]&&"object"==typeof g[A]?o(g[A]):console.warn("Ignoring input item, which is not an object at index "+A);else{if(!g||"object"!=typeof g)throw new Error("Unknown dataType");o(g)}if(t.length&&this._trigger("add",{items:t},A),C.length){const g={items:C,oldData:I,data:e};this._trigger("update",g,A)}return t.concat(C)}updateOnly(g,A){Array.isArray(g)||(g=[g]);const t=g.map(g=>{const A=this._data.get(g[this._idProp]);if(null==A)throw new Error("Updating non-existent items is not allowed.");return{oldData:A,update:g}}).map(({oldData:g,update:A})=>{const t=g[this._idProp],C=function(g,...A){return ge({},g,...A)}(g,A);return this._data.set(t,C),{id:t,oldData:g,updatedData:C}});if(t.length){const g={items:t.map(g=>g.id),oldData:t.map(g=>g.oldData),data:t.map(g=>g.updatedData)};return this._trigger("update",g,A),g.items}return[]}get(g,A){let t,C,I;Jh(g)?(t=g,I=A):Array.isArray(g)?(C=g,I=A):I=g;const e=I&&"Object"===I.returnType?"Object":"Array",i=I&&I.filter,o=[];let n,s,r;if(null!=t)n=this._data.get(t),n&&i&&!i(n)&&(n=void 0);else if(null!=C)for(let g=0,A=C.length;g<A;g++)n=this._data.get(C[g]),null==n||i&&!i(n)||o.push(n);else{s=[...this._data.keys()];for(let g=0,A=s.length;g<A;g++)r=s[g],n=this._data.get(r),null==n||i&&!i(n)||o.push(n)}if(I&&I.order&&null==t&&this._sort(o,I.order),I&&I.fields){const g=I.fields;if(null!=t&&null!=n)n=this._filterFields(n,g);else for(let A=0,t=o.length;A<t;A++)o[A]=this._filterFields(o[A],g)}if("Object"==e){const g={};for(let A=0,t=o.length;A<t;A++){const t=o[A];g[t[this._idProp]]=t}return g}return null!=t?n??null:o}getIds(g){const A=this._data,t=g&&g.filter,C=g&&g.order,I=[...A.keys()],e=[];if(t)if(C){const g=[];for(let A=0,C=I.length;A<C;A++){const C=I[A],e=this._data.get(C);null!=e&&t(e)&&g.push(e)}this._sort(g,C);for(let A=0,t=g.length;A<t;A++)e.push(g[A][this._idProp])}else for(let g=0,A=I.length;g<A;g++){const A=I[g],C=this._data.get(A);null!=C&&t(C)&&e.push(C[this._idProp])}else if(C){const g=[];for(let t=0,C=I.length;t<C;t++){const C=I[t];g.push(A.get(C))}this._sort(g,C);for(let A=0,t=g.length;A<t;A++)e.push(g[A][this._idProp])}else for(let g=0,t=I.length;g<t;g++){const t=I[g],C=A.get(t);null!=C&&e.push(C[this._idProp])}return e}getDataSet(){return this}forEach(g,A){const t=A&&A.filter,C=[...this._data.keys()];if(A&&A.order){const t=this.get(A);for(let A=0,C=t.length;A<C;A++){const C=t[A];g(C,C[this._idProp])}}else for(let A=0,I=C.length;A<I;A++){const I=C[A],e=this._data.get(I);null==e||t&&!t(e)||g(e,I)}}map(g,A){const t=A&&A.filter,C=[],I=[...this._data.keys()];for(let A=0,e=I.length;A<e;A++){const e=I[A],i=this._data.get(e);null==i||t&&!t(i)||C.push(g(i,e))}return A&&A.order&&this._sort(C,A.order),C}_filterFields(g,A){return g?(Array.isArray(A)?A:Object.keys(A)).reduce((A,t)=>(A[t]=g[t],A),{}):g}_sort(g,A){if("string"==typeof A){const t=A;g.sort((g,A)=>{const C=g[t],I=A[t];return C>I?1:C<I?-1:0})}else{if("function"!=typeof A)throw new TypeError("Order must be a function or a string");g.sort(A)}}remove(g,A){const t=[],C=[],I=Array.isArray(g)?g:[g];for(let g=0,A=I.length;g<A;g++){const A=this._remove(I[g]);if(A){const g=A[this._idProp];null!=g&&(t.push(g),C.push(A))}}return t.length&&this._trigger("remove",{items:t,oldData:C},A),t}_remove(g){let A;if(Jh(g)?A=g:g&&"object"==typeof g&&(A=g[this._idProp]),null!=A&&this._data.has(A)){const g=this._data.get(A)||null;return this._data.delete(A),--this.length,g}return null}clear(g){const A=[...this._data.keys()],t=[];for(let g=0,C=A.length;g<C;g++)t.push(this._data.get(A[g]));return this._data.clear(),this.length=0,this._trigger("remove",{items:A,oldData:t},g),A}max(g){let A=null,t=null;for(const C of this._data.values()){const I=C[g];"number"==typeof I&&(null==t||I>t)&&(A=C,t=I)}return A||null}min(g){let A=null,t=null;for(const C of this._data.values()){const I=C[g];"number"==typeof I&&(null==t||I<t)&&(A=C,t=I)}return A||null}distinct(g){const A=this._data,t=[...A.keys()],C=[];let I=0;for(let e=0,i=t.length;e<i;e++){const i=t[e],o=A.get(i)[g];let n=!1;for(let g=0;g<I;g++)if(C[g]==o){n=!0;break}n||void 0===o||(C[I]=o,I++)}return C}_addItem(g){const A=function(g,A){return null==g[A]&&(g[A]=Hh()),g}(g,this._idProp),t=A[this._idProp];if(this._data.has(t))throw new Error("Cannot add item: item with id "+t+" already exists");return this._data.set(t,A),++this.length,t}_updateItem(g){const A=g[this._idProp];if(null==A)throw new Error("Cannot update item: item has no id (item: "+JSON.stringify(g)+")");const t=this._data.get(A);if(!t)throw new Error("Cannot update item: no item with id "+A+" found");return this._data.set(A,{...t,...g}),A}stream(g){if(g){const A=this._data;return new gl({*[Symbol.iterator](){for(const t of g){const g=A.get(t);null!=g&&(yield[t,g])}}})}return new gl({[Symbol.iterator]:this._data.entries.bind(this._data)})}get testLeakData(){return this._data}get testLeakIdProp(){return this._idProp}get testLeakOptions(){return this._options}get testLeakQueue(){return this._queue}set testLeakQueue(g){this._queue=g}}class tl extends $h{length=0;get idProp(){return this.getDataSet().idProp}_listener;_data;_ids=new Set;_options;constructor(g,A){super(),this._options=A||{},this._listener=this._onEvent.bind(this),this.setData(g)}setData(g){if(this._data){this._data.off&&this._data.off("*",this._listener);const g=this._data.getIds({filter:this._options.filter}),A=this._data.get(g);this._ids.clear(),this.length=0,this._trigger("remove",{items:g,oldData:A})}if(null!=g){this._data=g;const A=this._data.getIds({filter:this._options.filter});for(let g=0,t=A.length;g<t;g++){const t=A[g];this._ids.add(t)}this.length=A.length,this._trigger("add",{items:A})}else this._data=new Al;this._data.on&&this._data.on("*",this._listener)}refresh(){const g=this._data.getIds({filter:this._options.filter}),A=[...this._ids],t={},C=[],I=[],e=[];for(let A=0,I=g.length;A<I;A++){const I=g[A];t[I]=!0,this._ids.has(I)||(C.push(I),this._ids.add(I))}for(let g=0,C=A.length;g<C;g++){const C=A[g],i=this._data.get(C);null==i?console.error("If you see this, report it please."):t[C]||(I.push(C),e.push(i),this._ids.delete(C))}this.length+=C.length-I.length,C.length&&this._trigger("add",{items:C}),I.length&&this._trigger("remove",{items:I,oldData:e})}get(g,A){if(null==this._data)return null;let t,C=null;Jh(g)||Array.isArray(g)?(C=g,t=A):t=g;const I=Object.assign({},this._options,t),e=this._options.filter,i=t&&t.filter;return e&&i&&(I.filter=g=>e(g)&&i(g)),null==C?this._data.get(I):this._data.get(C,I)}getIds(g){if(this._data.length){const A=this._options.filter,t=null!=g?g.filter:null;let C;return C=t?A?g=>A(g)&&t(g):t:A,this._data.getIds({filter:C,order:g&&g.order})}return[]}forEach(g,A){if(this._data){const t=this._options.filter,C=A&&A.filter;let I;I=C?t?function(g){return t(g)&&C(g)}:C:t,this._data.forEach(g,{filter:I,order:A&&A.order})}}map(g,A){if(this._data){const t=this._options.filter,C=A&&A.filter;let I;return I=C?t?g=>t(g)&&C(g):C:t,this._data.map(g,{filter:I,order:A&&A.order})}return[]}getDataSet(){return this._data.getDataSet()}stream(g){return this._data.stream(g||{[Symbol.iterator]:this._ids.keys.bind(this._ids)})}dispose(){this._data?.off&&this._data.off("*",this._listener);const g="This data view has already been disposed of.",A={get:()=>{throw new Error(g)},set:()=>{throw new Error(g)},configurable:!1};for(const g of Reflect.ownKeys(tl.prototype))Object.defineProperty(this,g,A)}_onEvent(g,A,t){if(!A||!A.items||!this._data)return;const C=A.items,I=[],e=[],i=[],o=[],n=[],s=[];switch(g){case"add":for(let g=0,A=C.length;g<A;g++){const A=C[g];this.get(A)&&(this._ids.add(A),I.push(A))}break;case"update":for(let g=0,t=C.length;g<t;g++){const t=C[g];this.get(t)?this._ids.has(t)?(e.push(t),n.push(A.data[g]),o.push(A.oldData[g])):(this._ids.add(t),I.push(t)):this._ids.has(t)&&(this._ids.delete(t),i.push(t),s.push(A.oldData[g]))}break;case"remove":for(let g=0,t=C.length;g<t;g++){const t=C[g];this._ids.has(t)&&(this._ids.delete(t),i.push(t),s.push(A.oldData[g]))}}this.length+=I.length-i.length,I.length&&this._trigger("add",{items:I},t),e.length&&this._trigger("update",{items:e,oldData:o,data:n},t),i.length&&this._trigger("remove",{items:i,oldData:s},t)}}function Cl(g,A){return"object"==typeof A&&null!==A&&g===A.idProp&&"function"==typeof A.add&&"function"==typeof A.clear&&"function"==typeof A.distinct&&"function"==typeof A.forEach&&"function"==typeof A.get&&"function"==typeof A.getDataSet&&"function"==typeof A.getIds&&"number"==typeof A.length&&"function"==typeof A.map&&"function"==typeof A.max&&"function"==typeof A.min&&"function"==typeof A.off&&"function"==typeof A.on&&"function"==typeof A.remove&&"function"==typeof A.setOptions&&"function"==typeof A.stream&&"function"==typeof A.update&&"function"==typeof A.updateOnly}function Il(g,A){return"object"==typeof A&&null!==A&&g===A.idProp&&"function"==typeof A.forEach&&"function"==typeof A.get&&"function"==typeof A.getDataSet&&"function"==typeof A.getIds&&"number"==typeof A.length&&"function"==typeof A.map&&"function"==typeof A.off&&"function"==typeof A.on&&"function"==typeof A.stream&&Cl(g,A.getDataSet())}console.warn("You're running a development build.");var el,il,ol,nl,sl,rl,al,dl,hl,ll,cl=Object.freeze({__proto__:null,DELETE:$I,DataSet:Al,DataStream:gl,DataView:tl,Queue:qh,createNewDataPipeFrom:function(g){return new Xh(g)},isDataSetLike:Cl,isDataViewLike:Il}),ul={exports:{}},pl={};function fl(){if(el)return pl;el=1;var g=st(),A=z(),t=ot().f;return g({target:"Object",stat:!0,forced:Object.defineProperty!==t,sham:!A},{defineProperty:t}),pl}function vl(){if(il)return ul.exports;il=1,fl();var g=Tg().Object,A=ul.exports=function(A,t,C){return g.defineProperty(A,t,C)};return g.defineProperty.sham&&(A.sham=!0),ul.exports}function bl(){return nl?ol:(nl=1,ol=vl())}function ml(){return rl?sl:(rl=1,sl=bl())}function yl(){return dl?al:(dl=1,al=ml())}function wl(){return ll?hl:(ll=1,hl=yl())}var xl,El,Ol,Tl,Dl,Nl,kl=C(wl()),Rl={},Pl={},Ml={};function zl(){if(xl)return Ml;xl=1;var g=mA();return Ml.f=g,Ml}function Bl(){if(Ol)return El;Ol=1;var g=Tg(),A=vA(),t=zl(),C=ot().f;return El=function(I){var e=g.Symbol||(g.Symbol={});A(e,I)||C(e,I,{value:t.f(I)})}}function Zl(){if(Dl)return Tl;Dl=1;var g=B(),A=Dg(),t=mA(),C=Gr();return Tl=function(){var I=A("Symbol"),e=I&&I.prototype,i=e&&e.valueOf,o=t("toPrimitive");e&&!e[o]&&C(e,o,function(A){return g(i,this)},{arity:1})}}var Sl,Fl,Gl,jl={};function Ll(){return Fl?Sl:(Fl=1,Sl=Pg()&&!!Symbol.for&&!!Symbol.keyFor)}var Vl,Yl={};var Wl,Ql,Ul,Kl={};function Hl(){if(Ql)return Wl;Ql=1;var g=E(),A=Xo(),t=D(),C=O(),I=lo(),e=g([].push);return Wl=function(g){if(t(g))return g;if(A(g)){for(var i=g.length,o=[],n=0;n<i;n++){var s=g[n];"string"==typeof s?e(o,s):"number"!=typeof s&&"Number"!==C(s)&&"String"!==C(s)||e(o,I(s))}var r=o.length,a=!0;return function(g,t){if(a)return a=!1,t;if(A(this))return t;for(var C=0;C<r;C++)if(o[C]===g)return t}}},Wl}function _l(){if(Ul)return Kl;Ul=1;var g=st(),A=Dg(),t=x(),C=B(),I=E(),e=y(),i=D(),o=zg(),n=qt(),s=Hl(),r=Pg(),a=String,d=A("JSON","stringify"),h=I(/./.exec),l=I("".charAt),c=I("".charCodeAt),u=I("".replace),p=I(1.1.toString),f=/[\uD800-\uDFFF]/g,v=/^[\uD800-\uDBFF]$/,b=/^[\uDC00-\uDFFF]$/,m=!r||e(function(){var g=A("Symbol")("stringify detection");return"[null]"!==d([g])||"{}"!==d({a:g})||"{}"!==d(Object(g))}),w=e(function(){return'"\\udf06\\ud834"'!==d("\udf06\ud834")||'"\\udead"'!==d("\udead")}),O=function(g,A){var I=n(arguments),e=s(A);if(i(e)||void 0!==g&&!o(g))return I[1]=function(g,A){if(i(e)&&(A=C(e,this,a(g),A)),!o(A))return A},t(d,null,I)},T=function(g,A,t){var C=l(t,A-1),I=l(t,A+1);return h(v,g)&&!h(b,I)||h(b,g)&&!h(v,C)?"\\u"+p(c(g,0),16):g};return d&&g({target:"JSON",stat:!0,arity:3,forced:m||w},{stringify:function(g,A,C){var I=n(arguments),e=t(m?O:d,null,I);return w&&"string"==typeof e?u(e,f,T):e}}),Kl}var Xl,Jl,ql={};function $l(){return Jl||(Jl=1,function(){if(Nl)return Pl;Nl=1;var g=st(),A=m(),t=B(),C=E(),I=lA(),e=z(),i=Pg(),o=y(),n=vA(),s=Ng(),r=it(),a=Eg(),d=wA(),h=lo(),l=mg(),c=di(),u=vt(),p=Aa(),f=Ba(),v=Rt(),b=OA(),w=ot(),x=si(),O=bg(),T=Gr(),D=Ka(),N=pA(),k=ai(),R=ut(),P=bA(),M=mA(),Z=zl(),S=Bl(),F=Zl(),G=Vr(),j=Br(),L=Bn().forEach,V=k("hidden"),Y="Symbol",W="prototype",Q=j.set,U=j.getterFor(Y),K=Object[W],H=A.Symbol,_=H&&H[W],X=A.RangeError,J=A.TypeError,q=A.QObject,$=b.f,gg=w.f,Ag=f.f,tg=O.f,Cg=C([].push),Ig=N("symbols"),eg=N("op-symbols"),ig=N("wks"),og=!q||!q[W]||!q[W].findChild,ng=function(g,A,t){var C=$(K,A);C&&delete K[A],gg(g,A,t),C&&g!==K&&gg(K,A,C)},sg=e&&o(function(){return 7!==c(gg({},"a",{get:function(){return gg(this,"a",{value:7}).a}})).a})?ng:gg,rg=function(g,A){var t=Ig[g]=c(_);return Q(t,{type:Y,tag:g,description:A}),e||(t.description=A),t},ag=function(g,A,t){g===K&&ag(eg,A,t),r(g);var C=d(A);return r(t),n(Ig,C)?(t.enumerable?(n(g,V)&&g[V][C]&&(g[V][C]=!1),t=c(t,{enumerable:l(0,!1)})):(n(g,V)||gg(g,V,l(1,c(null))),g[V][C]=!0),sg(g,C,t)):gg(g,C,t)},dg=function(g,A){r(g);var C=a(A),I=u(C).concat(ug(C));return L(I,function(A){e&&!t(hg,C,A)||ag(g,A,C[A])}),g},hg=function(g){var A=d(g),C=t(tg,this,A);return!(this===K&&n(Ig,A)&&!n(eg,A))&&(!(C||!n(this,A)||!n(Ig,A)||n(this,V)&&this[V][A])||C)},lg=function(g,A){var t=a(g),C=d(A);if(t!==K||!n(Ig,C)||n(eg,C)){var I=$(t,C);return!I||!n(Ig,C)||n(t,V)&&t[V][C]||(I.enumerable=!0),I}},cg=function(g){var A=Ag(a(g)),t=[];return L(A,function(g){n(Ig,g)||n(R,g)||Cg(t,g)}),t},ug=function(g){var A=g===K,t=Ag(A?eg:a(g)),C=[];return L(t,function(g){!n(Ig,g)||A&&!n(K,g)||Cg(C,Ig[g])}),C};i||(H=function(){if(s(_,this))throw new J("Symbol is not a constructor");var g=arguments.length&&void 0!==arguments[0]?h(arguments[0]):void 0,C=P(g),I=function(g){var e=void 0===this?A:this;e===K&&t(I,eg,g),n(e,V)&&n(e[V],C)&&(e[V][C]=!1);var i=l(1,g);try{sg(e,C,i)}catch(g){if(!(g instanceof X))throw g;ng(e,C,i)}};return e&&og&&sg(K,C,{configurable:!0,set:I}),rg(C,g)},T(_=H[W],"toString",function(){return U(this).tag}),T(H,"withoutSetter",function(g){return rg(P(g),g)}),O.f=hg,w.f=ag,x.f=dg,b.f=lg,p.f=f.f=cg,v.f=ug,Z.f=function(g){return rg(M(g),g)},e&&(D(_,"description",{configurable:!0,get:function(){return U(this).description}}),I||T(K,"propertyIsEnumerable",hg,{unsafe:!0}))),g({global:!0,constructor:!0,wrap:!0,forced:!i,sham:!i},{Symbol:H}),L(u(ig),function(g){S(g)}),g({target:Y,stat:!0,forced:!i},{useSetter:function(){og=!0},useSimple:function(){og=!1}}),g({target:"Object",stat:!0,forced:!i,sham:!e},{create:function(g,A){return void 0===A?c(g):dg(c(g),A)},defineProperty:ag,defineProperties:dg,getOwnPropertyDescriptor:lg}),g({target:"Object",stat:!0,forced:!i},{getOwnPropertyNames:cg}),F(),G(H,Y),R[V]=!0}(),function(){if(Gl)return jl;Gl=1;var g=st(),A=Dg(),t=vA(),C=lo(),I=pA(),e=Ll(),i=I("string-to-symbol-registry"),o=I("symbol-to-string-registry");g({target:"Symbol",stat:!0,forced:!e},{for:function(g){var I=C(g);if(t(i,I))return i[I];var e=A("Symbol")(I);return i[I]=e,o[e]=I,e}})}(),function(){if(Vl)return Yl;Vl=1;var g=st(),A=vA(),t=zg(),C=Bg(),I=pA(),e=Ll(),i=I("symbol-to-string-registry");g({target:"Symbol",stat:!0,forced:!e},{keyFor:function(g){if(!t(g))throw new TypeError(C(g)+" is not a symbol");if(A(i,g))return i[g]}})}(),_l(),function(){if(Xl)return ql;Xl=1;var g=st(),A=Pg(),t=y(),C=Rt(),I=fA();g({target:"Object",stat:!0,forced:!A||t(function(){C.f(1)})},{getOwnPropertySymbols:function(g){var A=C.f;return A?A(I(g)):[]}})}()),Rl}var gc,Ac={};function tc(){return gc||(gc=1,Bl()("asyncDispose")),Ac}var Cc;var Ic,ec={};function ic(){return Ic||(Ic=1,Bl()("dispose")),ec}var oc;var nc;var sc,rc={};function ac(){return sc||(sc=1,Bl()("iterator")),rc}var dc;var hc;var lc;var cc;var uc;var pc;var fc,vc={};function bc(){if(fc)return vc;fc=1;var g=Bl(),A=Zl();return g("toPrimitive"),A(),vc}var mc,yc={};var wc;var xc,Ec,Oc,Tc,Dc,Nc={};function kc(){return Oc?Ec:(Oc=1,Ws(),$l(),tc(),Cc||(Cc=1,Bl()("asyncIterator")),ic(),oc||(oc=1,Bl()("hasInstance")),nc||(nc=1,Bl()("isConcatSpreadable")),ac(),dc||(dc=1,Bl()("match")),hc||(hc=1,Bl()("matchAll")),lc||(lc=1,Bl()("replace")),cc||(cc=1,Bl()("search")),uc||(uc=1,Bl()("species")),pc||(pc=1,Bl()("split")),bc(),function(){if(mc)return yc;mc=1;var g=Dg(),A=Bl(),t=Vr();A("toStringTag"),t(g("Symbol"),"Symbol")}(),wc||(wc=1,Bl()("unscopables")),function(){if(xc)return Nc;xc=1;var g=m();Vr()(g.JSON,"JSON",!0)}(),Ec=Tg().Symbol)}function Rc(){if(Dc)return Tc;Dc=1;var g=kc();return xd(),Tc=g}var Pc,Mc={};var zc;var Bc;var Zc,Sc,Fc;function Gc(){if(Fc)return Sc;Fc=1;var g=Rc();return function(){if(Pc)return Mc;Pc=1;var g=mA(),A=ot().f,t=g("metadata"),C=Function.prototype;void 0===C[t]&&A(C,t,{value:null})}(),zc||(zc=1,tc()),Bc||(Bc=1,ic()),Zc||(Zc=1,Bl()("metadata")),Sc=g}var jc,Lc,Vc;function Yc(){if(Lc)return jc;Lc=1;var g=Dg(),A=E(),t=g("Symbol"),C=t.keyFor,I=A(t.prototype.valueOf);return jc=t.isRegisteredSymbol||function(g){try{return void 0!==C(I(g))}catch(g){return!1}}}var Wc,Qc,Uc;function Kc(){if(Qc)return Wc;Qc=1;for(var g=pA(),A=Dg(),t=E(),C=zg(),I=mA(),e=A("Symbol"),i=e.isWellKnownSymbol,o=A("Object","getOwnPropertyNames"),n=t(e.prototype.valueOf),s=g("wks"),r=0,a=o(e),d=a.length;r<d;r++)try{var h=a[r];C(e[h])&&I(h)}catch(g){}return Wc=function(g){if(i&&i(g))return!0;try{for(var A=n(g),t=0,C=o(s),I=C.length;t<I;t++)if(s[C[t]]==A)return!0}catch(g){}return!1},Wc}var Hc;var _c;var Xc;var Jc;var qc;var $c;var gu;var Au,tu,Cu,Iu,eu;function iu(){if(Cu)return tu;Cu=1;var g=Gc();return Vc||(Vc=1,st()({target:"Symbol",stat:!0},{isRegisteredSymbol:Yc()})),Uc||(Uc=1,st()({target:"Symbol",stat:!0,forced:!0},{isWellKnownSymbol:Kc()})),Hc||(Hc=1,Bl()("customMatcher")),_c||(_c=1,Bl()("observable")),Xc||(Xc=1,st()({target:"Symbol",stat:!0,name:"isRegisteredSymbol"},{isRegistered:Yc()})),Jc||(Jc=1,st()({target:"Symbol",stat:!0,name:"isWellKnownSymbol",forced:!0},{isWellKnown:Kc()})),qc||(qc=1,Bl()("matcher")),$c||($c=1,Bl()("metadataKey")),gu||(gu=1,Bl()("patternMatch")),Au||(Au=1,Bl()("replaceAll")),tu=g}function ou(){return eu?Iu:(eu=1,Iu=iu())}var nu,su,ru,au,du,hu,lu,cu,uu,pu,fu=C(ou());function vu(){return su?nu:(su=1,Xr(),hd(),ac(),nu=zl().f("iterator"))}function bu(){if(au)return ru;au=1;var g=vu();return xd(),ru=g}function mu(){return hu?du:(hu=1,du=bu())}function yu(){return cu?lu:(cu=1,lu=mu())}function wu(){return pu?uu:(pu=1,uu=yu())}var xu,Eu,Ou,Tu,Du,Nu,ku,Ru,Pu,Mu,zu=C(wu());function Bu(g){return Bu="function"==typeof fu&&"symbol"==typeof zu?function(g){return typeof g}:function(g){return g&&"function"==typeof fu&&g.constructor===fu&&g!==fu.prototype?"symbol":typeof g},Bu(g)}function Zu(){return Eu?xu:(Eu=1,bc(),xu=zl().f("toPrimitive"))}function Su(){return Tu?Ou:(Tu=1,Ou=Zu())}function Fu(){return Nu?Du:(Nu=1,Du=Su())}function Gu(){return Ru?ku:(Ru=1,ku=Fu())}function ju(){return Mu?Pu:(Mu=1,Pu=Gu())}var Lu=C(ju());function Vu(g){var A=function(g,A){if("object"!=Bu(g)||!g)return g;var t=g[Lu];if(void 0!==t){var C=t.call(g,A);if("object"!=Bu(C))return C;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===A?String:Number)(g)}(g,"string");return"symbol"==Bu(A)?A:A+""}function Yu(g,A,t){return(A=Vu(A))in g?kl(g,A,{value:t,enumerable:!0,configurable:!0,writable:!0}):g[A]=t,g}var Wu,Qu,Uu,Ku,Hu,_u,Xu,Ju,qu,$u,gp,Ap,tp,Cp={};function Ip(){return Qu?Wu:(Qu=1,Wu="\t\n\v\f\r                 \u2028\u2029\ufeff")}function ep(){if(Ku)return Uu;Ku=1;var g=E(),A=xg(),t=lo(),C=Ip(),I=g("".replace),e=RegExp("^["+C+"]+"),i=RegExp("(^|[^"+C+"])["+C+"]+$"),o=function(g){return function(C){var o=t(A(C));return 1&g&&(o=I(o,e,"")),2&g&&(o=I(o,i,"$1")),o}};return Uu={start:o(1),end:o(2),trim:o(3)}}function ip(){if(_u)return Hu;_u=1;var g=m(),A=y(),t=E(),C=lo(),I=ep().trim,e=Ip(),i=g.parseInt,o=g.Symbol,n=o&&o.iterator,s=/^[+-]?0x/i,r=t(s.exec),a=8!==i(e+"08")||22!==i(e+"0x16")||n&&!A(function(){i(Object(n))});return Hu=a?function(g,A){var t=I(C(g));return i(t,A>>>0||(r(s,t)?16:10))}:i,Hu}function op(){return qu?Ju:(qu=1,function(){if(Xu)return Cp;Xu=1;var g=st(),A=ip();g({global:!0,forced:parseInt!==A},{parseInt:A})}(),Ju=Tg().parseInt)}function np(){return gp?$u:(gp=1,$u=op())}var sp,rp,ap,dp,hp,lp,cp,up,pp,fp=C(tp?Ap:(tp=1,Ap=np())),vp={};function bp(){if(rp)return sp;rp=1;var g=m(),A=y(),t=E(),C=lo(),I=ep().trim,e=Ip(),i=t("".charAt),o=g.parseFloat,n=g.Symbol,s=n&&n.iterator,r=1/o(e+"-0")!=-1/0||s&&!A(function(){o(Object(s))});return sp=r?function(g){var A=I(C(g)),t=o(A);return 0===t&&"-"===i(A,0)?-0:t}:o,sp}function mp(){return hp?dp:(hp=1,function(){if(ap)return vp;ap=1;var g=st(),A=bp();g({global:!0,forced:parseFloat!==A},{parseFloat:A})}(),dp=Tg().parseFloat)}function yp(){return cp?lp:(cp=1,lp=mp())}var wp,xp,Ep,Op,Tp,Dp,Np,kp,Rp,Pp=C(pp?up:(pp=1,up=yp())),Mp={};function zp(){return Ep?xp:(Ep=1,function(){if(wp)return Mp;wp=1;var g=st(),A=Bn().filter;g({target:"Array",proto:!0,forced:!en()("filter")},{filter:function(g){return A(this,g,arguments.length>1?arguments[1]:void 0)}})}(),xp=gC()("Array","filter"))}function Bp(){if(Tp)return Op;Tp=1;var g=Ng(),A=zp(),t=Array.prototype;return Op=function(C){var I=C.filter;return C===t||g(t,C)&&I===t.filter?A:I},Op}function Zp(){return Np?Dp:(Np=1,Dp=Bp())}var Sp,Fp,Gp,jp,Lp,Vp,Yp,Wp=C(Rp?kp:(Rp=1,kp=Zp())),Qp={};function Up(){if(Sp)return Qp;Sp=1;var g=st(),A=y(),t=Ba().f;return g({target:"Object",stat:!0,forced:A(function(){return!Object.getOwnPropertyNames(1)})},{getOwnPropertyNames:t}),Qp}function Kp(){if(Gp)return Fp;Gp=1,Up();var g=Tg().Object;return Fp=function(A){return g.getOwnPropertyNames(A)},Fp}function Hp(){return Lp?jp:(Lp=1,jp=Kp())}var _p,Xp,Jp,qp,$p,gf,Af=C(Yp?Vp:(Yp=1,Vp=Hp()));function tf(){return Xp?_p:(Xp=1,$l(),_p=Tg().Object.getOwnPropertySymbols)}function Cf(){return qp?Jp:(qp=1,Jp=tf())}var If,ef,of,nf,sf,rf,af=C(gf?$p:(gf=1,$p=Cf())),df={exports:{}},hf={};function lf(){if(ef)return df.exports;ef=1,function(){if(If)return hf;If=1;var g=st(),A=y(),t=Eg(),C=OA().f,I=z();g({target:"Object",stat:!0,forced:!I||A(function(){C(1)}),sham:!I},{getOwnPropertyDescriptor:function(g,A){return C(t(g),A)}})}();var g=Tg().Object,A=df.exports=function(A,t){return g.getOwnPropertyDescriptor(A,t)};return g.getOwnPropertyDescriptor.sham&&(A.sham=!0),df.exports}function cf(){return nf?of:(nf=1,of=lf())}var uf,pf,ff,vf,bf,mf,yf,wf,xf,Ef=C(rf?sf:(rf=1,sf=cf())),Of={};function Tf(){if(pf)return uf;pf=1;var g=Dg(),A=E(),t=Aa(),C=Rt(),I=it(),e=A([].concat);return uf=g("Reflect","ownKeys")||function(g){var A=t.f(I(g)),i=C.f;return i?e(A,i(g)):A},uf}function Df(){return bf?vf:(bf=1,function(){if(ff)return Of;ff=1;var g=st(),A=z(),t=Tf(),C=Eg(),I=OA(),e=Cn();g({target:"Object",stat:!0,sham:!A},{getOwnPropertyDescriptors:function(g){for(var A,i,o=C(g),n=I.f,s=t(o),r={},a=0;s.length>a;)void 0!==(i=n(o,A=s[a++]))&&e(r,A,i);return r}})}(),vf=Tg().Object.getOwnPropertyDescriptors)}function Nf(){return yf?mf:(yf=1,mf=Df())}var kf,Rf,Pf,Mf,zf,Bf,Zf=C(xf?wf:(xf=1,wf=Nf())),Sf={exports:{}},Ff={};function Gf(){if(kf)return Ff;kf=1;var g=st(),A=z(),t=si().f;return g({target:"Object",stat:!0,forced:Object.defineProperties!==t,sham:!A},{defineProperties:t}),Ff}function jf(){if(Rf)return Sf.exports;Rf=1,Gf();var g=Tg().Object,A=Sf.exports=function(A,t){return g.defineProperties(A,t)};return g.defineProperties.sham&&(A.sham=!0),Sf.exports}function Lf(){return Mf?Pf:(Mf=1,Pf=jf())}var Vf,Yf,Wf=C(Bf?zf:(Bf=1,zf=Lf()));var Qf=C(Yf?Vf:(Yf=1,Vf=bl()));function Uf(g,A){const t=["node","edge","label"];let C=!0;const I=Be(A,"chosen");if("boolean"==typeof I)C=I;else if("object"==typeof I){if(-1===Si(t).call(t,g))throw new Error("choosify: subOption '"+g+"' should be one of '"+t.join("', '")+"'");const I=Be(A,["chosen",g]);"boolean"!=typeof I&&"function"!=typeof I||(C=I)}return C}function Kf(g,A,t){if(g.width<=0||g.height<=0)return!1;if(void 0!==t){const g={x:A.x-t.x,y:A.y-t.y};if(0!==t.angle){const C=-t.angle;A={x:Math.cos(C)*g.x-Math.sin(C)*g.y,y:Math.sin(C)*g.x+Math.cos(C)*g.y}}else A=g}const C=g.x+g.width,I=g.y+g.width;return g.left<A.x&&C>A.x&&g.top<A.y&&I>A.y}function Hf(g){return"string"==typeof g&&""!==g}function _f(g,A,t,C){let I=C.x,e=C.y;if("function"==typeof C.distanceToBorder){const t=C.distanceToBorder(g,A),i=Math.sin(A)*t,o=Math.cos(A)*t;o===t?(I+=t,e=C.y):i===t?(I=C.x,e-=t):(I+=o,e-=i)}else C.shape.width>C.shape.height?(I=C.x+.5*C.shape.width,e=C.y-t):(I=C.x+t,e=C.y-.5*C.shape.height);return{x:I,y:e}}var Xf,Jf,qf,$f,gv,Av,tv,Cv,Iv,ev={};function iv(){return qf?Jf:(qf=1,function(){if(Xf)return ev;Xf=1;var g=st(),A=Xo(),t=gn(),C=Og(),I=dt(),e=lt(),i=Eg(),o=Cn(),n=mA(),s=en(),r=qt(),a=s("slice"),d=n("species"),h=Array,l=Math.max;g({target:"Array",proto:!0,forced:!a},{slice:function(g,n){var s,a,c,u=i(this),p=e(u),f=I(g,p),v=I(void 0===n?p:n,p);if(A(u)&&(s=u.constructor,(t(s)&&(s===h||A(s.prototype))||C(s)&&null===(s=s[d]))&&(s=void 0),s===h||void 0===s))return r(u,f,v);for(a=new(void 0===s?h:s)(l(v-f,0)),c=0;f<v;f++,c++)f in u&&o(a,c,u[f]);return a.length=c,a}})}(),Jf=gC()("Array","slice"))}function ov(){if(gv)return $f;gv=1;var g=Ng(),A=iv(),t=Array.prototype;return $f=function(C){var I=C.slice;return C===t||g(t,C)&&I===t.slice?A:I},$f}function nv(){return tv?Av:(tv=1,Av=ov())}var sv,rv,av,dv,hv,lv,cv,uv,pv=C(Iv?Cv:(Iv=1,Cv=nv()));function fv(){return rv?sv:(rv=1,Xr(),sv=gC()("Array","values"))}function vv(){return dv?av:(dv=1,av=fv())}function bv(){if(lv)return hv;lv=1,xd();var g=ho(),A=vA(),t=Ng(),C=vv(),I=Array.prototype,e={DOMTokenList:!0,NodeList:!0};return hv=function(i){var o=i.values;return i===I||t(I,i)&&o===I.values||A(e,g(i))?C:o},hv}var mv=C(uv?cv:(uv=1,cv=bv()));class yv{constructor(g){this.measureText=g,this.current=0,this.width=0,this.height=0,this.lines=[]}_add(g,A){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"normal";void 0===this.lines[g]&&(this.lines[g]={width:0,height:0,blocks:[]});let C=A;void 0!==A&&""!==A||(C=" ");const I=this.measureText(C,t),e=Xt({},mv(I));e.text=A,e.width=I.width,e.mod=t,void 0!==A&&""!==A||(e.width=0),this.lines[g].blocks.push(e),this.lines[g].width+=e.width}curWidth(){const g=this.lines[this.current];return void 0===g?0:g.width}append(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,g,A)}newLine(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,g,A),this.current++}determineLineHeights(){for(let g=0;g<this.lines.length;g++){const A=this.lines[g];let t=0;if(void 0!==A.blocks)for(let g=0;g<A.blocks.length;g++){const C=A.blocks[g];t<C.height&&(t=C.height)}A.height=t}}determineLabelSize(){let g=0,A=0;for(let t=0;t<this.lines.length;t++){const C=this.lines[t];C.width>g&&(g=C.width),A+=C.height}this.width=g,this.height=A}removeEmptyBlocks(){const g=[];for(let A=0;A<this.lines.length;A++){const t=this.lines[A];if(0===t.blocks.length)continue;if(A===this.lines.length-1&&0===t.width)continue;const C={};let I;Xt(C,t),C.blocks=[];const e=[];for(let g=0;g<t.blocks.length;g++){const A=t.blocks[g];0!==A.width?e.push(A):void 0===I&&(I=A)}0===e.length&&void 0!==I&&e.push(I),C.blocks=e,g.push(C)}return g}finalize(){this.determineLineHeights(),this.determineLabelSize();const g=this.removeEmptyBlocks();return{width:this.width,height:this.height,lines:g}}}const wv={"<b>":/<b>/,"<i>":/<i>/,"<code>":/<code>/,"</b>":/<\/b>/,"</i>":/<\/i>/,"</code>":/<\/code>/,"*":/\*/,_:/_/,"`":/`/,afterBold:/[^*]/,afterItal:/[^_]/,afterMono:/[^`]/};class xv{constructor(g){this.text=g,this.bold=!1,this.ital=!1,this.mono=!1,this.spacing=!1,this.position=0,this.buffer="",this.modStack=[],this.blocks=[]}mod(){return 0===this.modStack.length?"normal":this.modStack[0]}modName(){return 0===this.modStack.length?"normal":"mono"===this.modStack[0]?"mono":this.bold&&this.ital?"boldital":this.bold?"bold":this.ital?"ital":void 0}emitBlock(){this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(this.blocks.push({text:this.buffer,mod:this.modName()}),this.buffer="")}add(g){" "===g&&(this.spacing=!0),this.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=g&&(this.buffer+=g)}parseWS(g){return!!/[ \t]/.test(g)&&(this.mono?this.add(g):this.spacing=!0,!0)}setTag(g){this.emitBlock(),this[g]=!0,this.modStack.unshift(g)}unsetTag(g){this.emitBlock(),this[g]=!1,this.modStack.shift()}parseStartTag(g,A){return!(this.mono||this[g]||!this.match(A))&&(this.setTag(g),!0)}match(g){let A=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const[t,C]=this.prepareRegExp(g),I=t.test(this.text.substr(this.position,C));return I&&A&&(this.position+=C-1),I}parseEndTag(g,A,t){let C=this.mod()===g;return C="mono"===g?C&&this.mono:C&&!this.mono,!(!C||!this.match(A))&&(void 0!==t?(this.position===this.text.length-1||this.match(t,!1))&&this.unsetTag(g):this.unsetTag(g),!0)}replace(g,A){return!!this.match(g)&&(this.add(A),this.position+=length-1,!0)}prepareRegExp(g){let A,t;if(g instanceof RegExp)t=g,A=1;else{const C=wv[g];t=void 0!==C?C:new RegExp(g),A=g.length}return[t,A]}}class Ev{constructor(g,A,t,C){this.ctx=g,this.parent=A,this.selected=t,this.hover=C;this.lines=new yv((A,I)=>{if(void 0===A)return 0;const e=this.parent.getFormattingValues(g,t,C,I);let i=0;if(""!==A){i=this.ctx.measureText(A).width}return{width:i,values:e}})}process(g){if(!Hf(g))return this.lines.finalize();const A=this.parent.fontOptions;g=(g=g.replace(/\r\n/g,"\n")).replace(/\r/g,"\n");const t=String(g).split("\n"),C=t.length;if(A.multi)for(let g=0;g<C;g++){const C=this.splitBlocks(t[g],A.multi);if(void 0!==C)if(0!==C.length){if(A.maxWdt>0)for(let g=0;g<C.length;g++){const A=C[g].mod,t=C[g].text;this.splitStringIntoLines(t,A,!0)}else for(let g=0;g<C.length;g++){const A=C[g].mod,t=C[g].text;this.lines.append(t,A)}this.lines.newLine()}else this.lines.newLine("")}else if(A.maxWdt>0)for(let g=0;g<C;g++)this.splitStringIntoLines(t[g]);else for(let g=0;g<C;g++)this.lines.newLine(t[g]);return this.lines.finalize()}decodeMarkupSystem(g){let A="none";return"markdown"===g||"md"===g?A="markdown":!0!==g&&"html"!==g||(A="html"),A}splitHtmlBlocks(g){const A=new xv(g),t=g=>{if(/&/.test(g)){return A.replace(A.text,"&lt;","<")||A.replace(A.text,"&amp;","&")||A.add("&"),!0}return!1};for(;A.position<A.text.length;){const g=A.text.charAt(A.position);A.parseWS(g)||/</.test(g)&&(A.parseStartTag("bold","<b>")||A.parseStartTag("ital","<i>")||A.parseStartTag("mono","<code>")||A.parseEndTag("bold","</b>")||A.parseEndTag("ital","</i>")||A.parseEndTag("mono","</code>"))||t(g)||A.add(g),A.position++}return A.emitBlock(),A.blocks}splitMarkdownBlocks(g){const A=new xv(g);let t=!0;const C=g=>!!/\\/.test(g)&&(A.position<this.text.length+1&&(A.position++,g=this.text.charAt(A.position),/ \t/.test(g)?A.spacing=!0:(A.add(g),t=!1)),!0);for(;A.position<A.text.length;){const g=A.text.charAt(A.position);A.parseWS(g)||C(g)||(t||A.spacing)&&(A.parseStartTag("bold","*")||A.parseStartTag("ital","_")||A.parseStartTag("mono","`"))||A.parseEndTag("bold","*","afterBold")||A.parseEndTag("ital","_","afterItal")||A.parseEndTag("mono","`","afterMono")||(A.add(g),t=!1),A.position++}return A.emitBlock(),A.blocks}splitBlocks(g,A){const t=this.decodeMarkupSystem(A);return"none"===t?[{text:g,mod:"normal"}]:"markdown"===t?this.splitMarkdownBlocks(g):"html"===t?this.splitHtmlBlocks(g):void 0}overMaxWidth(g){const A=this.ctx.measureText(g).width;return this.lines.curWidth()+A>this.parent.fontOptions.maxWdt}getLongestFit(g){let A="",t=0;for(;t<g.length;){const C=A+(""===A?"":" ")+g[t];if(this.overMaxWidth(C))break;A=C,t++}return t}getLongestFitWord(g){let A=0;for(;A<g.length&&!this.overMaxWidth(pv(g).call(g,0,A));)A++;return A}splitStringIntoLines(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal",t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.parent.getFormattingValues(this.ctx,this.selected,this.hover,A);let C=(g=(g=g.replace(/^( +)/g,"$1\r")).replace(/([^\r][^ ]*)( +)/g,"$1\r$2\r")).split("\r");for(;C.length>0;){let g=this.getLongestFit(C);if(0===g){const g=C[0],t=this.getLongestFitWord(g);this.lines.newLine(pv(g).call(g,0,t),A),C[0]=pv(g).call(g,t)}else{let I=g;" "===C[g-1]?g--:" "===C[I]&&I++;const e=pv(C).call(C,0,g).join("");g==C.length&&t?this.lines.append(e,A):this.lines.newLine(e,A),C=pv(C).call(C,I)}}}}const Ov=["bold","ital","boldital","mono"];class Tv{constructor(g,A){let t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];this.body=g,this.pointToSelf=!1,this.baseSize=void 0,this.fontOptions={},this.setOptions(A),this.size={top:0,left:0,width:0,height:0,yLine:0},this.isEdgeLabel=t}setOptions(g){if(this.elementOptions=g,this.initFontOptions(g.font),Hf(g.label)?this.labelDirty=!0:g.label=void 0,void 0!==g.font&&null!==g.font)if("string"==typeof g.font)this.baseSize=this.fontOptions.size;else if("object"==typeof g.font){const A=g.font.size;void 0!==A&&(this.baseSize=A)}}initFontOptions(g){ye(Ov,g=>{this.fontOptions[g]={}}),Tv.parseFontString(this.fontOptions,g)?this.fontOptions.vadjust=0:ye(g,(g,A)=>{null!=g&&"object"!=typeof g&&(this.fontOptions[A]=g)})}static parseFontString(g,A){if(!A||"string"!=typeof A)return!1;const t=A.split(" ");return g.size=+t[0].replace("px",""),g.face=t[1],g.color=t[2],!0}constrain(g){const A={constrainWidth:!1,maxWdt:-1,minWdt:-1,constrainHeight:!1,minHgt:-1,valign:"middle"},t=Be(g,"widthConstraint");if("number"==typeof t)A.maxWdt=Number(t),A.minWdt=Number(t);else if("object"==typeof t){const t=Be(g,["widthConstraint","maximum"]);"number"==typeof t&&(A.maxWdt=Number(t));const C=Be(g,["widthConstraint","minimum"]);"number"==typeof C&&(A.minWdt=Number(C))}const C=Be(g,"heightConstraint");if("number"==typeof C)A.minHgt=Number(C);else if("object"==typeof C){const t=Be(g,["heightConstraint","minimum"]);"number"==typeof t&&(A.minHgt=Number(t));const C=Be(g,["heightConstraint","valign"]);"string"==typeof C&&("top"!==C&&"bottom"!==C||(A.valign=C))}return A}update(g,A){this.setOptions(g,!0),this.propagateFonts(A),fe(this.fontOptions,this.constrain(A)),this.fontOptions.chooser=Uf("label",A)}adjustSizes(g){const A=g?g.right+g.left:0;this.fontOptions.constrainWidth&&(this.fontOptions.maxWdt-=A,this.fontOptions.minWdt-=A);const t=g?g.top+g.bottom:0;this.fontOptions.constrainHeight&&(this.fontOptions.minHgt-=t)}addFontOptionsToPile(g,A){for(let t=0;t<A.length;++t)this.addFontToPile(g,A[t])}addFontToPile(g,A){if(void 0===A)return;if(void 0===A.font||null===A.font)return;const t=A.font;g.push(t)}getBasicOptions(g){const A={};for(let t=0;t<g.length;++t){let C=g[t];const I={};Tv.parseFontString(I,C)&&(C=I),ye(C,(g,t)=>{void 0!==g&&(Object.prototype.hasOwnProperty.call(A,t)||(-1!==Si(Ov).call(Ov,t)?A[t]={}:A[t]=g))})}return A}getFontOption(g,A,t){let C;for(let I=0;I<g.length;++I){const e=g[I];if(Object.prototype.hasOwnProperty.call(e,A)){if(C=e[A],null==C)continue;const g={};if(Tv.parseFontString(g,C)&&(C=g),Object.prototype.hasOwnProperty.call(C,t))return C[t]}}if(Object.prototype.hasOwnProperty.call(this.fontOptions,t))return this.fontOptions[t];throw new Error("Did not find value for multi-font for property: '"+t+"'")}getFontOptions(g,A){const t={},C=["color","size","face","mod","vadjust"];for(let I=0;I<C.length;++I){const e=C[I];t[e]=this.getFontOption(g,A,e)}return t}propagateFonts(g){const A=[];this.addFontOptionsToPile(A,g),this.fontOptions=this.getBasicOptions(A);for(let g=0;g<Ov.length;++g){const t=Ov[g],C=this.fontOptions[t];ye(this.getFontOptions(A,t),(g,A)=>{C[A]=g}),C.size=Number(C.size),C.vadjust=Number(C.vadjust)}}draw(g,A,t,C,I){let e=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"middle";if(void 0===this.elementOptions.label)return;let i=this.fontOptions.size*this.body.view.scale;this.elementOptions.label&&i<this.elementOptions.scaling.label.drawThreshold-1||(i>=this.elementOptions.scaling.label.maxVisible&&(i=Number(this.elementOptions.scaling.label.maxVisible)/this.body.view.scale),this.calculateLabelSize(g,C,I,A,t,e),this._drawBackground(g),this._drawText(g,A,this.size.yLine,e,i))}_drawBackground(g){if(void 0!==this.fontOptions.background&&"none"!==this.fontOptions.background){g.fillStyle=this.fontOptions.background;const A=this.getSize();g.fillRect(A.left,A.top,A.width,A.height)}}_drawText(g,A,t){let C=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"middle",I=arguments.length>4?arguments[4]:void 0;[A,t]=this._setAlignment(g,A,t,C),g.textAlign="left",A-=this.size.width/2,this.fontOptions.valign&&this.size.height>this.size.labelHeight&&("top"===this.fontOptions.valign&&(t-=(this.size.height-this.size.labelHeight)/2),"bottom"===this.fontOptions.valign&&(t+=(this.size.height-this.size.labelHeight)/2));for(let C=0;C<this.lineCount;C++){const e=this.lines[C];if(e&&e.blocks){let C=0;this.isEdgeLabel||"center"===this.fontOptions.align?C+=(this.size.width-e.width)/2:"right"===this.fontOptions.align&&(C+=this.size.width-e.width);for(let i=0;i<e.blocks.length;i++){const o=e.blocks[i];g.font=o.font;const[n,s]=this._getColor(o.color,I,o.strokeColor);o.strokeWidth>0&&(g.lineWidth=o.strokeWidth,g.strokeStyle=s,g.lineJoin="round"),g.fillStyle=n,o.strokeWidth>0&&g.strokeText(o.text,A+C,t+o.vadjust),g.fillText(o.text,A+C,t+o.vadjust),C+=o.width}t+=e.height}}}_setAlignment(g,A,t,C){if(this.isEdgeLabel&&"horizontal"!==this.fontOptions.align&&!1===this.pointToSelf){A=0,t=0;const C=2;"top"===this.fontOptions.align?(g.textBaseline="alphabetic",t-=2*C):"bottom"===this.fontOptions.align?(g.textBaseline="hanging",t+=2*C):g.textBaseline="middle"}else g.textBaseline=C;return[A,t]}_getColor(g,A,t){let C=g||"#000000",I=t||"#ffffff";if(A<=this.elementOptions.scaling.label.drawThreshold){const g=Math.max(0,Math.min(1,1-(this.elementOptions.scaling.label.drawThreshold-A)));C=xe(C,g),I=xe(I,g)}return[C,I]}getTextSize(g){let A=arguments.length>1&&void 0!==arguments[1]&&arguments[1],t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return this._processLabel(g,A,t),{width:this.size.width,height:this.size.height,lineCount:this.lineCount}}getSize(){let g=this.size.left,A=this.size.top-1;if(this.isEdgeLabel){const t=.5*-this.size.width;switch(this.fontOptions.align){case"middle":g=t,A=.5*-this.size.height;break;case"top":g=t,A=-(this.size.height+2);break;case"bottom":g=t,A=2}}return{left:g,top:A,width:this.size.width,height:this.size.height}}calculateLabelSize(g,A,t){let C=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,I=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,e=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"middle";this._processLabel(g,A,t),this.size.left=C-.5*this.size.width,this.size.top=I-.5*this.size.height,this.size.yLine=I+.5*(1-this.lineCount)*this.fontOptions.size,"hanging"===e&&(this.size.top+=.5*this.fontOptions.size,this.size.top+=4,this.size.yLine+=4)}getFormattingValues(g,A,t,C){const I=function(g,A,t){return"normal"===A?"mod"===t?"":g[t]:void 0!==g[A][t]?g[A][t]:g[t]},e={color:I(this.fontOptions,C,"color"),size:I(this.fontOptions,C,"size"),face:I(this.fontOptions,C,"face"),mod:I(this.fontOptions,C,"mod"),vadjust:I(this.fontOptions,C,"vadjust"),strokeWidth:this.fontOptions.strokeWidth,strokeColor:this.fontOptions.strokeColor};(A||t)&&("normal"===C&&!0===this.fontOptions.chooser&&this.elementOptions.labelHighlightBold?e.mod="bold":"function"==typeof this.fontOptions.chooser&&this.fontOptions.chooser(e,this.elementOptions.id,A,t));let i="";return void 0!==e.mod&&""!==e.mod&&(i+=e.mod+" "),i+=e.size+"px "+e.face,g.font=i.replace(/"/g,""),e.font=g.font,e.height=e.size,e}differentState(g,A){return g!==this.selectedState||A!==this.hoverState}_processLabelText(g,A,t,C){return new Ev(g,this,A,t).process(C)}_processLabel(g,A,t){if(!1===this.labelDirty&&!this.differentState(A,t))return;const C=this._processLabelText(g,A,t,this.elementOptions.label);this.fontOptions.minWdt>0&&C.width<this.fontOptions.minWdt&&(C.width=this.fontOptions.minWdt),this.size.labelHeight=C.height,this.fontOptions.minHgt>0&&C.height<this.fontOptions.minHgt&&(C.height=this.fontOptions.minHgt),this.lines=C.lines,this.lineCount=C.lines.length,this.size.width=C.width,this.size.height=C.height,this.selectedState=A,this.hoverState=t,this.labelDirty=!1}visible(){if(0===this.size.width||0===this.size.height||void 0===this.elementOptions.label)return!1;return!(this.fontOptions.size*this.body.view.scale<this.elementOptions.scaling.label.drawThreshold-1)}}var Dv,Nv,kv,Rv,Pv,Mv,zv,Bv,Zv,Sv,Fv,Gv={};function jv(){if(Nv)return Dv;Nv=1;var g=fA(),A=dt(),t=lt();return Dv=function(C){for(var I=g(this),e=t(I),i=arguments.length,o=A(i>1?arguments[1]:void 0,e),n=i>2?arguments[2]:void 0,s=void 0===n?e:A(n,e);s>o;)I[o++]=C;return I},Dv}function Lv(){return Pv?Rv:(Pv=1,function(){if(kv)return Gv;kv=1;var g=st(),A=jv(),t=Gi();g({target:"Array",proto:!0},{fill:A}),t("fill")}(),Rv=gC()("Array","fill"))}function Vv(){if(zv)return Mv;zv=1;var g=Ng(),A=Lv(),t=Array.prototype;return Mv=function(C){var I=C.fill;return C===t||g(t,C)&&I===t.fill?A:I},Mv}function Yv(){return Zv?Bv:(Zv=1,Bv=Vv())}var Wv=C(Fv?Sv:(Fv=1,Sv=Yv()));class Qv{constructor(g,A,t){this.body=A,this.labelModule=t,this.setOptions(g),this.top=void 0,this.left=void 0,this.height=void 0,this.width=void 0,this.radius=void 0,this.margin=void 0,this.refreshNeeded=!0,this.boundingBox={top:0,left:0,right:0,bottom:0}}setOptions(g){this.options=g}_setMargins(g){this.margin={},this.options.margin&&("object"==typeof this.options.margin?(this.margin.top=this.options.margin.top,this.margin.right=this.options.margin.right,this.margin.bottom=this.options.margin.bottom,this.margin.left=this.options.margin.left):(this.margin.top=this.options.margin,this.margin.right=this.options.margin,this.margin.bottom=this.options.margin,this.margin.left=this.options.margin)),g.adjustSizes(this.margin)}_distanceToBorder(g,A){const t=this.options.borderWidth;return g&&this.resize(g),Math.min(Math.abs(this.width/2/Math.cos(A)),Math.abs(this.height/2/Math.sin(A)))+t}enableShadow(g,A){A.shadow&&(g.shadowColor=A.shadowColor,g.shadowBlur=A.shadowSize,g.shadowOffsetX=A.shadowX,g.shadowOffsetY=A.shadowY)}disableShadow(g,A){A.shadow&&(g.shadowColor="rgba(0,0,0,0)",g.shadowBlur=0,g.shadowOffsetX=0,g.shadowOffsetY=0)}enableBorderDashes(g,A){if(!1!==A.borderDashes)if(void 0!==g.setLineDash){let t=A.borderDashes;!0===t&&(t=[5,15]),g.setLineDash(t)}else console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used."),this.options.shapeProperties.borderDashes=!1,A.borderDashes=!1}disableBorderDashes(g,A){!1!==A.borderDashes&&(void 0!==g.setLineDash?g.setLineDash([0]):(console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used."),this.options.shapeProperties.borderDashes=!1,A.borderDashes=!1))}needsRefresh(g,A){return!0===this.refreshNeeded?(this.refreshNeeded=!1,!0):void 0===this.width||this.labelModule.differentState(g,A)}initContextForDraw(g,A){const t=A.borderWidth/this.body.view.scale;g.lineWidth=Math.min(this.width,t),g.strokeStyle=A.borderColor,g.fillStyle=A.color}performStroke(g,A){const t=A.borderWidth/this.body.view.scale;g.save(),t>0&&(this.enableBorderDashes(g,A),g.stroke(),this.disableBorderDashes(g,A)),g.restore()}performFill(g,A){g.save(),g.fillStyle=A.color,this.enableShadow(g,A),Wv(g).call(g),this.disableShadow(g,A),g.restore(),this.performStroke(g,A)}_addBoundingBoxMargin(g){this.boundingBox.left-=g,this.boundingBox.top-=g,this.boundingBox.bottom+=g,this.boundingBox.right+=g}_updateBoundingBox(g,A,t,C,I){void 0!==t&&this.resize(t,C,I),this.left=g-this.width/2,this.top=A-this.height/2,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}updateBoundingBox(g,A,t,C,I){this._updateBoundingBox(g,A,t,C,I)}getDimensionsFromLabel(g,A,t){this.textSize=this.labelModule.getTextSize(g,A,t);let C=this.textSize.width,I=this.textSize.height;return 0===C&&(C=14,I=14),{width:C,height:I}}}let Uv=class extends Qv{constructor(g,A,t){super(g,A,t),this._setMargins(t)}resize(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(A,t)){const C=this.getDimensionsFromLabel(g,A,t);this.width=C.width+this.margin.right+this.margin.left,this.height=C.height+this.margin.top+this.margin.bottom,this.radius=this.width/2}}draw(g,A,t,C,I,e){this.resize(g,C,I),this.left=A-this.width/2,this.top=t-this.height/2,this.initContextForDraw(g,e),iC(g,this.left,this.top,this.width,this.height,e.borderRadius),this.performFill(g,e),this.updateBoundingBox(A,t,g,C,I),this.labelModule.draw(g,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,C,I)}updateBoundingBox(g,A,t,C,I){this._updateBoundingBox(g,A,t,C,I);const e=this.options.shapeProperties.borderRadius;this._addBoundingBoxMargin(e)}distanceToBorder(g,A){g&&this.resize(g);const t=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(A)),Math.abs(this.height/2/Math.sin(A)))+t}};class Kv extends Qv{constructor(g,A,t){super(g,A,t),this.labelOffset=0,this.selected=!1}setOptions(g,A,t){this.options=g,void 0===A&&void 0===t||this.setImages(A,t)}setImages(g,A){A&&this.selected?(this.imageObj=A,this.imageObjAlt=g):(this.imageObj=g,this.imageObjAlt=A)}switchImages(g){const A=g&&!this.selected||!g&&this.selected;if(this.selected=g,void 0!==this.imageObjAlt&&A){const g=this.imageObj;this.imageObj=this.imageObjAlt,this.imageObjAlt=g}}_getImagePadding(){const g={top:0,right:0,bottom:0,left:0};if(this.options.imagePadding){const A=this.options.imagePadding;"object"==typeof A?(g.top=A.top,g.right=A.right,g.bottom=A.bottom,g.left=A.left):(g.top=A,g.right=A,g.bottom=A,g.left=A)}return g}_resizeImage(){let g,A;if(!1===this.options.shapeProperties.useImageSize){let t=1,C=1;this.imageObj.width&&this.imageObj.height&&(this.imageObj.width>this.imageObj.height?t=this.imageObj.width/this.imageObj.height:C=this.imageObj.height/this.imageObj.width),g=2*this.options.size*t,A=2*this.options.size*C}else{const t=this._getImagePadding();g=this.imageObj.width+t.left+t.right,A=this.imageObj.height+t.top+t.bottom}this.width=g,this.height=A,this.radius=.5*this.width}_drawRawCircle(g,A,t,C){this.initContextForDraw(g,C),eC(g,A,t,C.size),this.performFill(g,C)}_drawImageAtPosition(g,A){if(0!=this.imageObj.width){g.globalAlpha=void 0!==A.opacity?A.opacity:1,this.enableShadow(g,A);let t=1;!0===this.options.shapeProperties.interpolation&&(t=this.imageObj.width/this.width/this.body.view.scale);const C=this._getImagePadding(),I=this.left+C.left,e=this.top+C.top,i=this.width-C.left-C.right,o=this.height-C.top-C.bottom;this.imageObj.drawImageAtPosition(g,t,I,e,i,o),this.disableShadow(g,A)}}_drawImageLabel(g,A,t,C,I){let e=0;if(void 0!==this.height){e=.5*this.height;const A=this.labelModule.getTextSize(g,C,I);A.lineCount>=1&&(e+=A.height/2)}const i=t+e;this.options.label&&(this.labelOffset=e),this.labelModule.draw(g,A,i,C,I,"hanging")}}let Hv=class extends Kv{constructor(g,A,t){super(g,A,t),this._setMargins(t)}resize(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(A,t)){const C=this.getDimensionsFromLabel(g,A,t),I=Math.max(C.width+this.margin.right+this.margin.left,C.height+this.margin.top+this.margin.bottom);this.options.size=I/2,this.width=I,this.height=I,this.radius=this.width/2}}draw(g,A,t,C,I,e){this.resize(g,C,I),this.left=A-this.width/2,this.top=t-this.height/2,this._drawRawCircle(g,A,t,e),this.updateBoundingBox(A,t),this.labelModule.draw(g,this.left+this.textSize.width/2+this.margin.left,t,C,I)}updateBoundingBox(g,A){this.boundingBox.top=A-this.options.size,this.boundingBox.left=g-this.options.size,this.boundingBox.right=g+this.options.size,this.boundingBox.bottom=A+this.options.size}distanceToBorder(g){return g&&this.resize(g),.5*this.width}};class _v extends Kv{constructor(g,A,t,C,I){super(g,A,t),this.setImages(C,I)}resize(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){const g=2*this.options.size;return this.width=g,this.height=g,void(this.radius=.5*this.width)}this.needsRefresh(A,t)&&this._resizeImage()}draw(g,A,t,C,I,e){this.switchImages(C),this.resize();let i=A,o=t;"top-left"===this.options.shapeProperties.coordinateOrigin?(this.left=A,this.top=t,i+=this.width/2,o+=this.height/2):(this.left=A-this.width/2,this.top=t-this.height/2),this._drawRawCircle(g,i,o,e),g.save(),g.clip(),this._drawImageAtPosition(g,e),g.restore(),this._drawImageLabel(g,i,o,C,I),this.updateBoundingBox(A,t)}updateBoundingBox(g,A){"top-left"===this.options.shapeProperties.coordinateOrigin?(this.boundingBox.top=A,this.boundingBox.left=g,this.boundingBox.right=g+2*this.options.size,this.boundingBox.bottom=A+2*this.options.size):(this.boundingBox.top=A-this.options.size,this.boundingBox.left=g-this.options.size,this.boundingBox.right=g+this.options.size,this.boundingBox.bottom=A+this.options.size),this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}distanceToBorder(g){return g&&this.resize(g),.5*this.width}}class Xv extends Qv{constructor(g,A,t){super(g,A,t)}resize(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover,C=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{size:this.options.size};if(this.needsRefresh(A,t)){var I,e;this.labelModule.getTextSize(g,A,t);const i=2*C.size;this.width=null!==(I=this.customSizeWidth)&&void 0!==I?I:i,this.height=null!==(e=this.customSizeHeight)&&void 0!==e?e:i,this.radius=.5*this.width}}_drawShape(g,A,t,C,I,e,i,o){var n;return this.resize(g,e,i,o),this.left=C-this.width/2,this.top=I-this.height/2,this.initContextForDraw(g,o),(n=A,Object.prototype.hasOwnProperty.call(rC,n)?rC[n]:function(g){for(var A=arguments.length,t=new Array(A>1?A-1:0),C=1;C<A;C++)t[C-1]=arguments[C];CanvasRenderingContext2D.prototype[n].call(g,t)})(g,C,I,o.size),this.performFill(g,o),void 0!==this.options.icon&&void 0!==this.options.icon.code&&(g.font=(e?"bold ":"")+this.height/2+"px "+(this.options.icon.face||"FontAwesome"),g.fillStyle=this.options.icon.color||"black",g.textAlign="center",g.textBaseline="middle",g.fillText(this.options.icon.code,C,I)),{drawExternalLabel:()=>{if(void 0!==this.options.label){this.labelModule.calculateLabelSize(g,e,i,C,I,"hanging");const A=I+.5*this.height+.5*this.labelModule.size.height;this.labelModule.draw(g,C,A,e,i,"hanging")}this.updateBoundingBox(C,I)}}}updateBoundingBox(g,A){this.boundingBox.top=A-this.options.size,this.boundingBox.left=g-this.options.size,this.boundingBox.right=g+this.options.size,this.boundingBox.bottom=A+this.options.size,void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height))}}function Jv(g,A){var t=uh(g);if(af){var C=af(g);A&&(C=Wp(C).call(C,function(A){return Ef(g,A).enumerable})),t.push.apply(t,C)}return t}function qv(g){for(var A=1;A<arguments.length;A++){var t,C,I=null!=arguments[A]?arguments[A]:{};A%2?jn(t=Jv(Object(I),!0)).call(t,function(A){Yu(g,A,I[A])}):Zf?Wf(g,Zf(I)):jn(C=Jv(Object(I))).call(C,function(A){Qf(g,A,Ef(I,A))})}return g}class $v extends Xv{constructor(g,A,t,C){super(g,A,t,C),this.ctxRenderer=C}draw(g,A,t,C,I,e){this.resize(g,C,I,e),this.left=A-this.width/2,this.top=t-this.height/2,g.save();const i=this.ctxRenderer({ctx:g,id:this.options.id,x:A,y:t,state:{selected:C,hover:I},style:qv({},e),label:this.options.label});if(null!=i.drawNode&&i.drawNode(),g.restore(),i.drawExternalLabel){const A=i.drawExternalLabel;i.drawExternalLabel=()=>{g.save(),A(),g.restore()}}return i.nodeDimensions&&(this.customSizeWidth=i.nodeDimensions.width,this.customSizeHeight=i.nodeDimensions.height),i}distanceToBorder(g,A){return this._distanceToBorder(g,A)}}class gb extends Qv{constructor(g,A,t){super(g,A,t),this._setMargins(t)}resize(g,A,t){if(this.needsRefresh(A,t)){const C=this.getDimensionsFromLabel(g,A,t).width+this.margin.right+this.margin.left;this.width=C,this.height=C,this.radius=this.width/2}}draw(g,A,t,C,I,e){this.resize(g,C,I),this.left=A-this.width/2,this.top=t-this.height/2,this.initContextForDraw(g,e),nC(g,A-this.width/2,t-this.height/2,this.width,this.height),this.performFill(g,e),this.updateBoundingBox(A,t,g,C,I),this.labelModule.draw(g,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,C,I)}distanceToBorder(g,A){return this._distanceToBorder(g,A)}}let Ab=class extends Xv{constructor(g,A,t){super(g,A,t)}draw(g,A,t,C,I,e){return this._drawShape(g,"diamond",4,A,t,C,I,e)}distanceToBorder(g,A){return this._distanceToBorder(g,A)}};class tb extends Xv{constructor(g,A,t){super(g,A,t)}draw(g,A,t,C,I,e){return this._drawShape(g,"circle",2,A,t,C,I,e)}distanceToBorder(g){return g&&this.resize(g),this.options.size}}class Cb extends Qv{constructor(g,A,t){super(g,A,t)}resize(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(A,t)){const C=this.getDimensionsFromLabel(g,A,t);this.height=2*C.height,this.width=C.width+C.height,this.radius=.5*this.width}}draw(g,A,t,C,I,e){this.resize(g,C,I),this.left=A-.5*this.width,this.top=t-.5*this.height,this.initContextForDraw(g,e),oC(g,this.left,this.top,this.width,this.height),this.performFill(g,e),this.updateBoundingBox(A,t,g,C,I),this.labelModule.draw(g,A,t,C,I)}distanceToBorder(g,A){g&&this.resize(g);const t=.5*this.width,C=.5*this.height,I=Math.sin(A)*t,e=Math.cos(A)*C;return t*C/Math.sqrt(I*I+e*e)}}class Ib extends Qv{constructor(g,A,t){super(g,A,t),this._setMargins(t)}resize(g,A,t){this.needsRefresh(A,t)&&(this.iconSize={width:Number(this.options.icon.size),height:Number(this.options.icon.size)},this.width=this.iconSize.width+this.margin.right+this.margin.left,this.height=this.iconSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}draw(g,A,t,C,I,e){return this.resize(g,C,I),this.options.icon.size=this.options.icon.size||50,this.left=A-this.width/2,this.top=t-this.height/2,this._icon(g,A,t,C,I,e),{drawExternalLabel:()=>{if(void 0!==this.options.label){const A=5;this.labelModule.draw(g,this.left+this.iconSize.width/2+this.margin.left,t+this.height/2+A,C)}this.updateBoundingBox(A,t)}}}updateBoundingBox(g,A){if(this.boundingBox.top=A-.5*this.options.icon.size,this.boundingBox.left=g-.5*this.options.icon.size,this.boundingBox.right=g+.5*this.options.icon.size,this.boundingBox.bottom=A+.5*this.options.icon.size,void 0!==this.options.label&&this.labelModule.size.width>0){const g=5;this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+g)}}_icon(g,A,t,C,I,e){const i=Number(this.options.icon.size);void 0!==this.options.icon.code?(g.font=[null!=this.options.icon.weight?this.options.icon.weight:C?"bold":"",(null!=this.options.icon.weight&&C?5:0)+i+"px",this.options.icon.face].join(" "),g.fillStyle=this.options.icon.color||"black",g.textAlign="center",g.textBaseline="middle",this.enableShadow(g,e),g.fillText(this.options.icon.code,A,t),this.disableShadow(g,e)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}distanceToBorder(g,A){return this._distanceToBorder(g,A)}}let eb=class extends Kv{constructor(g,A,t,C,I){super(g,A,t),this.setImages(C,I)}resize(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){const g=2*this.options.size;return this.width=g,void(this.height=g)}this.needsRefresh(A,t)&&this._resizeImage()}draw(g,A,t,C,I,e){g.save(),this.switchImages(C),this.resize();let i=A,o=t;if("top-left"===this.options.shapeProperties.coordinateOrigin?(this.left=A,this.top=t,i+=this.width/2,o+=this.height/2):(this.left=A-this.width/2,this.top=t-this.height/2),!0===this.options.shapeProperties.useBorderWithImage){const A=this.options.borderWidth,t=this.options.borderWidthSelected||2*this.options.borderWidth,i=(C?t:A)/this.body.view.scale;g.lineWidth=Math.min(this.width,i),g.beginPath();let o=C?this.options.color.highlight.border:I?this.options.color.hover.border:this.options.color.border,n=C?this.options.color.highlight.background:I?this.options.color.hover.background:this.options.color.background;void 0!==e.opacity&&(o=xe(o,e.opacity),n=xe(n,e.opacity)),g.strokeStyle=o,g.fillStyle=n,g.rect(this.left-.5*g.lineWidth,this.top-.5*g.lineWidth,this.width+g.lineWidth,this.height+g.lineWidth),Wv(g).call(g),this.performStroke(g,e),g.closePath()}this._drawImageAtPosition(g,e),this._drawImageLabel(g,i,o,C,I),this.updateBoundingBox(A,t),g.restore()}updateBoundingBox(g,A){this.resize(),"top-left"===this.options.shapeProperties.coordinateOrigin?(this.left=g,this.top=A):(this.left=g-this.width/2,this.top=A-this.height/2),this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width,void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}distanceToBorder(g,A){return this._distanceToBorder(g,A)}};class ib extends Xv{constructor(g,A,t){super(g,A,t)}draw(g,A,t,C,I,e){return this._drawShape(g,"square",2,A,t,C,I,e)}distanceToBorder(g,A){return this._distanceToBorder(g,A)}}class ob extends Xv{constructor(g,A,t){super(g,A,t)}draw(g,A,t,C,I,e){return this._drawShape(g,"hexagon",4,A,t,C,I,e)}distanceToBorder(g,A){return this._distanceToBorder(g,A)}}class nb extends Xv{constructor(g,A,t){super(g,A,t)}draw(g,A,t,C,I,e){return this._drawShape(g,"star",4,A,t,C,I,e)}distanceToBorder(g,A){return this._distanceToBorder(g,A)}}class sb extends Qv{constructor(g,A,t){super(g,A,t),this._setMargins(t)}resize(g,A,t){this.needsRefresh(A,t)&&(this.textSize=this.labelModule.getTextSize(g,A,t),this.width=this.textSize.width+this.margin.right+this.margin.left,this.height=this.textSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}draw(g,A,t,C,I,e){this.resize(g,C,I),this.left=A-this.width/2,this.top=t-this.height/2,this.enableShadow(g,e),this.labelModule.draw(g,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,C,I),this.disableShadow(g,e),this.updateBoundingBox(A,t,g,C,I)}distanceToBorder(g,A){return this._distanceToBorder(g,A)}}let rb=class extends Xv{constructor(g,A,t){super(g,A,t)}draw(g,A,t,C,I,e){return this._drawShape(g,"triangle",3,A,t,C,I,e)}distanceToBorder(g,A){return this._distanceToBorder(g,A)}};class ab extends Xv{constructor(g,A,t){super(g,A,t)}draw(g,A,t,C,I,e){return this._drawShape(g,"triangleDown",3,A,t,C,I,e)}distanceToBorder(g,A){return this._distanceToBorder(g,A)}}function db(g,A){var t=uh(g);if(af){var C=af(g);A&&(C=Wp(C).call(C,function(A){return Ef(g,A).enumerable})),t.push.apply(t,C)}return t}function hb(g){for(var A=1;A<arguments.length;A++){var t,C,I=null!=arguments[A]?arguments[A]:{};A%2?jn(t=db(Object(I),!0)).call(t,function(A){Yu(g,A,I[A])}):Zf?Wf(g,Zf(I)):jn(C=db(Object(I))).call(C,function(A){Qf(g,A,Ef(I,A))})}return g}class lb{constructor(g,A,t,C,I,e){this.options=Pe(I),this.globalOptions=I,this.defaultOptions=e,this.body=A,this.edges=[],this.id=void 0,this.imagelist=t,this.grouplist=C,this.x=void 0,this.y=void 0,this.baseSize=this.options.size,this.baseFontSize=this.options.font.size,this.predefinedPosition=!1,this.selected=!1,this.hover=!1,this.labelModule=new Tv(this.body,this.options,!1),this.setOptions(g)}attachEdge(g){var A;-1===Si(A=this.edges).call(A,g)&&this.edges.push(g)}detachEdge(g){var A;const t=Si(A=this.edges).call(A,g);var C;-1!=t&&pn(C=this.edges).call(C,t,1)}setOptions(g){const A=this.options.shape;if(!g)return;if(void 0!==g.color&&(this._localColor=g.color),void 0!==g.id&&(this.id=g.id),void 0===this.id)throw new Error("Node must have an id");lb.checkMass(g,this.id),void 0!==g.x&&(null===g.x?(this.x=void 0,this.predefinedPosition=!1):(this.x=fp(g.x),this.predefinedPosition=!0)),void 0!==g.y&&(null===g.y?(this.y=void 0,this.predefinedPosition=!1):(this.y=fp(g.y),this.predefinedPosition=!0)),void 0!==g.size&&(this.baseSize=g.size),void 0!==g.value&&(g.value=Pp(g.value)),lb.parseOptions(this.options,g,!0,this.globalOptions,this.grouplist);const t=[g,this.options,this.defaultOptions];return this.chooser=Uf("node",t),this._load_images(),this.updateLabelModule(g),void 0!==g.opacity&&lb.checkOpacity(g.opacity)&&(this.options.opacity=g.opacity),this.updateShape(A),void 0!==g.hidden||void 0!==g.physics}_load_images(){if(("circularImage"===this.options.shape||"image"===this.options.shape)&&void 0===this.options.image)throw new Error("Option image must be defined for node type '"+this.options.shape+"'");if(void 0!==this.options.image){if(void 0===this.imagelist)throw new Error("Internal Error: No images provided");if("string"==typeof this.options.image)this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage,this.id);else{if(void 0===this.options.image.unselected)throw new Error("No unselected image provided");this.imageObj=this.imagelist.load(this.options.image.unselected,this.options.brokenImage,this.id),void 0!==this.options.image.selected?this.imageObjAlt=this.imagelist.load(this.options.image.selected,this.options.brokenImage,this.id):this.imageObjAlt=void 0}}}static checkOpacity(g){return 0<=g&&g<=1}static checkCoordinateOrigin(g){return void 0===g||"center"===g||"top-left"===g}static updateGroupOptions(g,A,t){var C;if(void 0===t)return;const I=g.group;if(void 0!==A&&void 0!==A.group&&I!==A.group)throw new Error("updateGroupOptions: group values in options don't match.");if(!("number"==typeof I||"string"==typeof I&&""!=I))return;const e=t.get(I);void 0!==e.opacity&&void 0===A.opacity&&(lb.checkOpacity(e.opacity)||(console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+e.opacity),e.opacity=void 0));const i=Wp(C=Af(A)).call(C,g=>null!=A[g]);i.push("font"),pe(i,g,e),g.color=Oe(g.color)}static parseOptions(g,A){let t=arguments.length>2&&void 0!==arguments[2]&&arguments[2],C=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},I=arguments.length>4?arguments[4]:void 0;if(pe(["color","fixed","shadow"],g,A,t),lb.checkMass(A),void 0!==g.opacity&&(lb.checkOpacity(g.opacity)||(console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+g.opacity),g.opacity=void 0)),void 0!==A.opacity&&(lb.checkOpacity(A.opacity)||(console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+A.opacity),A.opacity=void 0)),A.shapeProperties&&!lb.checkCoordinateOrigin(A.shapeProperties.coordinateOrigin)&&console.error("Invalid option for node coordinateOrigin, found: "+A.shapeProperties.coordinateOrigin),Me(g,A,"shadow",C),void 0!==A.color&&null!==A.color){const t=Oe(A.color);ce(g.color,t)}else!0===t&&null===A.color&&(g.color=Pe(C.color));void 0!==A.fixed&&null!==A.fixed&&("boolean"==typeof A.fixed?(g.fixed.x=A.fixed,g.fixed.y=A.fixed):(void 0!==A.fixed.x&&"boolean"==typeof A.fixed.x&&(g.fixed.x=A.fixed.x),void 0!==A.fixed.y&&"boolean"==typeof A.fixed.y&&(g.fixed.y=A.fixed.y))),!0===t&&null===A.font&&(g.font=Pe(C.font)),lb.updateGroupOptions(g,A,I),void 0!==A.scaling&&Me(g.scaling,A.scaling,"label",C.scaling)}getFormattingValues(){const g={color:this.options.color.background,opacity:this.options.opacity,borderWidth:this.options.borderWidth,borderColor:this.options.color.border,size:this.options.size,borderDashes:this.options.shapeProperties.borderDashes,borderRadius:this.options.shapeProperties.borderRadius,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y};if(this.selected||this.hover?!0===this.chooser?this.selected?(null!=this.options.borderWidthSelected?g.borderWidth=this.options.borderWidthSelected:g.borderWidth*=2,g.color=this.options.color.highlight.background,g.borderColor=this.options.color.highlight.border,g.shadow=this.options.shadow.enabled):this.hover&&(g.color=this.options.color.hover.background,g.borderColor=this.options.color.hover.border,g.shadow=this.options.shadow.enabled):"function"==typeof this.chooser&&(this.chooser(g,this.options.id,this.selected,this.hover),!1===g.shadow&&(g.shadowColor===this.options.shadow.color&&g.shadowSize===this.options.shadow.size&&g.shadowX===this.options.shadow.x&&g.shadowY===this.options.shadow.y||(g.shadow=!0))):g.shadow=this.options.shadow.enabled,void 0!==this.options.opacity){const A=this.options.opacity;g.borderColor=xe(g.borderColor,A),g.color=xe(g.color,A),g.shadowColor=xe(g.shadowColor,A)}return g}updateLabelModule(g){void 0!==this.options.label&&null!==this.options.label||(this.options.label=""),lb.updateGroupOptions(this.options,hb(hb({},g),{},{color:g&&g.color||this._localColor||void 0}),this.grouplist);const A=this.grouplist.get(this.options.group,!1),t=[g,this.options,A,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,t),void 0!==this.labelModule.baseSize&&(this.baseFontSize=this.labelModule.baseSize)}updateShape(g){if(g===this.options.shape&&this.shape)this.shape.setOptions(this.options,this.imageObj,this.imageObjAlt);else switch(this.options.shape){case"box":this.shape=new Uv(this.options,this.body,this.labelModule);break;case"circle":this.shape=new Hv(this.options,this.body,this.labelModule);break;case"circularImage":this.shape=new _v(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case"custom":this.shape=new $v(this.options,this.body,this.labelModule,this.options.ctxRenderer);break;case"database":this.shape=new gb(this.options,this.body,this.labelModule);break;case"diamond":this.shape=new Ab(this.options,this.body,this.labelModule);break;case"dot":this.shape=new tb(this.options,this.body,this.labelModule);break;case"ellipse":default:this.shape=new Cb(this.options,this.body,this.labelModule);break;case"icon":this.shape=new Ib(this.options,this.body,this.labelModule);break;case"image":this.shape=new eb(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case"square":this.shape=new ib(this.options,this.body,this.labelModule);break;case"hexagon":this.shape=new ob(this.options,this.body,this.labelModule);break;case"star":this.shape=new nb(this.options,this.body,this.labelModule);break;case"text":this.shape=new sb(this.options,this.body,this.labelModule);break;case"triangle":this.shape=new rb(this.options,this.body,this.labelModule);break;case"triangleDown":this.shape=new ab(this.options,this.body,this.labelModule)}this.needsRefresh()}select(){this.selected=!0,this.needsRefresh()}unselect(){this.selected=!1,this.needsRefresh()}needsRefresh(){this.shape.refreshNeeded=!0}getTitle(){return this.options.title}distanceToBorder(g,A){return this.shape.distanceToBorder(g,A)}isFixed(){return this.options.fixed.x&&this.options.fixed.y}isSelected(){return this.selected}getValue(){return this.options.value}getLabelSize(){return this.labelModule.size()}setValueRange(g,A,t){if(void 0!==this.options.value){const C=this.options.scaling.customScalingFunction(g,A,t,this.options.value),I=this.options.scaling.max-this.options.scaling.min;if(!0===this.options.scaling.label.enabled){const g=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+C*g}this.options.size=this.options.scaling.min+C*I}else this.options.size=this.baseSize,this.options.font.size=this.baseFontSize;this.updateLabelModule()}draw(g){const A=this.getFormattingValues();return this.shape.draw(g,this.x,this.y,this.selected,this.hover,A)||{}}updateBoundingBox(g){this.shape.updateBoundingBox(this.x,this.y,g)}resize(g){const A=this.getFormattingValues();this.shape.resize(g,this.selected,this.hover,A)}getItemsOnPoint(g){const A=[];return this.labelModule.visible()&&Kf(this.labelModule.getSize(),g)&&A.push({nodeId:this.id,labelId:0}),Kf(this.shape.boundingBox,g)&&A.push({nodeId:this.id}),A}isOverlappingWith(g){return this.shape.left<g.right&&this.shape.left+this.shape.width>g.left&&this.shape.top<g.bottom&&this.shape.top+this.shape.height>g.top}isBoundingBoxOverlappingWith(g){return this.shape.boundingBox.left<g.right&&this.shape.boundingBox.right>g.left&&this.shape.boundingBox.top<g.bottom&&this.shape.boundingBox.bottom>g.top}static checkMass(g,A){if(void 0!==g.mass&&g.mass<=0){let t="";void 0!==A&&(t=" in node id: "+A),console.error("%cNegative or zero mass disallowed"+t+", setting mass to 1.",Ue),g.mass=1}}}class cb{constructor(g,A,t,C){var I;if(this.body=g,this.images=A,this.groups=t,this.layoutEngine=C,this.body.functions.createNode=IC(I=this.create).call(I,this),this.nodesListeners={add:(g,A)=>{this.add(A.items)},update:(g,A)=>{this.update(A.items,A.data,A.oldData)},remove:(g,A)=>{this.remove(A.items)}},this.defaultOptions={borderWidth:1,borderWidthSelected:void 0,brokenImage:void 0,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},opacity:void 0,fixed:{x:!1,y:!1},font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:0,strokeColor:"#ffffff",align:"center",vadjust:0,multi:!1,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"monospace",vadjust:2}},group:void 0,hidden:!1,icon:{face:"FontAwesome",code:void 0,size:50,color:"#2B7CE9"},image:void 0,imagePadding:{top:0,right:0,bottom:0,left:0},label:void 0,labelHighlightBold:!0,level:void 0,margin:{top:5,right:5,bottom:5,left:5},mass:1,physics:!0,scaling:{min:10,max:30,label:{enabled:!1,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(g,A,t,C){if(A===g)return.5;{const t=1/(A-g);return Math.max(0,(C-g)*t)}}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},shape:"ellipse",shapeProperties:{borderDashes:!1,borderRadius:6,interpolation:!0,useImageSize:!1,useBorderWithImage:!1,coordinateOrigin:"center"},size:25,title:void 0,value:void 0,x:void 0,y:void 0},this.defaultOptions.mass<=0)throw"Internal error: mass in defaultOptions of NodesHandler may not be zero or negative";this.options=Pe(this.defaultOptions),this.bindEventListeners()}bindEventListeners(){var g,A;this.body.emitter.on("refreshNodes",IC(g=this.refresh).call(g,this)),this.body.emitter.on("refresh",IC(A=this.refresh).call(A,this)),this.body.emitter.on("destroy",()=>{ye(this.nodesListeners,(g,A)=>{this.body.data.nodes&&this.body.data.nodes.off(A,g)}),delete this.body.functions.createNode,delete this.nodesListeners.add,delete this.nodesListeners.update,delete this.nodesListeners.remove,delete this.nodesListeners})}setOptions(g){if(void 0!==g){if(lb.parseOptions(this.options,g),void 0!==g.opacity&&(Ud(g.opacity)||!Ch(g.opacity)||g.opacity<0||g.opacity>1?console.error("Invalid option for node opacity. Value must be between 0 and 1, found: "+g.opacity):this.options.opacity=g.opacity),void 0!==g.shape)for(const g in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,g)&&this.body.nodes[g].updateShape();if(void 0!==g.font||void 0!==g.widthConstraint||void 0!==g.heightConstraint)for(const g of uh(this.body.nodes))this.body.nodes[g].updateLabelModule(),this.body.nodes[g].needsRefresh();if(void 0!==g.size)for(const g in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,g)&&this.body.nodes[g].needsRefresh();void 0===g.hidden&&void 0===g.physics||this.body.emitter.emit("_dataChanged")}}setData(g){let A=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const t=this.body.data.nodes;if(Il("id",g))this.body.data.nodes=g;else if(Mn(g))this.body.data.nodes=new Al,this.body.data.nodes.add(g);else{if(g)throw new TypeError("Array or DataSet expected");this.body.data.nodes=new Al}if(t&&ye(this.nodesListeners,function(g,A){t.off(A,g)}),this.body.nodes={},this.body.data.nodes){const g=this;ye(this.nodesListeners,function(A,t){g.body.data.nodes.on(t,A)});const A=this.body.data.nodes.getIds();this.add(A,!0)}!1===A&&this.body.emitter.emit("_dataChanged")}add(g){let A,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const C=[];for(let t=0;t<g.length;t++){A=g[t];const I=this.body.data.nodes.get(A),e=this.create(I);C.push(e),this.body.nodes[A]=e}this.layoutEngine.positionInitially(C),!1===t&&this.body.emitter.emit("_dataChanged")}update(g,A,t){const C=this.body.nodes;let I=!1;for(let t=0;t<g.length;t++){const e=g[t];let i=C[e];const o=A[t];void 0!==i?i.setOptions(o)&&(I=!0):(I=!0,i=this.create(o),C[e]=i)}I||void 0===t||(I=Dh(A).call(A,function(g,A){const C=t[A];return C&&C.level!==g.level})),!0===I?this.body.emitter.emit("_dataChanged"):this.body.emitter.emit("_dataUpdated")}remove(g){const A=this.body.nodes;for(let t=0;t<g.length;t++){delete A[g[t]]}this.body.emitter.emit("_dataChanged")}create(g){return new(arguments.length>1&&void 0!==arguments[1]?arguments[1]:lb)(g,this.body,this.images,this.groups,this.options,this.defaultOptions)}refresh(){let g=arguments.length>0&&void 0!==arguments[0]&&arguments[0];ye(this.body.nodes,(A,t)=>{const C=this.body.data.nodes.get(t);void 0!==C&&(!0===g&&A.setOptions({x:null,y:null}),A.setOptions({fixed:!1}),A.setOptions(C))})}getPositions(g){const A={};if(void 0!==g){if(!0===Mn(g)){for(let t=0;t<g.length;t++)if(void 0!==this.body.nodes[g[t]]){const C=this.body.nodes[g[t]];A[g[t]]={x:Math.round(C.x),y:Math.round(C.y)}}}else if(void 0!==this.body.nodes[g]){const t=this.body.nodes[g];A[g]={x:Math.round(t.x),y:Math.round(t.y)}}}else for(let g=0;g<this.body.nodeIndices.length;g++){const t=this.body.nodes[this.body.nodeIndices[g]];A[this.body.nodeIndices[g]]={x:Math.round(t.x),y:Math.round(t.y)}}return A}getPosition(g){if(null==g)throw new TypeError("No id was specified for getPosition method.");if(null==this.body.nodes[g])throw new ReferenceError("NodeId provided for getPosition does not exist. Provided: ".concat(g));return{x:Math.round(this.body.nodes[g].x),y:Math.round(this.body.nodes[g].y)}}storePositions(){const g=[],A=this.body.data.nodes.getDataSet();for(const t of A.get()){const A=t.id,C=this.body.nodes[A],I=Math.round(C.x),e=Math.round(C.y);t.x===I&&t.y===e||g.push({id:A,x:I,y:e})}A.update(g)}getBoundingBox(g){if(void 0!==this.body.nodes[g])return this.body.nodes[g].shape.boundingBox}getConnectedNodes(g,A){const t=[];if(void 0!==this.body.nodes[g]){const C=this.body.nodes[g],I={};for(let g=0;g<C.edges.length;g++){const e=C.edges[g];"to"!==A&&e.toId==C.id?void 0===I[e.fromId]&&(t.push(e.fromId),I[e.fromId]=!0):"from"!==A&&e.fromId==C.id&&void 0===I[e.toId]&&(t.push(e.toId),I[e.toId]=!0)}}return t}getConnectedEdges(g){const A=[];if(void 0!==this.body.nodes[g]){const t=this.body.nodes[g];for(let g=0;g<t.edges.length;g++)A.push(t.edges[g].id)}else console.error("NodeId provided for getConnectedEdges does not exist. Provided: ",g);return A}moveNode(g,A,t){void 0!==this.body.nodes[g]?(this.body.nodes[g].x=Number(A),this.body.nodes[g].y=Number(t),Yh(()=>{this.body.emitter.emit("startSimulation")},0)):console.error("Node id supplied to moveNode does not exist. Provided: ",g)}}var ub,pb,fb,vb,bb,mb,yb,wb,xb,Eb,Ob,Tb,Db,Nb={};function kb(){if(pb)return ub;pb=1;var g=at(),A=lo(),t=xg(),C=RangeError;return ub=function(I){var e=A(t(this)),i="",o=g(I);if(o<0||o===1/0)throw new C("Wrong number of repetitions");for(;o>0;(o>>>=1)&&(e+=e))1&o&&(i+=e);return i}}function Rb(){if(vb)return fb;vb=1;var g=E(),A=ht(),t=lo(),C=kb(),I=xg(),e=g(C),i=g("".slice),o=Math.ceil,n=function(g){return function(C,n,s){var r,a,d=t(I(C)),h=A(n),l=d.length,c=void 0===s?" ":t(s);return h<=l||""===c?d:((a=e(c,o((r=h-l)/c.length))).length>r&&(a=i(a,0,r)),g?d+a:a+d)}};return fb={start:n(!1),end:n(!0)}}function Pb(){if(mb)return bb;mb=1;var g=E(),A=y(),t=Rb().start,C=RangeError,I=isFinite,e=Math.abs,i=Date.prototype,o=i.toISOString,n=g(i.getTime),s=g(i.getUTCDate),r=g(i.getUTCFullYear),a=g(i.getUTCHours),d=g(i.getUTCMilliseconds),h=g(i.getUTCMinutes),l=g(i.getUTCMonth),c=g(i.getUTCSeconds);return bb=A(function(){return"0385-07-25T07:06:39.999Z"!==o.call(new Date(-50000000000001))})||!A(function(){o.call(new Date(NaN))})?function(){if(!I(n(this)))throw new C("Invalid time value");var g=this,A=r(g),i=d(g),o=A<0?"-":A>9999?"+":"";return o+t(e(A),o?6:4,0)+"-"+t(l(g)+1,2,0)+"-"+t(s(g),2,0)+"T"+t(a(g),2,0)+":"+t(h(g),2,0)+":"+t(c(g),2,0)+"."+t(i,3,0)+"Z"}:o}function Mb(){if(xb)return wb;xb=1,function(){if(yb)return Nb;yb=1;var g=st(),A=B(),t=fA(),C=yA(),I=Pb(),e=O();g({target:"Date",proto:!0,forced:y()(function(){return null!==new Date(NaN).toJSON()||1!==A(Date.prototype.toJSON,{toISOString:function(){return 1}})})},{toJSON:function(g){var i=t(this),o=C(i,"number");return"number"!=typeof o||isFinite(o)?"toISOString"in i||"Date"!==e(i)?i.toISOString():A(I,i):null}})}(),_l();var g=Tg(),A=x();return g.JSON||(g.JSON={stringify:JSON.stringify}),wb=function(t,C,I){return A(g.JSON.stringify,null,arguments)},wb}function zb(){return Ob?Eb:(Ob=1,Eb=Mb())}var Bb,Zb,Sb,Fb,Gb,jb,Lb,Vb=C(Db?Tb:(Db=1,Tb=zb())),Yb={};function Wb(){return Sb?Zb:(Sb=1,function(){if(Bb)return Yb;Bb=1;var g=st(),A=Math.hypot,t=Math.abs,C=Math.sqrt;g({target:"Math",stat:!0,arity:2,forced:!!A&&A(1/0,NaN)!==1/0},{hypot:function(g,A){for(var I,e,i=0,o=0,n=arguments.length,s=0;o<n;)s<(I=t(arguments[o++]))?(i=i*(e=s/I)*e+1,s=I):i+=I>0?(e=I/s)*e:I;return s===1/0?1/0:s*C(i)}})}(),Zb=Tg().Math.hypot)}function Qb(){return Gb?Fb:(Gb=1,Fb=Wb())}var Ub=C(Lb?jb:(Lb=1,jb=Qb()));class Kb{static transform(g,A){Mn(g)||(g=[g]);const t=A.point.x,C=A.point.y,I=A.angle,e=A.length;for(let A=0;A<g.length;++A){const i=g[A],o=i.x*Math.cos(I)-i.y*Math.sin(I),n=i.x*Math.sin(I)+i.y*Math.cos(I);i.x=t+e*o,i.y=C+e*n}}static drawPath(g,A){g.beginPath(),g.moveTo(A[0].x,A[0].y);for(let t=1;t<A.length;++t)g.lineTo(A[t].x,A[t].y);g.closePath()}}let Hb=class extends Kb{static draw(g,A){if(A.image){g.save(),g.translate(A.point.x,A.point.y),g.rotate(Math.PI/2+A.angle);const t=null!=A.imageWidth?A.imageWidth:A.image.width,C=null!=A.imageHeight?A.imageHeight:A.image.height;A.image.drawImageAtPosition(g,1,-t/2,0,t,C),g.restore()}return!1}};class _b extends Kb{static draw(g,A){const t=[{x:0,y:0},{x:-1,y:.3},{x:-.9,y:0},{x:-1,y:-.3}];return Kb.transform(t,A),Kb.drawPath(g,t),!0}}class Xb{static draw(g,A){const t=[{x:-1,y:0},{x:0,y:.3},{x:-.4,y:0},{x:0,y:-.3}];return Kb.transform(t,A),Kb.drawPath(g,t),!0}}class Jb{static draw(g,A){const t={x:-.4,y:0};Kb.transform(t,A),g.strokeStyle=g.fillStyle,g.fillStyle="rgba(0, 0, 0, 0)";const C=Math.PI,I=A.angle-C/2,e=A.angle+C/2;return g.beginPath(),g.arc(t.x,t.y,.4*A.length,I,e,!1),g.stroke(),!0}}class qb{static draw(g,A){const t={x:-.3,y:0};Kb.transform(t,A),g.strokeStyle=g.fillStyle,g.fillStyle="rgba(0, 0, 0, 0)";const C=Math.PI,I=A.angle+C/2,e=A.angle+3*C/2;return g.beginPath(),g.arc(t.x,t.y,.4*A.length,I,e,!1),g.stroke(),!0}}class $b{static draw(g,A){const t=[{x:.02,y:0},{x:-1,y:.3},{x:-1,y:-.3}];return Kb.transform(t,A),Kb.drawPath(g,t),!0}}class gm{static draw(g,A){const t=[{x:0,y:.3},{x:0,y:-.3},{x:-1,y:0}];return Kb.transform(t,A),Kb.drawPath(g,t),!0}}class Am{static draw(g,A){const t={x:-.4,y:0};return Kb.transform(t,A),eC(g,t.x,t.y,.4*A.length),!0}}class tm{static draw(g,A){const t=[{x:0,y:.5},{x:0,y:-.5},{x:-.15,y:-.5},{x:-.15,y:.5}];return Kb.transform(t,A),Kb.drawPath(g,t),!0}}class Cm{static draw(g,A){const t=[{x:0,y:.3},{x:0,y:-.3},{x:-.6,y:-.3},{x:-.6,y:.3}];return Kb.transform(t,A),Kb.drawPath(g,t),!0}}class Im{static draw(g,A){const t=[{x:0,y:0},{x:-.5,y:-.3},{x:-1,y:0},{x:-.5,y:.3}];return Kb.transform(t,A),Kb.drawPath(g,t),!0}}class em{static draw(g,A){const t=[{x:-1,y:.3},{x:-.5,y:0},{x:-1,y:-.3},{x:0,y:0}];return Kb.transform(t,A),Kb.drawPath(g,t),!0}}class im{static draw(g,A){let t;switch(A.type&&(t=A.type.toLowerCase()),t){case"image":return Hb.draw(g,A);case"circle":return Am.draw(g,A);case"box":return Cm.draw(g,A);case"crow":return Xb.draw(g,A);case"curve":return Jb.draw(g,A);case"diamond":return Im.draw(g,A);case"inv_curve":return qb.draw(g,A);case"triangle":return $b.draw(g,A);case"inv_triangle":return gm.draw(g,A);case"bar":return tm.draw(g,A);case"vee":return em.draw(g,A);default:return _b.draw(g,A)}}}function om(g,A){var t=uh(g);if(af){var C=af(g);A&&(C=Wp(C).call(C,function(A){return Ef(g,A).enumerable})),t.push.apply(t,C)}return t}function nm(g){for(var A=1;A<arguments.length;A++){var t,C,I=null!=arguments[A]?arguments[A]:{};A%2?jn(t=om(Object(I),!0)).call(t,function(A){Yu(g,A,I[A])}):Zf?Wf(g,Zf(I)):jn(C=om(Object(I))).call(C,function(A){Qf(g,A,Ef(I,A))})}return g}class sm{constructor(g,A,t){Yu(this,"color",{}),Yu(this,"colorDirty",!0),Yu(this,"hoverWidth",1.5),Yu(this,"selectionWidth",2),this._body=A,this._labelModule=t,this.setOptions(g),this.fromPoint=this.from,this.toPoint=this.to}connect(){this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to]}cleanup(){return!1}setOptions(g){this.options=g,this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to],this.id=this.options.id}drawLine(g,A,t,C){let I=arguments.length>4&&void 0!==arguments[4]?arguments[4]:this.getViaNode();g.strokeStyle=this.getColor(g,A),g.lineWidth=A.width,!1!==A.dashes?this._drawDashedLine(g,A,I):this._drawLine(g,A,I)}_drawLine(g,A,t,C,I){if(this.from!=this.to)this._line(g,A,t,C,I);else{const[t,C,I]=this._getCircleData(g);this._circle(g,A,t,C,I)}}_drawDashedLine(g,A,t,C,I){g.lineCap="round";const e=Mn(A.dashes)?A.dashes:[5,5];if(void 0!==g.setLineDash){if(g.save(),g.setLineDash(e),g.lineDashOffset=0,this.from!=this.to)this._line(g,A,t);else{const[t,C,I]=this._getCircleData(g);this._circle(g,A,t,C,I)}g.setLineDash([0]),g.lineDashOffset=0,g.restore()}else{if(this.from!=this.to)sC(g,this.from.x,this.from.y,this.to.x,this.to.y,e);else{const[t,C,I]=this._getCircleData(g);this._circle(g,A,t,C,I)}this.enableShadow(g,A),g.stroke(),this.disableShadow(g,A)}}findBorderPosition(g,A,t){return this.from!=this.to?this._findBorderPosition(g,A,t):this._findBorderPositionCircle(g,A,t)}findBorderPositions(g){if(this.from!=this.to)return{from:this._findBorderPosition(this.from,g),to:this._findBorderPosition(this.to,g)};{var A;const[t,C]=pv(A=this._getCircleData(g)).call(A,0,2);return{from:this._findBorderPositionCircle(this.from,g,{x:t,y:C,low:.25,high:.6,direction:-1}),to:this._findBorderPositionCircle(this.from,g,{x:t,y:C,low:.6,high:.8,direction:1})}}}_getCircleData(g){const A=this.options.selfReference.size;void 0!==g&&void 0===this.from.shape.width&&this.from.shape.resize(g);const t=_f(g,this.options.selfReference.angle,A,this.from);return[t.x,t.y,A]}_pointOnCircle(g,A,t,C){const I=2*C*Math.PI;return{x:g+t*Math.cos(I),y:A-t*Math.sin(I)}}_findBorderPositionCircle(g,A,t){const C=t.x,I=t.y;let e=t.low,i=t.high;const o=t.direction,n=this.options.selfReference.size;let s,r=.5*(e+i),a=0;!0===this.options.arrowStrikethrough&&(-1===o?a=this.options.endPointOffset.from:1===o&&(a=this.options.endPointOffset.to));let d=0;do{r=.5*(e+i),s=this._pointOnCircle(C,I,n,r);const t=Math.atan2(g.y-s.y,g.x-s.x),h=g.distanceToBorder(A,t)+a-Math.sqrt(Math.pow(s.x-g.x,2)+Math.pow(s.y-g.y,2));if(Math.abs(h)<.05)break;h>0?o>0?e=r:i=r:o>0?i=r:e=r,++d}while(e<=i&&d<10);return nm(nm({},s),{},{t:r})}getLineWidth(g,A){return!0===g?Math.max(this.selectionWidth,.3/this._body.view.scale):!0===A?Math.max(this.hoverWidth,.3/this._body.view.scale):Math.max(this.options.width,.3/this._body.view.scale)}getColor(g,A){if(!1!==A.inheritsColor){if("both"===A.inheritsColor&&this.from.id!==this.to.id){const t=g.createLinearGradient(this.from.x,this.from.y,this.to.x,this.to.y);let C=this.from.options.color.highlight.border,I=this.to.options.color.highlight.border;return!1===this.from.selected&&!1===this.to.selected?(C=xe(this.from.options.color.border,A.opacity),I=xe(this.to.options.color.border,A.opacity)):!0===this.from.selected&&!1===this.to.selected?I=this.to.options.color.border:!1===this.from.selected&&!0===this.to.selected&&(C=this.from.options.color.border),t.addColorStop(0,C),t.addColorStop(1,I),t}return"to"===A.inheritsColor?xe(this.to.options.color.border,A.opacity):xe(this.from.options.color.border,A.opacity)}return xe(A.color,A.opacity)}_circle(g,A,t,C,I){this.enableShadow(g,A);let e=0,i=2*Math.PI;if(!this.options.selfReference.renderBehindTheNode){const A=this.options.selfReference.angle,I=this.options.selfReference.angle+Math.PI,o=this._findBorderPositionCircle(this.from,g,{x:t,y:C,low:A,high:I,direction:-1}),n=this._findBorderPositionCircle(this.from,g,{x:t,y:C,low:A,high:I,direction:1});e=Math.atan2(o.y-C,o.x-t),i=Math.atan2(n.y-C,n.x-t)}g.beginPath(),g.arc(t,C,I,e,i,!1),g.stroke(),this.disableShadow(g,A)}getDistanceToEdge(g,A,t,C,I,e){if(this.from!=this.to)return this._getDistanceToEdge(g,A,t,C,I,e);{const[g,A,t]=this._getCircleData(void 0),C=g-I,i=A-e;return Math.abs(Math.sqrt(C*C+i*i)-t)}}_getDistanceToLine(g,A,t,C,I,e){const i=t-g,o=C-A;let n=((I-g)*i+(e-A)*o)/(i*i+o*o);n>1?n=1:n<0&&(n=0);const s=g+n*i-I,r=A+n*o-e;return Math.sqrt(s*s+r*r)}getArrowData(g,A,t,C,I,e){let i,o,n,s,r,a,d;const h=e.width;"from"===A?(n=this.from,s=this.to,r=e.fromArrowScale<0,a=Math.abs(e.fromArrowScale),d=e.fromArrowType):"to"===A?(n=this.to,s=this.from,r=e.toArrowScale<0,a=Math.abs(e.toArrowScale),d=e.toArrowType):(n=this.to,s=this.from,r=e.middleArrowScale<0,a=Math.abs(e.middleArrowScale),d=e.middleArrowType);const l=15*a+3*h;if(n!=s){const C=l/Ub(n.x-s.x,n.y-s.y);if("middle"!==A)if(!0===this.options.smooth.enabled){const I=this._findBorderPosition(n,g,{via:t}),e=this.getPoint(I.t+C*("from"===A?1:-1),t);i=Math.atan2(I.y-e.y,I.x-e.x),o=I}else i=Math.atan2(n.y-s.y,n.x-s.x),o=this._findBorderPosition(n,g);else{const g=(r?-C:C)/2,A=this.getPoint(.5+g,t),I=this.getPoint(.5-g,t);i=Math.atan2(A.y-I.y,A.x-I.x),o=this.getPoint(.5,t)}}else{const[t,C,I]=this._getCircleData(g);if("from"===A){const A=this.options.selfReference.angle,I=this.options.selfReference.angle+Math.PI,e=this._findBorderPositionCircle(this.from,g,{x:t,y:C,low:A,high:I,direction:-1});i=-2*e.t*Math.PI+1.5*Math.PI+.1*Math.PI,o=e}else if("to"===A){const A=this.options.selfReference.angle,I=this.options.selfReference.angle+Math.PI,e=this._findBorderPositionCircle(this.from,g,{x:t,y:C,low:A,high:I,direction:1});i=-2*e.t*Math.PI+1.5*Math.PI-1.1*Math.PI,o=e}else{const g=this.options.selfReference.angle/(2*Math.PI);o=this._pointOnCircle(t,C,I,g),i=-2*g*Math.PI+1.5*Math.PI+.1*Math.PI}}return{point:o,core:{x:o.x-.9*l*Math.cos(i),y:o.y-.9*l*Math.sin(i)},angle:i,length:l,type:d}}drawArrowHead(g,A,t,C,I){g.strokeStyle=this.getColor(g,A),g.fillStyle=g.strokeStyle,g.lineWidth=A.width;im.draw(g,I)&&(this.enableShadow(g,A),Wv(g).call(g),this.disableShadow(g,A))}enableShadow(g,A){!0===A.shadow&&(g.shadowColor=A.shadowColor,g.shadowBlur=A.shadowSize,g.shadowOffsetX=A.shadowX,g.shadowOffsetY=A.shadowY)}disableShadow(g,A){!0===A.shadow&&(g.shadowColor="rgba(0,0,0,0)",g.shadowBlur=0,g.shadowOffsetX=0,g.shadowOffsetY=0)}drawBackground(g,A){if(!1!==A.background){const t={strokeStyle:g.strokeStyle,lineWidth:g.lineWidth,dashes:g.dashes};g.strokeStyle=A.backgroundColor,g.lineWidth=A.backgroundSize,this.setStrokeDashed(g,A.backgroundDashes),g.stroke(),g.strokeStyle=t.strokeStyle,g.lineWidth=t.lineWidth,g.dashes=t.dashes,this.setStrokeDashed(g,A.dashes)}}setStrokeDashed(g,A){if(!1!==A)if(void 0!==g.setLineDash){const t=Mn(A)?A:[5,5];g.setLineDash(t)}else console.warn("setLineDash is not supported in this browser. The dashed stroke cannot be used.");else void 0!==g.setLineDash?g.setLineDash([]):console.warn("setLineDash is not supported in this browser. The dashed stroke cannot be used.")}}function rm(g,A){var t=uh(g);if(af){var C=af(g);A&&(C=Wp(C).call(C,function(A){return Ef(g,A).enumerable})),t.push.apply(t,C)}return t}function am(g){for(var A=1;A<arguments.length;A++){var t,C,I=null!=arguments[A]?arguments[A]:{};A%2?jn(t=rm(Object(I),!0)).call(t,function(A){Yu(g,A,I[A])}):Zf?Wf(g,Zf(I)):jn(C=rm(Object(I))).call(C,function(A){Qf(g,A,Ef(I,A))})}return g}class dm extends sm{constructor(g,A,t){super(g,A,t)}_findBorderPositionBezier(g,A){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this._getViaCoordinates();let C,I,e=!1,i=1,o=0,n=this.to,s=this.options.endPointOffset?this.options.endPointOffset.to:0;g.id===this.from.id&&(n=this.from,e=!0,s=this.options.endPointOffset?this.options.endPointOffset.from:0),!1===this.options.arrowStrikethrough&&(s=0);let r=0;do{I=.5*(o+i),C=this.getPoint(I,t);const g=Math.atan2(n.y-C.y,n.x-C.x),a=n.distanceToBorder(A,g)+s-Math.sqrt(Math.pow(C.x-n.x,2)+Math.pow(C.y-n.y,2));if(Math.abs(a)<.2)break;a<0?!1===e?o=I:i=I:!1===e?i=I:o=I,++r}while(o<=i&&r<10);return am(am({},C),{},{t:I})}_getDistanceToBezierEdge(g,A,t,C,I,e,i){let o,n,s,r,a,d=1e9,h=g,l=A;for(n=1;n<10;n++)s=.1*n,r=Math.pow(1-s,2)*g+2*s*(1-s)*i.x+Math.pow(s,2)*t,a=Math.pow(1-s,2)*A+2*s*(1-s)*i.y+Math.pow(s,2)*C,n>0&&(o=this._getDistanceToLine(h,l,r,a,I,e),d=o<d?o:d),h=r,l=a;return d}_bezierCurve(g,A,t,C){g.beginPath(),g.moveTo(this.fromPoint.x,this.fromPoint.y),null!=t&&null!=t.x?null!=C&&null!=C.x?g.bezierCurveTo(t.x,t.y,C.x,C.y,this.toPoint.x,this.toPoint.y):g.quadraticCurveTo(t.x,t.y,this.toPoint.x,this.toPoint.y):g.lineTo(this.toPoint.x,this.toPoint.y),this.drawBackground(g,A),this.enableShadow(g,A),g.stroke(),this.disableShadow(g,A)}getViaNode(){return this._getViaCoordinates()}}class hm extends dm{constructor(g,A,t){super(g,A,t),Yu(this,"via",this.via),this._boundFunction=()=>{this.positionBezierNode()},this._body.emitter.on("_repositionBezierNodes",this._boundFunction)}setOptions(g){super.setOptions(g);let A=!1;this.options.physics!==g.physics&&(A=!0),this.options=g,this.id=this.options.id,this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to],this.setupSupportNode(),this.connect(),!0===A&&(this.via.setOptions({physics:this.options.physics}),this.positionBezierNode())}connect(){this.from=this._body.nodes[this.options.from],this.to=this._body.nodes[this.options.to],void 0===this.from||void 0===this.to||!1===this.options.physics||this.from.id===this.to.id?this.via.setOptions({physics:!1}):this.via.setOptions({physics:!0})}cleanup(){return this._body.emitter.off("_repositionBezierNodes",this._boundFunction),void 0!==this.via&&(delete this._body.nodes[this.via.id],this.via=void 0,!0)}setupSupportNode(){if(void 0===this.via){const g="edgeId:"+this.id,A=this._body.functions.createNode({id:g,shape:"circle",physics:!0,hidden:!0});this._body.nodes[g]=A,this.via=A,this.via.parentEdgeId=this.id,this.positionBezierNode()}}positionBezierNode(){void 0!==this.via&&void 0!==this.from&&void 0!==this.to?(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y)):void 0!==this.via&&(this.via.x=0,this.via.y=0)}_line(g,A,t){this._bezierCurve(g,A,t)}_getViaCoordinates(){return this.via}getViaNode(){return this.via}getPoint(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.via;if(this.from===this.to){const[A,t,C]=this._getCircleData(),I=2*Math.PI*(1-g);return{x:A+C*Math.sin(I),y:t+C-C*(1-Math.cos(I))}}return{x:Math.pow(1-g,2)*this.fromPoint.x+2*g*(1-g)*A.x+Math.pow(g,2)*this.toPoint.x,y:Math.pow(1-g,2)*this.fromPoint.y+2*g*(1-g)*A.y+Math.pow(g,2)*this.toPoint.y}}_findBorderPosition(g,A){return this._findBorderPositionBezier(g,A,this.via)}_getDistanceToEdge(g,A,t,C,I,e){return this._getDistanceToBezierEdge(g,A,t,C,I,e,this.via)}}class lm extends dm{constructor(g,A,t){super(g,A,t)}_line(g,A,t){this._bezierCurve(g,A,t)}getViaNode(){return this._getViaCoordinates()}_getViaCoordinates(){const g=this.options.smooth.roundness,A=this.options.smooth.type;let t=Math.abs(this.from.x-this.to.x),C=Math.abs(this.from.y-this.to.y);if("discrete"===A||"diagonalCross"===A){let I,e;I=e=t<=C?g*C:g*t,this.from.x>this.to.x&&(I=-I),this.from.y>=this.to.y&&(e=-e);let i=this.from.x+I,o=this.from.y+e;return"discrete"===A&&(t<=C?i=t<g*C?this.from.x:i:o=C<g*t?this.from.y:o),{x:i,y:o}}if("straightCross"===A){let A=(1-g)*t,I=(1-g)*C;return t<=C?(A=0,this.from.y<this.to.y&&(I=-I)):(this.from.x<this.to.x&&(A=-A),I=0),{x:this.to.x+A,y:this.to.y+I}}if("horizontal"===A){let A=(1-g)*t;return this.from.x<this.to.x&&(A=-A),{x:this.to.x+A,y:this.from.y}}if("vertical"===A){let A=(1-g)*C;return this.from.y<this.to.y&&(A=-A),{x:this.from.x,y:this.to.y+A}}if("curvedCW"===A){t=this.to.x-this.from.x,C=this.from.y-this.to.y;const A=Math.sqrt(t*t+C*C),I=Math.PI,e=(Math.atan2(C,t)+(.5*g+.5)*I)%(2*I);return{x:this.from.x+(.5*g+.5)*A*Math.sin(e),y:this.from.y+(.5*g+.5)*A*Math.cos(e)}}if("curvedCCW"===A){t=this.to.x-this.from.x,C=this.from.y-this.to.y;const A=Math.sqrt(t*t+C*C),I=Math.PI,e=(Math.atan2(C,t)+(.5*-g+.5)*I)%(2*I);return{x:this.from.x+(.5*g+.5)*A*Math.sin(e),y:this.from.y+(.5*g+.5)*A*Math.cos(e)}}{let A,I;A=I=t<=C?g*C:g*t,this.from.x>this.to.x&&(A=-A),this.from.y>=this.to.y&&(I=-I);let e=this.from.x+A,i=this.from.y+I;return t<=C?e=this.from.x<=this.to.x?this.to.x<e?this.to.x:e:this.to.x>e?this.to.x:e:i=this.from.y>=this.to.y?this.to.y>i?this.to.y:i:this.to.y<i?this.to.y:i,{x:e,y:i}}}_findBorderPosition(g,A){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this._findBorderPositionBezier(g,A,t.via)}_getDistanceToEdge(g,A,t,C,I,e){let i=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates();return this._getDistanceToBezierEdge(g,A,t,C,I,e,i)}getPoint(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates();const t=g;return{x:Math.pow(1-t,2)*this.fromPoint.x+2*t*(1-t)*A.x+Math.pow(t,2)*this.toPoint.x,y:Math.pow(1-t,2)*this.fromPoint.y+2*t*(1-t)*A.y+Math.pow(t,2)*this.toPoint.y}}}class cm extends dm{constructor(g,A,t){super(g,A,t)}_getDistanceToBezierEdge2(g,A,t,C,I,e,i,o){let n=1e9,s=g,r=A;const a=[0,0,0,0];for(let d=1;d<10;d++){const h=.1*d;a[0]=Math.pow(1-h,3),a[1]=3*h*Math.pow(1-h,2),a[2]=3*Math.pow(h,2)*(1-h),a[3]=Math.pow(h,3);const l=a[0]*g+a[1]*i.x+a[2]*o.x+a[3]*t,c=a[0]*A+a[1]*i.y+a[2]*o.y+a[3]*C;if(d>0){const g=this._getDistanceToLine(s,r,l,c,I,e);n=g<n?g:n}s=l,r=c}return n}}class um extends cm{constructor(g,A,t){super(g,A,t)}_line(g,A,t){const C=t[0],I=t[1];this._bezierCurve(g,A,C,I)}_getViaCoordinates(){const g=this.from.x-this.to.x,A=this.from.y-this.to.y;let t,C,I,e;const i=this.options.smooth.roundness;return(Math.abs(g)>Math.abs(A)||!0===this.options.smooth.forceDirection||"horizontal"===this.options.smooth.forceDirection)&&"vertical"!==this.options.smooth.forceDirection?(C=this.from.y,e=this.to.y,t=this.from.x-i*g,I=this.to.x+i*g):(C=this.from.y-i*A,e=this.to.y+i*A,t=this.from.x,I=this.to.x),[{x:t,y:C},{x:I,y:e}]}getViaNode(){return this._getViaCoordinates()}_findBorderPosition(g,A){return this._findBorderPositionBezier(g,A)}_getDistanceToEdge(g,A,t,C,I,e){let[i,o]=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates();return this._getDistanceToBezierEdge2(g,A,t,C,I,e,i,o)}getPoint(g){let[A,t]=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates();const C=g,I=[Math.pow(1-C,3),3*C*Math.pow(1-C,2),3*Math.pow(C,2)*(1-C),Math.pow(C,3)];return{x:I[0]*this.fromPoint.x+I[1]*A.x+I[2]*t.x+I[3]*this.toPoint.x,y:I[0]*this.fromPoint.y+I[1]*A.y+I[2]*t.y+I[3]*this.toPoint.y}}}class pm extends sm{constructor(g,A,t){super(g,A,t)}_line(g,A){g.beginPath(),g.moveTo(this.fromPoint.x,this.fromPoint.y),g.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(g,A),g.stroke(),this.disableShadow(g,A)}getViaNode(){}getPoint(g){return{x:(1-g)*this.fromPoint.x+g*this.toPoint.x,y:(1-g)*this.fromPoint.y+g*this.toPoint.y}}_findBorderPosition(g,A){let t=this.to,C=this.from;g.id===this.from.id&&(t=this.from,C=this.to);const I=Math.atan2(t.y-C.y,t.x-C.x),e=t.x-C.x,i=t.y-C.y,o=Math.sqrt(e*e+i*i),n=(o-g.distanceToBorder(A,I))/o;return{x:(1-n)*C.x+n*t.x,y:(1-n)*C.y+n*t.y,t:0}}_getDistanceToEdge(g,A,t,C,I,e){return this._getDistanceToLine(g,A,t,C,I,e)}}class fm{constructor(g,A,t,C,I){if(void 0===A)throw new Error("No body provided");this.options=Pe(C),this.globalOptions=C,this.defaultOptions=I,this.body=A,this.imagelist=t,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.selected=!1,this.hover=!1,this.labelDirty=!0,this.baseWidth=this.options.width,this.baseFontSize=this.options.font.size,this.from=void 0,this.to=void 0,this.edgeType=void 0,this.connected=!1,this.labelModule=new Tv(this.body,this.options,!0),this.setOptions(g)}setOptions(g){if(!g)return;let A=void 0!==g.physics&&this.options.physics!==g.physics||void 0!==g.hidden&&(this.options.hidden||!1)!==(g.hidden||!1)||void 0!==g.from&&this.options.from!==g.from||void 0!==g.to&&this.options.to!==g.to;fm.parseOptions(this.options,g,!0,this.globalOptions),void 0!==g.id&&(this.id=g.id),void 0!==g.from&&(this.fromId=g.from),void 0!==g.to&&(this.toId=g.to),void 0!==g.title&&(this.title=g.title),void 0!==g.value&&(g.value=Pp(g.value));const t=[g,this.options,this.defaultOptions];return this.chooser=Uf("edge",t),this.updateLabelModule(g),A=this.updateEdgeType()||A,this._setInteractionWidths(),this.connect(),A}static parseOptions(g,A){let t=arguments.length>2&&void 0!==arguments[2]&&arguments[2],C=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},I=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(ue(["endPointOffset","arrowStrikethrough","id","from","hidden","hoverWidth","labelHighlightBold","length","line","opacity","physics","scaling","selectionWidth","selfReferenceSize","selfReference","to","title","value","width","font","chosen","widthConstraint"],g,A,t),void 0!==A.endPointOffset&&void 0!==A.endPointOffset.from&&(Ch(A.endPointOffset.from)?g.endPointOffset.from=A.endPointOffset.from:(g.endPointOffset.from=void 0!==C.endPointOffset.from?C.endPointOffset.from:0,console.error("endPointOffset.from is not a valid number"))),void 0!==A.endPointOffset&&void 0!==A.endPointOffset.to&&(Ch(A.endPointOffset.to)?g.endPointOffset.to=A.endPointOffset.to:(g.endPointOffset.to=void 0!==C.endPointOffset.to?C.endPointOffset.to:0,console.error("endPointOffset.to is not a valid number"))),Hf(A.label)?g.label=A.label:Hf(g.label)||(g.label=void 0),Me(g,A,"smooth",C),Me(g,A,"shadow",C),Me(g,A,"background",C),void 0!==A.dashes&&null!==A.dashes?g.dashes=A.dashes:!0===t&&null===A.dashes&&(g.dashes=Oi(C.dashes)),void 0!==A.scaling&&null!==A.scaling?(void 0!==A.scaling.min&&(g.scaling.min=A.scaling.min),void 0!==A.scaling.max&&(g.scaling.max=A.scaling.max),Me(g.scaling,A.scaling,"label",C.scaling)):!0===t&&null===A.scaling&&(g.scaling=Oi(C.scaling)),void 0!==A.arrows&&null!==A.arrows)if("string"==typeof A.arrows){const t=A.arrows.toLowerCase();g.arrows.to.enabled=-1!=Si(t).call(t,"to"),g.arrows.middle.enabled=-1!=Si(t).call(t,"middle"),g.arrows.from.enabled=-1!=Si(t).call(t,"from")}else{if("object"!=typeof A.arrows)throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+Vb(A.arrows));Me(g.arrows,A.arrows,"to",C.arrows),Me(g.arrows,A.arrows,"middle",C.arrows),Me(g.arrows,A.arrows,"from",C.arrows)}else!0===t&&null===A.arrows&&(g.arrows=Oi(C.arrows));if(void 0!==A.color&&null!==A.color){const e=de(A.color)?{color:A.color,highlight:A.color,hover:A.color,inherit:!1,opacity:1}:A.color,i=g.color;if(I)fe(i,C.color,!1,t);else for(const g in i)Object.prototype.hasOwnProperty.call(i,g)&&delete i[g];if(de(i))i.color=i,i.highlight=i,i.hover=i,i.inherit=!1,void 0===e.opacity&&(i.opacity=1);else{let g=!1;void 0!==e.color&&(i.color=e.color,g=!0),void 0!==e.highlight&&(i.highlight=e.highlight,g=!0),void 0!==e.hover&&(i.hover=e.hover,g=!0),void 0!==e.inherit&&(i.inherit=e.inherit),void 0!==e.opacity&&(i.opacity=Math.min(1,Math.max(0,e.opacity))),!0===g?i.inherit=!1:void 0===i.inherit&&(i.inherit="from")}}else!0===t&&null===A.color&&(g.color=Pe(C.color));!0===t&&null===A.font&&(g.font=Pe(C.font)),Object.prototype.hasOwnProperty.call(A,"selfReferenceSize")&&(console.warn("The selfReferenceSize property has been deprecated. Please use selfReference property instead. The selfReference can be set like thise selfReference:{size:30, angle:Math.PI / 4}"),g.selfReference.size=A.selfReferenceSize)}getFormattingValues(){const g=!0===this.options.arrows.to||!0===this.options.arrows.to.enabled,A=!0===this.options.arrows.from||!0===this.options.arrows.from.enabled,t=!0===this.options.arrows.middle||!0===this.options.arrows.middle.enabled,C=this.options.color.inherit,I={toArrow:g,toArrowScale:this.options.arrows.to.scaleFactor,toArrowType:this.options.arrows.to.type,toArrowSrc:this.options.arrows.to.src,toArrowImageWidth:this.options.arrows.to.imageWidth,toArrowImageHeight:this.options.arrows.to.imageHeight,middleArrow:t,middleArrowScale:this.options.arrows.middle.scaleFactor,middleArrowType:this.options.arrows.middle.type,middleArrowSrc:this.options.arrows.middle.src,middleArrowImageWidth:this.options.arrows.middle.imageWidth,middleArrowImageHeight:this.options.arrows.middle.imageHeight,fromArrow:A,fromArrowScale:this.options.arrows.from.scaleFactor,fromArrowType:this.options.arrows.from.type,fromArrowSrc:this.options.arrows.from.src,fromArrowImageWidth:this.options.arrows.from.imageWidth,fromArrowImageHeight:this.options.arrows.from.imageHeight,arrowStrikethrough:this.options.arrowStrikethrough,color:C?void 0:this.options.color.color,inheritsColor:C,opacity:this.options.color.opacity,hidden:this.options.hidden,length:this.options.length,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y,dashes:this.options.dashes,width:this.options.width,background:this.options.background.enabled,backgroundColor:this.options.background.color,backgroundSize:this.options.background.size,backgroundDashes:this.options.background.dashes};if(this.selected||this.hover)if(!0===this.chooser){if(this.selected){const g=this.options.selectionWidth;"function"==typeof g?I.width=g(I.width):"number"==typeof g&&(I.width+=g),I.width=Math.max(I.width,.3/this.body.view.scale),I.color=this.options.color.highlight,I.shadow=this.options.shadow.enabled}else if(this.hover){const g=this.options.hoverWidth;"function"==typeof g?I.width=g(I.width):"number"==typeof g&&(I.width+=g),I.width=Math.max(I.width,.3/this.body.view.scale),I.color=this.options.color.hover,I.shadow=this.options.shadow.enabled}}else"function"==typeof this.chooser&&(this.chooser(I,this.options.id,this.selected,this.hover),void 0!==I.color&&(I.inheritsColor=!1),!1===I.shadow&&(I.shadowColor===this.options.shadow.color&&I.shadowSize===this.options.shadow.size&&I.shadowX===this.options.shadow.x&&I.shadowY===this.options.shadow.y||(I.shadow=!0)));else I.shadow=this.options.shadow.enabled,I.width=Math.max(I.width,.3/this.body.view.scale);return I}updateLabelModule(g){const A=[g,this.options,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,A),void 0!==this.labelModule.baseSize&&(this.baseFontSize=this.labelModule.baseSize)}updateEdgeType(){const g=this.options.smooth;let A=!1,t=!0;return void 0!==this.edgeType&&((this.edgeType instanceof hm&&!0===g.enabled&&"dynamic"===g.type||this.edgeType instanceof um&&!0===g.enabled&&"cubicBezier"===g.type||this.edgeType instanceof lm&&!0===g.enabled&&"dynamic"!==g.type&&"cubicBezier"!==g.type||this.edgeType instanceof pm&&!1===g.type.enabled)&&(t=!1),!0===t&&(A=this.cleanup())),!0===t?!0===g.enabled?"dynamic"===g.type?(A=!0,this.edgeType=new hm(this.options,this.body,this.labelModule)):"cubicBezier"===g.type?this.edgeType=new um(this.options,this.body,this.labelModule):this.edgeType=new lm(this.options,this.body,this.labelModule):this.edgeType=new pm(this.options,this.body,this.labelModule):this.edgeType.setOptions(this.options),A}connect(){this.disconnect(),this.from=this.body.nodes[this.fromId]||void 0,this.to=this.body.nodes[this.toId]||void 0,this.connected=void 0!==this.from&&void 0!==this.to,!0===this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this)),this.edgeType.connect()}disconnect(){this.from&&(this.from.detachEdge(this),this.from=void 0),this.to&&(this.to.detachEdge(this),this.to=void 0),this.connected=!1}getTitle(){return this.title}isSelected(){return this.selected}getValue(){return this.options.value}setValueRange(g,A,t){if(void 0!==this.options.value){const C=this.options.scaling.customScalingFunction(g,A,t,this.options.value),I=this.options.scaling.max-this.options.scaling.min;if(!0===this.options.scaling.label.enabled){const g=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+C*g}this.options.width=this.options.scaling.min+C*I}else this.options.width=this.baseWidth,this.options.font.size=this.baseFontSize;this._setInteractionWidths(),this.updateLabelModule()}_setInteractionWidths(){"function"==typeof this.options.hoverWidth?this.edgeType.hoverWidth=this.options.hoverWidth(this.options.width):this.edgeType.hoverWidth=this.options.hoverWidth+this.options.width,"function"==typeof this.options.selectionWidth?this.edgeType.selectionWidth=this.options.selectionWidth(this.options.width):this.edgeType.selectionWidth=this.options.selectionWidth+this.options.width}draw(g){const A=this.getFormattingValues();if(A.hidden)return;const t=this.edgeType.getViaNode();this.edgeType.drawLine(g,A,this.selected,this.hover,t),this.drawLabel(g,t)}drawArrows(g){const A=this.getFormattingValues();if(A.hidden)return;const t=this.edgeType.getViaNode(),C={};this.edgeType.fromPoint=this.edgeType.from,this.edgeType.toPoint=this.edgeType.to,A.fromArrow&&(C.from=this.edgeType.getArrowData(g,"from",t,this.selected,this.hover,A),!1===A.arrowStrikethrough&&(this.edgeType.fromPoint=C.from.core),A.fromArrowSrc&&(C.from.image=this.imagelist.load(A.fromArrowSrc)),A.fromArrowImageWidth&&(C.from.imageWidth=A.fromArrowImageWidth),A.fromArrowImageHeight&&(C.from.imageHeight=A.fromArrowImageHeight)),A.toArrow&&(C.to=this.edgeType.getArrowData(g,"to",t,this.selected,this.hover,A),!1===A.arrowStrikethrough&&(this.edgeType.toPoint=C.to.core),A.toArrowSrc&&(C.to.image=this.imagelist.load(A.toArrowSrc)),A.toArrowImageWidth&&(C.to.imageWidth=A.toArrowImageWidth),A.toArrowImageHeight&&(C.to.imageHeight=A.toArrowImageHeight)),A.middleArrow&&(C.middle=this.edgeType.getArrowData(g,"middle",t,this.selected,this.hover,A),A.middleArrowSrc&&(C.middle.image=this.imagelist.load(A.middleArrowSrc)),A.middleArrowImageWidth&&(C.middle.imageWidth=A.middleArrowImageWidth),A.middleArrowImageHeight&&(C.middle.imageHeight=A.middleArrowImageHeight)),A.fromArrow&&this.edgeType.drawArrowHead(g,A,this.selected,this.hover,C.from),A.middleArrow&&this.edgeType.drawArrowHead(g,A,this.selected,this.hover,C.middle),A.toArrow&&this.edgeType.drawArrowHead(g,A,this.selected,this.hover,C.to)}drawLabel(g,A){if(void 0!==this.options.label){const t=this.from,C=this.to;let I;if(this.labelModule.differentState(this.selected,this.hover)&&this.labelModule.getTextSize(g,this.selected,this.hover),t.id!=C.id){this.labelModule.pointToSelf=!1,I=this.edgeType.getPoint(.5,A),g.save();const t=this._getRotation(g);0!=t.angle&&(g.translate(t.x,t.y),g.rotate(t.angle)),this.labelModule.draw(g,I.x,I.y,this.selected,this.hover),g.restore()}else{this.labelModule.pointToSelf=!0;const A=_f(g,this.options.selfReference.angle,this.options.selfReference.size,t);I=this._pointOnCircle(A.x,A.y,this.options.selfReference.size,this.options.selfReference.angle),this.labelModule.draw(g,I.x,I.y,this.selected,this.hover)}}}getItemsOnPoint(g){const A=[];if(this.labelModule.visible()){const t=this._getRotation();Kf(this.labelModule.getSize(),g,t)&&A.push({edgeId:this.id,labelId:0})}const t={left:g.x,top:g.y};return this.isOverlappingWith(t)&&A.push({edgeId:this.id}),A}isOverlappingWith(g){if(this.connected){const A=10,t=this.from.x,C=this.from.y,I=this.to.x,e=this.to.y,i=g.left,o=g.top;return this.edgeType.getDistanceToEdge(t,C,I,e,i,o)<A}return!1}_getRotation(g){const A=this.edgeType.getViaNode(),t=this.edgeType.getPoint(.5,A);void 0!==g&&this.labelModule.calculateLabelSize(g,this.selected,this.hover,t.x,t.y);const C={x:t.x,y:this.labelModule.size.yLine,angle:0};if(!this.labelModule.visible())return C;if("horizontal"===this.options.font.align)return C;const I=this.from.y-this.to.y,e=this.from.x-this.to.x;let i=Math.atan2(I,e);return(i<-1&&e<0||i>0&&e<0)&&(i+=Math.PI),C.angle=i,C}_pointOnCircle(g,A,t,C){return{x:g+t*Math.cos(C),y:A-t*Math.sin(C)}}select(){this.selected=!0}unselect(){this.selected=!1}cleanup(){return this.edgeType.cleanup()}remove(){this.cleanup(),this.disconnect(),delete this.body.edges[this.id]}endPointsValid(){return void 0!==this.body.nodes[this.fromId]&&void 0!==this.body.nodes[this.toId]}}class vm{constructor(g,A,t){var C;this.body=g,this.images=A,this.groups=t,this.body.functions.createEdge=IC(C=this.create).call(C,this),this.edgesListeners={add:(g,A)=>{this.add(A.items)},update:(g,A)=>{this.update(A.items)},remove:(g,A)=>{this.remove(A.items)}},this.options={},this.defaultOptions={arrows:{to:{enabled:!1,scaleFactor:1,type:"arrow"},middle:{enabled:!1,scaleFactor:1,type:"arrow"},from:{enabled:!1,scaleFactor:1,type:"arrow"}},endPointOffset:{from:0,to:0},arrowStrikethrough:!0,color:{color:"#848484",highlight:"#848484",hover:"#848484",inherit:"from",opacity:1},dashes:!1,font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:2,strokeColor:"#ffffff",align:"horizontal",multi:!1,vadjust:0,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"courier new",vadjust:2}},hidden:!1,hoverWidth:1.5,label:void 0,labelHighlightBold:!0,length:void 0,physics:!0,scaling:{min:1,max:15,label:{enabled:!0,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(g,A,t,C){if(A===g)return.5;{const t=1/(A-g);return Math.max(0,(C-g)*t)}}},selectionWidth:1.5,selfReference:{size:20,angle:Math.PI/4,renderBehindTheNode:!0},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},background:{enabled:!1,color:"rgba(111,111,111,1)",size:10,dashes:!1},smooth:{enabled:!0,type:"dynamic",forceDirection:"none",roundness:.5},title:void 0,width:1,value:void 0},fe(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){var g,A,t=this;this.body.emitter.on("_forceDisableDynamicCurves",function(g){let A=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];"dynamic"===g&&(g="continuous");let C=!1;for(const A in t.body.edges)if(Object.prototype.hasOwnProperty.call(t.body.edges,A)){const I=t.body.edges[A],e=t.body.data.edges.get(A);if(null!=e){const A=e.smooth;void 0!==A&&!0===A.enabled&&"dynamic"===A.type&&(void 0===g?I.setOptions({smooth:!1}):I.setOptions({smooth:{type:g}}),C=!0)}}!0===A&&!0===C&&t.body.emitter.emit("_dataChanged")}),this.body.emitter.on("_dataUpdated",()=>{this.reconnectEdges()}),this.body.emitter.on("refreshEdges",IC(g=this.refresh).call(g,this)),this.body.emitter.on("refresh",IC(A=this.refresh).call(A,this)),this.body.emitter.on("destroy",()=>{ye(this.edgesListeners,(g,A)=>{this.body.data.edges&&this.body.data.edges.off(A,g)}),delete this.body.functions.createEdge,delete this.edgesListeners.add,delete this.edgesListeners.update,delete this.edgesListeners.remove,delete this.edgesListeners})}setOptions(g){if(void 0!==g){fm.parseOptions(this.options,g,!0,this.defaultOptions,!0);let A=!1;if(void 0!==g.smooth)for(const g in this.body.edges)Object.prototype.hasOwnProperty.call(this.body.edges,g)&&(A=this.body.edges[g].updateEdgeType()||A);if(void 0!==g.font)for(const g in this.body.edges)Object.prototype.hasOwnProperty.call(this.body.edges,g)&&this.body.edges[g].updateLabelModule();void 0===g.hidden&&void 0===g.physics&&!0!==A||this.body.emitter.emit("_dataChanged")}}setData(g){let A=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const t=this.body.data.edges;if(Il("id",g))this.body.data.edges=g;else if(Mn(g))this.body.data.edges=new Al,this.body.data.edges.add(g);else{if(g)throw new TypeError("Array or DataSet expected");this.body.data.edges=new Al}if(t&&ye(this.edgesListeners,(g,A)=>{t.off(A,g)}),this.body.edges={},this.body.data.edges){ye(this.edgesListeners,(g,A)=>{this.body.data.edges.on(A,g)});const g=this.body.data.edges.getIds();this.add(g,!0)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),!1===A&&this.body.emitter.emit("_dataChanged")}add(g){let A=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const t=this.body.edges,C=this.body.data.edges;for(let A=0;A<g.length;A++){const I=g[A],e=t[I];e&&e.disconnect();const i=C.get(I,{showInternalIds:!0});t[I]=this.create(i)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),!1===A&&this.body.emitter.emit("_dataChanged")}update(g){const A=this.body.edges,t=this.body.data.edges;let C=!1;for(let I=0;I<g.length;I++){const e=g[I],i=t.get(e),o=A[e];void 0!==o?(o.disconnect(),C=o.setOptions(i)||C,o.connect()):(this.body.edges[e]=this.create(i),C=!0)}!0===C?(this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),this.body.emitter.emit("_dataChanged")):this.body.emitter.emit("_dataUpdated")}remove(g){let A=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(0===g.length)return;const t=this.body.edges;ye(g,g=>{const A=t[g];void 0!==A&&A.remove()}),A&&this.body.emitter.emit("_dataChanged")}refresh(){ye(this.body.edges,(g,A)=>{const t=this.body.data.edges.get(A);void 0!==t&&g.setOptions(t)})}create(g){return new fm(g,this.body,this.images,this.options,this.defaultOptions)}reconnectEdges(){let g;const A=this.body.nodes,t=this.body.edges;for(g in A)Object.prototype.hasOwnProperty.call(A,g)&&(A[g].edges=[]);for(g in t)if(Object.prototype.hasOwnProperty.call(t,g)){const A=t[g];A.from=null,A.to=null,A.connect()}}getConnectedNodes(g){const A=[];if(void 0!==this.body.edges[g]){const t=this.body.edges[g];void 0!==t.fromId&&A.push(t.fromId),void 0!==t.toId&&A.push(t.toId)}return A}_updateState(){this._addMissingEdges(),this._removeInvalidEdges()}_removeInvalidEdges(){const g=[];ye(this.body.edges,(A,t)=>{const C=this.body.nodes[A.toId],I=this.body.nodes[A.fromId];void 0!==C&&!0===C.isCluster||void 0!==I&&!0===I.isCluster||void 0!==C&&void 0!==I||g.push(t)}),this.remove(g,!1)}_addMissingEdges(){const g=this.body.data.edges;if(null==g)return;const A=this.body.edges,t=[];jn(g).call(g,(g,C)=>{void 0===A[C]&&t.push(C)}),this.add(t,!0)}}var bm,mm,ym,wm,xm,Em,Om,Tm={};function Dm(){return ym?mm:(ym=1,function(){if(bm)return Tm;bm=1;var g=st(),A=Date,t=E()(A.prototype.getTime);g({target:"Date",stat:!0},{now:function(){return t(new A)}})}(),mm=Tg().Date.now)}function Nm(){return xm?wm:(xm=1,wm=Dm())}var km=C(Om?Em:(Om=1,Em=Nm()));class Rm{constructor(g,A,t){this.body=g,this.physicsBody=A,this.barnesHutTree,this.setOptions(t),this._rng=Ie("BARNES HUT SOLVER")}setOptions(g){this.options=g,this.thetaInversed=1/this.options.theta,this.overlapAvoidanceFactor=1-Math.max(0,Math.min(1,this.options.avoidOverlap))}solve(){if(0!==this.options.gravitationalConstant&&this.physicsBody.physicsNodeIndices.length>0){let g;const A=this.body.nodes,t=this.physicsBody.physicsNodeIndices,C=t.length,I=this._formBarnesHutTree(A,t);this.barnesHutTree=I;for(let e=0;e<C;e++)g=A[t[e]],g.options.mass>0&&this._getForceContributions(I.root,g)}}_getForceContributions(g,A){this._getForceContribution(g.children.NW,A),this._getForceContribution(g.children.NE,A),this._getForceContribution(g.children.SW,A),this._getForceContribution(g.children.SE,A)}_getForceContribution(g,A){if(g.childrenCount>0){const t=g.centerOfMass.x-A.x,C=g.centerOfMass.y-A.y,I=Math.sqrt(t*t+C*C);I*g.calcSize>this.thetaInversed?this._calculateForces(I,t,C,A,g):4===g.childrenCount?this._getForceContributions(g,A):g.children.data.id!=A.id&&this._calculateForces(I,t,C,A,g)}}_calculateForces(g,A,t,C,I){0===g&&(A=g=.1),this.overlapAvoidanceFactor<1&&C.shape.radius&&(g=Math.max(.1+this.overlapAvoidanceFactor*C.shape.radius,g-C.shape.radius));const e=this.options.gravitationalConstant*I.mass*C.options.mass/Math.pow(g,3),i=A*e,o=t*e;this.physicsBody.forces[C.id].x+=i,this.physicsBody.forces[C.id].y+=o}_formBarnesHutTree(g,A){let t;const C=A.length;let I=g[A[0]].x,e=g[A[0]].y,i=g[A[0]].x,o=g[A[0]].y;for(let t=1;t<C;t++){const C=g[A[t]],n=C.x,s=C.y;C.options.mass>0&&(n<I&&(I=n),n>i&&(i=n),s<e&&(e=s),s>o&&(o=s))}const n=Math.abs(i-I)-Math.abs(o-e);n>0?(e-=.5*n,o+=.5*n):(I+=.5*n,i-=.5*n);const s=Math.max(1e-5,Math.abs(i-I)),r=.5*s,a=.5*(I+i),d=.5*(e+o),h={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:a-r,maxX:a+r,minY:d-r,maxY:d+r},size:s,calcSize:1/s,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(h.root);for(let I=0;I<C;I++)t=g[A[I]],t.options.mass>0&&this._placeInTree(h.root,t);return h}_updateBranchMass(g,A){const t=g.centerOfMass,C=g.mass+A.options.mass,I=1/C;t.x=t.x*g.mass+A.x*A.options.mass,t.x*=I,t.y=t.y*g.mass+A.y*A.options.mass,t.y*=I,g.mass=C;const e=Math.max(Math.max(A.height,A.radius),A.width);g.maxWidth=g.maxWidth<e?e:g.maxWidth}_placeInTree(g,A,t){1==t&&void 0!==t||this._updateBranchMass(g,A);const C=g.children.NW.range;let I;I=C.maxX>A.x?C.maxY>A.y?"NW":"SW":C.maxY>A.y?"NE":"SE",this._placeInRegion(g,A,I)}_placeInRegion(g,A,t){const C=g.children[t];switch(C.childrenCount){case 0:C.children.data=A,C.childrenCount=1,this._updateBranchMass(C,A);break;case 1:C.children.data.x===A.x&&C.children.data.y===A.y?(A.x+=this._rng(),A.y+=this._rng()):(this._splitBranch(C),this._placeInTree(C,A));break;case 4:this._placeInTree(C,A)}}_splitBranch(g){let A=null;1===g.childrenCount&&(A=g.children.data,g.mass=0,g.centerOfMass.x=0,g.centerOfMass.y=0),g.childrenCount=4,g.children.data=null,this._insertRegion(g,"NW"),this._insertRegion(g,"NE"),this._insertRegion(g,"SW"),this._insertRegion(g,"SE"),null!=A&&this._placeInTree(g,A)}_insertRegion(g,A){let t,C,I,e;const i=.5*g.size;switch(A){case"NW":t=g.range.minX,C=g.range.minX+i,I=g.range.minY,e=g.range.minY+i;break;case"NE":t=g.range.minX+i,C=g.range.maxX,I=g.range.minY,e=g.range.minY+i;break;case"SW":t=g.range.minX,C=g.range.minX+i,I=g.range.minY+i,e=g.range.maxY;break;case"SE":t=g.range.minX+i,C=g.range.maxX,I=g.range.minY+i,e=g.range.maxY}g.children[A]={centerOfMass:{x:0,y:0},mass:0,range:{minX:t,maxX:C,minY:I,maxY:e},size:.5*g.size,calcSize:2*g.calcSize,children:{data:null},maxWidth:0,level:g.level+1,childrenCount:0}}_debug(g,A){void 0!==this.barnesHutTree&&(g.lineWidth=1,this._drawBranch(this.barnesHutTree.root,g,A))}_drawBranch(g,A,t){void 0===t&&(t="#FF0000"),4===g.childrenCount&&(this._drawBranch(g.children.NW,A),this._drawBranch(g.children.NE,A),this._drawBranch(g.children.SE,A),this._drawBranch(g.children.SW,A)),A.strokeStyle=t,A.beginPath(),A.moveTo(g.range.minX,g.range.minY),A.lineTo(g.range.maxX,g.range.minY),A.stroke(),A.beginPath(),A.moveTo(g.range.maxX,g.range.minY),A.lineTo(g.range.maxX,g.range.maxY),A.stroke(),A.beginPath(),A.moveTo(g.range.maxX,g.range.maxY),A.lineTo(g.range.minX,g.range.maxY),A.stroke(),A.beginPath(),A.moveTo(g.range.minX,g.range.maxY),A.lineTo(g.range.minX,g.range.minY),A.stroke()}}class Pm{constructor(g,A,t){this._rng=Ie("REPULSION SOLVER"),this.body=g,this.physicsBody=A,this.setOptions(t)}setOptions(g){this.options=g}solve(){let g,A,t,C,I,e,i,o;const n=this.body.nodes,s=this.physicsBody.physicsNodeIndices,r=this.physicsBody.forces,a=this.options.nodeDistance,d=-2/3/a,h=4/3;for(let l=0;l<s.length-1;l++){i=n[s[l]];for(let c=l+1;c<s.length;c++)o=n[s[c]],g=o.x-i.x,A=o.y-i.y,t=Math.sqrt(g*g+A*A),0===t&&(t=.1*this._rng(),g=t),t<2*a&&(e=t<.5*a?1:d*t+h,e/=t,C=g*e,I=A*e,r[i.id].x-=C,r[i.id].y-=I,r[o.id].x+=C,r[o.id].y+=I)}}}class Mm{constructor(g,A,t){this.body=g,this.physicsBody=A,this.setOptions(t)}setOptions(g){this.options=g,this.overlapAvoidanceFactor=Math.max(0,Math.min(1,this.options.avoidOverlap||0))}solve(){const g=this.body.nodes,A=this.physicsBody.physicsNodeIndices,t=this.physicsBody.forces,C=this.options.nodeDistance;for(let I=0;I<A.length-1;I++){const e=g[A[I]];for(let i=I+1;i<A.length;i++){const I=g[A[i]];if(e.level===I.level){const g=C+this.overlapAvoidanceFactor*((e.shape.radius||0)/2+(I.shape.radius||0)/2),A=I.x-e.x,i=I.y-e.y,o=Math.sqrt(A*A+i*i),n=.05;let s;s=o<g?-Math.pow(n*o,2)+Math.pow(n*g,2):0,0!==o&&(s/=o);const r=A*s,a=i*s;t[e.id].x-=r,t[e.id].y-=a,t[I.id].x+=r,t[I.id].y+=a}}}}}class zm{constructor(g,A,t){this.body=g,this.physicsBody=A,this.setOptions(t)}setOptions(g){this.options=g}solve(){let g,A;const t=this.physicsBody.physicsEdgeIndices,C=this.body.edges;let I,e,i;for(let o=0;o<t.length;o++)A=C[t[o]],!0===A.connected&&A.toId!==A.fromId&&void 0!==this.body.nodes[A.toId]&&void 0!==this.body.nodes[A.fromId]&&(void 0!==A.edgeType.via?(g=void 0===A.options.length?this.options.springLength:A.options.length,I=A.to,e=A.edgeType.via,i=A.from,this._calculateSpringForce(I,e,.5*g),this._calculateSpringForce(e,i,.5*g)):(g=void 0===A.options.length?1.5*this.options.springLength:A.options.length,this._calculateSpringForce(A.from,A.to,g)))}_calculateSpringForce(g,A,t){const C=g.x-A.x,I=g.y-A.y,e=Math.max(Math.sqrt(C*C+I*I),.01),i=this.options.springConstant*(t-e)/e,o=C*i,n=I*i;void 0!==this.physicsBody.forces[g.id]&&(this.physicsBody.forces[g.id].x+=o,this.physicsBody.forces[g.id].y+=n),void 0!==this.physicsBody.forces[A.id]&&(this.physicsBody.forces[A.id].x-=o,this.physicsBody.forces[A.id].y-=n)}}class Bm{constructor(g,A,t){this.body=g,this.physicsBody=A,this.setOptions(t)}setOptions(g){this.options=g}solve(){let g,A,t,C,I,e,i,o;const n=this.body.edges,s=.5,r=this.physicsBody.physicsEdgeIndices,a=this.physicsBody.physicsNodeIndices,d=this.physicsBody.forces;for(let g=0;g<a.length;g++){const A=a[g];d[A].springFx=0,d[A].springFy=0}for(let a=0;a<r.length;a++)A=n[r[a]],!0===A.connected&&(g=void 0===A.options.length?this.options.springLength:A.options.length,t=A.from.x-A.to.x,C=A.from.y-A.to.y,o=Math.sqrt(t*t+C*C),o=0===o?.01:o,i=this.options.springConstant*(g-o)/o,I=t*i,e=C*i,A.to.level!=A.from.level?(void 0!==d[A.toId]&&(d[A.toId].springFx-=I,d[A.toId].springFy-=e),void 0!==d[A.fromId]&&(d[A.fromId].springFx+=I,d[A.fromId].springFy+=e)):(void 0!==d[A.toId]&&(d[A.toId].x-=s*I,d[A.toId].y-=s*e),void 0!==d[A.fromId]&&(d[A.fromId].x+=s*I,d[A.fromId].y+=s*e)));let h,l;i=1;for(let g=0;g<a.length;g++){const A=a[g];h=Math.min(i,Math.max(-i,d[A].springFx)),l=Math.min(i,Math.max(-i,d[A].springFy)),d[A].x+=h,d[A].y+=l}let c=0,u=0;for(let g=0;g<a.length;g++){const A=a[g];c+=d[A].x,u+=d[A].y}const p=c/a.length,f=u/a.length;for(let g=0;g<a.length;g++){const A=a[g];d[A].x-=p,d[A].y-=f}}}class Zm{constructor(g,A,t){this.body=g,this.physicsBody=A,this.setOptions(t)}setOptions(g){this.options=g}solve(){let g,A,t,C;const I=this.body.nodes,e=this.physicsBody.physicsNodeIndices,i=this.physicsBody.forces;for(let o=0;o<e.length;o++){C=I[e[o]],g=-C.x,A=-C.y,t=Math.sqrt(g*g+A*A),this._calculateForces(t,g,A,i,C)}}_calculateForces(g,A,t,C,I){const e=0===g?0:this.options.centralGravity/g;C[I.id].x=A*e,C[I.id].y=t*e}}class Sm extends Rm{constructor(g,A,t){super(g,A,t),this._rng=Ie("FORCE ATLAS 2 BASED REPULSION SOLVER")}_calculateForces(g,A,t,C,I){0===g&&(A=g=.1*this._rng()),this.overlapAvoidanceFactor<1&&C.shape.radius&&(g=Math.max(.1+this.overlapAvoidanceFactor*C.shape.radius,g-C.shape.radius));const e=C.edges.length+1,i=this.options.gravitationalConstant*I.mass*C.options.mass*e/Math.pow(g,2),o=A*i,n=t*i;this.physicsBody.forces[C.id].x+=o,this.physicsBody.forces[C.id].y+=n}}class Fm extends Zm{constructor(g,A,t){super(g,A,t)}_calculateForces(g,A,t,C,I){if(g>0){const g=I.edges.length+1,e=this.options.centralGravity*g*I.options.mass;C[I.id].x=A*e,C[I.id].y=t*e}}}class Gm{constructor(g){this.body=g,this.physicsBody={physicsNodeIndices:[],physicsEdgeIndices:[],forces:{},velocities:{}},this.physicsEnabled=!0,this.simulationInterval=1e3/60,this.requiresTimeout=!0,this.previousStates={},this.referenceState={},this.freezeCache={},this.renderTimer=void 0,this.adaptiveTimestep=!1,this.adaptiveTimestepEnabled=!1,this.adaptiveCounter=0,this.adaptiveInterval=3,this.stabilized=!1,this.startedStabilization=!1,this.stabilizationIterations=0,this.ready=!1,this.options={},this.defaultOptions={enabled:!0,barnesHut:{theta:.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09,avoidOverlap:0},forceAtlas2Based:{theta:.5,gravitationalConstant:-50,centralGravity:.01,springConstant:.08,springLength:100,damping:.4,avoidOverlap:0},repulsion:{centralGravity:.2,springLength:200,springConstant:.05,nodeDistance:100,damping:.09,avoidOverlap:0},hierarchicalRepulsion:{centralGravity:0,springLength:100,springConstant:.01,nodeDistance:120,damping:.09},maxVelocity:50,minVelocity:.75,solver:"barnesHut",stabilization:{enabled:!0,iterations:1e3,updateInterval:50,onlyDynamicEdges:!1,fit:!0},timestep:.5,adaptiveTimestep:!0,wind:{x:0,y:0}},Xt(this.options,this.defaultOptions),this.timestep=.5,this.layoutFailed=!1,this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("initPhysics",()=>{this.initPhysics()}),this.body.emitter.on("_layoutFailed",()=>{this.layoutFailed=!0}),this.body.emitter.on("resetPhysics",()=>{this.stopSimulation(),this.ready=!1}),this.body.emitter.on("disablePhysics",()=>{this.physicsEnabled=!1,this.stopSimulation()}),this.body.emitter.on("restorePhysics",()=>{this.setOptions(this.options),!0===this.ready&&this.startSimulation()}),this.body.emitter.on("startSimulation",()=>{!0===this.ready&&this.startSimulation()}),this.body.emitter.on("stopSimulation",()=>{this.stopSimulation()}),this.body.emitter.on("destroy",()=>{this.stopSimulation(!1),this.body.emitter.off()}),this.body.emitter.on("_dataChanged",()=>{this.updatePhysicsData()})}setOptions(g){if(void 0!==g)if(!1===g)this.options.enabled=!1,this.physicsEnabled=!1,this.stopSimulation();else if(!0===g)this.options.enabled=!0,this.physicsEnabled=!0,this.startSimulation();else{this.physicsEnabled=!0,pe(["stabilization"],this.options,g),Me(this.options,g,"stabilization"),void 0===g.enabled&&(this.options.enabled=!0),!1===this.options.enabled&&(this.physicsEnabled=!1,this.stopSimulation());const A=this.options.wind;A&&(("number"!=typeof A.x||Ud(A.x))&&(A.x=0),("number"!=typeof A.y||Ud(A.y))&&(A.y=0)),this.timestep=this.options.timestep}this.init()}init(){let g;"forceAtlas2Based"===this.options.solver?(g=this.options.forceAtlas2Based,this.nodesSolver=new Sm(this.body,this.physicsBody,g),this.edgesSolver=new zm(this.body,this.physicsBody,g),this.gravitySolver=new Fm(this.body,this.physicsBody,g)):"repulsion"===this.options.solver?(g=this.options.repulsion,this.nodesSolver=new Pm(this.body,this.physicsBody,g),this.edgesSolver=new zm(this.body,this.physicsBody,g),this.gravitySolver=new Zm(this.body,this.physicsBody,g)):"hierarchicalRepulsion"===this.options.solver?(g=this.options.hierarchicalRepulsion,this.nodesSolver=new Mm(this.body,this.physicsBody,g),this.edgesSolver=new Bm(this.body,this.physicsBody,g),this.gravitySolver=new Zm(this.body,this.physicsBody,g)):(g=this.options.barnesHut,this.nodesSolver=new Rm(this.body,this.physicsBody,g),this.edgesSolver=new zm(this.body,this.physicsBody,g),this.gravitySolver=new Zm(this.body,this.physicsBody,g)),this.modelOptions=g}initPhysics(){!0===this.physicsEnabled&&!0===this.options.enabled?!0===this.options.stabilization.enabled?this.stabilize():(this.stabilized=!1,this.ready=!0,this.body.emitter.emit("fit",{},this.layoutFailed),this.startSimulation()):(this.ready=!0,this.body.emitter.emit("fit"))}startSimulation(){var g;!0===this.physicsEnabled&&!0===this.options.enabled?(this.stabilized=!1,this.adaptiveTimestep=!1,this.body.emitter.emit("_resizeNodes"),void 0===this.viewFunction&&(this.viewFunction=IC(g=this.simulationStep).call(g,this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))):this.body.emitter.emit("_redraw")}stopSimulation(){let g=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.stabilized=!0,!0===g&&this._emitStabilized(),void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.viewFunction=void 0,!0===g&&this.body.emitter.emit("_stopRendering"))}simulationStep(){const g=km();this.physicsTick();(km()-g<.4*this.simulationInterval||!0===this.runDoubleSpeed)&&!1===this.stabilized&&(this.physicsTick(),this.runDoubleSpeed=!0),!0===this.stabilized&&this.stopSimulation()}_emitStabilized(){let g=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.stabilizationIterations;(this.stabilizationIterations>1||!0===this.startedStabilization)&&Yh(()=>{this.body.emitter.emit("stabilized",{iterations:g}),this.startedStabilization=!1,this.stabilizationIterations=0},0)}physicsStep(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve(),this.moveNodes()}adjustTimeStep(){!0===this._evaluateStepQuality()?this.timestep=1.2*this.timestep:this.timestep/1.2<this.options.timestep?this.timestep=this.options.timestep:(this.adaptiveCounter=-1,this.timestep=Math.max(this.options.timestep,this.timestep/1.2))}physicsTick(){if(this._startStabilizing(),!0!==this.stabilized){if(!0===this.adaptiveTimestep&&!0===this.adaptiveTimestepEnabled){this.adaptiveCounter%this.adaptiveInterval===0?(this.timestep=2*this.timestep,this.physicsStep(),this.revert(),this.timestep=.5*this.timestep,this.physicsStep(),this.physicsStep(),this.adjustTimeStep()):this.physicsStep(),this.adaptiveCounter+=1}else this.timestep=this.options.timestep,this.physicsStep();!0===this.stabilized&&this.revert(),this.stabilizationIterations++}}updatePhysicsData(){this.physicsBody.forces={},this.physicsBody.physicsNodeIndices=[],this.physicsBody.physicsEdgeIndices=[];const g=this.body.nodes,A=this.body.edges;for(const A in g)Object.prototype.hasOwnProperty.call(g,A)&&!0===g[A].options.physics&&this.physicsBody.physicsNodeIndices.push(g[A].id);for(const g in A)Object.prototype.hasOwnProperty.call(A,g)&&!0===A[g].options.physics&&this.physicsBody.physicsEdgeIndices.push(A[g].id);for(let g=0;g<this.physicsBody.physicsNodeIndices.length;g++){const A=this.physicsBody.physicsNodeIndices[g];this.physicsBody.forces[A]={x:0,y:0},void 0===this.physicsBody.velocities[A]&&(this.physicsBody.velocities[A]={x:0,y:0})}for(const A in this.physicsBody.velocities)void 0===g[A]&&delete this.physicsBody.velocities[A]}revert(){const g=uh(this.previousStates),A=this.body.nodes,t=this.physicsBody.velocities;this.referenceState={};for(let C=0;C<g.length;C++){const I=g[C];void 0!==A[I]?!0===A[I].options.physics&&(this.referenceState[I]={positions:{x:A[I].x,y:A[I].y}},t[I].x=this.previousStates[I].vx,t[I].y=this.previousStates[I].vy,A[I].x=this.previousStates[I].x,A[I].y=this.previousStates[I].y):delete this.previousStates[I]}}_evaluateStepQuality(){let g,A,t;const C=this.body.nodes,I=this.referenceState;for(const e in this.referenceState)if(Object.prototype.hasOwnProperty.call(this.referenceState,e)&&void 0!==C[e]&&(g=C[e].x-I[e].positions.x,A=C[e].y-I[e].positions.y,t=Math.sqrt(Math.pow(g,2)+Math.pow(A,2)),t>.3))return!1;return!0}moveNodes(){const g=this.physicsBody.physicsNodeIndices;let A=0,t=0;for(let C=0;C<g.length;C++){const I=g[C],e=this._performStep(I);A=Math.max(A,e),t+=e}this.adaptiveTimestepEnabled=t/g.length<5,this.stabilized=A<this.options.minVelocity}calculateComponentVelocity(g,A,t){g+=(A-this.modelOptions.damping*g)/t*this.timestep;const C=this.options.maxVelocity||1e9;return Math.abs(g)>C&&(g=g>0?C:-C),g}_performStep(g){const A=this.body.nodes[g],t=this.physicsBody.forces[g];this.options.wind&&(t.x+=this.options.wind.x,t.y+=this.options.wind.y);const C=this.physicsBody.velocities[g];this.previousStates[g]={x:A.x,y:A.y,vx:C.x,vy:C.y},!1===A.options.fixed.x?(C.x=this.calculateComponentVelocity(C.x,t.x,A.options.mass),A.x+=C.x*this.timestep):(t.x=0,C.x=0),!1===A.options.fixed.y?(C.y=this.calculateComponentVelocity(C.y,t.y,A.options.mass),A.y+=C.y*this.timestep):(t.y=0,C.y=0);return Math.sqrt(Math.pow(C.x,2)+Math.pow(C.y,2))}_freezeNodes(){const g=this.body.nodes;for(const A in g)if(Object.prototype.hasOwnProperty.call(g,A)&&g[A].x&&g[A].y){const t=g[A].options.fixed;this.freezeCache[A]={x:t.x,y:t.y},t.x=!0,t.y=!0}}_restoreFrozenNodes(){const g=this.body.nodes;for(const A in g)Object.prototype.hasOwnProperty.call(g,A)&&void 0!==this.freezeCache[A]&&(g[A].options.fixed.x=this.freezeCache[A].x,g[A].options.fixed.y=this.freezeCache[A].y);this.freezeCache={}}stabilize(){let g=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.stabilization.iterations;"number"!=typeof g&&(g=this.options.stabilization.iterations,console.error("The stabilize method needs a numeric amount of iterations. Switching to default: ",g)),0!==this.physicsBody.physicsNodeIndices.length?(this.adaptiveTimestep=this.options.adaptiveTimestep,this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=g,!0===this.options.stabilization.onlyDynamicEdges&&this._freezeNodes(),this.stabilizationIterations=0,Yh(()=>this._stabilizationBatch(),0)):this.ready=!0}_startStabilizing(){return!0!==this.startedStabilization&&(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0,!0)}_stabilizationBatch(){const g=()=>!1===this.stabilized&&this.stabilizationIterations<this.targetIterations,A=()=>{this.body.emitter.emit("stabilizationProgress",{iterations:this.stabilizationIterations,total:this.targetIterations})};this._startStabilizing()&&A();let t=0;for(;g()&&t<this.options.stabilization.updateInterval;)this.physicsTick(),t++;var C;(A(),g())?Yh(IC(C=this._stabilizationBatch).call(C,this),0):this._finalizeStabilization()}_finalizeStabilization(){this.body.emitter.emit("_allowRedraw"),!0===this.options.stabilization.fit&&this.body.emitter.emit("fit"),!0===this.options.stabilization.onlyDynamicEdges&&this._restoreFrozenNodes(),this.body.emitter.emit("stabilizationIterationsDone"),this.body.emitter.emit("_requestRedraw"),!0===this.stabilized?this._emitStabilized():this.startSimulation(),this.ready=!0}_drawForces(g){for(let A=0;A<this.physicsBody.physicsNodeIndices.length;A++){const t=this.physicsBody.physicsNodeIndices[A],C=this.body.nodes[t],I=this.physicsBody.forces[t],e=20,i=.03,o=Math.sqrt(Math.pow(I.x,2)+Math.pow(I.x,2)),n=Math.min(Math.max(5,o),15),s=3*n,r=Ne((180-180*Math.min(1,Math.max(0,i*o)))/360,1,1),a={x:C.x+e*I.x,y:C.y+e*I.y};g.lineWidth=n,g.strokeStyle=r,g.beginPath(),g.moveTo(C.x,C.y),g.lineTo(a.x,a.y),g.stroke();const d=Math.atan2(I.y,I.x);g.fillStyle=r,im.draw(g,{type:"arrow",point:a,angle:d,length:s}),Wv(g).call(g)}}}var jm,Lm,Vm,Ym,Wm,Qm,Um,Km,Hm,_m={};function Xm(){return Vm?Lm:(Vm=1,function(){if(jm)return _m;jm=1;var g=st(),A=E(),t=Xo(),C=A([].reverse),I=[1,2];g({target:"Array",proto:!0,forced:String(I)===String(I.reverse())},{reverse:function(){return t(this)&&(this.length=this.length),C(this)}})}(),Lm=gC()("Array","reverse"))}function Jm(){if(Wm)return Ym;Wm=1;var g=Ng(),A=Xm(),t=Array.prototype;return Ym=function(C){var I=C.reverse;return C===t||g(t,C)&&I===t.reverse?A:I},Ym}function qm(){return Um?Qm:(Um=1,Qm=Jm())}var $m,gy,Ay,ty,Cy=C(Hm?Km:(Hm=1,Km=qm()));class Iy{constructor(){}static getRange(g){let A,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],C=1e9,I=-1e9,e=1e9,i=-1e9;if(t.length>0)for(let o=0;o<t.length;o++)A=g[t[o]],e>A.shape.boundingBox.left&&(e=A.shape.boundingBox.left),i<A.shape.boundingBox.right&&(i=A.shape.boundingBox.right),C>A.shape.boundingBox.top&&(C=A.shape.boundingBox.top),I<A.shape.boundingBox.bottom&&(I=A.shape.boundingBox.bottom);return 1e9===e&&-1e9===i&&1e9===C&&-1e9===I&&(C=0,I=0,e=0,i=0),{minX:e,maxX:i,minY:C,maxY:I}}static getRangeCore(g){let A,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],C=1e9,I=-1e9,e=1e9,i=-1e9;if(t.length>0)for(let o=0;o<t.length;o++)A=g[t[o]],e>A.x&&(e=A.x),i<A.x&&(i=A.x),C>A.y&&(C=A.y),I<A.y&&(I=A.y);return 1e9===e&&-1e9===i&&1e9===C&&-1e9===I&&(C=0,I=0,e=0,i=0),{minX:e,maxX:i,minY:C,maxY:I}}static findCenter(g){return{x:.5*(g.maxX+g.minX),y:.5*(g.maxY+g.minY)}}static cloneOptions(g,A){const t={};return void 0===A||"node"===A?(fe(t,g.options,!0),t.x=g.x,t.y=g.y,t.amountOfConnections=g.edges.length):fe(t,g.options,!0),t}}class ey extends lb{constructor(g,A,t,C,I,e){super(g,A,t,C,I,e),this.isCluster=!0,this.containedNodes={},this.containedEdges={}}_openChildCluster(g){const A=this.body.nodes[g];if(void 0===this.containedNodes[g])throw new Error("node with id: "+g+" not in current cluster");if(!A.isCluster)throw new Error("node with id: "+g+" is not a cluster");delete this.containedNodes[g],ye(A.edges,g=>{delete this.containedEdges[g.id]}),ye(A.containedNodes,(g,A)=>{this.containedNodes[A]=g}),A.containedNodes={},ye(A.containedEdges,(g,A)=>{this.containedEdges[A]=g}),A.containedEdges={},ye(A.edges,g=>{ye(this.edges,A=>{var t,C;const I=Si(t=A.clusteringEdgeReplacingIds).call(t,g.id);-1!==I&&(ye(g.clusteringEdgeReplacingIds,g=>{A.clusteringEdgeReplacingIds.push(g),this.body.edges[g].edgeReplacedById=A.id}),pn(C=A.clusteringEdgeReplacingIds).call(C,I,1))})}),A.edges=[]}}class iy{constructor(g){this.body=g,this.clusteredNodes={},this.clusteredEdges={},this.options={},this.defaultOptions={},Xt(this.options,this.defaultOptions),this.body.emitter.on("_resetData",()=>{this.clusteredNodes={},this.clusteredEdges={}})}clusterByHubsize(g,A){void 0===g?g=this._getHubSize():"object"==typeof g&&(A=this._checkOptions(g),g=this._getHubSize());const t=[];for(let A=0;A<this.body.nodeIndices.length;A++){const C=this.body.nodes[this.body.nodeIndices[A]];C.edges.length>=g&&t.push(C.id)}for(let g=0;g<t.length;g++)this.clusterByConnection(t[g],A,!0);this.body.emitter.emit("_dataChanged")}cluster(){let g=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},A=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(void 0===g.joinCondition)throw new Error("Cannot call clusterByNodeData without a joinCondition function in the options.");g=this._checkOptions(g);const t={},C={};ye(this.body.nodes,(A,I)=>{A.options&&!0===g.joinCondition(A.options)&&(t[I]=A,ye(A.edges,g=>{void 0===this.clusteredEdges[g.id]&&(C[g.id]=g)}))}),this._cluster(t,C,g,A)}clusterByEdgeCount(g,A){let t=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];A=this._checkOptions(A);const C=[],I={};let e,i,o;for(let t=0;t<this.body.nodeIndices.length;t++){const n={},s={},r=this.body.nodeIndices[t],a=this.body.nodes[r];if(void 0===I[r]){o=0,i=[];for(let g=0;g<a.edges.length;g++)e=a.edges[g],void 0===this.clusteredEdges[e.id]&&(e.toId!==e.fromId&&o++,i.push(e));if(o===g){const g=function(g){if(void 0===A.joinCondition||null===A.joinCondition)return!0;const t=Iy.cloneOptions(g);return A.joinCondition(t)};let t=!0;for(let A=0;A<i.length;A++){e=i[A];const C=this._getConnectedId(e,r);if(!g(a)){t=!1;break}s[e.id]=e,n[r]=a,n[C]=this.body.nodes[C],I[r]=!0}if(uh(n).length>0&&uh(s).length>0&&!0===t){const g=function(){for(let g=0;g<C.length;++g)for(const A in n)if(void 0!==C[g].nodes[A])return C[g]}();if(void 0!==g){for(const A in n)void 0===g.nodes[A]&&(g.nodes[A]=n[A]);for(const A in s)void 0===g.edges[A]&&(g.edges[A]=s[A])}else C.push({nodes:n,edges:s})}}}}for(let g=0;g<C.length;g++)this._cluster(C[g].nodes,C[g].edges,A,!1);!0===t&&this.body.emitter.emit("_dataChanged")}clusterOutliers(g){let A=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(1,g,A)}clusterBridges(g){let A=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(2,g,A)}clusterByConnection(g,A){var t;let C=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===g)throw new Error("No nodeId supplied to clusterByConnection!");if(void 0===this.body.nodes[g])throw new Error("The nodeId given to clusterByConnection does not exist!");const I=this.body.nodes[g];void 0===(A=this._checkOptions(A,I)).clusterNodeProperties.x&&(A.clusterNodeProperties.x=I.x),void 0===A.clusterNodeProperties.y&&(A.clusterNodeProperties.y=I.y),void 0===A.clusterNodeProperties.fixed&&(A.clusterNodeProperties.fixed={},A.clusterNodeProperties.fixed.x=I.options.fixed.x,A.clusterNodeProperties.fixed.y=I.options.fixed.y);const e={},i={},o=I.id,n=Iy.cloneOptions(I);e[o]=I;for(let g=0;g<I.edges.length;g++){const t=I.edges[g];if(void 0===this.clusteredEdges[t.id]){const g=this._getConnectedId(t,o);if(void 0===this.clusteredNodes[g])if(g!==o)if(void 0===A.joinCondition)i[t.id]=t,e[g]=this.body.nodes[g];else{const C=Iy.cloneOptions(this.body.nodes[g]);!0===A.joinCondition(n,C)&&(i[t.id]=t,e[g]=this.body.nodes[g])}else i[t.id]=t}}const s=ks(t=uh(e)).call(t,function(g){return e[g].id});for(const g in e){if(!Object.prototype.hasOwnProperty.call(e,g))continue;const A=e[g];for(let g=0;g<A.edges.length;g++){const t=A.edges[g];Si(s).call(s,this._getConnectedId(t,A.id))>-1&&(i[t.id]=t)}}this._cluster(e,i,A,C)}_createClusterEdges(g,A,t,C){let I,e,i,o,n,s;const r=uh(g),a=[];for(let C=0;C<r.length;C++){e=r[C],i=g[e];for(let C=0;C<i.edges.length;C++)I=i.edges[C],void 0===this.clusteredEdges[I.id]&&(I.toId==I.fromId?A[I.id]=I:I.toId==e?(o=t.id,n=I.fromId,s=n):(o=I.toId,n=t.id,s=o),void 0===g[s]&&a.push({edge:I,fromId:n,toId:o}))}const d=[],h=function(g){for(let A=0;A<d.length;A++){const t=d[A],C=g.fromId===t.fromId&&g.toId===t.toId,I=g.fromId===t.toId&&g.toId===t.fromId;if(C||I)return t}return null};for(let g=0;g<a.length;g++){const A=a[g],t=A.edge;let I=h(A);null===I?(I=this._createClusteredEdge(A.fromId,A.toId,t,C),d.push(I)):I.clusteringEdgeReplacingIds.push(t.id),this.body.edges[t.id].edgeReplacedById=I.id,this._backupEdgeOptions(t),t.setOptions({physics:!1})}}_checkOptions(){let g=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return void 0===g.clusterEdgeProperties&&(g.clusterEdgeProperties={}),void 0===g.clusterNodeProperties&&(g.clusterNodeProperties={}),g}_cluster(g,A,t){let C=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];const I=[];for(const A in g)Object.prototype.hasOwnProperty.call(g,A)&&void 0!==this.clusteredNodes[A]&&I.push(A);for(let A=0;A<I.length;++A)delete g[I[A]];if(0==uh(g).length)return;if(1==uh(g).length&&1!=t.clusterNodeProperties.allowSingleNodeCluster)return;let e=fe({},t.clusterNodeProperties);if(void 0!==t.processProperties){const C=[];for(const A in g)if(Object.prototype.hasOwnProperty.call(g,A)){const t=Iy.cloneOptions(g[A]);C.push(t)}const I=[];for(const g in A)if(Object.prototype.hasOwnProperty.call(A,g)&&"clusterEdge:"!==g.substr(0,12)){const t=Iy.cloneOptions(A[g],"edge");I.push(t)}if(e=t.processProperties(e,C,I),!e)throw new Error("The processProperties function does not return properties!")}void 0===e.id&&(e.id="cluster:"+Hh());const i=e.id;let o;void 0===e.label&&(e.label="cluster"),void 0===e.x&&(o=this._getClusterPosition(g),e.x=o.x),void 0===e.y&&(void 0===o&&(o=this._getClusterPosition(g)),e.y=o.y),e.id=i;const n=this.body.functions.createNode(e,ey);n.containedNodes=g,n.containedEdges=A,n.clusterEdgeProperties=t.clusterEdgeProperties,this.body.nodes[e.id]=n,this._clusterEdges(g,A,e,t.clusterEdgeProperties),e.id=void 0,!0===C&&this.body.emitter.emit("_dataChanged")}_backupEdgeOptions(g){void 0===this.clusteredEdges[g.id]&&(this.clusteredEdges[g.id]={physics:g.options.physics})}_restoreEdge(g){const A=this.clusteredEdges[g.id];void 0!==A&&(g.setOptions({physics:A.physics}),delete this.clusteredEdges[g.id])}isCluster(g){return void 0!==this.body.nodes[g]?!0===this.body.nodes[g].isCluster:(console.error("Node does not exist."),!1)}_getClusterPosition(g){const A=uh(g);let t,C=g[A[0]].x,I=g[A[0]].x,e=g[A[0]].y,i=g[A[0]].y;for(let o=1;o<A.length;o++)t=g[A[o]],C=t.x<C?t.x:C,I=t.x>I?t.x:I,e=t.y<e?t.y:e,i=t.y>i?t.y:i;return{x:.5*(C+I),y:.5*(e+i)}}openCluster(g,A){let t=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===g)throw new Error("No clusterNodeId supplied to openCluster.");const C=this.body.nodes[g];if(void 0===C)throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(!0!==C.isCluster||void 0===C.containedNodes||void 0===C.containedEdges)throw new Error("The node:"+g+" is not a valid cluster.");const I=this.findNode(g),e=Si(I).call(I,g)-1;if(e>=0){const A=I[e];return this.body.nodes[A]._openChildCluster(g),delete this.body.nodes[g],void(!0===t&&this.body.emitter.emit("_dataChanged"))}const i=C.containedNodes,o=C.containedEdges;if(void 0!==A&&void 0!==A.releaseFunction&&"function"==typeof A.releaseFunction){const g={},t={x:C.x,y:C.y};for(const A in i)if(Object.prototype.hasOwnProperty.call(i,A)){const t=this.body.nodes[A];g[A]={x:t.x,y:t.y}}const I=A.releaseFunction(t,g);for(const g in i)if(Object.prototype.hasOwnProperty.call(i,g)){const A=this.body.nodes[g];void 0!==I[g]&&(A.x=void 0===I[g].x?C.x:I[g].x,A.y=void 0===I[g].y?C.y:I[g].y)}}else ye(i,function(g){!1===g.options.fixed.x&&(g.x=C.x),!1===g.options.fixed.y&&(g.y=C.y)});for(const g in i)if(Object.prototype.hasOwnProperty.call(i,g)){const A=this.body.nodes[g];A.vx=C.vx,A.vy=C.vy,A.setOptions({physics:!0}),delete this.clusteredNodes[g]}const n=[];for(let g=0;g<C.edges.length;g++)n.push(C.edges[g]);for(let A=0;A<n.length;A++){const t=n[A],C=this._getConnectedId(t,g),I=this.clusteredNodes[C];for(let g=0;g<t.clusteringEdgeReplacingIds.length;g++){const A=t.clusteringEdgeReplacingIds[g],e=this.body.edges[A];if(void 0!==e)if(void 0!==I){const g=this.body.nodes[I.clusterId];g.containedEdges[e.id]=e,delete o[e.id];let A=e.fromId,t=e.toId;e.toId==C?t=I.clusterId:A=I.clusterId,this._createClusteredEdge(A,t,e,g.clusterEdgeProperties,{hidden:!1,physics:!0})}else this._restoreEdge(e)}t.remove()}for(const g in o)Object.prototype.hasOwnProperty.call(o,g)&&this._restoreEdge(o[g]);delete this.body.nodes[g],!0===t&&this.body.emitter.emit("_dataChanged")}getNodesInCluster(g){const A=[];if(!0===this.isCluster(g)){const t=this.body.nodes[g].containedNodes;for(const g in t)Object.prototype.hasOwnProperty.call(t,g)&&A.push(this.body.nodes[g].id)}return A}findNode(g){const A=[];let t,C=0;for(;void 0!==this.clusteredNodes[g]&&C<100;){if(t=this.body.nodes[g],void 0===t)return[];A.push(t.id),g=this.clusteredNodes[g].clusterId,C++}return t=this.body.nodes[g],void 0===t?[]:(A.push(t.id),Cy(A).call(A),A)}updateClusteredNode(g,A){if(void 0===g)throw new Error("No clusteredNodeId supplied to updateClusteredNode.");if(void 0===A)throw new Error("No newOptions supplied to updateClusteredNode.");if(void 0===this.body.nodes[g])throw new Error("The clusteredNodeId supplied to updateClusteredNode does not exist.");this.body.nodes[g].setOptions(A),this.body.emitter.emit("_dataChanged")}updateEdge(g,A){if(void 0===g)throw new Error("No startEdgeId supplied to updateEdge.");if(void 0===A)throw new Error("No newOptions supplied to updateEdge.");if(void 0===this.body.edges[g])throw new Error("The startEdgeId supplied to updateEdge does not exist.");const t=this.getClusteredEdges(g);for(let g=0;g<t.length;g++){this.body.edges[t[g]].setOptions(A)}this.body.emitter.emit("_dataChanged")}getClusteredEdges(g){const A=[];let t=0;for(;void 0!==g&&void 0!==this.body.edges[g]&&t<100;)A.push(this.body.edges[g].id),g=this.body.edges[g].edgeReplacedById,t++;return Cy(A).call(A),A}getBaseEdge(g){return this.getBaseEdges(g)[0]}getBaseEdges(g){const A=[g],t=[],C=[];let I=0;for(;A.length>0&&I<100;){const g=A.pop();if(void 0===g)continue;const e=this.body.edges[g];if(void 0===e)continue;I++;const i=e.clusteringEdgeReplacingIds;if(void 0===i)C.push(g);else for(let g=0;g<i.length;++g){const C=i[g];-1===Si(A).call(A,i)&&-1===Si(t).call(t,i)&&A.push(C)}t.push(g)}return C}_getConnectedId(g,A){return g.toId!=A?g.toId:(g.fromId,g.fromId)}_getHubSize(){let g=0,A=0,t=0,C=0;for(let I=0;I<this.body.nodeIndices.length;I++){const e=this.body.nodes[this.body.nodeIndices[I]];e.edges.length>C&&(C=e.edges.length),g+=e.edges.length,A+=Math.pow(e.edges.length,2),t+=1}g/=t,A/=t;const I=A-Math.pow(g,2),e=Math.sqrt(I);let i=Math.floor(g+2*e);return i>C&&(i=C),i}_createClusteredEdge(g,A,t,C,I){const e=Iy.cloneOptions(t,"edge");fe(e,C),e.from=g,e.to=A,e.id="clusterEdge:"+Hh(),void 0!==I&&fe(e,I);const i=this.body.functions.createEdge(e);return i.clusteringEdgeReplacingIds=[t.id],i.connect(),this.body.edges[i.id]=i,i}_clusterEdges(g,A,t,C){if(A instanceof fm){const g=A,t={};t[g.id]=g,A=t}if(g instanceof lb){const A=g,t={};t[A.id]=A,g=t}if(null==t)throw new Error("_clusterEdges: parameter clusterNode required");void 0===C&&(C=t.clusterEdgeProperties),this._createClusterEdges(g,A,t,C);for(const g in A)if(Object.prototype.hasOwnProperty.call(A,g)&&void 0!==this.body.edges[g]){const A=this.body.edges[g];this._backupEdgeOptions(A),A.setOptions({physics:!1})}for(const A in g)Object.prototype.hasOwnProperty.call(g,A)&&(this.clusteredNodes[A]={clusterId:t.id,node:this.body.nodes[A]},this.body.nodes[A].setOptions({physics:!1}))}_getClusterNodeForNode(g){if(void 0===g)return;const A=this.clusteredNodes[g];if(void 0===A)return;const t=A.clusterId;return void 0!==t?this.body.nodes[t]:void 0}_filter(g,A){const t=[];return ye(g,g=>{A(g)&&t.push(g)}),t}_updateState(){let g;const A=[],t={},C=g=>{ye(this.body.nodes,A=>{!0===A.isCluster&&g(A)})};for(g in this.clusteredNodes){if(!Object.prototype.hasOwnProperty.call(this.clusteredNodes,g))continue;void 0===this.body.nodes[g]&&A.push(g)}C(function(g){for(let t=0;t<A.length;t++)delete g.containedNodes[A[t]]});for(let g=0;g<A.length;g++)delete this.clusteredNodes[A[g]];ye(this.clusteredEdges,g=>{const A=this.body.edges[g];void 0!==A&&A.endPointsValid()||(t[g]=g)}),C(function(g){ye(g.containedEdges,(g,A)=>{g.endPointsValid()||t[A]||(t[A]=A)})}),ye(this.body.edges,(g,A)=>{let C=!0;const I=g.clusteringEdgeReplacingIds;if(void 0!==I){let g=0;ye(I,A=>{const t=this.body.edges[A];void 0!==t&&t.endPointsValid()&&(g+=1)}),C=g>0}g.endPointsValid()&&C||(t[A]=A)}),C(g=>{ye(t,A=>{delete g.containedEdges[A],ye(g.edges,(C,I)=>{C.id!==A?C.clusteringEdgeReplacingIds=this._filter(C.clusteringEdgeReplacingIds,function(g){return!t[g]}):g.edges[I]=null}),g.edges=this._filter(g.edges,function(g){return null!==g})})}),ye(t,g=>{delete this.clusteredEdges[g]}),ye(t,g=>{delete this.body.edges[g]});ye(uh(this.body.edges),g=>{const A=this.body.edges[g],t=this._isClusteredNode(A.fromId)||this._isClusteredNode(A.toId);if(t!==this._isClusteredEdge(A.id))if(t){const g=this._getClusterNodeForNode(A.fromId);void 0!==g&&this._clusterEdges(this.body.nodes[A.fromId],A,g);const t=this._getClusterNodeForNode(A.toId);void 0!==t&&this._clusterEdges(this.body.nodes[A.toId],A,t)}else delete this._clusterEdges[g],this._restoreEdge(A)});let I=!1,e=!0;for(;e;){const g=[];C(function(A){const t=uh(A.containedNodes).length,C=!0===A.options.allowSingleNodeCluster;(C&&t<1||!C&&t<2)&&g.push(A.id)});for(let A=0;A<g.length;++A)this.openCluster(g[A],{},!1);e=g.length>0,I=I||e}I&&this._updateState()}_isClusteredNode(g){return void 0!==this.clusteredNodes[g]}_isClusteredEdge(g){return void 0!==this.clusteredEdges[g]}}class oy{constructor(g,A){this.body=g,this.canvas=A,this.redrawRequested=!1,this.requestAnimationFrameRequestId=void 0,this.renderingActive=!1,this.renderRequests=0,this.allowRedraw=!0,this.dragging=!1,this.zooming=!1,this.options={},this.defaultOptions={hideEdgesOnDrag:!1,hideEdgesOnZoom:!1,hideNodesOnDrag:!1},Xt(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){var g;this.body.emitter.on("dragStart",()=>{this.dragging=!0}),this.body.emitter.on("dragEnd",()=>{this.dragging=!1}),this.body.emitter.on("zoom",()=>{this.zooming=!0,window.clearTimeout(this.zoomTimeoutId),this.zoomTimeoutId=Yh(()=>{var g;this.zooming=!1,IC(g=this._requestRedraw).call(g,this)()},250)}),this.body.emitter.on("_resizeNodes",()=>{this._resizeNodes()}),this.body.emitter.on("_redraw",()=>{!1===this.renderingActive&&this._redraw()}),this.body.emitter.on("_blockRedraw",()=>{this.allowRedraw=!1}),this.body.emitter.on("_allowRedraw",()=>{this.allowRedraw=!0,this.redrawRequested=!1}),this.body.emitter.on("_requestRedraw",IC(g=this._requestRedraw).call(g,this)),this.body.emitter.on("_startRendering",()=>{this.renderRequests+=1,this.renderingActive=!0,this._startRendering()}),this.body.emitter.on("_stopRendering",()=>{this.renderRequests-=1,this.renderingActive=this.renderRequests>0,this.requestAnimationFrameRequestId=void 0}),this.body.emitter.on("destroy",()=>{this.renderRequests=0,this.allowRedraw=!1,this.renderingActive=!1,window.cancelAnimationFrame(this.requestAnimationFrameRequestId),this.body.emitter.off()})}setOptions(g){if(void 0!==g){ue(["hideEdgesOnDrag","hideEdgesOnZoom","hideNodesOnDrag"],this.options,g)}}_startRendering(){var g;!0===this.renderingActive&&(void 0===this.requestAnimationFrameRequestId&&(this.requestAnimationFrameRequestId=window.requestAnimationFrame(IC(g=this._renderStep).call(g,this),this.simulationInterval)))}_renderStep(){!0===this.renderingActive&&(this.requestAnimationFrameRequestId=void 0,this._startRendering(),this._redraw())}redraw(){this.body.emitter.emit("setSize"),this._redraw()}_requestRedraw(){!0!==this.redrawRequested&&!1===this.renderingActive&&!0===this.allowRedraw&&(this.redrawRequested=!0,window.requestAnimationFrame(()=>{this._redraw(!1)}))}_redraw(){let g=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!0===this.allowRedraw){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1;const A={drawExternalLabels:null};0!==this.canvas.frame.canvas.width&&0!==this.canvas.frame.canvas.height||this.canvas.setSize(),this.canvas.setTransform();const t=this.canvas.getContext(),C=this.canvas.frame.canvas.clientWidth,I=this.canvas.frame.canvas.clientHeight;if(t.clearRect(0,0,C,I),0===this.canvas.frame.clientWidth)return;if(t.save(),t.translate(this.body.view.translation.x,this.body.view.translation.y),t.scale(this.body.view.scale,this.body.view.scale),t.beginPath(),this.body.emitter.emit("beforeDrawing",t),t.closePath(),!1===g&&(!1===this.dragging||!0===this.dragging&&!1===this.options.hideEdgesOnDrag)&&(!1===this.zooming||!0===this.zooming&&!1===this.options.hideEdgesOnZoom)&&this._drawEdges(t),!1===this.dragging||!0===this.dragging&&!1===this.options.hideNodesOnDrag){const{drawExternalLabels:C}=this._drawNodes(t,g);A.drawExternalLabels=C}!1===g&&(!1===this.dragging||!0===this.dragging&&!1===this.options.hideEdgesOnDrag)&&(!1===this.zooming||!0===this.zooming&&!1===this.options.hideEdgesOnZoom)&&this._drawArrows(t),null!=A.drawExternalLabels&&A.drawExternalLabels(),!1===g&&this._drawSelectionBox(t),t.beginPath(),this.body.emitter.emit("afterDrawing",t),t.closePath(),t.restore(),!0===g&&t.clearRect(0,0,C,I)}}_resizeNodes(){this.canvas.setTransform();const g=this.canvas.getContext();g.save(),g.translate(this.body.view.translation.x,this.body.view.translation.y),g.scale(this.body.view.scale,this.body.view.scale);const A=this.body.nodes;let t;for(const C in A)Object.prototype.hasOwnProperty.call(A,C)&&(t=A[C],t.resize(g),t.updateBoundingBox(g,t.selected));g.restore()}_drawNodes(g){let A=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const t=this.body.nodes,C=this.body.nodeIndices;let I;const e=[],i=[],o=this.canvas.DOMtoCanvas({x:-20,y:-20}),n=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+20,y:this.canvas.frame.canvas.clientHeight+20}),s={top:o.y,left:o.x,bottom:n.y,right:n.x},r=[];for(let o=0;o<C.length;o++)if(I=t[C[o]],I.hover)i.push(C[o]);else if(I.isSelected())e.push(C[o]);else if(!0===A){const A=I.draw(g);null!=A.drawExternalLabel&&r.push(A.drawExternalLabel)}else if(!0===I.isBoundingBoxOverlappingWith(s)){const A=I.draw(g);null!=A.drawExternalLabel&&r.push(A.drawExternalLabel)}else I.updateBoundingBox(g,I.selected);let a;const d=e.length,h=i.length;for(a=0;a<d;a++){I=t[e[a]];const A=I.draw(g);null!=A.drawExternalLabel&&r.push(A.drawExternalLabel)}for(a=0;a<h;a++){I=t[i[a]];const A=I.draw(g);null!=A.drawExternalLabel&&r.push(A.drawExternalLabel)}return{drawExternalLabels:()=>{for(const g of r)g()}}}_drawEdges(g){const A=this.body.edges,t=this.body.edgeIndices;for(let C=0;C<t.length;C++){const I=A[t[C]];!0===I.connected&&I.draw(g)}}_drawArrows(g){const A=this.body.edges,t=this.body.edgeIndices;for(let C=0;C<t.length;C++){const I=A[t[C]];!0===I.connected&&I.drawArrows(g)}}_drawSelectionBox(g){if(this.body.selectionBox.show){g.beginPath();const A=this.body.selectionBox.position.end.x-this.body.selectionBox.position.start.x,t=this.body.selectionBox.position.end.y-this.body.selectionBox.position.start.y;g.rect(this.body.selectionBox.position.start.x,this.body.selectionBox.position.start.y,A,t),g.fillStyle="rgba(151, 194, 252, 0.2)",g.fillRect(this.body.selectionBox.position.start.x,this.body.selectionBox.position.start.y,A,t),g.strokeStyle="rgba(151, 194, 252, 1)",g.stroke()}else g.closePath()}}function ny(){return gy?$m:(gy=1,Lh(),$m=Tg().setInterval)}var sy=C(ty?Ay:(ty=1,Ay=ny()));function ry(g,A){A.inputHandler=function(g){g.isFirst&&A(g)},g.on("hammer.input",A.inputHandler)}function ay(g,A){return A.inputHandler=function(g){g.isFinal&&A(g)},g.on("hammer.input",A.inputHandler)}class dy{constructor(g){this.body=g,this.pixelRatio=1,this.cameraState={},this.initialized=!1,this.canvasViewCenter={},this._cleanupCallbacks=[],this.options={},this.defaultOptions={autoResize:!0,height:"100%",width:"100%"},Xt(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){var g;this.body.emitter.once("resize",g=>{0!==g.width&&(this.body.view.translation.x=.5*g.width),0!==g.height&&(this.body.view.translation.y=.5*g.height)}),this.body.emitter.on("setSize",IC(g=this.setSize).call(g,this)),this.body.emitter.on("destroy",()=>{this.hammerFrame.destroy(),this.hammer.destroy(),this._cleanUp()})}setOptions(g){if(void 0!==g){ue(["width","height","autoResize"],this.options,g)}if(this._cleanUp(),!0===this.options.autoResize){var A;if(window.ResizeObserver){const g=new ResizeObserver(()=>{!0===this.setSize()&&this.body.emitter.emit("_requestRedraw")}),{frame:A}=this;g.observe(A),this._cleanupCallbacks.push(()=>{g.unobserve(A)})}else{const g=sy(()=>{!0===this.setSize()&&this.body.emitter.emit("_requestRedraw")},1e3);this._cleanupCallbacks.push(()=>{clearInterval(g)})}const g=IC(A=this._onResize).call(A,this);window.addEventListener("resize",g),this._cleanupCallbacks.push(()=>{window.removeEventListener("resize",g)})}}_cleanUp(){var g,A,t;jn(g=Cy(A=pn(t=this._cleanupCallbacks).call(t,0)).call(A)).call(g,g=>{try{g()}catch(g){console.error(g)}})}_onResize(){this.setSize(),this.body.emitter.emit("_redraw")}_getCameraState(){let g=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.pixelRatio;!0===this.initialized&&(this.cameraState.previousWidth=this.frame.canvas.width/g,this.cameraState.previousHeight=this.frame.canvas.height/g,this.cameraState.scale=this.body.view.scale,this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/g,y:.5*this.frame.canvas.height/g}))}_setCameraState(){if(void 0!==this.cameraState.scale&&0!==this.frame.canvas.clientWidth&&0!==this.frame.canvas.clientHeight&&0!==this.pixelRatio&&this.cameraState.previousWidth>0&&this.cameraState.previousHeight>0){const g=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,A=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight;let t=this.cameraState.scale;1!=g&&1!=A?t=.5*this.cameraState.scale*(g+A):1!=g?t=this.cameraState.scale*g:1!=A&&(t=this.cameraState.scale*A),this.body.view.scale=t;const C=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),I={x:C.x-this.cameraState.position.x,y:C.y-this.cameraState.position.y};this.body.view.translation.x+=I.x*this.body.view.scale,this.body.view.translation.y+=I.y*this.body.view.scale}}_prepareValue(g){if("number"==typeof g)return g+"px";if("string"==typeof g){if(-1!==Si(g).call(g,"%")||-1!==Si(g).call(g,"px"))return g;if(-1===Si(g).call(g,"%"))return g+"px"}throw new Error("Could not use the value supplied for width or height:"+g)}_create(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=0,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext)this._setPixelRatio(),this.setTransform();else{const g=document.createElement("DIV");g.style.color="red",g.style.fontWeight="bold",g.style.padding="10px",g.innerText="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(g)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}_bindHammer(){void 0!==this.hammer&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new We(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:We.DIRECTION_ALL}),ry(this.hammer,g=>{this.body.eventListeners.onTouch(g)}),this.hammer.on("tap",g=>{this.body.eventListeners.onTap(g)}),this.hammer.on("doubletap",g=>{this.body.eventListeners.onDoubleTap(g)}),this.hammer.on("press",g=>{this.body.eventListeners.onHold(g)}),this.hammer.on("panstart",g=>{this.body.eventListeners.onDragStart(g)}),this.hammer.on("panmove",g=>{this.body.eventListeners.onDrag(g)}),this.hammer.on("panend",g=>{this.body.eventListeners.onDragEnd(g)}),this.hammer.on("pinch",g=>{this.body.eventListeners.onPinch(g)}),this.frame.canvas.addEventListener("wheel",g=>{this.body.eventListeners.onMouseWheel(g)}),this.frame.canvas.addEventListener("mousemove",g=>{this.body.eventListeners.onMouseMove(g)}),this.frame.canvas.addEventListener("contextmenu",g=>{this.body.eventListeners.onContext(g)}),this.hammerFrame=new We(this.frame),ay(this.hammerFrame,g=>{this.body.eventListeners.onRelease(g)})}setSize(){let g=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.width,A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.height;g=this._prepareValue(g),A=this._prepareValue(A);let t=!1;const C=this.frame.canvas.width,I=this.frame.canvas.height,e=this.pixelRatio;if(this._setPixelRatio(),g!=this.options.width||A!=this.options.height||this.frame.style.width!=g||this.frame.style.height!=A)this._getCameraState(e),this.frame.style.width=g,this.frame.style.height=A,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=g,this.options.height=A,this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight},t=!0;else{const g=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),A=Math.round(this.frame.canvas.clientHeight*this.pixelRatio);this.frame.canvas.width===g&&this.frame.canvas.height===A||this._getCameraState(e),this.frame.canvas.width!==g&&(this.frame.canvas.width=g,t=!0),this.frame.canvas.height!==A&&(this.frame.canvas.height=A,t=!0)}return!0===t&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(C/this.pixelRatio),oldHeight:Math.round(I/this.pixelRatio)}),this._setCameraState()),this.initialized=!0,t}getContext(){return this.frame.canvas.getContext("2d")}_determinePixelRatio(){const g=this.getContext();if(void 0===g)throw new Error("Could not get canvax context");let A=1;"undefined"!=typeof window&&(A=window.devicePixelRatio||1);return A/(g.webkitBackingStorePixelRatio||g.mozBackingStorePixelRatio||g.msBackingStorePixelRatio||g.oBackingStorePixelRatio||g.backingStorePixelRatio||1)}_setPixelRatio(){this.pixelRatio=this._determinePixelRatio()}setTransform(){const g=this.getContext();if(void 0===g)throw new Error("Could not get canvax context");g.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}_XconvertDOMtoCanvas(g){return(g-this.body.view.translation.x)/this.body.view.scale}_XconvertCanvasToDOM(g){return g*this.body.view.scale+this.body.view.translation.x}_YconvertDOMtoCanvas(g){return(g-this.body.view.translation.y)/this.body.view.scale}_YconvertCanvasToDOM(g){return g*this.body.view.scale+this.body.view.translation.y}canvasToDOM(g){return{x:this._XconvertCanvasToDOM(g.x),y:this._YconvertCanvasToDOM(g.y)}}DOMtoCanvas(g){return{x:this._XconvertDOMtoCanvas(g.x),y:this._YconvertDOMtoCanvas(g.y)}}}class hy{constructor(g,A){var t,C;this.body=g,this.canvas=A,this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0,this.touchTime=0,this.viewFunction=void 0,this.body.emitter.on("fit",IC(t=this.fit).call(t,this)),this.body.emitter.on("animationFinished",()=>{this.body.emitter.emit("_stopRendering")}),this.body.emitter.on("unlockNode",IC(C=this.releaseNode).call(C,this))}setOptions(){let g=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=g}fit(g){let A=arguments.length>1&&void 0!==arguments[1]&&arguments[1];g=function(g,A){const t=Xt({nodes:A,minZoomLevel:Number.MIN_VALUE,maxZoomLevel:1},null!=g?g:{});if(!Mn(t.nodes))throw new TypeError("Nodes has to be an array of ids.");if(0===t.nodes.length&&(t.nodes=A),!("number"==typeof t.minZoomLevel&&t.minZoomLevel>0))throw new TypeError("Min zoom level has to be a number higher than zero.");if(!("number"==typeof t.maxZoomLevel&&t.minZoomLevel<=t.maxZoomLevel))throw new TypeError("Max zoom level has to be a number higher than min zoom level.");return t}(g,this.body.nodeIndices);const t=this.canvas.frame.canvas.clientWidth,C=this.canvas.frame.canvas.clientHeight;let I,e;if(0===t||0===C)e=1,I=Iy.getRange(this.body.nodes,g.nodes);else if(!0===A){let A=0;for(const g in this.body.nodes)if(Object.prototype.hasOwnProperty.call(this.body.nodes,g)){!0===this.body.nodes[g].predefinedPosition&&(A+=1)}if(A>.5*this.body.nodeIndices.length)return void this.fit(g,!1);I=Iy.getRange(this.body.nodes,g.nodes);e=12.662/(this.body.nodeIndices.length+7.4147)+.0964822;e*=Math.min(t/600,C/600)}else{this.body.emitter.emit("_resizeNodes"),I=Iy.getRange(this.body.nodes,g.nodes);const A=t/(1.1*Math.abs(I.maxX-I.minX)),i=C/(1.1*Math.abs(I.maxY-I.minY));e=A<=i?A:i}e>g.maxZoomLevel?e=g.maxZoomLevel:e<g.minZoomLevel&&(e=g.minZoomLevel);const i={position:Iy.findCenter(I),scale:e,animation:g.animation};this.moveTo(i)}focus(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(void 0!==this.body.nodes[g]){const t={x:this.body.nodes[g].x,y:this.body.nodes[g].y};A.position=t,A.lockedOnNode=g,this.moveTo(A)}else console.error("Node: "+g+" cannot be found.")}moveTo(g){if(void 0!==g){if(null!=g.offset){if(null!=g.offset.x){if(g.offset.x=+g.offset.x,!Ch(g.offset.x))throw new TypeError('The option "offset.x" has to be a finite number.')}else g.offset.x=0;if(null!=g.offset.y){if(g.offset.y=+g.offset.y,!Ch(g.offset.y))throw new TypeError('The option "offset.y" has to be a finite number.')}else g.offset.x=0}else g.offset={x:0,y:0};if(null!=g.position){if(null!=g.position.x){if(g.position.x=+g.position.x,!Ch(g.position.x))throw new TypeError('The option "position.x" has to be a finite number.')}else g.position.x=0;if(null!=g.position.y){if(g.position.y=+g.position.y,!Ch(g.position.y))throw new TypeError('The option "position.y" has to be a finite number.')}else g.position.x=0}else g.position=this.getViewPosition();if(null!=g.scale){if(g.scale=+g.scale,!(g.scale>0))throw new TypeError('The option "scale" has to be a number greater than zero.')}else g.scale=this.body.view.scale;void 0===g.animation&&(g.animation={duration:0}),!1===g.animation&&(g.animation={duration:0}),!0===g.animation&&(g.animation={}),void 0===g.animation.duration&&(g.animation.duration=1e3),void 0===g.animation.easingFunction&&(g.animation.easingFunction="easeInOutQuad"),this.animateView(g)}else g={}}animateView(g){if(void 0===g)return;this.animationEasingFunction=g.animation.easingFunction,this.releaseNode(),!0===g.locked&&(this.lockedOnNodeId=g.lockedOnNode,this.lockedOnNodeOffset=g.offset),0!=this.easingTime&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=g.scale,this.body.view.scale=this.targetScale;const A=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),t=A.x-g.position.x,C=A.y-g.position.y;var I,e;(this.targetTranslation={x:this.sourceTranslation.x+t*this.targetScale+g.offset.x,y:this.sourceTranslation.y+C*this.targetScale+g.offset.y},0===g.animation.duration)?null!=this.lockedOnNodeId?(this.viewFunction=IC(I=this._lockedRedraw).call(I,this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*g.animation.duration*.001)||1/60,this.animationEasingFunction=g.animation.easingFunction,this.viewFunction=IC(e=this._transitionRedraw).call(e,this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}_lockedRedraw(){const g=this.body.nodes[this.lockedOnNodeId].x,A=this.body.nodes[this.lockedOnNodeId].y,t=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),C=t.x-g,I=t.y-A,e=this.body.view.translation,i={x:e.x+C*this.body.view.scale+this.lockedOnNodeOffset.x,y:e.y+I*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=i}releaseNode(){void 0!==this.lockedOnNodeId&&void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}_transitionRedraw(){let g=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.easingTime+=this.animationSpeed,this.easingTime=!0===g?1:this.easingTime;const A=ze[this.animationEasingFunction](this.easingTime);if(this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*A,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*A,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*A},this.easingTime>=1){var t;if(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,null!=this.lockedOnNodeId)this.viewFunction=IC(t=this._lockedRedraw).call(t,this),this.body.emitter.on("initRedraw",this.viewFunction);this.body.emitter.emit("animationFinished")}}getScale(){return this.body.view.scale}getViewPosition(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}}function ly(g){var A,t=g&&g.preventDefault||!1,C=g&&g.container||window,I={},e={keydown:{},keyup:{}},i={};for(A=97;A<=122;A++)i[String.fromCharCode(A)]={code:A-97+65,shift:!1};for(A=65;A<=90;A++)i[String.fromCharCode(A)]={code:A,shift:!0};for(A=0;A<=9;A++)i[""+A]={code:48+A,shift:!1};for(A=1;A<=12;A++)i["F"+A]={code:111+A,shift:!1};for(A=0;A<=9;A++)i["num"+A]={code:96+A,shift:!1};i["num*"]={code:106,shift:!1},i["num+"]={code:107,shift:!1},i["num-"]={code:109,shift:!1},i["num/"]={code:111,shift:!1},i["num."]={code:110,shift:!1},i.left={code:37,shift:!1},i.up={code:38,shift:!1},i.right={code:39,shift:!1},i.down={code:40,shift:!1},i.space={code:32,shift:!1},i.enter={code:13,shift:!1},i.shift={code:16,shift:void 0},i.esc={code:27,shift:!1},i.backspace={code:8,shift:!1},i.tab={code:9,shift:!1},i.ctrl={code:17,shift:!1},i.alt={code:18,shift:!1},i.delete={code:46,shift:!1},i.pageup={code:33,shift:!1},i.pagedown={code:34,shift:!1},i["="]={code:187,shift:!1},i["-"]={code:189,shift:!1},i["]"]={code:221,shift:!1},i["["]={code:219,shift:!1};var o=function(g){s(g,"keydown")},n=function(g){s(g,"keyup")},s=function(g,A){if(void 0!==e[A][g.keyCode]){for(var C=e[A][g.keyCode],I=0;I<C.length;I++)(void 0===C[I].shift||1==C[I].shift&&1==g.shiftKey||0==C[I].shift&&0==g.shiftKey)&&C[I].fn(g);1==t&&g.preventDefault()}};return I.bind=function(g,A,t){if(void 0===t&&(t="keydown"),void 0===i[g])throw new Error("unsupported key: "+g);void 0===e[t][i[g].code]&&(e[t][i[g].code]=[]),e[t][i[g].code].push({fn:A,shift:i[g].shift})},I.bindAll=function(g,A){for(var t in void 0===A&&(A="keydown"),i)i.hasOwnProperty(t)&&I.bind(t,g,A)},I.getKey=function(g){for(var A in i)if(i.hasOwnProperty(A)){if(1==g.shiftKey&&1==i[A].shift&&g.keyCode==i[A].code)return A;if(0==g.shiftKey&&0==i[A].shift&&g.keyCode==i[A].code)return A;if(g.keyCode==i[A].code&&"shift"==A)return A}return"unknown key, currently not supported"},I.unbind=function(g,A,t){if(void 0===t&&(t="keydown"),void 0===i[g])throw new Error("unsupported key: "+g);if(void 0!==A){var C=[],I=e[t][i[g].code];if(void 0!==I)for(var o=0;o<I.length;o++)I[o].fn==A&&I[o].shift==i[g].shift||C.push(e[t][i[g].code][o]);e[t][i[g].code]=C}else e[t][i[g].code]=[]},I.reset=function(){e={keydown:{},keyup:{}}},I.destroy=function(){e={keydown:{},keyup:{}},C.removeEventListener("keydown",o,!0),C.removeEventListener("keyup",n,!0)},C.addEventListener("keydown",o,!0),C.addEventListener("keyup",n,!0),I}class cy{constructor(g,A){this.body=g,this.canvas=A,this.iconsCreated=!1,this.navigationHammers=[],this.boundFunctions={},this.touchTime=0,this.activated=!1,this.body.emitter.on("activate",()=>{this.activated=!0,this.configureKeyboardBindings()}),this.body.emitter.on("deactivate",()=>{this.activated=!1,this.configureKeyboardBindings()}),this.body.emitter.on("destroy",()=>{void 0!==this.keycharm&&this.keycharm.destroy()}),this.options={}}setOptions(g){void 0!==g&&(this.options=g,this.create())}create(){!0===this.options.navigationButtons?!1===this.iconsCreated&&this.loadNavigationElements():!0===this.iconsCreated&&this.cleanNavigation(),this.configureKeyboardBindings()}cleanNavigation(){if(0!=this.navigationHammers.length){for(let g=0;g<this.navigationHammers.length;g++)this.navigationHammers[g].destroy();this.navigationHammers=[]}this.navigationDOM&&this.navigationDOM.wrapper&&this.navigationDOM.wrapper.parentNode&&this.navigationDOM.wrapper.parentNode.removeChild(this.navigationDOM.wrapper),this.iconsCreated=!1}loadNavigationElements(){this.cleanNavigation(),this.navigationDOM={};const g=["up","down","left","right","zoomIn","zoomOut","zoomExtends"],A=["_moveUp","_moveDown","_moveLeft","_moveRight","_zoomIn","_zoomOut","_fit"];this.navigationDOM.wrapper=document.createElement("div"),this.navigationDOM.wrapper.className="vis-navigation",this.canvas.frame.appendChild(this.navigationDOM.wrapper);for(let I=0;I<g.length;I++){this.navigationDOM[g[I]]=document.createElement("div"),this.navigationDOM[g[I]].className="vis-button vis-"+g[I],this.navigationDOM.wrapper.appendChild(this.navigationDOM[g[I]]);const e=new We(this.navigationDOM[g[I]]);var t,C;if("_fit"===A[I])ry(e,IC(t=this._fit).call(t,this));else ry(e,IC(C=this.bindToRedraw).call(C,this,A[I]));this.navigationHammers.push(e)}const I=new We(this.canvas.frame);ay(I,()=>{this._stopMovement()}),this.navigationHammers.push(I),this.iconsCreated=!0}bindToRedraw(g){var A;void 0===this.boundFunctions[g]&&(this.boundFunctions[g]=IC(A=this[g]).call(A,this),this.body.emitter.on("initRedraw",this.boundFunctions[g]),this.body.emitter.emit("_startRendering"))}unbindFromRedraw(g){void 0!==this.boundFunctions[g]&&(this.body.emitter.off("initRedraw",this.boundFunctions[g]),this.body.emitter.emit("_stopRendering"),delete this.boundFunctions[g])}_fit(){(new Date).valueOf()-this.touchTime>700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=(new Date).valueOf())}_stopMovement(){for(const g in this.boundFunctions)Object.prototype.hasOwnProperty.call(this.boundFunctions,g)&&(this.body.emitter.off("initRedraw",this.boundFunctions[g]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}_moveUp(){this.body.view.translation.y+=this.options.keyboard.speed.y}_moveDown(){this.body.view.translation.y-=this.options.keyboard.speed.y}_moveLeft(){this.body.view.translation.x+=this.options.keyboard.speed.x}_moveRight(){this.body.view.translation.x-=this.options.keyboard.speed.x}_zoomIn(){const g=this.body.view.scale,A=this.body.view.scale*(1+this.options.keyboard.speed.zoom),t=this.body.view.translation,C=A/g,I=(1-C)*this.canvas.canvasViewCenter.x+t.x*C,e=(1-C)*this.canvas.canvasViewCenter.y+t.y*C;this.body.view.scale=A,this.body.view.translation={x:I,y:e},this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:null})}_zoomOut(){const g=this.body.view.scale,A=this.body.view.scale/(1+this.options.keyboard.speed.zoom),t=this.body.view.translation,C=A/g,I=(1-C)*this.canvas.canvasViewCenter.x+t.x*C,e=(1-C)*this.canvas.canvasViewCenter.y+t.y*C;this.body.view.scale=A,this.body.view.translation={x:I,y:e},this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:null})}configureKeyboardBindings(){var g,A,t,C,I,e,i,o,n,s,r,a,d,h,l,c,u,p,f,v,b,m,y,w;(void 0!==this.keycharm&&this.keycharm.destroy(),!0===this.options.keyboard.enabled)&&(!0===this.options.keyboard.bindToWindow?this.keycharm=ly({container:window,preventDefault:!0}):this.keycharm=ly({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),!0===this.activated&&(IC(g=this.keycharm).call(g,"up",()=>{this.bindToRedraw("_moveUp")},"keydown"),IC(A=this.keycharm).call(A,"down",()=>{this.bindToRedraw("_moveDown")},"keydown"),IC(t=this.keycharm).call(t,"left",()=>{this.bindToRedraw("_moveLeft")},"keydown"),IC(C=this.keycharm).call(C,"right",()=>{this.bindToRedraw("_moveRight")},"keydown"),IC(I=this.keycharm).call(I,"=",()=>{this.bindToRedraw("_zoomIn")},"keydown"),IC(e=this.keycharm).call(e,"num+",()=>{this.bindToRedraw("_zoomIn")},"keydown"),IC(i=this.keycharm).call(i,"num-",()=>{this.bindToRedraw("_zoomOut")},"keydown"),IC(o=this.keycharm).call(o,"-",()=>{this.bindToRedraw("_zoomOut")},"keydown"),IC(n=this.keycharm).call(n,"[",()=>{this.bindToRedraw("_zoomOut")},"keydown"),IC(s=this.keycharm).call(s,"]",()=>{this.bindToRedraw("_zoomIn")},"keydown"),IC(r=this.keycharm).call(r,"pageup",()=>{this.bindToRedraw("_zoomIn")},"keydown"),IC(a=this.keycharm).call(a,"pagedown",()=>{this.bindToRedraw("_zoomOut")},"keydown"),IC(d=this.keycharm).call(d,"up",()=>{this.unbindFromRedraw("_moveUp")},"keyup"),IC(h=this.keycharm).call(h,"down",()=>{this.unbindFromRedraw("_moveDown")},"keyup"),IC(l=this.keycharm).call(l,"left",()=>{this.unbindFromRedraw("_moveLeft")},"keyup"),IC(c=this.keycharm).call(c,"right",()=>{this.unbindFromRedraw("_moveRight")},"keyup"),IC(u=this.keycharm).call(u,"=",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),IC(p=this.keycharm).call(p,"num+",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),IC(f=this.keycharm).call(f,"num-",()=>{this.unbindFromRedraw("_zoomOut")},"keyup"),IC(v=this.keycharm).call(v,"-",()=>{this.unbindFromRedraw("_zoomOut")},"keyup"),IC(b=this.keycharm).call(b,"[",()=>{this.unbindFromRedraw("_zoomOut")},"keyup"),IC(m=this.keycharm).call(m,"]",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),IC(y=this.keycharm).call(y,"pageup",()=>{this.unbindFromRedraw("_zoomIn")},"keyup"),IC(w=this.keycharm).call(w,"pagedown",()=>{this.unbindFromRedraw("_zoomOut")},"keyup")))}}class uy{constructor(g,A,t){var C,I,e,i,o,n,s,r,a,d,h,l,c;this.body=g,this.canvas=A,this.selectionHandler=t,this.navigationHandler=new cy(g,A),this.body.eventListeners.onTap=IC(C=this.onTap).call(C,this),this.body.eventListeners.onTouch=IC(I=this.onTouch).call(I,this),this.body.eventListeners.onDoubleTap=IC(e=this.onDoubleTap).call(e,this),this.body.eventListeners.onHold=IC(i=this.onHold).call(i,this),this.body.eventListeners.onDragStart=IC(o=this.onDragStart).call(o,this),this.body.eventListeners.onDrag=IC(n=this.onDrag).call(n,this),this.body.eventListeners.onDragEnd=IC(s=this.onDragEnd).call(s,this),this.body.eventListeners.onMouseWheel=IC(r=this.onMouseWheel).call(r,this),this.body.eventListeners.onPinch=IC(a=this.onPinch).call(a,this),this.body.eventListeners.onMouseMove=IC(d=this.onMouseMove).call(d,this),this.body.eventListeners.onRelease=IC(h=this.onRelease).call(h,this),this.body.eventListeners.onContext=IC(l=this.onContext).call(l,this),this.touchTime=0,this.drag={},this.pinch={},this.popup=void 0,this.popupObj=void 0,this.popupTimer=void 0,this.body.functions.getPointer=IC(c=this.getPointer).call(c,this),this.options={},this.defaultOptions={dragNodes:!0,dragView:!0,hover:!1,keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02},bindToWindow:!0,autoFocus:!0},navigationButtons:!1,tooltipDelay:300,zoomView:!0,zoomSpeed:1},Xt(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("destroy",()=>{clearTimeout(this.popupTimer),delete this.body.functions.getPointer})}setOptions(g){if(void 0!==g){pe(["hideEdgesOnDrag","hideEdgesOnZoom","hideNodesOnDrag","keyboard","multiselect","selectable","selectConnectedEdges"],this.options,g),Me(this.options,g,"keyboard"),g.tooltip&&(Xt(this.options.tooltip,g.tooltip),g.tooltip.color&&(this.options.tooltip.color=Oe(g.tooltip.color)))}this.navigationHandler.setOptions(this.options)}getPointer(g){return{x:g.x-(A=this.canvas.frame.canvas,A.getBoundingClientRect().left),y:g.y-me(this.canvas.frame.canvas)};var A}onTouch(g){(new Date).valueOf()-this.touchTime>50&&(this.drag.pointer=this.getPointer(g.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=(new Date).valueOf())}onTap(g){const A=this.getPointer(g.center),t=this.selectionHandler.options.multiselect&&(g.changedPointers[0].ctrlKey||g.changedPointers[0].metaKey);this.checkSelectionChanges(A,t),this.selectionHandler.commitAndEmit(A,g),this.selectionHandler.generateClickEvent("click",g,A)}onDoubleTap(g){const A=this.getPointer(g.center);this.selectionHandler.generateClickEvent("doubleClick",g,A)}onHold(g){const A=this.getPointer(g.center),t=this.selectionHandler.options.multiselect;this.checkSelectionChanges(A,t),this.selectionHandler.commitAndEmit(A,g),this.selectionHandler.generateClickEvent("click",g,A),this.selectionHandler.generateClickEvent("hold",g,A)}onRelease(g){if((new Date).valueOf()-this.touchTime>10){const A=this.getPointer(g.center);this.selectionHandler.generateClickEvent("release",g,A),this.touchTime=(new Date).valueOf()}}onContext(g){const A=this.getPointer({x:g.clientX,y:g.clientY});this.selectionHandler.generateClickEvent("oncontext",g,A)}checkSelectionChanges(g){!0===(arguments.length>1&&void 0!==arguments[1]&&arguments[1])?this.selectionHandler.selectAdditionalOnPoint(g):this.selectionHandler.selectOnPoint(g)}_determineDifference(g,A){const t=function(g,A){const t=[];for(let C=0;C<g.length;C++){const I=g[C];-1===Si(A).call(A,I)&&t.push(I)}return t};return{nodes:t(g.nodes,A.nodes),edges:t(g.edges,A.edges)}}onDragStart(g){if(this.drag.dragging)return;void 0===this.drag.pointer&&this.onTouch(g);const A=this.selectionHandler.getNodeAt(this.drag.pointer);if(this.drag.dragging=!0,this.drag.selection=[],this.drag.translation=Xt({},this.body.view.translation),this.drag.nodeId=void 0,g.srcEvent.shiftKey){this.body.selectionBox.show=!0;const A=this.getPointer(g.center);this.body.selectionBox.position.start={x:this.canvas._XconvertDOMtoCanvas(A.x),y:this.canvas._YconvertDOMtoCanvas(A.y)},this.body.selectionBox.position.end={x:this.canvas._XconvertDOMtoCanvas(A.x),y:this.canvas._YconvertDOMtoCanvas(A.y)}}else if(void 0!==A&&!0===this.options.dragNodes){this.drag.nodeId=A.id,!1===A.isSelected()&&this.selectionHandler.setSelection({nodes:[A.id]}),this.selectionHandler.generateClickEvent("dragStart",g,this.drag.pointer);for(const g of this.selectionHandler.getSelectedNodes()){const A={id:g.id,node:g,x:g.x,y:g.y,xFixed:g.options.fixed.x,yFixed:g.options.fixed.y};g.options.fixed.x=!0,g.options.fixed.y=!0,this.drag.selection.push(A)}}else this.selectionHandler.generateClickEvent("dragStart",g,this.drag.pointer,void 0,!0)}onDrag(g){if(!0===this.drag.pinched)return;this.body.emitter.emit("unlockNode");const A=this.getPointer(g.center),t=this.drag.selection;if(t&&t.length&&!0===this.options.dragNodes){this.selectionHandler.generateClickEvent("dragging",g,A);const C=A.x-this.drag.pointer.x,I=A.y-this.drag.pointer.y;jn(t).call(t,g=>{const A=g.node;!1===g.xFixed&&(A.x=this.canvas._XconvertDOMtoCanvas(this.canvas._XconvertCanvasToDOM(g.x)+C)),!1===g.yFixed&&(A.y=this.canvas._YconvertDOMtoCanvas(this.canvas._YconvertCanvasToDOM(g.y)+I))}),this.body.emitter.emit("startSimulation")}else{if(g.srcEvent.shiftKey){if(this.selectionHandler.generateClickEvent("dragging",g,A,void 0,!0),void 0===this.drag.pointer)return void this.onDragStart(g);this.body.selectionBox.position.end={x:this.canvas._XconvertDOMtoCanvas(A.x),y:this.canvas._YconvertDOMtoCanvas(A.y)},this.body.emitter.emit("_requestRedraw")}if(!0===this.options.dragView&&!g.srcEvent.shiftKey){if(this.selectionHandler.generateClickEvent("dragging",g,A,void 0,!0),void 0===this.drag.pointer)return void this.onDragStart(g);const t=A.x-this.drag.pointer.x,C=A.y-this.drag.pointer.y;this.body.view.translation={x:this.drag.translation.x+t,y:this.drag.translation.y+C},this.body.emitter.emit("_requestRedraw")}}}onDragEnd(g){if(this.drag.dragging=!1,this.body.selectionBox.show){var A;this.body.selectionBox.show=!1;const t=this.body.selectionBox.position,C={minX:Math.min(t.start.x,t.end.x),minY:Math.min(t.start.y,t.end.y),maxX:Math.max(t.start.x,t.end.x),maxY:Math.max(t.start.y,t.end.y)},I=Wp(A=this.body.nodeIndices).call(A,g=>{const A=this.body.nodes[g];return A.x>=C.minX&&A.x<=C.maxX&&A.y>=C.minY&&A.y<=C.maxY});jn(I).call(I,g=>this.selectionHandler.selectObject(this.body.nodes[g]));const e=this.getPointer(g.center);this.selectionHandler.commitAndEmit(e,g),this.selectionHandler.generateClickEvent("dragEnd",g,this.getPointer(g.center),void 0,!0),this.body.emitter.emit("_requestRedraw")}else{const A=this.drag.selection;A&&A.length?(jn(A).call(A,function(g){g.node.options.fixed.x=g.xFixed,g.node.options.fixed.y=g.yFixed}),this.selectionHandler.generateClickEvent("dragEnd",g,this.getPointer(g.center)),this.body.emitter.emit("startSimulation")):(this.selectionHandler.generateClickEvent("dragEnd",g,this.getPointer(g.center),void 0,!0),this.body.emitter.emit("_requestRedraw"))}}onPinch(g){const A=this.getPointer(g.center);this.drag.pinched=!0,void 0===this.pinch.scale&&(this.pinch.scale=1);const t=this.pinch.scale*g.scale;this.zoom(t,A)}zoom(g,A){if(!0===this.options.zoomView){const t=this.body.view.scale;let C;g<1e-5&&(g=1e-5),g>10&&(g=10),void 0!==this.drag&&!0===this.drag.dragging&&(C=this.canvas.DOMtoCanvas(this.drag.pointer));const I=this.body.view.translation,e=g/t,i=(1-e)*A.x+I.x*e,o=(1-e)*A.y+I.y*e;if(this.body.view.scale=g,this.body.view.translation={x:i,y:o},null!=C){const g=this.canvas.canvasToDOM(C);this.drag.pointer.x=g.x,this.drag.pointer.y=g.y}this.body.emitter.emit("_requestRedraw"),t<g?this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:A}):this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:A})}}onMouseWheel(g){if(!0===this.options.zoomView){if(0!==g.deltaY){let A=this.body.view.scale;A*=1+(g.deltaY<0?1:-1)*(.1*this.options.zoomSpeed);const t=this.getPointer({x:g.clientX,y:g.clientY});this.zoom(A,t)}g.preventDefault()}}onMouseMove(g){const A=this.getPointer({x:g.clientX,y:g.clientY});let t=!1;void 0!==this.popup&&(!1===this.popup.hidden&&this._checkHidePopup(A),!1===this.popup.hidden&&(t=!0,this.popup.setPosition(A.x+3,A.y-5),this.popup.show())),this.options.keyboard.autoFocus&&!1===this.options.keyboard.bindToWindow&&!0===this.options.keyboard.enabled&&this.canvas.frame.focus(),!1===t&&(void 0!==this.popupTimer&&(clearInterval(this.popupTimer),this.popupTimer=void 0),this.drag.dragging||(this.popupTimer=Yh(()=>this._checkShowPopup(A),this.options.tooltipDelay))),!0===this.options.hover&&this.selectionHandler.hoverObject(g,A)}_checkShowPopup(g){const A=this.canvas._XconvertDOMtoCanvas(g.x),t=this.canvas._YconvertDOMtoCanvas(g.y),C={left:A,top:t,right:A,bottom:t},I=void 0===this.popupObj?void 0:this.popupObj.id;let e=!1,i="node";if(void 0===this.popupObj){const g=this.body.nodeIndices,A=this.body.nodes;let t;const I=[];for(let i=0;i<g.length;i++)t=A[g[i]],!0===t.isOverlappingWith(C)&&(e=!0,void 0!==t.getTitle()&&I.push(g[i]));I.length>0&&(this.popupObj=A[I[I.length-1]],e=!0)}if(void 0===this.popupObj&&!1===e){const g=this.body.edgeIndices,A=this.body.edges;let t;const I=[];for(let e=0;e<g.length;e++)t=A[g[e]],!0===t.isOverlappingWith(C)&&!0===t.connected&&void 0!==t.getTitle()&&I.push(g[e]);I.length>0&&(this.popupObj=A[I[I.length-1]],i="edge")}void 0!==this.popupObj?this.popupObj.id!==I&&(void 0===this.popup&&(this.popup=new Qe(this.canvas.frame)),this.popup.popupTargetType=i,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(g.x+3,g.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):void 0!==this.popup&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}_checkHidePopup(g){const A=this.selectionHandler._pointerToPositionObject(g);let t=!1;if("node"===this.popup.popupTargetType){if(void 0!==this.body.nodes[this.popup.popupTargetId]&&(t=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(A),!0===t)){const A=this.selectionHandler.getNodeAt(g);t=void 0!==A&&A.id===this.popup.popupTargetId}}else void 0===this.selectionHandler.getNodeAt(g)&&void 0!==this.body.edges[this.popup.popupTargetId]&&(t=this.body.edges[this.popup.popupTargetId].isOverlappingWith(A));!1===t&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}}var py,fy,vy={};function by(){return fy||(fy=1,py||(py=1,Ua()("Set",function(g){return function(){return g(this,arguments.length?arguments[0]:void 0)}},Xa()))),vy}var my,yy,wy,xy,Ey,Oy,Ty,Dy,Ny,ky,Ry,Py,My,zy,By,Zy,Sy,Fy,Gy,jy,Ly,Vy={};function Yy(){if(yy)return my;yy=1;var g=Bg(),A=TypeError;return my=function(t){if("object"==typeof t&&"size"in t&&"has"in t&&"add"in t&&"delete"in t&&"keys"in t)return t;throw new A(g(t)+" is not a set")},my}function Wy(){if(xy)return wy;xy=1;var g=Dg(),A=Id(),t=g("Set"),C=t.prototype;return wy={Set:t,add:A("add",1),has:A("has",1),remove:A("delete",1),proto:C}}function Qy(){if(Oy)return Ey;Oy=1;var g=B();return Ey=function(A,t,C){for(var I,e,i=C?A:A.iterator,o=A.next;!(I=g(o,i)).done;)if(void 0!==(e=t(I.value)))return e},Ey}function Uy(){if(Dy)return Ty;Dy=1;var g=Qy();return Ty=function(A,t,C){return C?g(A.keys(),t,!0):A.forEach(t)},Ty}function Ky(){if(ky)return Ny;ky=1;var g=Wy(),A=Uy(),t=g.Set,C=g.add;return Ny=function(g){var I=new t;return A(g,function(g){C(I,g)}),I},Ny}function Hy(){return Py||(Py=1,Ry=function(g){return g.size}),Ry}function _y(){return zy?My:(zy=1,My=function(g){return{iterator:g,next:g.next,done:!1}})}function Xy(){if(Zy)return By;Zy=1;var g=Zg(),A=it(),t=B(),C=at(),I=_y(),e="Invalid size",i=RangeError,o=TypeError,n=Math.max,s=function(A,t){this.set=A,this.size=n(t,0),this.has=g(A.has),this.keys=g(A.keys)};return s.prototype={getIterator:function(){return I(A(t(this.keys,this.set)))},includes:function(g){return t(this.has,this.set,g)}},By=function(g){A(g);var t=+g.size;if(t!=t)throw new o(e);var I=C(t);if(I<0)throw new i(e);return new s(g,I)}}function Jy(){if(Fy)return Sy;Fy=1;var g=Yy(),A=Wy(),t=Ky(),C=Hy(),I=Xy(),e=Uy(),i=Qy(),o=A.has,n=A.remove;return Sy=function(A){var s=g(this),r=I(A),a=t(s);return C(s)<=r.size?e(s,function(g){r.includes(g)&&n(a,g)}):i(r.getIterator(),function(g){o(a,g)&&n(a,g)}),a}}function qy(){return jy?Gy:(jy=1,Gy=function(){return!1})}var $y,gw,Aw,tw={};function Cw(){if(gw)return $y;gw=1;var g=Yy(),A=Wy(),t=Hy(),C=Xy(),I=Uy(),e=Qy(),i=A.Set,o=A.add,n=A.has;return $y=function(A){var s=g(this),r=C(A),a=new i;return t(s)>r.size?e(r.getIterator(),function(g){n(s,g)&&o(a,g)}):I(s,function(g){r.includes(g)&&o(a,g)}),a}}var Iw,ew,iw,ow={};function nw(){if(ew)return Iw;ew=1;var g=Yy(),A=Wy().has,t=Hy(),C=Xy(),I=Uy(),e=Qy(),i=Ya();return Iw=function(o){var n=g(this),s=C(o);if(t(n)<=s.size)return!1!==I(n,function(g){if(s.includes(g))return!1},!0);var r=s.getIterator();return!1!==e(r,function(g){if(A(n,g))return i(r,"normal",!1)})},Iw}var sw,rw,aw,dw={};function hw(){if(rw)return sw;rw=1;var g=Yy(),A=Hy(),t=Uy(),C=Xy();return sw=function(I){var e=g(this),i=C(I);return!(A(e)>i.size)&&!1!==t(e,function(g){if(!i.includes(g))return!1},!0)}}var lw,cw,uw,pw={};function fw(){if(cw)return lw;cw=1;var g=Yy(),A=Wy().has,t=Hy(),C=Xy(),I=Qy(),e=Ya();return lw=function(i){var o=g(this),n=C(i);if(t(o)<n.size)return!1;var s=n.getIterator();return!1!==I(s,function(g){if(!A(o,g))return e(s,"normal",!1)})},lw}var vw,bw,mw,yw,ww,xw={};function Ew(){if(bw)return vw;bw=1;var g=Yy(),A=Wy(),t=Ky(),C=Xy(),I=Qy(),e=A.add,i=A.has,o=A.remove;return vw=function(A){var n=g(this),s=C(A).getIterator(),r=t(n);return I(s,function(g){i(n,g)?o(r,g):e(r,g)}),r}}function Ow(){return yw?mw:(yw=1,mw=function(g){try{var A=new Set,t={size:0,has:function(){return!0},keys:function(){return Object.defineProperty({},"next",{get:function(){return A.clear(),A.add(4),function(){return{done:!0}}}})}},C=A[g](t);return 1===C.size&&4===C.values().next().value}catch(g){return!1}})}var Tw,Dw,Nw,kw,Rw,Pw,Mw,zw,Bw,Zw={};function Sw(){if(Dw)return Tw;Dw=1;var g=Yy(),A=Wy().add,t=Ky(),C=Xy(),I=Qy();return Tw=function(e){var i=g(this),o=C(e).getIterator(),n=t(i);return I(o,function(g){A(n,g)}),n},Tw}function Fw(){return Rw?kw:(Rw=1,Xr(),by(),function(){if(Ly)return Vy;Ly=1;var g=st(),A=Jy(),t=y(),C=!qy()("difference",function(g){return 0===g.size})||t(function(){var g={size:1,has:function(){return!0},keys:function(){var g=0;return{next:function(){var t=g++>1;return A.has(1)&&A.clear(),{done:t,value:2}}}}},A=new Set([1,2,3,4]);return 3!==A.difference(g).size});g({target:"Set",proto:!0,real:!0,forced:C},{difference:A})}(),function(){if(Aw)return tw;Aw=1;var g=st(),A=y(),t=Cw();g({target:"Set",proto:!0,real:!0,forced:!qy()("intersection",function(g){return 2===g.size&&g.has(1)&&g.has(2)})||A(function(){return"3,2"!==String(Array.from(new Set([1,2,3]).intersection(new Set([3,2]))))})},{intersection:t})}(),function(){if(iw)return ow;iw=1;var g=st(),A=nw();g({target:"Set",proto:!0,real:!0,forced:!qy()("isDisjointFrom",function(g){return!g})},{isDisjointFrom:A})}(),function(){if(aw)return dw;aw=1;var g=st(),A=hw();g({target:"Set",proto:!0,real:!0,forced:!qy()("isSubsetOf",function(g){return g})},{isSubsetOf:A})}(),function(){if(uw)return pw;uw=1;var g=st(),A=fw();g({target:"Set",proto:!0,real:!0,forced:!qy()("isSupersetOf",function(g){return!g})},{isSupersetOf:A})}(),function(){if(ww)return xw;ww=1;var g=st(),A=Ew(),t=Ow();g({target:"Set",proto:!0,real:!0,forced:!qy()("symmetricDifference")||!t("symmetricDifference")},{symmetricDifference:A})}(),function(){if(Nw)return Zw;Nw=1;var g=st(),A=Sw(),t=Ow();g({target:"Set",proto:!0,real:!0,forced:!qy()("union")||!t("union")},{union:A})}(),hd(),kw=Tg().Set)}function Gw(){if(Mw)return Pw;Mw=1;var g=Fw();return xd(),Pw=g}var jw,Lw,Vw,Yw,Ww,Qw,Uw,Kw,Hw,_w,Xw=C(Bw?zw:(Bw=1,zw=Gw())),Jw={},qw={};function $w(){if(Lw)return jw;Lw=1;var g=E(),A=Ha(),t=Ga().getWeakData,C=Qa(),I=it(),e=wg(),i=Og(),o=Wa(),n=Bn(),s=vA(),r=Br(),a=r.set,d=r.getterFor,h=n.find,l=n.findIndex,c=g([].splice),u=0,p=function(g){return g.frozen||(g.frozen=new f)},f=function(){this.entries=[]},v=function(g,A){return h(g.entries,function(g){return g[0]===A})};return f.prototype={get:function(g){var A=v(this,g);if(A)return A[1]},has:function(g){return!!v(this,g)},set:function(g,A){var t=v(this,g);t?t[1]=A:this.entries.push([g,A])},delete:function(g){var A=l(this.entries,function(A){return A[0]===g});return~A&&c(this.entries,A,1),!!~A}},jw={getConstructor:function(g,n,r,h){var l=g(function(g,A){C(g,c),a(g,{type:n,id:u++,frozen:null}),e(A)||o(A,g[h],{that:g,AS_ENTRIES:r})}),c=l.prototype,f=d(n),v=function(g,A,C){var e=f(g),i=t(I(A),!0);return!0===i?p(e).set(A,C):i[e.id]=C,g};return A(c,{delete:function(g){var A=f(this);if(!i(g))return!1;var C=t(g);return!0===C?p(A).delete(g):C&&s(C,A.id)&&delete C[A.id]},has:function(g){var A=f(this);if(!i(g))return!1;var C=t(g);return!0===C?p(A).has(g):C&&s(C,A.id)}}),A(c,r?{get:function(g){var A=f(this);if(i(g)){var C=t(g);if(!0===C)return p(A).get(g);if(C)return C[A.id]}},set:function(g,A){return v(this,g,A)}}:{add:function(g){return v(this,g,!0)}}),l}}}function gx(){return Yw||(Yw=1,function(){if(Vw)return qw;Vw=1;var g,A=Fa(),t=m(),C=E(),I=Ha(),e=Ga(),i=Ua(),o=$w(),n=Og(),s=Br().enforce,r=y(),a=zr(),d=Object,h=Array.isArray,l=d.isExtensible,c=d.isFrozen,u=d.isSealed,p=d.freeze,f=d.seal,v=!t.ActiveXObject&&"ActiveXObject"in t,b=function(g){return function(){return g(this,arguments.length?arguments[0]:void 0)}},w=i("WeakMap",b,o),x=w.prototype,O=C(x.set);if(a)if(v){g=o.getConstructor(b,"WeakMap",!0),e.enable();var T=C(x.delete),D=C(x.has),N=C(x.get);I(x,{delete:function(A){if(n(A)&&!l(A)){var t=s(this);return t.frozen||(t.frozen=new g),T(this,A)||t.frozen.delete(A)}return T(this,A)},has:function(A){if(n(A)&&!l(A)){var t=s(this);return t.frozen||(t.frozen=new g),D(this,A)||t.frozen.has(A)}return D(this,A)},get:function(A){if(n(A)&&!l(A)){var t=s(this);return t.frozen||(t.frozen=new g),D(this,A)?N(this,A):t.frozen.get(A)}return N(this,A)},set:function(A,t){if(n(A)&&!l(A)){var C=s(this);C.frozen||(C.frozen=new g),D(this,A)?O(this,A,t):C.frozen.set(A,t)}else O(this,A,t);return this}})}else A&&r(function(){var g=p([]);return O(new w,g,1),!c(g)})&&I(x,{set:function(g,A){var t;return h(g)&&(c(g)?t=p:u(g)&&(t=f)),O(this,g,A),t&&t(g),this}})}()),Jw}function Ax(){return Qw?Ww:(Qw=1,Xr(),gx(),Ww=Tg().WeakMap)}function tx(){if(Kw)return Uw;Kw=1;var g=Ax();return xd(),Uw=g}var Cx=C(_w?Hw:(_w=1,Hw=tx()));function Ix(g,A,t){(function(g,A){if(A.has(g))throw new TypeError("Cannot initialize the same private elements twice on an object")})(g,A),A.set(g,t)}function ex(g,A,t){return g.set(ox(g,A),t),t}function ix(g,A){return g.get(ox(g,A))}function ox(g,A,t){if("function"==typeof g?g===A:g.has(A))return arguments.length<3?A:t;throw new TypeError("Private element is not present on this object")}function nx(g,A){const t=new Xw;for(const C of A)g.has(C)||t.add(C);return t}var sx=new Cx,rx=new Cx;class ax{constructor(){Ix(this,sx,new Xw),Ix(this,rx,new Xw)}get size(){return ix(rx,this).size}add(){for(var g=arguments.length,A=new Array(g),t=0;t<g;t++)A[t]=arguments[t];for(const g of A)ix(rx,this).add(g)}delete(){for(var g=arguments.length,A=new Array(g),t=0;t<g;t++)A[t]=arguments[t];for(const g of A)ix(rx,this).delete(g)}clear(){ix(rx,this).clear()}getSelection(){return[...ix(rx,this)]}getChanges(){return{added:[...nx(ix(sx,this),ix(rx,this))],deleted:[...nx(ix(rx,this),ix(sx,this))],previous:[...new Xw(ix(sx,this))],current:[...new Xw(ix(rx,this))]}}commit(){const g=this.getChanges();ex(sx,this,ix(rx,this)),ex(rx,this,new Xw(ix(sx,this)));for(const A of g.added)A.select();for(const A of g.deleted)A.unselect();return g}}var dx=new Cx,hx=new Cx,lx=new Cx;class cx{constructor(){let g=arguments.length>0&&void 0!==arguments[0]?arguments[0]:()=>{};Ix(this,dx,new ax),Ix(this,hx,new ax),Ix(this,lx,void 0),ex(lx,this,g)}get sizeNodes(){return ix(dx,this).size}get sizeEdges(){return ix(hx,this).size}getNodes(){return ix(dx,this).getSelection()}getEdges(){return ix(hx,this).getSelection()}addNodes(){ix(dx,this).add(...arguments)}addEdges(){ix(hx,this).add(...arguments)}deleteNodes(g){ix(dx,this).delete(g)}deleteEdges(g){ix(hx,this).delete(g)}clear(){ix(dx,this).clear(),ix(hx,this).clear()}commit(){const g={nodes:ix(dx,this).commit(),edges:ix(hx,this).commit()};for(var A=arguments.length,t=new Array(A),C=0;C<A;C++)t[C]=arguments[C];return ix(lx,this).call(this,g,...t),g}}class ux{constructor(g,A){this.body=g,this.canvas=A,this._selectionAccumulator=new cx,this.hoverObj={nodes:{},edges:{}},this.options={},this.defaultOptions={multiselect:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0},Xt(this.options,this.defaultOptions),this.body.emitter.on("_dataChanged",()=>{this.updateSelection()})}setOptions(g){if(void 0!==g){ue(["multiselect","hoverConnectedEdges","selectable","selectConnectedEdges"],this.options,g)}}selectOnPoint(g){let A=!1;if(!0===this.options.selectable){const t=this.getNodeAt(g)||this.getEdgeAt(g);this.unselectAll(),void 0!==t&&(A=this.selectObject(t)),this.body.emitter.emit("_requestRedraw")}return A}selectAdditionalOnPoint(g){let A=!1;if(!0===this.options.selectable){const t=this.getNodeAt(g)||this.getEdgeAt(g);void 0!==t&&(A=!0,!0===t.isSelected()?this.deselectObject(t):this.selectObject(t),this.body.emitter.emit("_requestRedraw"))}return A}_initBaseEvent(g,A){const t={};return t.pointer={DOM:{x:A.x,y:A.y},canvas:this.canvas.DOMtoCanvas(A)},t.event=g,t}generateClickEvent(g,A,t,C){let I=arguments.length>4&&void 0!==arguments[4]&&arguments[4];const e=this._initBaseEvent(A,t);if(!0===I)e.nodes=[],e.edges=[];else{const g=this.getSelection();e.nodes=g.nodes,e.edges=g.edges}void 0!==C&&(e.previousSelection=C),"click"==g&&(e.items=this.getClickedItems(t)),void 0!==A.controlEdge&&(e.controlEdge=A.controlEdge),this.body.emitter.emit(g,e)}selectObject(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.selectConnectedEdges;return void 0!==g&&(g instanceof lb?(!0===A&&this._selectionAccumulator.addEdges(...g.edges),this._selectionAccumulator.addNodes(g)):this._selectionAccumulator.addEdges(g),!0)}deselectObject(g){!0===g.isSelected()&&(g.selected=!1,this._removeFromSelection(g))}_getAllNodesOverlappingWith(g){const A=[],t=this.body.nodes;for(let C=0;C<this.body.nodeIndices.length;C++){const I=this.body.nodeIndices[C];t[I].isOverlappingWith(g)&&A.push(I)}return A}_pointerToPositionObject(g){const A=this.canvas.DOMtoCanvas(g);return{left:A.x-1,top:A.y+1,right:A.x+1,bottom:A.y-1}}getNodeAt(g){let A=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const t=this._pointerToPositionObject(g),C=this._getAllNodesOverlappingWith(t);return C.length>0?!0===A?this.body.nodes[C[C.length-1]]:C[C.length-1]:void 0}_getEdgesOverlappingWith(g,A){const t=this.body.edges;for(let C=0;C<this.body.edgeIndices.length;C++){const I=this.body.edgeIndices[C];t[I].isOverlappingWith(g)&&A.push(I)}}_getAllEdgesOverlappingWith(g){const A=[];return this._getEdgesOverlappingWith(g,A),A}getEdgeAt(g){let A=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const t=this.canvas.DOMtoCanvas(g);let C=10,I=null;const e=this.body.edges;for(let g=0;g<this.body.edgeIndices.length;g++){const A=this.body.edgeIndices[g],i=e[A];if(i.connected){const g=i.from.x,e=i.from.y,o=i.to.x,n=i.to.y,s=i.edgeType.getDistanceToEdge(g,e,o,n,t.x,t.y);s<C&&(I=A,C=s)}}return null!==I?!0===A?this.body.edges[I]:I:void 0}_addToHover(g){g instanceof lb?this.hoverObj.nodes[g.id]=g:this.hoverObj.edges[g.id]=g}_removeFromSelection(g){g instanceof lb?(this._selectionAccumulator.deleteNodes(g),this._selectionAccumulator.deleteEdges(...g.edges)):this._selectionAccumulator.deleteEdges(g)}unselectAll(){this._selectionAccumulator.clear()}getSelectedNodeCount(){return this._selectionAccumulator.sizeNodes}getSelectedEdgeCount(){return this._selectionAccumulator.sizeEdges}_hoverConnectedEdges(g){for(let A=0;A<g.edges.length;A++){const t=g.edges[A];t.hover=!0,this._addToHover(t)}}emitBlurEvent(g,A,t){const C=this._initBaseEvent(g,A);!0===t.hover&&(t.hover=!1,t instanceof lb?(C.node=t.id,this.body.emitter.emit("blurNode",C)):(C.edge=t.id,this.body.emitter.emit("blurEdge",C)))}emitHoverEvent(g,A,t){const C=this._initBaseEvent(g,A);let I=!1;return!1===t.hover&&(t.hover=!0,this._addToHover(t),I=!0,t instanceof lb?(C.node=t.id,this.body.emitter.emit("hoverNode",C)):(C.edge=t.id,this.body.emitter.emit("hoverEdge",C))),I}hoverObject(g,A){let t=this.getNodeAt(A);void 0===t&&(t=this.getEdgeAt(A));let C=!1;for(const I in this.hoverObj.nodes)Object.prototype.hasOwnProperty.call(this.hoverObj.nodes,I)&&(void 0===t||t instanceof lb&&t.id!=I||t instanceof fm)&&(this.emitBlurEvent(g,A,this.hoverObj.nodes[I]),delete this.hoverObj.nodes[I],C=!0);for(const I in this.hoverObj.edges)Object.prototype.hasOwnProperty.call(this.hoverObj.edges,I)&&(!0===C?(this.hoverObj.edges[I].hover=!1,delete this.hoverObj.edges[I]):(void 0===t||t instanceof fm&&t.id!=I||t instanceof lb&&!t.hover)&&(this.emitBlurEvent(g,A,this.hoverObj.edges[I]),delete this.hoverObj.edges[I],C=!0));if(void 0!==t){const I=uh(this.hoverObj.edges).length,e=uh(this.hoverObj.nodes).length;(C||t instanceof fm&&0===I&&0===e||t instanceof lb&&0===I&&0===e)&&(C=this.emitHoverEvent(g,A,t)),t instanceof lb&&!0===this.options.hoverConnectedEdges&&this._hoverConnectedEdges(t)}!0===C&&this.body.emitter.emit("_requestRedraw")}commitWithoutEmitting(){this._selectionAccumulator.commit()}commitAndEmit(g,A){let t=!1;const C=this._selectionAccumulator.commit(),I={nodes:C.nodes.previous,edges:C.edges.previous};C.edges.deleted.length>0&&(this.generateClickEvent("deselectEdge",A,g,I),t=!0),C.nodes.deleted.length>0&&(this.generateClickEvent("deselectNode",A,g,I),t=!0),C.nodes.added.length>0&&(this.generateClickEvent("selectNode",A,g),t=!0),C.edges.added.length>0&&(this.generateClickEvent("selectEdge",A,g),t=!0),!0===t&&this.generateClickEvent("select",A,g)}getSelection(){return{nodes:this.getSelectedNodeIds(),edges:this.getSelectedEdgeIds()}}getSelectedNodes(){return this._selectionAccumulator.getNodes()}getSelectedEdges(){return this._selectionAccumulator.getEdges()}getSelectedNodeIds(){var g;return ks(g=this._selectionAccumulator.getNodes()).call(g,g=>g.id)}getSelectedEdgeIds(){var g;return ks(g=this._selectionAccumulator.getEdges()).call(g,g=>g.id)}setSelection(g){let A=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!g||!g.nodes&&!g.edges)throw new TypeError("Selection must be an object with nodes and/or edges properties");if((A.unselectAll||void 0===A.unselectAll)&&this.unselectAll(),g.nodes)for(const t of g.nodes){const g=this.body.nodes[t];if(!g)throw new RangeError('Node with id "'+t+'" not found');this.selectObject(g,A.highlightEdges)}if(g.edges)for(const A of g.edges){const g=this.body.edges[A];if(!g)throw new RangeError('Edge with id "'+A+'" not found');this.selectObject(g)}this.body.emitter.emit("_requestRedraw"),this._selectionAccumulator.commit()}selectNodes(g){let A=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(!g||void 0===g.length)throw"Selection must be an array with ids";this.setSelection({nodes:g},{highlightEdges:A})}selectEdges(g){if(!g||void 0===g.length)throw"Selection must be an array with ids";this.setSelection({edges:g})}updateSelection(){for(const g in this._selectionAccumulator.getNodes())Object.prototype.hasOwnProperty.call(this.body.nodes,g.id)||this._selectionAccumulator.deleteNodes(g);for(const g in this._selectionAccumulator.getEdges())Object.prototype.hasOwnProperty.call(this.body.edges,g.id)||this._selectionAccumulator.deleteEdges(g)}getClickedItems(g){const A=this.canvas.DOMtoCanvas(g),t=[],C=this.body.nodeIndices,I=this.body.nodes;for(let g=C.length-1;g>=0;g--){const e=I[C[g]].getItemsOnPoint(A);t.push.apply(t,e)}const e=this.body.edgeIndices,i=this.body.edges;for(let g=e.length-1;g>=0;g--){const C=i[e[g]].getItemsOnPoint(A);t.push.apply(t,C)}return t}}var px,fx,vx,bx,mx,yx,wx,xx,Ex,Ox,Tx,Dx,Nx,kx,Rx,Px,Mx,zx={};function Bx(){if(fx)return px;fx=1;var g=qt(),A=Math.floor,t=function(C,I){var e=C.length;if(e<8)for(var i,o,n=1;n<e;){for(o=n,i=C[n];o&&I(C[o-1],i)>0;)C[o]=C[--o];o!==n++&&(C[o]=i)}else for(var s=A(e/2),r=t(g(C,0,s),I),a=t(g(C,s),I),d=r.length,h=a.length,l=0,c=0;l<d||c<h;)C[l+c]=l<d&&c<h?I(r[l],a[c])<=0?r[l++]:a[c++]:l<d?r[l++]:a[c++];return C};return px=t}function Zx(){if(bx)return vx;bx=1;var g=kg().match(/firefox\/(\d+)/i);return vx=!!g&&+g[1]}function Sx(){return yx?mx:(yx=1,mx=/MSIE|Trident/.test(kg()))}function Fx(){if(xx)return wx;xx=1;var g=kg().match(/AppleWebKit\/(\d+)\./);return wx=!!g&&+g[1]}function Gx(){if(Ex)return zx;Ex=1;var g=st(),A=E(),t=Zg(),C=fA(),I=lt(),e=In(),i=lo(),o=y(),n=Bx(),s=Di(),r=Zx(),a=Sx(),d=Rg(),h=Fx(),l=[],c=A(l.sort),u=A(l.push),p=o(function(){l.sort(void 0)}),f=o(function(){l.sort(null)}),v=s("sort"),b=!o(function(){if(d)return d<70;if(!(r&&r>3)){if(a)return!0;if(h)return h<603;var g,A,t,C,I="";for(g=65;g<76;g++){switch(A=String.fromCharCode(g),g){case 66:case 69:case 70:case 72:t=3;break;case 68:case 71:t=4;break;default:t=2}for(C=0;C<47;C++)l.push({k:A+C,v:t})}for(l.sort(function(g,A){return A.v-g.v}),C=0;C<l.length;C++)A=l[C].k.charAt(0),I.charAt(I.length-1)!==A&&(I+=A);return"DGBEFHACIJK"!==I}});return g({target:"Array",proto:!0,forced:p||!f||!v||!b},{sort:function(g){void 0!==g&&t(g);var A=C(this);if(b)return void 0===g?c(A):c(A,g);var o,s,r=[],a=I(A);for(s=0;s<a;s++)s in A&&u(r,A[s]);for(n(r,function(g){return function(A,t){return void 0===t?-1:void 0===A?1:void 0!==g?+g(A,t)||0:i(A)>i(t)?1:-1}}(g)),o=I(r),s=0;s<o;)A[s]=r[s++];for(;s<a;)e(A,s++);return A}}),zx}function jx(){return Tx?Ox:(Tx=1,Gx(),Ox=gC()("Array","sort"))}function Lx(){if(Nx)return Dx;Nx=1;var g=Ng(),A=jx(),t=Array.prototype;return Dx=function(C){var I=C.sort;return C===t||g(t,C)&&I===t.sort?A:I},Dx}function Vx(){return Rx?kx:(Rx=1,kx=Lx())}var Yx,Wx,Qx,Ux,Kx,Hx,_x,Xx,Jx,qx=C(Mx?Px:(Mx=1,Px=Vx())),$x={};function gE(){if(Wx)return Yx;Wx=1;var g=z(),A=y(),t=E(),C=Fr(),I=vt(),e=Eg(),i=t(bg().f),o=t([].push),n=g&&A(function(){var g=Object.create(null);return g[2]=2,!i(g,2)}),s=function(A){return function(t){for(var s,r=e(t),a=I(r),d=n&&null===C(r),h=a.length,l=0,c=[];h>l;)s=a[l++],g&&!(d?s in r:i(r,s))||o(c,A?[s,r[s]]:r[s]);return c}};return Yx={entries:s(!0),values:s(!1)}}function AE(){return Kx?Ux:(Kx=1,function(){if(Qx)return $x;Qx=1;var g=st(),A=gE().values;g({target:"Object",stat:!0},{values:function(g){return A(g)}})}(),Ux=Tg().Object.values)}function tE(){return _x?Hx:(_x=1,Hx=AE())}var CE,IE,eE,iE,oE,nE,sE,rE,aE,dE,hE,lE,cE,uE=C(Jx?Xx:(Jx=1,Xx=tE())),pE={};function fE(){if(IE)return CE;IE=1;var g=Zg(),A=fA(),t=yg(),C=lt(),I=TypeError,e="Reduce of empty array with no initial value",i=function(i){return function(o,n,s,r){var a=A(o),d=t(a),h=C(a);if(g(n),0===h&&s<2)throw new I(e);var l=i?h-1:0,c=i?-1:1;if(s<2)for(;;){if(l in d){r=d[l],l+=c;break}if(l+=c,i?l<0:h<=l)throw new I(e)}for(;i?l>=0:h>l;l+=c)l in d&&(r=n(r,d[l],l,a));return r}};return CE={left:i(!1),right:i(!0)}}function vE(){return iE?eE:(iE=1,eE="NODE"===Rh())}function bE(){return sE?nE:(sE=1,function(){if(oE)return pE;oE=1;var g=st(),A=fE().left,t=Di(),C=Rg();g({target:"Array",proto:!0,forced:!vE()&&C>79&&C<83||!t("reduce")},{reduce:function(g){var t=arguments.length;return A(this,g,t,t>1?arguments[1]:void 0)}})}(),nE=gC()("Array","reduce"))}function mE(){if(aE)return rE;aE=1;var g=Ng(),A=bE(),t=Array.prototype;return rE=function(C){var I=C.reduce;return C===t||g(t,C)&&I===t.reduce?A:I},rE}function yE(){return hE?dE:(hE=1,dE=mE())}var wE=C(cE?lE:(cE=1,lE=yE()));class xE{abstract(){throw new Error("Can't instantiate abstract class!")}fake_use(){}curveType(){return this.abstract()}getPosition(g){return this.fake_use(g),this.abstract()}setPosition(g,A){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;this.fake_use(g,A,t),this.abstract()}getTreeSize(g){return this.fake_use(g),this.abstract()}sort(g){this.fake_use(g),this.abstract()}fix(g,A){this.fake_use(g,A),this.abstract()}shift(g,A){this.fake_use(g,A),this.abstract()}}class EE extends xE{constructor(g){super(),this.layout=g}curveType(){return"horizontal"}getPosition(g){return g.x}setPosition(g,A){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==t&&this.layout.hierarchical.addToOrdering(g,t),g.x=A}getTreeSize(g){const A=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,g);return{min:A.min_x,max:A.max_x}}sort(g){qx(g).call(g,function(g,A){return g.x-A.x})}fix(g,A){g.y=this.layout.options.hierarchical.levelSeparation*A,g.options.fixed.y=!0}shift(g,A){this.layout.body.nodes[g].x+=A}}class OE extends xE{constructor(g){super(),this.layout=g}curveType(){return"vertical"}getPosition(g){return g.y}setPosition(g,A){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==t&&this.layout.hierarchical.addToOrdering(g,t),g.y=A}getTreeSize(g){const A=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,g);return{min:A.min_y,max:A.max_y}}sort(g){qx(g).call(g,function(g,A){return g.y-A.y})}fix(g,A){g.x=this.layout.options.hierarchical.levelSeparation*A,g.options.fixed.x=!0}shift(g,A){this.layout.body.nodes[g].y+=A}}var TE,DE,NE,kE,RE,PE,ME,zE,BE,ZE={};function SE(){return NE?DE:(NE=1,function(){if(TE)return ZE;TE=1;var g=st(),A=Bn().every;g({target:"Array",proto:!0,forced:!Di()("every")},{every:function(g){return A(this,g,arguments.length>1?arguments[1]:void 0)}})}(),DE=gC()("Array","every"))}function FE(){if(RE)return kE;RE=1;var g=Ng(),A=SE(),t=Array.prototype;return kE=function(C){var I=C.every;return C===t||g(t,C)&&I===t.every?A:I},kE}function GE(){return ME?PE:(ME=1,PE=FE())}var jE=C(BE?zE:(BE=1,zE=GE()));function LE(g,A){const t=new Xw;return jn(g).call(g,g=>{var A;jn(A=g.edges).call(A,g=>{g.connected&&t.add(g)})}),jn(t).call(t,g=>{const t=g.from.id,C=g.to.id;null==A[t]&&(A[t]=0),(null==A[C]||A[t]>=A[C])&&(A[C]=A[t]+1)}),A}function VE(g,A,t,C){var I;const e=Oi(null),i=wE(I=[...mv(C).call(C)]).call(I,(g,A)=>g+1+A.edges.length,0),o=t+"Id",n="to"===t?1:-1;for(const[I,a]of C){if(!C.has(I)||!g(a))continue;e[I]=0;const d=[a];let h,l=0;for(;h=d.pop();){var s,r;if(!C.has(I))continue;const g=e[h.id]+n;if(jn(s=Wp(r=h.edges).call(r,g=>g.connected&&g.to!==g.from&&g[t]!==h&&C.has(g.toId)&&C.has(g.fromId))).call(s,C=>{const I=C[o],i=e[I];(null==i||A(g,i))&&(e[I]=g,d.push(C[t]))}),l>i)return LE(C,e);++l}}return e}class YE{constructor(){this.childrenReference={},this.parentReference={},this.trees={},this.distributionOrdering={},this.levels={},this.distributionIndex={},this.isTree=!1,this.treeIndex=-1}addRelation(g,A){void 0===this.childrenReference[g]&&(this.childrenReference[g]=[]),this.childrenReference[g].push(A),void 0===this.parentReference[A]&&(this.parentReference[A]=[]),this.parentReference[A].push(g)}checkIfTree(){for(const g in this.parentReference)if(this.parentReference[g].length>1)return void(this.isTree=!1);this.isTree=!0}numTrees(){return this.treeIndex+1}setTreeIndex(g,A){void 0!==A&&void 0===this.trees[g.id]&&(this.trees[g.id]=A,this.treeIndex=Math.max(A,this.treeIndex))}ensureLevel(g){void 0===this.levels[g]&&(this.levels[g]=0)}getMaxLevel(g){const A={},t=g=>{if(void 0!==A[g])return A[g];let C=this.levels[g];if(this.childrenReference[g]){const A=this.childrenReference[g];if(A.length>0)for(let g=0;g<A.length;g++)C=Math.max(C,t(A[g]))}return A[g]=C,C};return t(g)}levelDownstream(g,A){void 0===this.levels[A.id]&&(void 0===this.levels[g.id]&&(this.levels[g.id]=0),this.levels[A.id]=this.levels[g.id]+1)}setMinLevelToZero(){var g;const A=new Od;let t=0;const C=qx(g=[...new Xw(uE(this.levels))]).call(g,(g,A)=>g-A);for(const g of C)A.set(g,t++);for(const g in this.levels)Object.prototype.hasOwnProperty.call(this.levels,g)&&(this.levels[g]=A.get(this.levels[g]))}getTreeSize(g,A){let t=1e9,C=-1e9,I=1e9,e=-1e9;for(const i in this.trees)if(Object.prototype.hasOwnProperty.call(this.trees,i)&&this.trees[i]===A){const A=g[i];t=Math.min(A.x,t),C=Math.max(A.x,C),I=Math.min(A.y,I),e=Math.max(A.y,e)}return{min_x:t,max_x:C,min_y:I,max_y:e}}hasSameParent(g,A){const t=this.parentReference[g.id],C=this.parentReference[A.id];if(void 0===t||void 0===C)return!1;for(let g=0;g<t.length;g++)for(let A=0;A<C.length;A++)if(t[g]==C[A])return!0;return!1}inSameSubNetwork(g,A){return this.trees[g.id]===this.trees[A.id]}getLevels(){return uh(this.distributionOrdering)}addToOrdering(g,A){void 0===this.distributionOrdering[A]&&(this.distributionOrdering[A]=[]);let t=!1;const C=this.distributionOrdering[A];for(const A in C)if(C[A]===g){t=!0;break}t||(this.distributionOrdering[A].push(g),this.distributionIndex[g.id]=this.distributionOrdering[A].length-1)}}class WE{constructor(g){this.body=g,this._resetRNG(Math.random()+":"+km()),this.setPhysics=!1,this.options={},this.optionsBackup={physics:{}},this.defaultOptions={randomSeed:void 0,improvedLayout:!0,clusterThreshold:150,hierarchical:{enabled:!1,levelSeparation:150,nodeSpacing:100,treeSpacing:200,blockShifting:!0,edgeMinimization:!0,parentCentralization:!0,direction:"UD",sortMethod:"hubsize"}},Xt(this.options,this.defaultOptions),this.bindEventListeners()}bindEventListeners(){this.body.emitter.on("_dataChanged",()=>{this.setupHierarchicalLayout()}),this.body.emitter.on("_dataLoaded",()=>{this.layoutNetwork()}),this.body.emitter.on("_resetHierarchicalLayout",()=>{this.setupHierarchicalLayout()}),this.body.emitter.on("_adjustEdgesForHierarchicalLayout",()=>{if(!0!==this.options.hierarchical.enabled)return;const g=this.direction.curveType();this.body.emitter.emit("_forceDisableDynamicCurves",g,!1)})}setOptions(g,A){if(void 0!==g){const t=this.options.hierarchical,C=t.enabled;if(ue(["randomSeed","improvedLayout","clusterThreshold"],this.options,g),Me(this.options,g,"hierarchical"),void 0!==g.randomSeed&&this._resetRNG(g.randomSeed),!0===t.enabled)return!0===C&&this.body.emitter.emit("refresh",!0),"RL"===t.direction||"DU"===t.direction?t.levelSeparation>0&&(t.levelSeparation*=-1):t.levelSeparation<0&&(t.levelSeparation*=-1),this.setDirectionStrategy(),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptionsForHierarchicalLayout(A);if(!0===C)return this.body.emitter.emit("refresh"),fe(A,this.optionsBackup)}return A}_resetRNG(g){this.initialRandomSeed=g,this._rng=Ie(this.initialRandomSeed)}adaptAllOptionsForHierarchicalLayout(g){if(!0===this.options.hierarchical.enabled){const A=this.optionsBackup.physics;void 0===g.physics||!0===g.physics?(g.physics={enabled:void 0===A.enabled||A.enabled,solver:"hierarchicalRepulsion"},A.enabled=void 0===A.enabled||A.enabled,A.solver=A.solver||"barnesHut"):"object"==typeof g.physics?(A.enabled=void 0===g.physics.enabled||g.physics.enabled,A.solver=g.physics.solver||"barnesHut",g.physics.solver="hierarchicalRepulsion"):!1!==g.physics&&(A.solver="barnesHut",g.physics={solver:"hierarchicalRepulsion"});let t=this.direction.curveType();if(void 0===g.edges)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},g.edges={smooth:!1};else if(void 0===g.edges.smooth)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},g.edges.smooth=!1;else if("boolean"==typeof g.edges.smooth)this.optionsBackup.edges={smooth:g.edges.smooth},g.edges.smooth={enabled:g.edges.smooth,type:t};else{const A=g.edges.smooth;void 0!==A.type&&"dynamic"!==A.type&&(t=A.type),this.optionsBackup.edges={smooth:{enabled:void 0===A.enabled||A.enabled,type:void 0===A.type?"dynamic":A.type,roundness:void 0===A.roundness?.5:A.roundness,forceDirection:void 0!==A.forceDirection&&A.forceDirection}},g.edges.smooth={enabled:void 0===A.enabled||A.enabled,type:t,roundness:void 0===A.roundness?.5:A.roundness,forceDirection:void 0!==A.forceDirection&&A.forceDirection}}this.body.emitter.emit("_forceDisableDynamicCurves",t)}return g}positionInitially(g){if(!0!==this.options.hierarchical.enabled){this._resetRNG(this.initialRandomSeed);const A=g.length+50;for(let t=0;t<g.length;t++){const C=g[t],I=2*Math.PI*this._rng();void 0===C.x&&(C.x=A*Math.cos(I)),void 0===C.y&&(C.y=A*Math.sin(I))}}}layoutNetwork(){if(!0!==this.options.hierarchical.enabled&&!0===this.options.improvedLayout){const g=this.body.nodeIndices;let A=0;for(let t=0;t<g.length;t++){!0===this.body.nodes[g[t]].predefinedPosition&&(A+=1)}if(A<.5*g.length){const A=10;let t=0;const C=this.options.clusterThreshold,I={clusterNodeProperties:{shape:"ellipse",label:"",group:"",font:{multi:!1}},clusterEdgeProperties:{label:"",font:{multi:!1},smooth:{enabled:!1}}};if(g.length>C){const e=g.length;for(;g.length>C&&t<=A;){t+=1;const A=g.length;t%3==0?this.body.modules.clustering.clusterBridges(I):this.body.modules.clustering.clusterOutliers(I);if(A==g.length&&t%3!=0)return this._declusterAll(),this.body.emitter.emit("_layoutFailed"),void console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.")}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*e)})}t>A&&console.info("The clustering didn't succeed within the amount of interations allowed, progressing with partial result."),this.body.modules.kamadaKawai.solve(g,this.body.edgeIndices,!0),this._shiftToCenter();const e=70;for(let A=0;A<g.length;A++){const t=this.body.nodes[g[A]];!1===t.predefinedPosition&&(t.x+=(.5-this._rng())*e,t.y+=(.5-this._rng())*e)}this._declusterAll(),this.body.emitter.emit("_repositionBezierNodes")}}}_shiftToCenter(){const g=Iy.getRangeCore(this.body.nodes,this.body.nodeIndices),A=Iy.findCenter(g);for(let g=0;g<this.body.nodeIndices.length;g++){const t=this.body.nodes[this.body.nodeIndices[g]];t.x-=A.x,t.y-=A.y}}_declusterAll(){let g=!0;for(;!0===g;){g=!1;for(let A=0;A<this.body.nodeIndices.length;A++)!0===this.body.nodes[this.body.nodeIndices[A]].isCluster&&(g=!0,this.body.modules.clustering.openCluster(this.body.nodeIndices[A],{},!1));!0===g&&this.body.emitter.emit("_dataChanged")}}getSeed(){return this.initialRandomSeed}setupHierarchicalLayout(){if(!0===this.options.hierarchical.enabled&&this.body.nodeIndices.length>0){let g,A,t=!1,C=!1;for(A in this.lastNodeOnLevel={},this.hierarchical=new YE,this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,A)&&(g=this.body.nodes[A],void 0!==g.options.level?(t=!0,this.hierarchical.levels[A]=g.options.level):C=!0);if(!0===C&&!0===t)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");{if(!0===C){const g=this.options.hierarchical.sortMethod;"hubsize"===g?this._determineLevelsByHubsize():"directed"===g?this._determineLevelsDirected():"custom"===g&&this._determineLevelsCustomCallback()}for(const g in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,g)&&this.hierarchical.ensureLevel(g);const g=this._getDistribution();this._generateMap(),this._placeNodesByHierarchy(g),this._condenseHierarchy(),this._shiftToCenter()}}}_condenseHierarchy(){var g=this;let A=!1;const t={},C=(g,A)=>{const t=this.hierarchical.trees;for(const C in t)Object.prototype.hasOwnProperty.call(t,C)&&t[C]===g&&this.direction.shift(C,A)},I=()=>{const g=[];for(let A=0;A<this.hierarchical.numTrees();A++)g.push(this.direction.getTreeSize(A));return g},e=(g,A)=>{if(!A[g.id]&&(A[g.id]=!0,this.hierarchical.childrenReference[g.id])){const t=this.hierarchical.childrenReference[g.id];if(t.length>0)for(let g=0;g<t.length;g++)e(this.body.nodes[t[g]],A)}},i=function(A){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e9,C=1e9,I=1e9,e=1e9,i=-1e9;for(const o in A)if(Object.prototype.hasOwnProperty.call(A,o)){const n=g.body.nodes[o],s=g.hierarchical.levels[n.id],r=g.direction.getPosition(n),[a,d]=g._getSpaceAroundNode(n,A);C=Math.min(a,C),I=Math.min(d,I),s<=t&&(e=Math.min(r,e),i=Math.max(r,i))}return[e,i,C,I]},o=(g,A)=>{const t=this.hierarchical.getMaxLevel(g.id),C=this.hierarchical.getMaxLevel(A.id);return Math.min(t,C)},n=(g,A,t)=>{const C=this.hierarchical;for(let I=0;I<A.length;I++){const e=A[I],i=C.distributionOrdering[e];if(i.length>1)for(let A=0;A<i.length-1;A++){const I=i[A],e=i[A+1];C.hasSameParent(I,e)&&C.inSameSubNetwork(I,e)&&g(I,e,t)}}},s=function(t,C){let I=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const n=g.direction.getPosition(t),s=g.direction.getPosition(C),r=Math.abs(s-n),a=g.options.hierarchical.nodeSpacing;if(r>a){const n={},s={};e(t,n),e(C,s);const r=o(t,C),d=i(n,r),h=i(s,r),l=d[1],c=h[0],u=h[2];if(Math.abs(l-c)>a){let t=l-c+a;t<-u+a&&(t=-u+a),t<0&&(g._shiftBlock(C.id,t),A=!0,!0===I&&g._centerParent(C))}}},r=(g,C)=>{const I=C.id,o=C.edges,n=this.hierarchical.levels[C.id],s=this.options.hierarchical.levelSeparation*this.options.hierarchical.levelSeparation,r={},a=[];for(let g=0;g<o.length;g++){const A=o[g];if(A.toId!=A.fromId){const t=A.toId==I?A.from:A.to;r[o[g].id]=t,this.hierarchical.levels[t.id]<n&&a.push(A)}}const d=(g,A)=>{let t=0;for(let C=0;C<A.length;C++)if(void 0!==r[A[C].id]){const I=this.direction.getPosition(r[A[C].id])-g;t+=I/Math.sqrt(I*I+s)}return t},h=(g,A)=>{let t=0;for(let C=0;C<A.length;C++)if(void 0!==r[A[C].id]){const I=this.direction.getPosition(r[A[C].id])-g;t-=s*Math.pow(I*I+s,-1.5)}return t},l=(g,A)=>{let t=this.direction.getPosition(C);const I={};for(let C=0;C<g;C++){const g=d(t,A),e=h(t,A),i=40;if(t-=Math.max(-i,Math.min(i,Math.round(g/e))),void 0!==I[t])break;I[t]=C}return t};let c=l(g,a);(g=>{const I=this.direction.getPosition(C);if(void 0===t[C.id]){const g={};e(C,g),t[C.id]=g}const o=i(t[C.id]),n=o[2],s=o[3],r=g-I;let a=0;r>0?a=Math.min(r,s-this.options.hierarchical.nodeSpacing):r<0&&(a=-Math.min(-r,n-this.options.hierarchical.nodeSpacing)),0!=a&&(this._shiftBlock(C.id,a),A=!0)})(c),c=l(g,o),(g=>{const t=this.direction.getPosition(C),[I,e]=this._getSpaceAroundNode(C),i=g-t;let o=t;i>0?o=Math.min(t+(e-this.options.hierarchical.nodeSpacing),g):i<0&&(o=Math.max(t-(I-this.options.hierarchical.nodeSpacing),g)),o!==t&&(this.direction.setPosition(C,o),A=!0)})(c)},a=g=>{let t=this.hierarchical.getLevels();t=Cy(t).call(t);for(let C=0;C<g;C++){A=!1;for(let g=0;g<t.length;g++){const A=t[g],C=this.hierarchical.distributionOrdering[A];for(let g=0;g<C.length;g++)r(1e3,C[g])}if(!0!==A)break}},d=g=>{let t=this.hierarchical.getLevels();t=Cy(t).call(t);for(let C=0;C<g&&(A=!1,n(s,t,!0),!0===A);C++);},h=()=>{for(const g in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,g)&&this._centerParent(this.body.nodes[g])},l=()=>{let g=this.hierarchical.getLevels();g=Cy(g).call(g);for(let A=0;A<g.length;A++){const t=g[A],C=this.hierarchical.distributionOrdering[t];for(let g=0;g<C.length;g++)this._centerParent(C[g])}};!0===this.options.hierarchical.blockShifting&&(d(5),h()),!0===this.options.hierarchical.edgeMinimization&&a(20),!0===this.options.hierarchical.parentCentralization&&l(),(()=>{const g=I();let A=0;for(let t=0;t<g.length-1;t++){A+=g[t].max-g[t+1].min+this.options.hierarchical.treeSpacing,C(t+1,A)}})()}_getSpaceAroundNode(g,A){let t=!0;void 0===A&&(t=!1);const C=this.hierarchical.levels[g.id];if(void 0!==C){const I=this.hierarchical.distributionIndex[g.id],e=this.direction.getPosition(g),i=this.hierarchical.distributionOrdering[C];let o=1e9,n=1e9;if(0!==I){const g=i[I-1];if(!0===t&&void 0===A[g.id]||!1===t){o=e-this.direction.getPosition(g)}}if(I!=i.length-1){const g=i[I+1];if(!0===t&&void 0===A[g.id]||!1===t){const A=this.direction.getPosition(g);n=Math.min(n,A-e)}}return[o,n]}return[0,0]}_centerParent(g){if(this.hierarchical.parentReference[g.id]){const A=this.hierarchical.parentReference[g.id];for(let g=0;g<A.length;g++){const t=A[g],C=this.body.nodes[t],I=this.hierarchical.childrenReference[t];if(void 0!==I){const g=this._getCenterPosition(I),A=this.direction.getPosition(C),[t,e]=this._getSpaceAroundNode(C),i=A-g;(i<0&&Math.abs(i)<e-this.options.hierarchical.nodeSpacing||i>0&&Math.abs(i)<t-this.options.hierarchical.nodeSpacing)&&this.direction.setPosition(C,g)}}}}_placeNodesByHierarchy(g){this.positionedNodes={};for(const t in g)if(Object.prototype.hasOwnProperty.call(g,t)){var A;let C=uh(g[t]);C=this._indexArrayToNodes(C),qx(A=this.direction).call(A,C);let I=0;for(let g=0;g<C.length;g++){const A=C[g];if(void 0===this.positionedNodes[A.id]){const e=this.options.hierarchical.nodeSpacing;let i=e*I;I>0&&(i=this.direction.getPosition(C[g-1])+e),this.direction.setPosition(A,i,t),this._validatePositionAndContinue(A,t,i),I++}}}}_placeBranchNodes(g,A){var t;const C=this.hierarchical.childrenReference[g];if(void 0===C)return;const I=[];for(let g=0;g<C.length;g++)I.push(this.body.nodes[C[g]]);qx(t=this.direction).call(t,I);for(let t=0;t<I.length;t++){const C=I[t],e=this.hierarchical.levels[C.id];if(!(e>A&&void 0===this.positionedNodes[C.id]))return;{const A=this.options.hierarchical.nodeSpacing;let i;i=0===t?this.direction.getPosition(this.body.nodes[g]):this.direction.getPosition(I[t-1])+A,this.direction.setPosition(C,i,e),this._validatePositionAndContinue(C,e,i)}}const e=this._getCenterPosition(I);this.direction.setPosition(this.body.nodes[g],e,A)}_validatePositionAndContinue(g,A,t){if(this.hierarchical.isTree){if(void 0!==this.lastNodeOnLevel[A]){const C=this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[A]]);if(t-C<this.options.hierarchical.nodeSpacing){const I=C+this.options.hierarchical.nodeSpacing-t,e=this._findCommonParent(this.lastNodeOnLevel[A],g.id);this._shiftBlock(e.withChild,I)}}this.lastNodeOnLevel[A]=g.id,this.positionedNodes[g.id]=!0,this._placeBranchNodes(g.id,A)}}_indexArrayToNodes(g){const A=[];for(let t=0;t<g.length;t++)A.push(this.body.nodes[g[t]]);return A}_getDistribution(){const g={};let A,t;for(A in this.body.nodes)if(Object.prototype.hasOwnProperty.call(this.body.nodes,A)){t=this.body.nodes[A];const C=void 0===this.hierarchical.levels[A]?0:this.hierarchical.levels[A];this.direction.fix(t,C),void 0===g[C]&&(g[C]={}),g[C][A]=t}return g}_getActiveEdges(g){const A=[];return ye(g.edges,g=>{var t;-1!==Si(t=this.body.edgeIndices).call(t,g.id)&&A.push(g)}),A}_getHubSizes(){const g={};ye(this.body.nodeIndices,A=>{const t=this.body.nodes[A],C=this._getActiveEdges(t).length;g[C]=!0});const A=[];return ye(g,g=>{A.push(Number(g))}),qx(A).call(A,function(g,A){return A-g}),A}_determineLevelsByHubsize(){const g=(g,A)=>{this.hierarchical.levelDownstream(g,A)},A=this._getHubSizes();for(let t=0;t<A.length;++t){const C=A[t];if(0===C)break;ye(this.body.nodeIndices,A=>{const t=this.body.nodes[A];C===this._getActiveEdges(t).length&&this._crawlNetwork(g,A)})}}_determineLevelsCustomCallback(){this._crawlNetwork((g,A,t)=>{let C=this.hierarchical.levels[g.id];void 0===C&&(C=this.hierarchical.levels[g.id]=1e5);const I=(Iy.cloneOptions(g,"node"),Iy.cloneOptions(A,"node"),void Iy.cloneOptions(t,"edge"));this.hierarchical.levels[A.id]=C+I}),this.hierarchical.setMinLevelToZero()}_determineLevelsDirected(){var g;const A=wE(g=this.body.nodeIndices).call(g,(g,A)=>(g.set(A,this.body.nodes[A]),g),new Od);"roots"===this.options.hierarchical.shakeTowards?this.hierarchical.levels=function(g){return VE(A=>{var t,C;return jE(t=Wp(C=A.edges).call(C,A=>g.has(A.toId))).call(t,g=>g.from===A)},(g,A)=>A<g,"to",g)}(A):this.hierarchical.levels=function(g){return VE(A=>{var t,C;return jE(t=Wp(C=A.edges).call(C,A=>g.has(A.toId))).call(t,g=>g.to===A)},(g,A)=>A>g,"from",g)}(A),this.hierarchical.setMinLevelToZero()}_generateMap(){this._crawlNetwork((g,A)=>{this.hierarchical.levels[A.id]>this.hierarchical.levels[g.id]&&this.hierarchical.addRelation(g.id,A.id)}),this.hierarchical.checkIfTree()}_crawlNetwork(){let g=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){},A=arguments.length>1?arguments[1]:void 0;const t={},C=(A,I)=>{if(void 0===t[A.id]){let e;this.hierarchical.setTreeIndex(A,I),t[A.id]=!0;const i=this._getActiveEdges(A);for(let t=0;t<i.length;t++){const o=i[t];!0===o.connected&&(e=o.toId==A.id?o.from:o.to,A.id!=e.id&&(g(A,e,o),C(e,I)))}}};if(void 0===A){let g=0;for(let A=0;A<this.body.nodeIndices.length;A++){const I=this.body.nodeIndices[A];if(void 0===t[I]){const A=this.body.nodes[I];C(A,g),g+=1}}}else{const g=this.body.nodes[A];if(void 0===g)return void console.error("Node not found:",A);C(g)}}_shiftBlock(g,A){const t={},C=g=>{if(t[g])return;t[g]=!0,this.direction.shift(g,A);const I=this.hierarchical.childrenReference[g];if(void 0!==I)for(let g=0;g<I.length;g++)C(I[g])};C(g)}_findCommonParent(g,A){const t={},C=(g,A)=>{const t=this.hierarchical.parentReference[A];if(void 0!==t)for(let A=0;A<t.length;A++){const I=t[A];g[I]=!0,C(g,I)}},I=(g,A)=>{const t=this.hierarchical.parentReference[A];if(void 0!==t)for(let C=0;C<t.length;C++){const e=t[C];if(void 0!==g[e])return{foundParent:e,withChild:A};const i=I(g,e);if(null!==i.foundParent)return i}return{foundParent:null,withChild:A}};return C(t,g),I(t,A)}setDirectionStrategy(){const g="UD"===this.options.hierarchical.direction||"DU"===this.options.hierarchical.direction;this.direction=g?new EE(this):new OE(this)}_getCenterPosition(g){let A=1e9,t=-1e9;for(let C=0;C<g.length;C++){let I;if(void 0!==g[C].id)I=g[C];else{const A=g[C];I=this.body.nodes[A]}const e=this.direction.getPosition(I);A=Math.min(A,e),t=Math.max(t,e)}return.5*(A+t)}}class QE{constructor(g,A,t,C){var I,e;this.body=g,this.canvas=A,this.selectionHandler=t,this.interactionHandler=C,this.editMode=!1,this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this._domEventListenerCleanupQueue=[],this.temporaryUIFunctions={},this.temporaryEventFunctions=[],this.touchTime=0,this.temporaryIds={nodes:[],edges:[]},this.guiEnabled=!1,this.inMode=!1,this.selectedControlNode=void 0,this.options={},this.defaultOptions={enabled:!1,initiallyActive:!1,addNode:!0,addEdge:!0,editNode:void 0,editEdge:!0,deleteNode:!0,deleteEdge:!0,controlNodeStyle:{shape:"dot",size:6,color:{background:"#ff0000",border:"#3c3c3c",highlight:{background:"#07f968",border:"#3c3c3c"}},borderWidth:2,borderWidthSelected:2}},Xt(this.options,this.defaultOptions),this.body.emitter.on("destroy",()=>{this._clean()}),this.body.emitter.on("_dataChanged",IC(I=this._restore).call(I,this)),this.body.emitter.on("_resetData",IC(e=this._restore).call(e,this))}_restore(){!1!==this.inMode&&(!0===this.options.initiallyActive?this.enableEditMode():this.disableEditMode())}setOptions(g,A,t){void 0!==A&&(void 0!==A.locale?this.options.locale=A.locale:this.options.locale=t.locale,void 0!==A.locales?this.options.locales=A.locales:this.options.locales=t.locales),void 0!==g&&("boolean"==typeof g?this.options.enabled=g:(this.options.enabled=!0,fe(this.options,g)),!0===this.options.initiallyActive&&(this.editMode=!0),this._setup())}toggleEditMode(){!0===this.editMode?this.disableEditMode():this.enableEditMode()}enableEditMode(){this.editMode=!0,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="block",this.closeDiv.style.display="block",this.editModeDiv.style.display="none",this.showManipulatorToolbar())}disableEditMode(){this.editMode=!1,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="none",this.closeDiv.style.display="none",this.editModeDiv.style.display="block",this._createEditButton())}showManipulatorToolbar(){if(this._clean(),this.manipulationDOM={},!0===this.guiEnabled){var g,A;this.editMode=!0,this.manipulationDiv.style.display="block",this.closeDiv.style.display="block";const t=this.selectionHandler.getSelectedNodeCount(),C=this.selectionHandler.getSelectedEdgeCount(),I=t+C,e=this.options.locales[this.options.locale];let i=!1;!1!==this.options.addNode&&(this._createAddNodeButton(e),i=!0),!1!==this.options.addEdge&&(!0===i?this._createSeperator(1):i=!0,this._createAddEdgeButton(e)),1===t&&"function"==typeof this.options.editNode?(!0===i?this._createSeperator(2):i=!0,this._createEditNodeButton(e)):1===C&&0===t&&!1!==this.options.editEdge&&(!0===i?this._createSeperator(3):i=!0,this._createEditEdgeButton(e)),0!==I&&(t>0&&!1!==this.options.deleteNode||0===t&&!1!==this.options.deleteEdge)&&(!0===i&&this._createSeperator(4),this._createDeleteButton(e)),this._bindElementEvents(this.closeDiv,IC(g=this.toggleEditMode).call(g,this)),this._temporaryBindEvent("select",IC(A=this.showManipulatorToolbar).call(A,this))}this.body.emitter.emit("_redraw")}addNodeMode(){var g;if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addNode",!0===this.guiEnabled){var A;const g=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(g),this._createSeperator(),this._createDescription(g.addDescription||this.options.locales.en.addDescription),this._bindElementEvents(this.closeDiv,IC(A=this.toggleEditMode).call(A,this))}this._temporaryBindEvent("click",IC(g=this._performAddNode).call(g,this))}editNode(){!0!==this.editMode&&this.enableEditMode(),this._clean();const g=this.selectionHandler.getSelectedNodes()[0];if(void 0!==g){if(this.inMode="editNode","function"!=typeof this.options.editNode)throw new Error("No function has been configured to handle the editing of nodes.");if(!0!==g.isCluster){const A=fe({},g.options,!1);if(A.x=g.x,A.y=g.y,2!==this.options.editNode.length)throw new Error("The function for edit does not support two arguments (data, callback)");this.options.editNode(A,g=>{null!=g&&"editNode"===this.inMode&&this.body.data.nodes.getDataSet().update(g),this.showManipulatorToolbar()})}else alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError)}else this.showManipulatorToolbar()}addEdgeMode(){var g,A,t,C,I;if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addEdge",!0===this.guiEnabled){var e;const g=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(g),this._createSeperator(),this._createDescription(g.edgeDescription||this.options.locales.en.edgeDescription),this._bindElementEvents(this.closeDiv,IC(e=this.toggleEditMode).call(e,this))}this._temporaryBindUI("onTouch",IC(g=this._handleConnect).call(g,this)),this._temporaryBindUI("onDragEnd",IC(A=this._finishConnect).call(A,this)),this._temporaryBindUI("onDrag",IC(t=this._dragControlNode).call(t,this)),this._temporaryBindUI("onRelease",IC(C=this._finishConnect).call(C,this)),this._temporaryBindUI("onDragStart",IC(I=this._dragStartEdge).call(I,this)),this._temporaryBindUI("onHold",()=>{})}editEdgeMode(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="editEdge","object"==typeof this.options.editEdge&&"function"==typeof this.options.editEdge.editWithoutDrag&&(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdgeIds()[0],void 0!==this.edgeBeingEditedId)){const g=this.body.edges[this.edgeBeingEditedId];return void this._performEditEdge(g.from.id,g.to.id)}if(!0===this.guiEnabled){var g;const A=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(A),this._createSeperator(),this._createDescription(A.editEdgeDescription||this.options.locales.en.editEdgeDescription),this._bindElementEvents(this.closeDiv,IC(g=this.toggleEditMode).call(g,this))}if(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdgeIds()[0],void 0!==this.edgeBeingEditedId){var A,t,C,I;const g=this.body.edges[this.edgeBeingEditedId],e=this._getNewTargetNode(g.from.x,g.from.y),i=this._getNewTargetNode(g.to.x,g.to.y);this.temporaryIds.nodes.push(e.id),this.temporaryIds.nodes.push(i.id),this.body.nodes[e.id]=e,this.body.nodeIndices.push(e.id),this.body.nodes[i.id]=i,this.body.nodeIndices.push(i.id),this._temporaryBindUI("onTouch",IC(A=this._controlNodeTouch).call(A,this)),this._temporaryBindUI("onTap",()=>{}),this._temporaryBindUI("onHold",()=>{}),this._temporaryBindUI("onDragStart",IC(t=this._controlNodeDragStart).call(t,this)),this._temporaryBindUI("onDrag",IC(C=this._controlNodeDrag).call(C,this)),this._temporaryBindUI("onDragEnd",IC(I=this._controlNodeDragEnd).call(I,this)),this._temporaryBindUI("onMouseMove",()=>{}),this._temporaryBindEvent("beforeDrawing",A=>{const t=g.edgeType.findBorderPositions(A);!1===e.selected&&(e.x=t.from.x,e.y=t.from.y),!1===i.selected&&(i.x=t.to.x,i.y=t.to.y)}),this.body.emitter.emit("_redraw")}else this.showManipulatorToolbar()}deleteSelected(){!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="delete";const g=this.selectionHandler.getSelectedNodeIds(),A=this.selectionHandler.getSelectedEdgeIds();let t;if(g.length>0){for(let A=0;A<g.length;A++)if(!0===this.body.nodes[g[A]].isCluster)return void alert(this.options.locales[this.options.locale].deleteClusterError||this.options.locales.en.deleteClusterError);"function"==typeof this.options.deleteNode&&(t=this.options.deleteNode)}else A.length>0&&"function"==typeof this.options.deleteEdge&&(t=this.options.deleteEdge);if("function"==typeof t){const C={nodes:g,edges:A};if(2!==t.length)throw new Error("The function for delete does not support two arguments (data, callback)");t(C,g=>{null!=g&&"delete"===this.inMode?(this.body.data.edges.getDataSet().remove(g.edges),this.body.data.nodes.getDataSet().remove(g.nodes),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()):(this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().remove(A),this.body.data.nodes.getDataSet().remove(g),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}_setup(){!0===this.options.enabled?(this.guiEnabled=!0,this._createWrappers(),!1===this.editMode?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}_createWrappers(){var g,A;(void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",!0===this.editMode?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",!0===this.editMode?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv)&&(this.closeDiv=document.createElement("button"),this.closeDiv.className="vis-close",this.closeDiv.setAttribute("aria-label",null!==(g=null===(A=this.options.locales[this.options.locale])||void 0===A?void 0:A.close)&&void 0!==g?g:this.options.locales.en.close),this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}_getNewTargetNode(g,A){const t=fe({},this.options.controlNodeStyle);t.id="targetNode"+Hh(),t.hidden=!1,t.physics=!1,t.x=g,t.y=A;const C=this.body.functions.createNode(t);return C.shape.boundingBox={left:g,right:g,top:A,bottom:A},C}_createEditButton(){var g;this._clean(),this.manipulationDOM={},ae(this.editModeDiv);const A=this.options.locales[this.options.locale],t=this._createButton("editMode","vis-edit vis-edit-mode",A.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(t),this._bindElementEvents(t,IC(g=this.toggleEditMode).call(g,this))}_clean(){this.inMode=!1,!0===this.guiEnabled&&(ae(this.editModeDiv),ae(this.manipulationDiv),this._cleanupDOMEventListeners()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}_cleanupDOMEventListeners(){for(const A of pn(g=this._domEventListenerCleanupQueue).call(g,0)){var g;A()}}_removeManipulationDOM(){this._clean(),ae(this.manipulationDiv),ae(this.editModeDiv),ae(this.closeDiv),this.manipulationDiv&&this.canvas.frame.removeChild(this.manipulationDiv),this.editModeDiv&&this.canvas.frame.removeChild(this.editModeDiv),this.closeDiv&&this.canvas.frame.removeChild(this.closeDiv),this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0}_createSeperator(){let g=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;this.manipulationDOM["seperatorLineDiv"+g]=document.createElement("div"),this.manipulationDOM["seperatorLineDiv"+g].className="vis-separator-line",this.manipulationDiv.appendChild(this.manipulationDOM["seperatorLineDiv"+g])}_createAddNodeButton(g){var A;const t=this._createButton("addNode","vis-add",g.addNode||this.options.locales.en.addNode);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,IC(A=this.addNodeMode).call(A,this))}_createAddEdgeButton(g){var A;const t=this._createButton("addEdge","vis-connect",g.addEdge||this.options.locales.en.addEdge);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,IC(A=this.addEdgeMode).call(A,this))}_createEditNodeButton(g){var A;const t=this._createButton("editNode","vis-edit",g.editNode||this.options.locales.en.editNode);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,IC(A=this.editNode).call(A,this))}_createEditEdgeButton(g){var A;const t=this._createButton("editEdge","vis-edit",g.editEdge||this.options.locales.en.editEdge);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,IC(A=this.editEdgeMode).call(A,this))}_createDeleteButton(g){var A;let t;t=this.options.rtl?"vis-delete-rtl":"vis-delete";const C=this._createButton("delete",t,g.del||this.options.locales.en.del);this.manipulationDiv.appendChild(C),this._bindElementEvents(C,IC(A=this.deleteSelected).call(A,this))}_createBackButton(g){var A;const t=this._createButton("back","vis-back",g.back||this.options.locales.en.back);this.manipulationDiv.appendChild(t),this._bindElementEvents(t,IC(A=this.showManipulatorToolbar).call(A,this))}_createButton(g,A,t){let C=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"vis-label";return this.manipulationDOM[g+"Div"]=document.createElement("button"),this.manipulationDOM[g+"Div"].className="vis-button "+A,this.manipulationDOM[g+"Label"]=document.createElement("div"),this.manipulationDOM[g+"Label"].className=C,this.manipulationDOM[g+"Label"].innerText=t,this.manipulationDOM[g+"Div"].appendChild(this.manipulationDOM[g+"Label"]),this.manipulationDOM[g+"Div"]}_createDescription(g){this.manipulationDOM.descriptionLabel=document.createElement("div"),this.manipulationDOM.descriptionLabel.className="vis-none",this.manipulationDOM.descriptionLabel.innerText=g,this.manipulationDiv.appendChild(this.manipulationDOM.descriptionLabel)}_temporaryBindEvent(g,A){this.temporaryEventFunctions.push({event:g,boundFunction:A}),this.body.emitter.on(g,A)}_temporaryBindUI(g,A){if(void 0===this.body.eventListeners[g])throw new Error("This UI function does not exist. Typo? You tried: "+g+" possible are: "+Vb(uh(this.body.eventListeners)));this.temporaryUIFunctions[g]=this.body.eventListeners[g],this.body.eventListeners[g]=A}_unbindTemporaryUIs(){for(const g in this.temporaryUIFunctions)Object.prototype.hasOwnProperty.call(this.temporaryUIFunctions,g)&&(this.body.eventListeners[g]=this.temporaryUIFunctions[g],delete this.temporaryUIFunctions[g]);this.temporaryUIFunctions={}}_unbindTemporaryEvents(){for(let g=0;g<this.temporaryEventFunctions.length;g++){const A=this.temporaryEventFunctions[g].event,t=this.temporaryEventFunctions[g].boundFunction;this.body.emitter.off(A,t)}this.temporaryEventFunctions=[]}_bindElementEvents(g,A){const t=new We(g,{});ry(t,A),this._domEventListenerCleanupQueue.push(()=>{t.destroy()});const C=g=>{let{keyCode:t,key:C}=g;"Enter"!==C&&" "!==C&&13!==t&&32!==t||A()};g.addEventListener("keyup",C,!1),this._domEventListenerCleanupQueue.push(()=>{g.removeEventListener("keyup",C,!1)})}_cleanupTemporaryNodesAndEdges(){for(let t=0;t<this.temporaryIds.edges.length;t++){var g;this.body.edges[this.temporaryIds.edges[t]].disconnect(),delete this.body.edges[this.temporaryIds.edges[t]];const C=Si(g=this.body.edgeIndices).call(g,this.temporaryIds.edges[t]);var A;if(-1!==C)pn(A=this.body.edgeIndices).call(A,C,1)}for(let g=0;g<this.temporaryIds.nodes.length;g++){var t;delete this.body.nodes[this.temporaryIds.nodes[g]];const A=Si(t=this.body.nodeIndices).call(t,this.temporaryIds.nodes[g]);var C;if(-1!==A)pn(C=this.body.nodeIndices).call(C,A,1)}this.temporaryIds={nodes:[],edges:[]}}_controlNodeTouch(g){this.selectionHandler.unselectAll(),this.lastTouch=this.body.functions.getPointer(g.center),this.lastTouch.translation=Xt({},this.body.view.translation)}_controlNodeDragStart(){const g=this.lastTouch,A=this.selectionHandler._pointerToPositionObject(g),t=this.body.nodes[this.temporaryIds.nodes[0]],C=this.body.nodes[this.temporaryIds.nodes[1]],I=this.body.edges[this.edgeBeingEditedId];this.selectedControlNode=void 0;const e=t.isOverlappingWith(A),i=C.isOverlappingWith(A);!0===e?(this.selectedControlNode=t,I.edgeType.from=t):!0===i&&(this.selectedControlNode=C,I.edgeType.to=C),void 0!==this.selectedControlNode&&this.selectionHandler.selectObject(this.selectedControlNode),this.body.emitter.emit("_redraw")}_controlNodeDrag(g){this.body.emitter.emit("disablePhysics");const A=this.body.functions.getPointer(g.center),t=this.canvas.DOMtoCanvas(A);void 0!==this.selectedControlNode?(this.selectedControlNode.x=t.x,this.selectedControlNode.y=t.y):this.interactionHandler.onDrag(g),this.body.emitter.emit("_redraw")}_controlNodeDragEnd(g){const A=this.body.functions.getPointer(g.center),t=this.selectionHandler._pointerToPositionObject(A),C=this.body.edges[this.edgeBeingEditedId];if(void 0===this.selectedControlNode)return;this.selectionHandler.unselectAll();const I=this.selectionHandler._getAllNodesOverlappingWith(t);let e;for(let g=I.length-1;g>=0;g--)if(I[g]!==this.selectedControlNode.id){e=this.body.nodes[I[g]];break}if(void 0!==e&&void 0!==this.selectedControlNode)if(!0===e.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{const g=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===g.id?this._performEditEdge(e.id,C.to.id):this._performEditEdge(C.from.id,e.id)}else C.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}_handleConnect(g){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(g.center),this.lastTouch.translation=Xt({},this.body.view.translation),this.interactionHandler.drag.pointer=this.lastTouch,this.interactionHandler.drag.translation=this.lastTouch.translation;const A=this.lastTouch,t=this.selectionHandler.getNodeAt(A);if(void 0!==t)if(!0===t.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{const g=this._getNewTargetNode(t.x,t.y);this.body.nodes[g.id]=g,this.body.nodeIndices.push(g.id);const A=this.body.functions.createEdge({id:"connectionEdge"+Hh(),from:t.id,to:g.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[A.id]=A,this.body.edgeIndices.push(A.id),this.temporaryIds.nodes.push(g.id),this.temporaryIds.edges.push(A.id)}this.touchTime=(new Date).valueOf()}}_dragControlNode(g){const A=this.body.functions.getPointer(g.center),t=this.selectionHandler._pointerToPositionObject(A);let C;void 0!==this.temporaryIds.edges[0]&&(C=this.body.edges[this.temporaryIds.edges[0]].fromId);const I=this.selectionHandler._getAllNodesOverlappingWith(t);let e;for(let g=I.length-1;g>=0;g--){var i;if(-1===Si(i=this.temporaryIds.nodes).call(i,I[g])){e=this.body.nodes[I[g]];break}}if(g.controlEdge={from:C,to:e?e.id:void 0},this.selectionHandler.generateClickEvent("controlNodeDragging",g,A),void 0!==this.temporaryIds.nodes[0]){const g=this.body.nodes[this.temporaryIds.nodes[0]];g.x=this.canvas._XconvertDOMtoCanvas(A.x),g.y=this.canvas._YconvertDOMtoCanvas(A.y),this.body.emitter.emit("_redraw")}else this.interactionHandler.onDrag(g)}_finishConnect(g){const A=this.body.functions.getPointer(g.center),t=this.selectionHandler._pointerToPositionObject(A);let C;void 0!==this.temporaryIds.edges[0]&&(C=this.body.edges[this.temporaryIds.edges[0]].fromId);const I=this.selectionHandler._getAllNodesOverlappingWith(t);let e;for(let g=I.length-1;g>=0;g--){var i;if(-1===Si(i=this.temporaryIds.nodes).call(i,I[g])){e=this.body.nodes[I[g]];break}}this._cleanupTemporaryNodesAndEdges(),void 0!==e&&(!0===e.isCluster?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):void 0!==this.body.nodes[C]&&void 0!==this.body.nodes[e.id]&&this._performAddEdge(C,e.id)),g.controlEdge={from:C,to:e?e.id:void 0},this.selectionHandler.generateClickEvent("controlNodeDragEnd",g,A),this.body.emitter.emit("_redraw")}_dragStartEdge(g){const A=this.lastTouch;this.selectionHandler.generateClickEvent("dragStart",g,A,void 0,!0)}_performAddNode(g){const A={id:Hh(),x:g.pointer.canvas.x,y:g.pointer.canvas.y,label:"new"};if("function"==typeof this.options.addNode){if(2!==this.options.addNode.length)throw this.showManipulatorToolbar(),new Error("The function for add does not support two arguments (data,callback)");this.options.addNode(A,g=>{null!=g&&"addNode"===this.inMode&&this.body.data.nodes.getDataSet().add(g),this.showManipulatorToolbar()})}else this.body.data.nodes.getDataSet().add(A),this.showManipulatorToolbar()}_performAddEdge(g,A){const t={from:g,to:A};if("function"==typeof this.options.addEdge){if(2!==this.options.addEdge.length)throw new Error("The function for connect does not support two arguments (data,callback)");this.options.addEdge(t,g=>{null!=g&&"addEdge"===this.inMode&&(this.body.data.edges.getDataSet().add(g),this.selectionHandler.unselectAll(),this.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().add(t),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}_performEditEdge(g,A){const t={id:this.edgeBeingEditedId,from:g,to:A,label:this.body.data.edges.get(this.edgeBeingEditedId).label};let C=this.options.editEdge;if("object"==typeof C&&(C=C.editWithoutDrag),"function"==typeof C){if(2!==C.length)throw new Error("The function for edit does not support two arguments (data, callback)");C(t,g=>{null==g||"editEdge"!==this.inMode?(this.body.edges[t.id].updateEdgeType(),this.body.emitter.emit("_redraw"),this.showManipulatorToolbar()):(this.body.data.edges.getDataSet().update(g),this.selectionHandler.unselectAll(),this.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().update(t),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}}const UE="string",KE="boolean",HE="number",_E="array",XE="object",JE=["arrow","bar","box","circle","crow","curve","diamond","image","inv_curve","inv_triangle","triangle","vee"],qE={borderWidth:{number:HE},borderWidthSelected:{number:HE,undefined:"undefined"},brokenImage:{string:UE,undefined:"undefined"},chosen:{label:{boolean:KE,function:"function"},node:{boolean:KE,function:"function"},__type__:{object:XE,boolean:KE}},color:{border:{string:UE},background:{string:UE},highlight:{border:{string:UE},background:{string:UE},__type__:{object:XE,string:UE}},hover:{border:{string:UE},background:{string:UE},__type__:{object:XE,string:UE}},__type__:{object:XE,string:UE}},opacity:{number:HE,undefined:"undefined"},fixed:{x:{boolean:KE},y:{boolean:KE},__type__:{object:XE,boolean:KE}},font:{align:{string:UE},color:{string:UE},size:{number:HE},face:{string:UE},background:{string:UE},strokeWidth:{number:HE},strokeColor:{string:UE},vadjust:{number:HE},multi:{boolean:KE,string:UE},bold:{color:{string:UE},size:{number:HE},face:{string:UE},mod:{string:UE},vadjust:{number:HE},__type__:{object:XE,string:UE}},boldital:{color:{string:UE},size:{number:HE},face:{string:UE},mod:{string:UE},vadjust:{number:HE},__type__:{object:XE,string:UE}},ital:{color:{string:UE},size:{number:HE},face:{string:UE},mod:{string:UE},vadjust:{number:HE},__type__:{object:XE,string:UE}},mono:{color:{string:UE},size:{number:HE},face:{string:UE},mod:{string:UE},vadjust:{number:HE},__type__:{object:XE,string:UE}},__type__:{object:XE,string:UE}},group:{string:UE,number:HE,undefined:"undefined"},heightConstraint:{minimum:{number:HE},valign:{string:UE},__type__:{object:XE,boolean:KE,number:HE}},hidden:{boolean:KE},icon:{face:{string:UE},code:{string:UE},size:{number:HE},color:{string:UE},weight:{string:UE,number:HE},__type__:{object:XE}},id:{string:UE,number:HE},image:{selected:{string:UE,undefined:"undefined"},unselected:{string:UE,undefined:"undefined"},__type__:{object:XE,string:UE}},imagePadding:{top:{number:HE},right:{number:HE},bottom:{number:HE},left:{number:HE},__type__:{object:XE,number:HE}},label:{string:UE,undefined:"undefined"},labelHighlightBold:{boolean:KE},level:{number:HE,undefined:"undefined"},margin:{top:{number:HE},right:{number:HE},bottom:{number:HE},left:{number:HE},__type__:{object:XE,number:HE}},mass:{number:HE},physics:{boolean:KE},scaling:{min:{number:HE},max:{number:HE},label:{enabled:{boolean:KE},min:{number:HE},max:{number:HE},maxVisible:{number:HE},drawThreshold:{number:HE},__type__:{object:XE,boolean:KE}},customScalingFunction:{function:"function"},__type__:{object:XE}},shadow:{enabled:{boolean:KE},color:{string:UE},size:{number:HE},x:{number:HE},y:{number:HE},__type__:{object:XE,boolean:KE}},shape:{string:["custom","ellipse","circle","database","box","text","image","circularImage","diamond","dot","star","triangle","triangleDown","square","icon","hexagon"]},ctxRenderer:{function:"function"},shapeProperties:{borderDashes:{boolean:KE,array:_E},borderRadius:{number:HE},interpolation:{boolean:KE},useImageSize:{boolean:KE},useBorderWithImage:{boolean:KE},coordinateOrigin:{string:["center","top-left"]},__type__:{object:XE}},size:{number:HE},title:{string:UE,dom:"dom",undefined:"undefined"},value:{number:HE,undefined:"undefined"},widthConstraint:{minimum:{number:HE},maximum:{number:HE},__type__:{object:XE,boolean:KE,number:HE}},x:{number:HE},y:{number:HE},__type__:{object:XE}},$E={configure:{enabled:{boolean:KE},filter:{boolean:KE,string:UE,array:_E,function:"function"},container:{dom:"dom"},showButton:{boolean:KE},__type__:{object:XE,boolean:KE,string:UE,array:_E,function:"function"}},edges:{arrows:{to:{enabled:{boolean:KE},scaleFactor:{number:HE},type:{string:JE},imageHeight:{number:HE},imageWidth:{number:HE},src:{string:UE},__type__:{object:XE,boolean:KE}},middle:{enabled:{boolean:KE},scaleFactor:{number:HE},type:{string:JE},imageWidth:{number:HE},imageHeight:{number:HE},src:{string:UE},__type__:{object:XE,boolean:KE}},from:{enabled:{boolean:KE},scaleFactor:{number:HE},type:{string:JE},imageWidth:{number:HE},imageHeight:{number:HE},src:{string:UE},__type__:{object:XE,boolean:KE}},__type__:{string:["from","to","middle"],object:XE}},endPointOffset:{from:{number:HE},to:{number:HE},__type__:{object:XE,number:HE}},arrowStrikethrough:{boolean:KE},background:{enabled:{boolean:KE},color:{string:UE},size:{number:HE},dashes:{boolean:KE,array:_E},__type__:{object:XE,boolean:KE}},chosen:{label:{boolean:KE,function:"function"},edge:{boolean:KE,function:"function"},__type__:{object:XE,boolean:KE}},color:{color:{string:UE},highlight:{string:UE},hover:{string:UE},inherit:{string:["from","to","both"],boolean:KE},opacity:{number:HE},__type__:{object:XE,string:UE}},dashes:{boolean:KE,array:_E},font:{color:{string:UE},size:{number:HE},face:{string:UE},background:{string:UE},strokeWidth:{number:HE},strokeColor:{string:UE},align:{string:["horizontal","top","middle","bottom"]},vadjust:{number:HE},multi:{boolean:KE,string:UE},bold:{color:{string:UE},size:{number:HE},face:{string:UE},mod:{string:UE},vadjust:{number:HE},__type__:{object:XE,string:UE}},boldital:{color:{string:UE},size:{number:HE},face:{string:UE},mod:{string:UE},vadjust:{number:HE},__type__:{object:XE,string:UE}},ital:{color:{string:UE},size:{number:HE},face:{string:UE},mod:{string:UE},vadjust:{number:HE},__type__:{object:XE,string:UE}},mono:{color:{string:UE},size:{number:HE},face:{string:UE},mod:{string:UE},vadjust:{number:HE},__type__:{object:XE,string:UE}},__type__:{object:XE,string:UE}},hidden:{boolean:KE},hoverWidth:{function:"function",number:HE},label:{string:UE,undefined:"undefined"},labelHighlightBold:{boolean:KE},length:{number:HE,undefined:"undefined"},physics:{boolean:KE},scaling:{min:{number:HE},max:{number:HE},label:{enabled:{boolean:KE},min:{number:HE},max:{number:HE},maxVisible:{number:HE},drawThreshold:{number:HE},__type__:{object:XE,boolean:KE}},customScalingFunction:{function:"function"},__type__:{object:XE}},selectionWidth:{function:"function",number:HE},selfReferenceSize:{number:HE},selfReference:{size:{number:HE},angle:{number:HE},renderBehindTheNode:{boolean:KE},__type__:{object:XE}},shadow:{enabled:{boolean:KE},color:{string:UE},size:{number:HE},x:{number:HE},y:{number:HE},__type__:{object:XE,boolean:KE}},smooth:{enabled:{boolean:KE},type:{string:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"]},roundness:{number:HE},forceDirection:{string:["horizontal","vertical","none"],boolean:KE},__type__:{object:XE,boolean:KE}},title:{string:UE,undefined:"undefined"},width:{number:HE},widthConstraint:{maximum:{number:HE},__type__:{object:XE,boolean:KE,number:HE}},value:{number:HE,undefined:"undefined"},__type__:{object:XE}},groups:{useDefaultGroups:{boolean:KE},__any__:qE,__type__:{object:XE}},interaction:{dragNodes:{boolean:KE},dragView:{boolean:KE},hideEdgesOnDrag:{boolean:KE},hideEdgesOnZoom:{boolean:KE},hideNodesOnDrag:{boolean:KE},hover:{boolean:KE},keyboard:{enabled:{boolean:KE},speed:{x:{number:HE},y:{number:HE},zoom:{number:HE},__type__:{object:XE}},bindToWindow:{boolean:KE},autoFocus:{boolean:KE},__type__:{object:XE,boolean:KE}},multiselect:{boolean:KE},navigationButtons:{boolean:KE},selectable:{boolean:KE},selectConnectedEdges:{boolean:KE},hoverConnectedEdges:{boolean:KE},tooltipDelay:{number:HE},zoomView:{boolean:KE},zoomSpeed:{number:HE},__type__:{object:XE}},layout:{randomSeed:{undefined:"undefined",number:HE,string:UE},improvedLayout:{boolean:KE},clusterThreshold:{number:HE},hierarchical:{enabled:{boolean:KE},levelSeparation:{number:HE},nodeSpacing:{number:HE},treeSpacing:{number:HE},blockShifting:{boolean:KE},edgeMinimization:{boolean:KE},parentCentralization:{boolean:KE},direction:{string:["UD","DU","LR","RL"]},sortMethod:{string:["hubsize","directed"]},shakeTowards:{string:["leaves","roots"]},__type__:{object:XE,boolean:KE}},__type__:{object:XE}},manipulation:{enabled:{boolean:KE},initiallyActive:{boolean:KE},addNode:{boolean:KE,function:"function"},addEdge:{boolean:KE,function:"function"},editNode:{function:"function"},editEdge:{editWithoutDrag:{function:"function"},__type__:{object:XE,boolean:KE,function:"function"}},deleteNode:{boolean:KE,function:"function"},deleteEdge:{boolean:KE,function:"function"},controlNodeStyle:qE,__type__:{object:XE,boolean:KE}},nodes:qE,physics:{enabled:{boolean:KE},barnesHut:{theta:{number:HE},gravitationalConstant:{number:HE},centralGravity:{number:HE},springLength:{number:HE},springConstant:{number:HE},damping:{number:HE},avoidOverlap:{number:HE},__type__:{object:XE}},forceAtlas2Based:{theta:{number:HE},gravitationalConstant:{number:HE},centralGravity:{number:HE},springLength:{number:HE},springConstant:{number:HE},damping:{number:HE},avoidOverlap:{number:HE},__type__:{object:XE}},repulsion:{centralGravity:{number:HE},springLength:{number:HE},springConstant:{number:HE},nodeDistance:{number:HE},damping:{number:HE},__type__:{object:XE}},hierarchicalRepulsion:{centralGravity:{number:HE},springLength:{number:HE},springConstant:{number:HE},nodeDistance:{number:HE},damping:{number:HE},avoidOverlap:{number:HE},__type__:{object:XE}},maxVelocity:{number:HE},minVelocity:{number:HE},solver:{string:["barnesHut","repulsion","hierarchicalRepulsion","forceAtlas2Based"]},stabilization:{enabled:{boolean:KE},iterations:{number:HE},updateInterval:{number:HE},onlyDynamicEdges:{boolean:KE},fit:{boolean:KE},__type__:{object:XE,boolean:KE}},timestep:{number:HE},adaptiveTimestep:{boolean:KE},wind:{x:{number:HE},y:{number:HE},__type__:{object:XE}},__type__:{object:XE,boolean:KE}},autoResize:{boolean:KE},clickToUse:{boolean:KE},locale:{string:UE},locales:{__any__:{any:"any"},__type__:{object:XE}},height:{string:UE},width:{string:UE},__type__:{object:XE}},gO={nodes:{borderWidth:[1,0,10,1],borderWidthSelected:[2,0,10,1],color:{border:["color","#2B7CE9"],background:["color","#97C2FC"],highlight:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]},hover:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]}},opacity:[0,0,1,.1],fixed:{x:!1,y:!1},font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[0,0,50,1],strokeColor:["color","#ffffff"]},hidden:!1,labelHighlightBold:!0,physics:!0,scaling:{min:[10,0,200,1],max:[30,0,200,1],label:{enabled:!1,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},shape:["ellipse","box","circle","database","diamond","dot","square","star","text","triangle","triangleDown","hexagon"],shapeProperties:{borderDashes:!1,borderRadius:[6,0,20,1],interpolation:!0,useImageSize:!1},size:[25,0,200,1]},edges:{arrows:{to:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"},middle:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"},from:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"}},endPointOffset:{from:[0,-10,10,1],to:[0,-10,10,1]},arrowStrikethrough:!0,color:{color:["color","#848484"],highlight:["color","#848484"],hover:["color","#848484"],inherit:["from","to","both",!0,!1],opacity:[1,0,1,.05]},dashes:!1,font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[2,0,50,1],strokeColor:["color","#ffffff"],align:["horizontal","top","middle","bottom"]},hidden:!1,hoverWidth:[1.5,0,5,.1],labelHighlightBold:!0,physics:!0,scaling:{min:[1,0,100,1],max:[15,0,100,1],label:{enabled:!0,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},selectionWidth:[1.5,0,5,.1],selfReferenceSize:[20,0,200,1],selfReference:{size:[20,0,200,1],angle:[Math.PI/2,-6*Math.PI,6*Math.PI,Math.PI/8],renderBehindTheNode:!0},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},smooth:{enabled:!0,type:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"],forceDirection:["horizontal","vertical","none"],roundness:[.5,0,1,.05]},width:[1,0,30,1]},layout:{hierarchical:{enabled:!1,levelSeparation:[150,20,500,5],nodeSpacing:[100,20,500,5],treeSpacing:[200,20,500,5],blockShifting:!0,edgeMinimization:!0,parentCentralization:!0,direction:["UD","DU","LR","RL"],sortMethod:["hubsize","directed"],shakeTowards:["leaves","roots"]}},interaction:{dragNodes:!0,dragView:!0,hideEdgesOnDrag:!1,hideEdgesOnZoom:!1,hideNodesOnDrag:!1,hover:!1,keyboard:{enabled:!1,speed:{x:[10,0,40,1],y:[10,0,40,1],zoom:[.02,0,.1,.005]},bindToWindow:!0,autoFocus:!0},multiselect:!1,navigationButtons:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0,tooltipDelay:[300,0,1e3,25],zoomView:!0,zoomSpeed:[1,.1,2,.1]},manipulation:{enabled:!1,initiallyActive:!1},physics:{enabled:!0,barnesHut:{theta:[.5,.1,1,.05],gravitationalConstant:[-2e3,-3e4,0,50],centralGravity:[.3,0,10,.05],springLength:[95,0,500,5],springConstant:[.04,0,1.2,.005],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},forceAtlas2Based:{theta:[.5,.1,1,.05],gravitationalConstant:[-50,-500,0,1],centralGravity:[.01,0,1,.005],springLength:[95,0,500,5],springConstant:[.08,0,1.2,.005],damping:[.4,0,1,.01],avoidOverlap:[0,0,1,.01]},repulsion:{centralGravity:[.2,0,10,.05],springLength:[200,0,500,5],springConstant:[.05,0,1.2,.005],nodeDistance:[100,0,500,5],damping:[.09,0,1,.01]},hierarchicalRepulsion:{centralGravity:[.2,0,10,.05],springLength:[100,0,500,5],springConstant:[.01,0,1.2,.005],nodeDistance:[120,0,500,5],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},maxVelocity:[50,0,150,1],minVelocity:[.1,.01,.5,.01],solver:["barnesHut","forceAtlas2Based","repulsion","hierarchicalRepulsion"],timestep:[.5,.01,1,.01],wind:{x:[0,-10,10,.1],y:[0,-10,10,.1]}}},AO=(g,A,t)=>{var C;return!(!Ho(g).call(g,"physics")||!Ho(C=gO.physics.solver).call(C,A)||t.physics.solver===A||"wind"===A)};var tO=Object.freeze({__proto__:null,allOptions:$E,configuratorHideOption:AO,configureOptions:gO});class CO{constructor(){}getDistances(g,A,t){const C={},I=g.edges;for(let g=0;g<A.length;g++){const t={};C[A[g]]=t;for(let C=0;C<A.length;C++)t[A[C]]=g==C?0:1e9}for(let g=0;g<t.length;g++){const A=I[t[g]];!0===A.connected&&void 0!==C[A.fromId]&&void 0!==C[A.toId]&&(C[A.fromId][A.toId]=1,C[A.toId][A.fromId]=1)}const e=A.length;for(let g=0;g<e;g++){const t=A[g],I=C[t];for(let g=0;g<e-1;g++){const i=A[g],o=C[i];for(let n=g+1;n<e;n++){const g=A[n],e=C[g],s=Math.min(o[g],o[t]+I[g]);o[g]=s,e[i]=s}}}return C}}class IO{constructor(g,A,t){this.body=g,this.springLength=A,this.springConstant=t,this.distanceSolver=new CO}setOptions(g){g&&(g.springLength&&(this.springLength=g.springLength),g.springConstant&&(this.springConstant=g.springConstant))}solve(g,A){let t=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const C=this.distanceSolver.getDistances(this.body,g,A);this._createL_matrix(C),this._createK_matrix(C),this._createE_matrix();let I=0;const e=Math.max(1e3,Math.min(10*this.body.nodeIndices.length,6e3));let i=1e9,o=0,n=0,s=0,r=0,a=0;for(;i>.01&&I<e;)for(I+=1,[o,i,n,s]=this._getHighestEnergyNode(t),r=i,a=0;r>1&&a<5;)a+=1,this._moveNode(o,n,s),[r,n,s]=this._getEnergy(o)}_getHighestEnergyNode(g){const A=this.body.nodeIndices,t=this.body.nodes;let C=0,I=A[0],e=0,i=0;for(let o=0;o<A.length;o++){const n=A[o];if(!0!==t[n].predefinedPosition||!0===t[n].isCluster&&!0===g||!0!==t[n].options.fixed.x||!0!==t[n].options.fixed.y){const[g,A,t]=this._getEnergy(n);C<g&&(C=g,I=n,e=A,i=t)}}return[I,C,e,i]}_getEnergy(g){const[A,t]=this.E_sums[g];return[Math.sqrt(A**2+t**2),A,t]}_moveNode(g,A,t){const C=this.body.nodeIndices,I=this.body.nodes;let e=0,i=0,o=0;const n=I[g].x,s=I[g].y,r=this.K_matrix[g],a=this.L_matrix[g];for(let A=0;A<C.length;A++){const t=C[A];if(t!==g){const g=I[t].x,A=I[t].y,C=r[t],d=a[t],h=1/((n-g)**2+(s-A)**2)**1.5;e+=C*(1-d*(s-A)**2*h),i+=C*(d*(n-g)*(s-A)*h),o+=C*(1-d*(n-g)**2*h)}}const d=(A/e+t/i)/(i/e-o/i),h=-(i*d+A)/e;I[g].x+=h,I[g].y+=d,this._updateE_matrix(g)}_createL_matrix(g){const A=this.body.nodeIndices,t=this.springLength;this.L_matrix=[];for(let C=0;C<A.length;C++){this.L_matrix[A[C]]={};for(let I=0;I<A.length;I++)this.L_matrix[A[C]][A[I]]=t*g[A[C]][A[I]]}}_createK_matrix(g){const A=this.body.nodeIndices,t=this.springConstant;this.K_matrix=[];for(let C=0;C<A.length;C++){this.K_matrix[A[C]]={};for(let I=0;I<A.length;I++)this.K_matrix[A[C]][A[I]]=t*g[A[C]][A[I]]**-2}}_createE_matrix(){const g=this.body.nodeIndices,A=this.body.nodes;this.E_matrix={},this.E_sums={};for(let A=0;A<g.length;A++)this.E_matrix[g[A]]=[];for(let t=0;t<g.length;t++){const C=g[t],I=A[C].x,e=A[C].y;let i=0,o=0;for(let n=t;n<g.length;n++){const s=g[n];if(s!==C){const g=A[s].x,r=A[s].y,a=1/Math.sqrt((I-g)**2+(e-r)**2);this.E_matrix[C][n]=[this.K_matrix[C][s]*(I-g-this.L_matrix[C][s]*(I-g)*a),this.K_matrix[C][s]*(e-r-this.L_matrix[C][s]*(e-r)*a)],this.E_matrix[s][t]=this.E_matrix[C][n],i+=this.E_matrix[C][n][0],o+=this.E_matrix[C][n][1]}}this.E_sums[C]=[i,o]}}_updateE_matrix(g){const A=this.body.nodeIndices,t=this.body.nodes,C=this.E_matrix[g],I=this.K_matrix[g],e=this.L_matrix[g],i=t[g].x,o=t[g].y;let n=0,s=0;for(let r=0;r<A.length;r++){const a=A[r];if(a!==g){const g=C[r],A=g[0],d=g[1],h=t[a].x,l=t[a].y,c=1/Math.sqrt((i-h)**2+(o-l)**2),u=I[a]*(i-h-e[a]*(i-h)*c),p=I[a]*(o-l-e[a]*(o-l)*c);C[r]=[u,p],n+=u,s+=p;const f=this.E_sums[a];f[0]+=u-A,f[1]+=p-d}}this.E_sums[g]=[n,s]}}function eO(g,A,t){var C,I,e,i;if(!(this instanceof eO))throw new SyntaxError("Constructor must be called with the new operator");this.options={},this.defaultOptions={locale:"en",locales:Vs,clickToUse:!1},Xt(this.options,this.defaultOptions),this.body={container:g,nodes:{},nodeIndices:[],edges:{},edgeIndices:[],emitter:{on:IC(C=this.on).call(C,this),off:IC(I=this.off).call(I,this),emit:IC(e=this.emit).call(e,this),once:IC(i=this.once).call(i,this)},eventListeners:{onTap:function(){},onTouch:function(){},onDoubleTap:function(){},onHold:function(){},onDragStart:function(){},onDrag:function(){},onDragEnd:function(){},onMouseWheel:function(){},onPinch:function(){},onMouseMove:function(){},onRelease:function(){},onContext:function(){}},data:{nodes:null,edges:null},functions:{createNode:function(){},createEdge:function(){},getPointer:function(){}},modules:{},view:{scale:1,translation:{x:0,y:0}},selectionBox:{show:!1,position:{start:{x:0,y:0},end:{x:0,y:0}}}},this.bindEventListeners(),this.images=new Pr(()=>this.body.emitter.emit("_requestRedraw")),this.groups=new Td,this.canvas=new dy(this.body),this.selectionHandler=new ux(this.body,this.canvas),this.interactionHandler=new uy(this.body,this.canvas,this.selectionHandler),this.view=new hy(this.body,this.canvas),this.renderer=new oy(this.body,this.canvas),this.physics=new Gm(this.body),this.layoutEngine=new WE(this.body),this.clustering=new iy(this.body),this.manipulation=new QE(this.body,this.canvas,this.selectionHandler,this.interactionHandler),this.nodesHandler=new cb(this.body,this.images,this.groups,this.layoutEngine),this.edgesHandler=new vm(this.body,this.images,this.groups),this.body.modules.kamadaKawai=new IO(this.body,150,.05),this.body.modules.clustering=this.clustering,this.canvas._create(),this.setOptions(t),this.setData(A)}cC(eO.prototype),eO.prototype.setOptions=function(g){if(null===g&&(g=void 0),void 0!==g){!0===Ke.validate(g,$E)&&console.error("%cErrors have been found in the supplied options object.",Ue);if(ue(["locale","locales","clickToUse"],this.options,g),void 0!==g.locale&&(g.locale=function(g,A){try{const[C,I]=A.split(/[-_ /]/,2),e=null!=C?C.toLowerCase():null,i=null!=I?I.toUpperCase():null;if(e&&i){const A=e+"-"+i;if(Object.prototype.hasOwnProperty.call(g,A))return A;var t;console.warn(kr(t="Unknown variant ".concat(i," of language ")).call(t,e,"."))}if(e){const A=e;if(Object.prototype.hasOwnProperty.call(g,A))return A;console.warn("Unknown language ".concat(e))}return console.warn("Unknown locale ".concat(A,", falling back to English.")),"en"}catch(g){return console.error(g),console.warn("Unexpected error while normalizing locale ".concat(A,", falling back to English.")),"en"}}(g.locales||this.options.locales,g.locale)),g=this.layoutEngine.setOptions(g.layout,g),this.canvas.setOptions(g),this.groups.setOptions(g.groups),this.nodesHandler.setOptions(g.nodes),this.edgesHandler.setOptions(g.edges),this.physics.setOptions(g.physics),this.manipulation.setOptions(g.manipulation,g,this.options),this.interactionHandler.setOptions(g.interaction),this.renderer.setOptions(g.interaction),this.selectionHandler.setOptions(g.interaction),void 0!==g.groups&&this.body.emitter.emit("refreshNodes"),"configure"in g&&(this.configurator||(this.configurator=new Ye(this,this.body.container,gO,this.canvas.pixelRatio,AO)),this.configurator.setOptions(g.configure)),this.configurator&&!0===this.configurator.options.enabled){const g={nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};fe(g.nodes,this.nodesHandler.options),fe(g.edges,this.edgesHandler.options),fe(g.layout,this.layoutEngine.options),fe(g.interaction,this.selectionHandler.options),fe(g.interaction,this.renderer.options),fe(g.interaction,this.interactionHandler.options),fe(g.manipulation,this.manipulation.options),fe(g.physics,this.physics.options),fe(g.global,this.canvas.options),fe(g.global,this.options),this.configurator.setModuleOptions(g)}void 0!==g.clickToUse?!0===g.clickToUse?void 0===this.activator&&(this.activator=new Ve(this.canvas.frame),this.activator.on("change",()=>{this.body.emitter.emit("activate")})):(void 0!==this.activator&&(this.activator.destroy(),delete this.activator),this.body.emitter.emit("activate")):this.body.emitter.emit("activate"),this.canvas.setSize(),this.body.emitter.emit("startSimulation")}},eO.prototype._updateVisibleIndices=function(){const g=this.body.nodes,A=this.body.edges;this.body.nodeIndices=[],this.body.edgeIndices=[];for(const A in g)Object.prototype.hasOwnProperty.call(g,A)&&(this.clustering._isClusteredNode(A)||!1!==g[A].options.hidden||this.body.nodeIndices.push(g[A].id));for(const t in A)if(Object.prototype.hasOwnProperty.call(A,t)){const C=A[t],I=g[C.fromId],e=g[C.toId],i=void 0!==I&&void 0!==e;!this.clustering._isClusteredEdge(t)&&!1===C.options.hidden&&i&&!1===I.options.hidden&&!1===e.options.hidden&&this.body.edgeIndices.push(C.id)}},eO.prototype.bindEventListeners=function(){this.body.emitter.on("_dataChanged",()=>{this.edgesHandler._updateState(),this.body.emitter.emit("_dataUpdated")}),this.body.emitter.on("_dataUpdated",()=>{this.clustering._updateState(),this._updateVisibleIndices(),this._updateValueRange(this.body.nodes),this._updateValueRange(this.body.edges),this.body.emitter.emit("startSimulation"),this.body.emitter.emit("_requestRedraw")})},eO.prototype.setData=function(g){if(this.body.emitter.emit("resetPhysics"),this.body.emitter.emit("_resetData"),this.selectionHandler.unselectAll(),g&&g.dot&&(g.nodes||g.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(g&&g.options),g&&g.dot){console.warn("The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);");const A=cs(g.dot);return void this.setData(A)}if(g&&g.gephi){console.warn("The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);");const A=Rs(g.gephi);return void this.setData(A)}this.nodesHandler.setData(g&&g.nodes,!0),this.edgesHandler.setData(g&&g.edges,!0),this.body.emitter.emit("_dataChanged"),this.body.emitter.emit("_dataLoaded"),this.body.emitter.emit("initPhysics")},eO.prototype.destroy=function(){this.body.emitter.emit("destroy"),this.body.emitter.off(),this.off(),delete this.groups,delete this.canvas,delete this.selectionHandler,delete this.interactionHandler,delete this.view,delete this.renderer,delete this.physics,delete this.layoutEngine,delete this.clustering,delete this.manipulation,delete this.nodesHandler,delete this.edgesHandler,delete this.configurator,delete this.images;for(const g in this.body.nodes)Object.prototype.hasOwnProperty.call(this.body.nodes,g)&&delete this.body.nodes[g];for(const g in this.body.edges)Object.prototype.hasOwnProperty.call(this.body.edges,g)&&delete this.body.edges[g];ae(this.body.container)},eO.prototype._updateValueRange=function(g){let A,t,C,I=0;for(A in g)if(Object.prototype.hasOwnProperty.call(g,A)){const e=g[A].getValue();void 0!==e&&(t=void 0===t?e:Math.min(e,t),C=void 0===C?e:Math.max(e,C),I+=e)}if(void 0!==t&&void 0!==C)for(A in g)Object.prototype.hasOwnProperty.call(g,A)&&g[A].setValueRange(t,C,I)},eO.prototype.isActive=function(){return!this.activator||this.activator.active},eO.prototype.setSize=function(){return this.canvas.setSize.apply(this.canvas,arguments)},eO.prototype.canvasToDOM=function(){return this.canvas.canvasToDOM.apply(this.canvas,arguments)},eO.prototype.DOMtoCanvas=function(){return this.canvas.DOMtoCanvas.apply(this.canvas,arguments)},eO.prototype.findNode=function(){return this.clustering.findNode.apply(this.clustering,arguments)},eO.prototype.isCluster=function(){return this.clustering.isCluster.apply(this.clustering,arguments)},eO.prototype.openCluster=function(){return this.clustering.openCluster.apply(this.clustering,arguments)},eO.prototype.cluster=function(){return this.clustering.cluster.apply(this.clustering,arguments)},eO.prototype.getNodesInCluster=function(){return this.clustering.getNodesInCluster.apply(this.clustering,arguments)},eO.prototype.clusterByConnection=function(){return this.clustering.clusterByConnection.apply(this.clustering,arguments)},eO.prototype.clusterByHubsize=function(){return this.clustering.clusterByHubsize.apply(this.clustering,arguments)},eO.prototype.updateClusteredNode=function(){return this.clustering.updateClusteredNode.apply(this.clustering,arguments)},eO.prototype.getClusteredEdges=function(){return this.clustering.getClusteredEdges.apply(this.clustering,arguments)},eO.prototype.getBaseEdge=function(){return this.clustering.getBaseEdge.apply(this.clustering,arguments)},eO.prototype.getBaseEdges=function(){return this.clustering.getBaseEdges.apply(this.clustering,arguments)},eO.prototype.updateEdge=function(){return this.clustering.updateEdge.apply(this.clustering,arguments)},eO.prototype.clusterOutliers=function(){return this.clustering.clusterOutliers.apply(this.clustering,arguments)},eO.prototype.getSeed=function(){return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments)},eO.prototype.enableEditMode=function(){return this.manipulation.enableEditMode.apply(this.manipulation,arguments)},eO.prototype.disableEditMode=function(){return this.manipulation.disableEditMode.apply(this.manipulation,arguments)},eO.prototype.addNodeMode=function(){return this.manipulation.addNodeMode.apply(this.manipulation,arguments)},eO.prototype.editNode=function(){return this.manipulation.editNode.apply(this.manipulation,arguments)},eO.prototype.editNodeMode=function(){return console.warn("Deprecated: Please use editNode instead of editNodeMode."),this.manipulation.editNode.apply(this.manipulation,arguments)},eO.prototype.addEdgeMode=function(){return this.manipulation.addEdgeMode.apply(this.manipulation,arguments)},eO.prototype.editEdgeMode=function(){return this.manipulation.editEdgeMode.apply(this.manipulation,arguments)},eO.prototype.deleteSelected=function(){return this.manipulation.deleteSelected.apply(this.manipulation,arguments)},eO.prototype.getPositions=function(){return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments)},eO.prototype.getPosition=function(){return this.nodesHandler.getPosition.apply(this.nodesHandler,arguments)},eO.prototype.storePositions=function(){return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments)},eO.prototype.moveNode=function(){return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments)},eO.prototype.getBoundingBox=function(){return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments)},eO.prototype.getConnectedNodes=function(g){return void 0!==this.body.nodes[g]?this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments):this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments)},eO.prototype.getConnectedEdges=function(){return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments)},eO.prototype.startSimulation=function(){return this.physics.startSimulation.apply(this.physics,arguments)},eO.prototype.stopSimulation=function(){return this.physics.stopSimulation.apply(this.physics,arguments)},eO.prototype.stabilize=function(){return this.physics.stabilize.apply(this.physics,arguments)},eO.prototype.getSelection=function(){return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments)},eO.prototype.setSelection=function(){return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments)},eO.prototype.getSelectedNodes=function(){return this.selectionHandler.getSelectedNodeIds.apply(this.selectionHandler,arguments)},eO.prototype.getSelectedEdges=function(){return this.selectionHandler.getSelectedEdgeIds.apply(this.selectionHandler,arguments)},eO.prototype.getNodeAt=function(){const g=this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);return void 0!==g&&void 0!==g.id?g.id:g},eO.prototype.getEdgeAt=function(){const g=this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);return void 0!==g&&void 0!==g.id?g.id:g},eO.prototype.selectNodes=function(){return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments)},eO.prototype.selectEdges=function(){return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments)},eO.prototype.unselectAll=function(){this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments),this.selectionHandler.commitWithoutEmitting.apply(this.selectionHandler),this.redraw()},eO.prototype.redraw=function(){return this.renderer.redraw.apply(this.renderer,arguments)},eO.prototype.getScale=function(){return this.view.getScale.apply(this.view,arguments)},eO.prototype.getViewPosition=function(){return this.view.getViewPosition.apply(this.view,arguments)},eO.prototype.fit=function(){return this.view.fit.apply(this.view,arguments)},eO.prototype.moveTo=function(){return this.view.moveTo.apply(this.view,arguments)},eO.prototype.focus=function(){return this.view.focus.apply(this.view,arguments)},eO.prototype.releaseNode=function(){return this.view.releaseNode.apply(this.view,arguments)},eO.prototype.getOptionsFromConfigurator=function(){let g={};return this.configurator&&(g=this.configurator.getOptions.apply(this.configurator)),g};const iO=cs;g.DataSet=Al,g.DataView=tl,g.Network=eO,g.NetworkImages=Pr,g.Queue=qh,g.data=cl,g.networkDOTParser=Es,g.networkGephiParser=Ps,g.networkOptions=tO,g.parseDOTNetwork=iO,g.parseGephiNetwork=Rs});
85//# sourceMappingURL=vis-network.min.js.map