makamaka / json Goto Github PK
View Code? Open in Web Editor NEWperl implementation of JSON encoder/decoder
perl implementation of JSON encoder/decoder
I got this ticket: rurban/Cpanel-JSON-XS#28
"inf and nan encoded as invalid JSON"
I know that inf and nan are not encodable in JSON, but inf or nan are invalid JavaScript.
perl -MJSON -e'print encode_json([9**9**9])'
=> [inf]
Other JSON libraries encode it as null, and Mojo::JSON stepped forward by stringifying it.
I have no opinion, but either one of those solution would be better than the invalid inf or nan,
we currently have.
Doc states:
$json->boolean_values([ $false, $true ]);
But this is incorrect. Correct call is:
$json->boolean_values( $false, $true );
I also suggest including some indication the above call mutates $json
. This is to differentiate from other methods that follow $json = $json->some_method( ... );
. In fact, $json = $json->boolean_values( ... );
returns the values set, therefore destroying $json
.
Test:
use JSON 4.01;
my $json = JSON->new;
$json->boolean_values( 0, 1 );
is( $json->true, 1 );
is( $json->false, 0 );
my $true = $json->decode( '{"value" : true }' );
is( ref($true->{'value'}, '' );
is( $true->{'value'}, 1 );
my $false = $json->decode( '{"value" : false }' );
is( ref($false->{'value'}, '' );
is( $false->{'value'}, 0 );
Perl has a special boolean false, which is simply a dualvar, zero in numeric context and the empty string in string context. You can get it from !! 0
.
JSON supports \0
and \1
as shortcuts to JSON::true
and JSON::false
, but it would be very helpful if it could detect a ref to this dualvar and resolve accordingly.
That would turn constructs like this
($value ? \1 : \0)
into
(!! $value)
Which, although mildly awkward, seems like the sort of idiom we get in Perl, and is understandable after the first encounter.
As expressed on irc, the entire point of a wrapper around the various backends is to provide a consistent experience no matter which backend + version the user has installed. To change the default behaviour now would break some applications and defeats the entire purpose.
Please, I implore you, remove this release on cpan.
see also makamaka/JSON-PP#40
cc @charsbar
version:
PERLBREW_PATH: /root/perl5/perlbrew/bin:/root/perl5/perlbrew/perls/perl-5.36.0/bin
PERLBREW_MANPATH: /root/perl5/perlbrew/perls/perl-5.36.0/man
Module: JSON
Location: /root/perl5/perlbrew/perls/perl-5.36.0/lib/site_perl/5.36.0/JSON.pm
Version: 4.10
Module: JSON::MaybeXS
Location: /root/perl5/perlbrew/perls/perl-5.36.0/lib/site_perl/5.36.0/JSON/MaybeXS.pm
Version: 1.004004
Module: JSON::Parse
Location: /root/perl5/perlbrew/perls/perl-5.36.0/lib/site_perl/5.36.0/x86_64-linux/JSON/Parse.pm
Version: 0.62
Module: JSON::XS
Location: /root/perl5/perlbrew/perls/perl-5.36.0/lib/site_perl/5.36.0/x86_64-linux/JSON/XS.pm
Version: 4.03
Module: Test::Deep::JSON
Location: /root/perl5/perlbrew/perls/perl-5.36.0/lib/site_perl/5.36.0/Test/Deep/JSON.pm
Version: 0.05
Sample code used to demonstrate the problem.
original JSON:
{"attr":{"remote":"str1","uuid":{"uuid":{"$uuid":"a1"}},"connectionId":16,"connectionCount":1}
}
in each case the tags in the original JSON have the same order.
the JSON is read using this code:
``
my (%tempAA) = (); my($tempJsonAARef) = undef;
try
{
$tempJsonAARef = from_json($line);
} catch
{
if ( $_ =~ /malformed JSON string/ )
{
} else
{
print STDERR __PACKAGE__." ".__LINE__." Error when processing from_json error: $_\n";
}
};
%tempAA = %$tempJsonAARef if ref($tempJsonAARef) eq "HASH";
my ($jsonObj) = JSON->new->allow_nonref;
my ($prettyStr) = $jsonObj->pretty->encode($tempAA{'attr'});
The pretty print output below shows the structure of the hash
pretty print version of the hash
'Connection accepted {
'uuid' : {
'uuid' : {
'$uuid' : 'a1'
}
},
'remote' : 'str1',
'connectionCount' : 1,
'connectionId' : 16
}
``
in this example the ids are listed in the following order: uuid, remote, connectionCount, connectionId
in the examples below the {. indicates where the carriage returns have been stripped out.
'Connection accepted {. 'uuid' : {. 'uuid' : {. '$uuid' : 'a2'. }. },. 'connectionId' : 17,. 'connectionCount' : 1,. 'remote' : 'str2'.}.
order here is:
in this example the ids are listed in the following order: uuid, connectionId, connectionCount, remote
'Connection accepted {. 'uuid' : {. 'uuid' : {. '$uuid' : 'a3'. }. },. 'connectionId' : 18,. 'remote' : 'str3',. 'connectionCount' : 1.}.
in this example the ids are listed in the following order: uuid, connectionId, remote, connectionCount
'Connection accepted {. 'uuid' : {. 'uuid' : {. '$uuid' : 'a4'. }. },. 'connectionCount' : 1,. 'remote' : 'str4',. 'connectionId' : 19.}.
in this example the ids are listed in the following order: uuid, connectionCount, remote, connectionId
In my case the pretty print text is logged a single string so the users can review them.
However it isn't possible to look at the entries and immediately see if the values of the fields are different because the order is different in every case.
In some cases the comparisons could be performed by the user in a non-Perl environment e.g. Excel.
==
I understand that changing the existing code would risk breaking existing code.
The request is to provide a method / option that allows the order of the keys to be defined e.g. the keys must be sorted.
It appears that the values are being retrieved from the hash in a random order.
adding the option to return the keys in a sorted order would add a lot of value when performing comparisons.
If I have missed a setting/misunderstood how to use this then please advise me on how to change my code to get the desired results.
thanks
I have a class named FactSet which contains an array of objects of class Fact. I tried to implement a method like this for FactSet:
sub TO_JSON {
JSON->new->utf8->allow_blessed->convert_blessed->encode( $_[0]->facts );
}
The items inside $_[0]->facts are blessed objects of class Fact and this class implements a TO_JSON method. However, when I try to call $fact_set->TO_JSON I get
encountered object 'SNMP::Class::Fact=HASH(0x803b9c7b0)', but neither allow_blessed nor convert_blessed settings are enabled at ...
Is this normal? Should it not descend into the array and convert each object by using its TO_JSON method ?
The following code will fail.
perl -MJSON -e '$a={a=>10, b=>20}; $a->{a} eq "" ; print encode_json($a), "\n";'
->
{"a":"10","b":20}
Data::Dumper is not fail.
perl -MData::Dumper -e '$a={a=>10, b=>20}; $a->{a} eq "" ; print Dumper($a), "\n";'
$VAR1 = {
'a' => 10,
'b' => 20
};
Even if it is not "eq", if you execute the string operation in general, the output changes without assigning it.
Some objects overload numification or stringification, but don't have a TO_JSON
method. It would be nice for those objects to be encoded without having to monkey patch a TO_JSON
method for them. The one that pops to mind is URI, but there are others.
The following code would go somewhere in object_to_json
, and should work for this.
if ( $use_overload && overload::Overloaded($obj) ) {
if ( my $overload = overload::Method( $obj, '0+' )
|| overload::Method( $obj, '""' ) )
{
return $self->value_to_json( $obj->$overload() );
}
}
There would also be a sub to turn on/off the feature, and require overload;
when it is enabled.
There is some discussion on p5p about making JSON
a core module in future versions of Perl. It's a great module, and a great namespace. Is this something you would be amenable to?
An idea I had was to allow the stringification of objects in some form that comes out as a readable string, which could be reinterpreted back as the object.
Consider the following object:
my $obj = bless( { foo => 1, bar => 'baz' }, 'My::Object' );
After a say $json->encode([$obj]);
with the right options enabled, it would produce something like:
["My::Object={\"bar\":\"baz\",\"foo\":1}"]
The code seems fairly straightforward, going into object_to_json
:
if ( $stringify ) {
my $string = ref($obj);
my $type = Scalar::Util::reftype($obj);
if ( $type eq 'SCALAR' ) {
$string .= '=' . $self->value_to_json($$obj);
}
elsif ( $type eq 'ARRAY' ) {
$string .= '=' . $self->array_to_json($obj);
}
elsif ( $type eq 'HASH' ) {
$string .= '=' . $self->hash_to_json($obj);
}
return $self->value_to_hash($string);
}
In JSON, when encoding, and when dealing with a blessed object and all attempts have failed, the module yields something like: encountered object 'XXX', but neither allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing)
where XXX
is the object reference.
When the object has overload stringification capability, this error message becomes unhelpful, because we do not know the source of the issue, i.e. which package is at fault. Thus, I would recommend changing the error to use overload::StrVal( $obj )
. Maybe something like:
encode_error( sprintf("encountered object '%s', but neither allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing)", overload::StrVal($obj))
At least convert_blessed_universally
should be implemented more cleanly, with less side effects.
See also: https://rt.cpan.org/Ticket/Display.html?id=100423
and also: https://rt.cpan.org/Ticket/Display.html?id=84819
Hi!
use JSON;
my $foo = JSON::from_json('{blah}');
$ perl /tmp/a.pl
'"' expected, at character offset 1 (before "blah}") at JSON.pm line 198.
This makes it look like there's an error in JSON.pm, due to a die()
Or
use JSON;
my $foo = JSON::to_json(\*STDERR);
$ perl /tmp/a.pl
cannot encode reference to scalar 'GLOB(0x558052844fd0)' unless the scalar is 0 or 1 at JSON.pm line 176.
Attached patch to kick errors back to the caller, referencing the caller stack location instead
diff --git a/lib/JSON.pm b/lib/JSON.pm
index 3e644cc..39d7b1f 100644
--- a/lib/JSON.pm
+++ b/lib/JSON.pm
@@ -170,7 +170,12 @@ sub to_json ($@) {
}
}
- $json->encode($_[0]);
+ my $result;
+ eval { $result = $json->encode($_[0]); };
+
+ Carp::croak "to_json: " . $@ if ($@);
+
+ return $result;
}
@@ -187,7 +192,12 @@ sub from_json ($@) {
}
}
- return $json->decode( $_[0] );
+ my $result;
+ eval { $result = $json->decode( $_[0] ) };
+
+ Carp::croak "from_json: " . $@ if ($@);
+
+ return $result;
}
Now we have a nice error:
$ perl test_json.pl
from_json: '"' expected, at character offset 1 (before "blah}") at JSON.pm line 196.
at test_json.pl line 4.
Fix is same as this PR for JSON::PP: makamaka/JSON-PP#19
Not sure if it can be cut down, or skipped, or something, but wow, it runs for a long time.
Reason behind this request: I'm using VSCodium which already has built-in support for Relaxed Json.
Issue is that the current variant of relaxed you support is not supported by VSCodium. So I either have to stick with standard JSON to get Syntax Highlighting or your relaxed variant and have JSON files with lots of highlighted errors.
In my tests I have to do something like this:
for (values $href) {
$_ = int !!$_ if JSON::is_bool($_);
}
So that Test::Differences::eq_or_diff doesn't consider the blessed boolean thingies to be different from the 0 and 1 (or \0
and \1
) I'm using in the first place.
A setting that downgrades the true and false atoms to simple scalars (perhaps customisable) would be very useful in this situation.
support_by_pp
behaves not too well and tweaks internals of JSON::XS. It should be implemented more cleanly, with less side effects.
JSON
exports a decode_json
that it chooses from either the preferred installed JSON parser or an acceptable one that the user provides. However, decode_json
from JSON::XS
and JSON::PP
act slightly differently.
The first question is how JSON
might want to handle this. Reading through previous bug reports, I've seen that JSON
might not want to track divergent interfaces.
I'd think that the most user-friendly solution is to make decode_json
act the same way despite the backend. On the development side that's a bit hairy.
In I don't want no 'wantarray', Juho Snellman notes that if decode_json
uses a function call as its argument, the backend matters because JSON::XS
and JSON::PP
use different contexts for their argument list. JSON::XS
uses scalar context but JSON::PP
uses list context. Unfortunately, he used File::Slurp::read_file
and was bit by its context-sensitive return value:
#!/usr/bin/perl
use v5.26;
use JSON::XS ();
use JSON::PP ();
say "JSON::XS " . JSON::XS->VERSION . " ------------";
my $ds_xs = eval { JSON::XS::decode_json read_file() };
say "Error: $@\n" if $@;
say "JSON::PP " . JSON::PP->VERSION . " ------------";
my $ds_pp = eval { JSON::PP::decode_json read_file() };
say "Error: $@\n" if $@;
say "done";
sub read_file {
my $json = <<~"JSON";
{
"camel": "Amelia"
}
JSON
say "Wantarray is <" . wantarray . ">";
wantarray ? split(/\R/, $json) : $json;
}
The result shows that JSON::PP
only gets the first line of the JSON becuase it was called in list context:
$ perl json.pl
JSON::XS 4.03 ------------
Wantarray is <>
JSON::PP 4.07 ------------
Wantarray is <1>
Error: , or } expected while parsing object/hash, at character offset 1 (before "(end of string)") at json.pl line 12.
done
This shows up on which one JSON
loads
#!/usr/bin/perl
use v5.26;
BEGIN {
$ENV{PERL_JSON_BACKEND} = $ARGV[0] // 'JSON::XS';
}
use JSON;
say "JSON backend is ", JSON->backend;
my $ds = decode_json read_file();
sub read_file {
my $json = <<~"JSON";
{
"camel": "Amelia"
}
JSON
say "Wantarray is <" . wantarray . ">";
wantarray ? split(/\R/, $json) : $json;
}
If the backend is not JSON::PP
(and acceptable to JSON
), there's no problem:
$ perl json2.pl
JSON backend is JSON::Backend::XS
Wantarray is <>
$ perl json2.pl JSON::PP
JSON backend is JSON::Backend::PP
Wantarray is <1>
, or } expected while parsing object/hash, at character offset 1 (before "(end of string)") at json2.pl line 12.
$ perl json2.pl Cpanel::JSON::XS
JSON backend is JSON::Backend::XS
Wantarray is <>
$ perl json2.pl Foo
The value of environmental variable 'PERL_JSON_BACKEND' is invalid. at json2.pl line 8.
Compilation failed in require at json2.pl line 8.
BEGIN failed--compilation aborted at json2.pl line 8.
I'd recommend using a builder like Dist::Zilla or removing the section.
Any backend should be accepted, as long as it is compatible with JSON::XS/JSON::PP. It's also better to use JSON::Backend::(XS|PP) as a backend wrapper, instead of using the backend module directly, so that we don't need to care much about the name of the actual backend.
We quite often find ourselves writing something like this:
... $some_boolean ? JSON->true : JSON->false
It would be nice if we could instead write:
JSON->boolean($some_boolean)
Currently JSON accepts two scalar references as values, \0 and \1, which mean false and true respectively. However, Perl returns the empty string as a false value from most functions. JSON should accept a reference to the empty string as a false value, to stay consistent with Perl.
$ perl -MJSON -E 'say JSON->new->encode([!!1, \!!1])'
[1,true]
$ perl -MJSON -E 'say JSON->new->encode([!!0, \!!0])'
cannot encode reference to scalar at -e line 1.
To get the latter one to work is less obvious:
$ perl -MJSON -E 'say JSON->new->encode([!!0, \(0+!!0)])'
["",false]
Which means to be consistent, casting any boolean function from perl to a JSON false/true value is excessively verbose:
$ perl -MJSON -E 'say JSON->new->encode([defined(undef), \(0+defined(undef))])'
["",false]
I have a scenario with hundreds of servers with different Perl versions and operating systems. On these servers, I need to run a script which decodes a JSON file. I can push additional libraries to the servers via a shared directory, but due to the different Perl versions, they can't contain XS code.
I'd like to leverage a pre-installed JSON::XS wherever possible and fall back to JSON::PP otherwise. Caveat: I use boolean_values()
, which is only available from version 4.0. Various servers have only JSON::XS version 3.0.1, so this call fails.
Is there any way to use JSON::XS only if it has a certain minimum version / supports a certain method and use PP otherwise?
I also tried -support_by_pp
, but it didn't help here.
I recently fell into the problem, that JSON prefers JSON::XS, which is not thread safe. However using JSON::PP works perfectly fine.
Would it be a good idea for JSON to either:
I'd hope that this could prevent another person not reading the entire documentation of JSON::XS from getting into weird crashes and spending a few days hunting down what caused it, until finally figuring it out.
Best regards,
Andre
I tried using zdim's script shown here, but it throws this error:
malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "(end of string)") at /home/user/scripts/Perl/stackoverflow-json-query-ex1_zdim.pl line 16.
at /home/user/scripts/Perl/stackoverflow-json-query-ex1_zdim.pl line 16.
So I pasted my complete JSON file text into jsonchecker.com and it says the JSON is valid.
JSON text below:
{
"auto_close": true,
"auto_open": false,
"auto_start": false,
"drawing_grid_size": 25,
"grid_size": 75,
"name": "Network Automation Quick Start",
"project_id": "8d418c27-83f3-4ebf-83cb-ab65fd1f9be9",
"revision": 9,
"scene_height": 1000,
"scene_width": 2000,
"show_grid": true,
"show_interface_labels": true,
"show_layers": false,
"snap_to_grid": true,
"supplier": null,
"topology": {
"computes": [],
"drawings": [],
"links": [
{
"filters": {},
"link_id": "1363b463-bb7e-40c4-a230-79f2fd1ede0a",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "eth0",
"x": 75,
"y": -2
},
"node_id": "69030479-1e75-46c7-8736-75dad39b4a8d",
"port_number": 0
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "e1",
"x": -51,
"y": -9
},
"node_id": "64c79d73-3c11-4827-8c80-203191ae63ac",
"port_number": 1
}
],
"suspend": false
},
{
"filters": {
"bpf": [
"icmp"
]
},
"link_id": "889077ae-0c1a-48dc-bdec-07aae88fc27b",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "e0",
"x": 44,
"y": -39
},
"node_id": "64c79d73-3c11-4827-8c80-203191ae63ac",
"port_number": 0
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "virbr0",
"x": 88,
"y": 74
},
"node_id": "21e67911-617e-45d3-b5e7-7555a5580de8",
"port_number": 3
}
],
"suspend": false
},
{
"filters": {},
"link_id": "d5d78256-9079-4314-aa2d-d08fbca25280",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/0",
"x": 43,
"y": 48
},
"node_id": "0d29ae28-d371-4e6d-b061-f75aa70d6c4f",
"port_number": 0
},
{
"adapter_number": 1,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/1",
"x": 38,
"y": -31
},
"node_id": "16f5e2f6-319d-4000-9b39-45183927fc86",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "997122f7-9976-4323-9be7-ccc40e94ecbf",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "e2",
"x": 82,
"y": -26
},
"node_id": "64c79d73-3c11-4827-8c80-203191ae63ac",
"port_number": 2
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/0",
"x": -68,
"y": -8
},
"node_id": "16f5e2f6-319d-4000-9b39-45183927fc86",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "d1738ec5-ce45-4920-80f9-b7db180c6cf0",
"nodes": [
{
"adapter_number": 4,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi1/0",
"x": -30,
"y": 89
},
"node_id": "16f5e2f6-319d-4000-9b39-45183927fc86",
"port_number": 0
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/0",
"x": 67,
"y": -82
},
"node_id": "a566a414-110c-4d8b-8d16-c96185c424b4",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "481de502-6bdd-4d8b-95d3-cf4bf7f57bf1",
"nodes": [
{
"adapter_number": 5,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi1/1",
"x": 45,
"y": 86
},
"node_id": "16f5e2f6-319d-4000-9b39-45183927fc86",
"port_number": 0
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/0",
"x": -69,
"y": -84
},
"node_id": "0a3df914-f0e7-4985-8195-57990d79e962",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "d1964aaf-5799-4e05-8216-38e169d01bda",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/0",
"x": 4,
"y": -30
},
"node_id": "14e89a4c-5d82-4fd5-b17c-e3253c174e69",
"port_number": 0
},
{
"adapter_number": 6,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi1/2",
"x": -65,
"y": 44
},
"node_id": "16f5e2f6-319d-4000-9b39-45183927fc86",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "8041e53c-c86b-4f1a-88bd-15b27ee25cab",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/0",
"x": -28,
"y": -27
},
"node_id": "ebc9b3c2-8632-4095-b27b-24d10543c8cf",
"port_number": 0
},
{
"adapter_number": 7,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi1/3",
"x": 11,
"y": 104
},
"node_id": "16f5e2f6-319d-4000-9b39-45183927fc86",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "2c554fe0-8e41-4dbc-b6dc-f19be4844893",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/0",
"x": -25,
"y": -37
},
"node_id": "213a5582-e9db-4a8b-a0e2-3fa073827e37",
"port_number": 0
},
{
"adapter_number": 8,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi2/0",
"x": 68,
"y": 44
},
"node_id": "16f5e2f6-319d-4000-9b39-45183927fc86",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "a8a2bbce-282a-495a-9f21-d7138d9cce44",
"nodes": [
{
"adapter_number": 2,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/2",
"x": 82,
"y": 25
},
"node_id": "a566a414-110c-4d8b-8d16-c96185c424b4",
"port_number": 0
},
{
"adapter_number": 2,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/2",
"x": -75,
"y": 25
},
"node_id": "0a3df914-f0e7-4985-8195-57990d79e962",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "55dd9d82-2a0e-405a-bead-09a20da978ec",
"nodes": [
{
"adapter_number": 1,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/1",
"x": 83,
"y": -6
},
"node_id": "a566a414-110c-4d8b-8d16-c96185c424b4",
"port_number": 0
},
{
"adapter_number": 1,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/1",
"x": -75,
"y": -6
},
"node_id": "0a3df914-f0e7-4985-8195-57990d79e962",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "3a5b05e5-8c58-44ed-b700-3f7747cd071b",
"nodes": [
{
"adapter_number": 4,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi1/0",
"x": -32,
"y": -31
},
"node_id": "a566a414-110c-4d8b-8d16-c96185c424b4",
"port_number": 0
},
{
"adapter_number": 1,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/1",
"x": -31,
"y": 49
},
"node_id": "14e89a4c-5d82-4fd5-b17c-e3253c174e69",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "8cf53a28-71e4-41b6-a64b-005dc96fa256",
"nodes": [
{
"adapter_number": 5,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi1/1",
"x": 95,
"y": -59
},
"node_id": "a566a414-110c-4d8b-8d16-c96185c424b4",
"port_number": 0
},
{
"adapter_number": 1,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/1",
"x": -1,
"y": 49
},
"node_id": "ebc9b3c2-8632-4095-b27b-24d10543c8cf",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "0fceb2fb-9c58-4d00-bb7e-12e47997b826",
"nodes": [
{
"adapter_number": 6,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi1/2",
"x": 122,
"y": -35
},
"node_id": "a566a414-110c-4d8b-8d16-c96185c424b4",
"port_number": 0
},
{
"adapter_number": 1,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/1",
"x": -37,
"y": 49
},
"node_id": "213a5582-e9db-4a8b-a0e2-3fa073827e37",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "f375627c-da11-42ed-992e-08a0cf3f9a0d",
"nodes": [
{
"adapter_number": 4,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi1/0",
"x": -101,
"y": -30
},
"node_id": "0a3df914-f0e7-4985-8195-57990d79e962",
"port_number": 0
},
{
"adapter_number": 2,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/2",
"x": 68,
"y": 23
},
"node_id": "14e89a4c-5d82-4fd5-b17c-e3253c174e69",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "6cdcc8e2-6a70-4e91-b58b-7d0ef2d61bce",
"nodes": [
{
"adapter_number": 5,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi1/1",
"x": -94,
"y": -61
},
"node_id": "0a3df914-f0e7-4985-8195-57990d79e962",
"port_number": 0
},
{
"adapter_number": 2,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/2",
"x": 62,
"y": 45
},
"node_id": "ebc9b3c2-8632-4095-b27b-24d10543c8cf",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "33221919-fb4d-44bc-b258-109d84d93951",
"nodes": [
{
"adapter_number": 6,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi1/2",
"x": 33,
"y": -32
},
"node_id": "0a3df914-f0e7-4985-8195-57990d79e962",
"port_number": 0
},
{
"adapter_number": 2,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/2",
"x": 29,
"y": 50
},
"node_id": "213a5582-e9db-4a8b-a0e2-3fa073827e37",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "38cdaa1e-9288-4aea-9c1e-a84479c03626",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "eth0",
"x": 62,
"y": -23
},
"node_id": "6ee7b7fb-b57c-49e3-8b65-03f39ed3d83e",
"port_number": 0
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "e7",
"x": -54,
"y": 17
},
"node_id": "64c79d73-3c11-4827-8c80-203191ae63ac",
"port_number": 7
}
],
"suspend": false
},
{
"filters": {},
"link_id": "cb5f1705-c3fa-4e6e-8442-00be09bfbfe0",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "eth0",
"x": 62,
"y": 10
},
"node_id": "341ff07c-d304-4610-82af-bb340e1b6495",
"port_number": 0
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "e3",
"x": -26,
"y": 48
},
"node_id": "64c79d73-3c11-4827-8c80-203191ae63ac",
"port_number": 3
}
],
"suspend": false
},
{
"filters": {},
"link_id": "7e0e9cee-4397-43b0-b21b-f41a47d3b195",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "eth0",
"x": 73,
"y": 11
},
"node_id": "07414fe2-70b5-4a62-ad13-9595eee83d79",
"port_number": 0
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "e4",
"x": -47,
"y": -35
},
"node_id": "64c79d73-3c11-4827-8c80-203191ae63ac",
"port_number": 4
}
],
"suspend": false
},
{
"filters": {},
"link_id": "5a93aef1-ca3b-43d9-836a-301ffef2715c",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "s0/0",
"x": -43,
"y": 38
},
"node_id": "ca5c6b81-0e40-4a1c-b1ed-b6a9ab0d88d3",
"port_number": 16
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "s0/0",
"x": 11,
"y": -24
},
"node_id": "e14c75d0-3125-41f0-bfc9-91da6db67698",
"port_number": 16
}
],
"suspend": false
},
{
"filters": {},
"link_id": "79f848b3-4570-4ed1-92d8-77485981a761",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "s0/1",
"x": 74,
"y": 33
},
"node_id": "ca5c6b81-0e40-4a1c-b1ed-b6a9ab0d88d3",
"port_number": 17
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "s0/0",
"x": 14,
"y": -25
},
"node_id": "f5a3a7be-a09c-4b26-8ec9-f2797aaef440",
"port_number": 16
}
],
"suspend": false
},
{
"filters": {},
"link_id": "a72de753-f481-4a7d-a88c-6fb2c35d3e84",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "s0/1",
"x": 64,
"y": 21
},
"node_id": "e14c75d0-3125-41f0-bfc9-91da6db67698",
"port_number": 17
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "s0/1",
"x": -50,
"y": 0
},
"node_id": "f5a3a7be-a09c-4b26-8ec9-f2797aaef440",
"port_number": 17
}
],
"suspend": false
},
{
"filters": {},
"link_id": "0c5d4425-4904-4585-84fe-9a54c1e03fed",
"nodes": [
{
"adapter_number": 1,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "f1/0",
"x": -44,
"y": -8
},
"node_id": "ca5c6b81-0e40-4a1c-b1ed-b6a9ab0d88d3",
"port_number": 0
},
{
"adapter_number": 3,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi0/3",
"x": 73,
"y": 22
},
"node_id": "0d29ae28-d371-4e6d-b061-f75aa70d6c4f",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "96b52b9e-358e-4c77-946a-797c0f2ab21a",
"nodes": [
{
"adapter_number": 15,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi3/3",
"x": 67,
"y": 20
},
"node_id": "ebc9b3c2-8632-4095-b27b-24d10543c8cf",
"port_number": 0
},
{
"adapter_number": 15,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi3/3",
"x": -64,
"y": 20
},
"node_id": "213a5582-e9db-4a8b-a0e2-3fa073827e37",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "d10821ea-e78e-4052-a119-5064d8a00bc2",
"nodes": [
{
"adapter_number": 14,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi3/2",
"x": 66,
"y": -3
},
"node_id": "ebc9b3c2-8632-4095-b27b-24d10543c8cf",
"port_number": 0
},
{
"adapter_number": 14,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi3/2",
"x": -65,
"y": -2
},
"node_id": "213a5582-e9db-4a8b-a0e2-3fa073827e37",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "b8ffd64f-641c-4879-b771-b1cbcd260641",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "ens0",
"x": -25,
"y": -14
},
"node_id": "fd77de72-aaef-4f69-bc5a-808995da1b5c",
"port_number": 0
},
{
"adapter_number": 12,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Gi3/0",
"x": 72,
"y": 20
},
"node_id": "16f5e2f6-319d-4000-9b39-45183927fc86",
"port_number": 0
}
],
"suspend": false
},
{
"filters": {},
"link_id": "b3f36415-35ea-44f1-b591-c2071952c952",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "1",
"x": 27,
"y": -25
},
"node_id": "99dc8ad3-b55b-4489-bfaa-5187699e4721",
"port_number": 1
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "3",
"x": 7,
"y": 47
},
"node_id": "552f192e-1e80-4ddc-9507-ae408dd7251d",
"port_number": 3
}
],
"suspend": false
},
{
"filters": {},
"link_id": "1f468877-d4e8-4073-b090-573c6108c866",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "1",
"x": -23,
"y": -3
},
"node_id": "d4e76d64-2682-4ce3-a54c-a29e9501ef9c",
"port_number": 1
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "2",
"x": 57,
"y": -8
},
"node_id": "552f192e-1e80-4ddc-9507-ae408dd7251d",
"port_number": 2
}
],
"suspend": false
},
{
"filters": {},
"link_id": "d0beaaa7-09d9-4bcc-a667-6642fc3d5728",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "4",
"x": 56,
"y": 26
},
"node_id": "552f192e-1e80-4ddc-9507-ae408dd7251d",
"port_number": 4
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "1",
"x": -3,
"y": -22
},
"node_id": "dc51f2ed-2b89-4d7a-a97e-46da9bc1b17d",
"port_number": 1
}
],
"suspend": false
},
{
"filters": {},
"link_id": "b3a47b4a-55b9-4dd0-92ae-762e3c55e9cf",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "2",
"x": 58,
"y": -14
},
"node_id": "99dc8ad3-b55b-4489-bfaa-5187699e4721",
"port_number": 2
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "3",
"x": -21,
"y": 35
},
"node_id": "d4e76d64-2682-4ce3-a54c-a29e9501ef9c",
"port_number": 3
}
],
"suspend": false
},
{
"filters": {},
"link_id": "59e2c6b6-a0e0-425c-ac25-301f055e7523",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "2",
"x": 28,
"y": -28
},
"node_id": "dc51f2ed-2b89-4d7a-a97e-46da9bc1b17d",
"port_number": 2
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "4",
"x": 8,
"y": 51
},
"node_id": "d4e76d64-2682-4ce3-a54c-a29e9501ef9c",
"port_number": 4
}
],
"suspend": false
},
{
"filters": {},
"link_id": "b389750e-d0f7-46b4-bc81-f563803b2e76",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "4",
"x": 56,
"y": 21
},
"node_id": "99dc8ad3-b55b-4489-bfaa-5187699e4721",
"port_number": 4
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "3",
"x": -24,
"y": 3
},
"node_id": "dc51f2ed-2b89-4d7a-a97e-46da9bc1b17d",
"port_number": 3
}
],
"suspend": false
},
{
"filters": {},
"link_id": "360d9888-d1f5-4472-934e-ad22b009eb92",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "3",
"x": 7,
"y": 47
},
"node_id": "9bbf578e-6feb-4f18-ab1d-c99b647492df",
"port_number": 3
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "1",
"x": 30,
"y": -27
},
"node_id": "5047a781-7b2a-4609-af13-fd84056a0611",
"port_number": 1
}
],
"suspend": false
},
{
"filters": {},
"link_id": "500fbaaa-3955-44ef-8026-33d089ab5902",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "4",
"x": 38,
"y": 46
},
"node_id": "9bbf578e-6feb-4f18-ab1d-c99b647492df",
"port_number": 4
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "1",
"x": -6,
"y": -28
},
"node_id": "ff297e3f-bcb6-47e2-b9f0-d5415e75f614",
"port_number": 1
}
],
"suspend": false
},
{
"filters": {},
"link_id": "6d018dde-7873-4a08-90f6-3b9a1f2fdfb3",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "4",
"x": 7,
"y": 50
},
"node_id": "da2ade8c-c28e-498c-9579-2a6b0ef74f36",
"port_number": 4
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "2",
"x": 28,
"y": -29
},
"node_id": "ff297e3f-bcb6-47e2-b9f0-d5415e75f614",
"port_number": 2
}
],
"suspend": false
},
{
"filters": {},
"link_id": "6c87391a-5f1a-4631-9807-6e5d6fe85b30",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "4",
"x": 55,
"y": 22
},
"node_id": "5047a781-7b2a-4609-af13-fd84056a0611",
"port_number": 4
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "3",
"x": -25,
"y": 0
},
"node_id": "ff297e3f-bcb6-47e2-b9f0-d5415e75f614",
"port_number": 3
}
],
"suspend": false
},
{
"filters": {},
"link_id": "b46bb4bd-ef48-47c3-b225-8255ccfe11a9",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "3",
"x": -22,
"y": 38
},
"node_id": "da2ade8c-c28e-498c-9579-2a6b0ef74f36",
"port_number": 3
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "2",
"x": 57,
"y": -14
},
"node_id": "5047a781-7b2a-4609-af13-fd84056a0611",
"port_number": 2
}
],
"suspend": false
},
{
"filters": {},
"link_id": "89c09ebc-a19c-4099-8cdf-577155754446",
"nodes": [
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "2",
"x": 57,
"y": 20
},
"node_id": "9bbf578e-6feb-4f18-ab1d-c99b647492df",
"port_number": 2
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "1",
"x": -23,
"y": 0
},
"node_id": "da2ade8c-c28e-498c-9579-2a6b0ef74f36",
"port_number": 1
}
],
"suspend": false
},
{
"filters": {},
"link_id": "6e0a7598-6d98-4c4b-bee6-1d52d5f280d6",
"nodes": [
{
"adapter_number": 1,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "s1/0",
"x": 5,
"y": 43
},
"node_id": "4a712f86-eb1d-4e2a-b53b-1a314fd84837",
"port_number": 0
},
{
"adapter_number": 0,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "10",
"x": 8,
"y": -25
},
"node_id": "9bbf578e-6feb-4f18-ab1d-c99b647492df",
"port_number": 10
}
],
"suspend": false
}
],
"nodes": [
{
"compute_id": "local",
"console": 5000,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": null,
"height": 59,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 10.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "NetBot-1",
"x": -98,
"y": 9
},
"locked": false,
"name": "NetBot-1",
"node_id": "69030479-1e75-46c7-8736-75dad39b4a8d",
"node_type": "docker",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"adapters": 1,
"aux": 5001,
"console_http_path": "/",
"console_http_port": 80,
"console_resolution": "1024x768",
"container_id": "c554a7cd281039e3df8839a2fe6cc9b0afe62325004542bf139b3dc1e7e1266f",
"environment": null,
"extra_hosts": null,
"extra_volumes": [],
"image": "adosztal/network_automation:latest",
"start_command": null,
"usage": ""
},
"symbol": "linux_guest.svg",
"template_id": "9e150ae6-5867-4e40-bac6-7833cf53a1c3",
"width": 65,
"x": -782,
"y": -104,
"z": 1
},
{
"compute_id": "local",
"console": 5002,
"console_auto_start": false,
"console_type": "none",
"custom_adapters": [],
"first_port_name": null,
"height": 32,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "S0",
"x": 59,
"y": 22
},
"locked": false,
"name": "S0",
"node_id": "64c79d73-3c11-4827-8c80-203191ae63ac",
"node_type": "ethernet_switch",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"ports_mapping": [
{
"name": "Ethernet0",
"port_number": 0,
"type": "access",
"vlan": 1
},
{
"name": "Ethernet1",
"port_number": 1,
"type": "access",
"vlan": 1
},
{
"name": "Ethernet2",
"port_number": 2,
"type": "access",
"vlan": 1
},
{
"name": "Ethernet3",
"port_number": 3,
"type": "access",
"vlan": 1
},
{
"name": "Ethernet4",
"port_number": 4,
"type": "access",
"vlan": 1
},
{
"name": "Ethernet5",
"port_number": 5,
"type": "access",
"vlan": 1
},
{
"name": "Ethernet6",
"port_number": 6,
"type": "access",
"vlan": 1
},
{
"name": "Ethernet7",
"port_number": 7,
"type": "access",
"vlan": 1
}
]
},
"symbol": ":/symbols/ethernet_switch.svg",
"template_id": "1966b864-93e7-32d5-965f-001384eec461",
"width": 72,
"x": -560,
"y": -91,
"z": 1
},
{
"compute_id": "local",
"console": 5004,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": "",
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "S1",
"x": 51,
"y": -4
},
"locked": false,
"name": "S1",
"node_id": "16f5e2f6-319d-4000-9b39-45183927fc86",
"node_type": "qemu",
"port_name_format": "Gi{1}/{0}",
"port_segment_size": 4,
"properties": {
"adapter_type": "e1000",
"adapters": 16,
"bios_image": "",
"bios_image_md5sum": null,
"boot_priority": "c",
"cdrom_image": "",
"cdrom_image_md5sum": null,
"cpu_throttling": 0,
"cpus": 1,
"hda_disk_image": "vios_l2-adventerprisek9-m.03.2017.qcow2",
"hda_disk_image_md5sum": "8f14b50083a14688dec2fc791706bb3e",
"hda_disk_interface": "virtio",
"hdb_disk_image": "",
"hdb_disk_image_md5sum": null,
"hdb_disk_interface": "ide",
"hdc_disk_image": "",
"hdc_disk_image_md5sum": null,
"hdc_disk_interface": "ide",
"hdd_disk_image": "",
"hdd_disk_image_md5sum": null,
"hdd_disk_interface": "ide",
"initrd": "",
"initrd_md5sum": null,
"kernel_command_line": "",
"kernel_image": "",
"kernel_image_md5sum": null,
"legacy_networking": false,
"linked_clone": true,
"mac_address": "0c:9b:e9:fc:86:00",
"on_close": "power_off",
"options": "-nographic",
"platform": "x86_64",
"process_priority": "normal",
"qemu_path": "/usr/bin/qemu-system-x86_64",
"ram": 768,
"replicate_network_connection_state": true,
"usage": "There is no default password and enable password. There is no default configuration present."
},
"symbol": ":/symbols/multilayer_switch.svg",
"template_id": "906f55a1-3bc4-4faf-80cf-789382cda4a5",
"width": 51,
"x": -325,
"y": -98,
"z": 1
},
{
"compute_id": "local",
"console": 5006,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": "",
"height": 45,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "R1",
"x": -40,
"y": 7
},
"locked": false,
"name": "R1",
"node_id": "0d29ae28-d371-4e6d-b061-f75aa70d6c4f",
"node_type": "qemu",
"port_name_format": "Gi0/{0}",
"port_segment_size": 0,
"properties": {
"adapter_type": "e1000",
"adapters": 4,
"bios_image": "",
"bios_image_md5sum": null,
"boot_priority": "c",
"cdrom_image": "",
"cdrom_image_md5sum": null,
"cpu_throttling": 0,
"cpus": 1,
"hda_disk_image": "vios-adventerprisek9-m.vmdk.SPA.156-2.T",
"hda_disk_image_md5sum": "83707e3cc93646da58ee6563a68002b5",
"hda_disk_interface": "virtio",
"hdb_disk_image": "IOSv_startup_config.img",
"hdb_disk_image_md5sum": "bc605651c4688276f81fd59dcf5cc786",
"hdb_disk_interface": "virtio",
"hdc_disk_image": "",
"hdc_disk_image_md5sum": null,
"hdc_disk_interface": "ide",
"hdd_disk_image": "",
"hdd_disk_image_md5sum": null,
"hdd_disk_interface": "ide",
"initrd": "",
"initrd_md5sum": null,
"kernel_command_line": "",
"kernel_image": "",
"kernel_image_md5sum": null,
"legacy_networking": false,
"linked_clone": false,
"mac_address": "0c:9b:e9:6c:4f:00",
"on_close": "power_off",
"options": "",
"platform": "x86_64",
"process_priority": "normal",
"qemu_path": "/usr/bin/qemu-system-x86_64",
"ram": 512,
"replicate_network_connection_state": true,
"usage": "There is no default password and enable password. There is no default configuration present."
},
"symbol": ":/symbols/classic/router.svg",
"template_id": "c03bb804-daa4-4202-b8fa-ed8737baf70d",
"width": 66,
"x": -333,
"y": -247,
"z": 1
},
{
"compute_id": "local",
"console": null,
"console_auto_start": false,
"console_type": "none",
"custom_adapters": [],
"first_port_name": null,
"height": 71,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "NAT1",
"x": 52,
"y": 18
},
"locked": false,
"name": "NAT1",
"node_id": "21e67911-617e-45d3-b5e7-7555a5580de8",
"node_type": "cloud",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"interfaces": [
{
"name": "docker0",
"special": true,
"type": "ethernet"
},
{
"name": "enp4s0",
"special": false,
"type": "ethernet"
},
{
"name": "enp6s0",
"special": false,
"type": "ethernet"
},
{
"name": "lo",
"special": true,
"type": "ethernet"
},
{
"name": "virbr0",
"special": true,
"type": "ethernet"
},
{
"name": "virbr0-nic",
"special": true,
"type": "ethernet"
},
{
"name": "wlp5s0",
"special": false,
"type": "ethernet"
}
],
"ports_mapping": [
{
"interface": "enp4s0",
"name": "enp4s0",
"port_number": 0,
"type": "ethernet"
},
{
"interface": "enp6s0",
"name": "enp6s0",
"port_number": 1,
"type": "ethernet"
},
{
"interface": "wlp5s0",
"name": "wlp5s0",
"port_number": 2,
"type": "ethernet"
},
{
"interface": "virbr0",
"name": "virbr0",
"port_number": 3,
"type": "ethernet"
},
{
"interface": "virbr0-nic",
"name": "virbr0-nic",
"port_number": 4,
"type": "ethernet"
},
{
"interface": "docker0",
"name": "docker0",
"port_number": 5,
"type": "ethernet"
},
{
"interface": "gns3tap0-3",
"name": "gns3tap0-3",
"port_number": 6,
"type": "ethernet"
},
{
"interface": "vboxnet0",
"name": "vboxnet0",
"port_number": 7,
"type": "ethernet"
},
{
"interface": "vboxnet2",
"name": "vboxnet2",
"port_number": 8,
"type": "ethernet"
},
{
"interface": "lo",
"name": "lo",
"port_number": 9,
"type": "ethernet"
},
{
"interface": "vboxnet1",
"name": "vboxnet1",
"port_number": 10,
"type": "ethernet"
},
{
"interface": "vboxnet3",
"name": "vboxnet3",
"port_number": 11,
"type": "ethernet"
}
],
"remote_console_host": "127.0.0.1",
"remote_console_http_path": "/",
"remote_console_port": 23,
"remote_console_type": "none"
},
"symbol": ":/symbols/cloud.svg",
"template_id": "5250e2de-ec81-4de5-962e-fae5d2276111",
"width": 159,
"x": -604,
"y": -260,
"z": 1
},
{
"compute_id": "local",
"console": 5008,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": "",
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "S2",
"x": -40,
"y": 8
},
"locked": false,
"name": "S2",
"node_id": "a566a414-110c-4d8b-8d16-c96185c424b4",
"node_type": "qemu",
"port_name_format": "Gi{1}/{0}",
"port_segment_size": 4,
"properties": {
"adapter_type": "e1000",
"adapters": 16,
"bios_image": "",
"bios_image_md5sum": null,
"boot_priority": "c",
"cdrom_image": "",
"cdrom_image_md5sum": null,
"cpu_throttling": 0,
"cpus": 1,
"hda_disk_image": "vios_l2-adventerprisek9-m.03.2017.qcow2",
"hda_disk_image_md5sum": "8f14b50083a14688dec2fc791706bb3e",
"hda_disk_interface": "virtio",
"hdb_disk_image": "",
"hdb_disk_image_md5sum": null,
"hdb_disk_interface": "ide",
"hdc_disk_image": "",
"hdc_disk_image_md5sum": null,
"hdc_disk_interface": "ide",
"hdd_disk_image": "",
"hdd_disk_image_md5sum": null,
"hdd_disk_interface": "ide",
"initrd": "",
"initrd_md5sum": null,
"kernel_command_line": "",
"kernel_image": "",
"kernel_image_md5sum": null,
"legacy_networking": false,
"linked_clone": true,
"mac_address": "0c:9b:e9:24:b4:00",
"on_close": "power_off",
"options": "-nographic",
"platform": "x86_64",
"process_priority": "normal",
"qemu_path": "/usr/bin/qemu-system-x86_64",
"ram": 768,
"replicate_network_connection_state": true,
"usage": "There is no default password and enable password. There is no default configuration present."
},
"symbol": ":/symbols/multilayer_switch.svg",
"template_id": "906f55a1-3bc4-4faf-80cf-789382cda4a5",
"width": 51,
"x": -550,
"y": 351,
"z": 1
},
{
"compute_id": "local",
"console": 5010,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": "",
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "S3",
"x": 56,
"y": 7
},
"locked": false,
"name": "S3",
"node_id": "0a3df914-f0e7-4985-8195-57990d79e962",
"node_type": "qemu",
"port_name_format": "Gi{1}/{0}",
"port_segment_size": 4,
"properties": {
"adapter_type": "e1000",
"adapters": 16,
"bios_image": "",
"bios_image_md5sum": null,
"boot_priority": "c",
"cdrom_image": "",
"cdrom_image_md5sum": null,
"cpu_throttling": 0,
"cpus": 1,
"hda_disk_image": "vios_l2-adventerprisek9-m.03.2017.qcow2",
"hda_disk_image_md5sum": "8f14b50083a14688dec2fc791706bb3e",
"hda_disk_interface": "virtio",
"hdb_disk_image": "",
"hdb_disk_image_md5sum": null,
"hdb_disk_interface": "ide",
"hdc_disk_image": "",
"hdc_disk_image_md5sum": null,
"hdc_disk_interface": "ide",
"hdd_disk_image": "",
"hdd_disk_image_md5sum": null,
"hdd_disk_interface": "ide",
"initrd": "",
"initrd_md5sum": null,
"kernel_command_line": "",
"kernel_image": "",
"kernel_image_md5sum": null,
"legacy_networking": false,
"linked_clone": true,
"mac_address": "0c:9b:e9:e9:62:00",
"on_close": "power_off",
"options": "-nographic",
"platform": "x86_64",
"process_priority": "normal",
"qemu_path": "/usr/bin/qemu-system-x86_64",
"ram": 768,
"replicate_network_connection_state": true,
"usage": "There is no default password and enable password. There is no default configuration present."
},
"symbol": ":/symbols/multilayer_switch.svg",
"template_id": "906f55a1-3bc4-4faf-80cf-789382cda4a5",
"width": 51,
"x": -100,
"y": 351,
"z": 1
},
{
"compute_id": "local",
"console": 5012,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": "",
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "S4",
"x": -36,
"y": 7
},
"locked": false,
"name": "S4",
"node_id": "14e89a4c-5d82-4fd5-b17c-e3253c174e69",
"node_type": "qemu",
"port_name_format": "Gi{1}/{0}",
"port_segment_size": 4,
"properties": {
"adapter_type": "e1000",
"adapters": 16,
"bios_image": "",
"bios_image_md5sum": null,
"boot_priority": "c",
"cdrom_image": "",
"cdrom_image_md5sum": null,
"cpu_throttling": 0,
"cpus": 1,
"hda_disk_image": "vios_l2-adventerprisek9-m.03.2017.qcow2",
"hda_disk_image_md5sum": "8f14b50083a14688dec2fc791706bb3e",
"hda_disk_interface": "virtio",
"hdb_disk_image": "",
"hdb_disk_image_md5sum": null,
"hdb_disk_interface": "ide",
"hdc_disk_image": "",
"hdc_disk_image_md5sum": null,
"hdc_disk_interface": "ide",
"hdd_disk_image": "",
"hdd_disk_image_md5sum": null,
"hdd_disk_interface": "ide",
"initrd": "",
"initrd_md5sum": null,
"kernel_command_line": "",
"kernel_image": "",
"kernel_image_md5sum": null,
"legacy_networking": false,
"linked_clone": true,
"mac_address": "0c:9b:e9:4e:69:00",
"on_close": "power_off",
"options": "-nographic",
"platform": "x86_64",
"process_priority": "normal",
"qemu_path": "/usr/bin/qemu-system-x86_64",
"ram": 768,
"replicate_network_connection_state": true,
"usage": "There is no default password and enable password. There is no default configuration present."
},
"symbol": ":/symbols/multilayer_switch.svg",
"template_id": "906f55a1-3bc4-4faf-80cf-789382cda4a5",
"width": 51,
"x": -550,
"y": 126,
"z": 1
},
{
"compute_id": "local",
"console": 5014,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": "",
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "S5",
"x": -36,
"y": 7
},
"locked": false,
"name": "S5",
"node_id": "ebc9b3c2-8632-4095-b27b-24d10543c8cf",
"node_type": "qemu",
"port_name_format": "Gi{1}/{0}",
"port_segment_size": 4,
"properties": {
"adapter_type": "e1000",
"adapters": 16,
"bios_image": "",
"bios_image_md5sum": null,
"boot_priority": "c",
"cdrom_image": "",
"cdrom_image_md5sum": null,
"cpu_throttling": 0,
"cpus": 1,
"hda_disk_image": "vios_l2-adventerprisek9-m.03.2017.qcow2",
"hda_disk_image_md5sum": "8f14b50083a14688dec2fc791706bb3e",
"hda_disk_interface": "virtio",
"hdb_disk_image": "",
"hdb_disk_image_md5sum": null,
"hdb_disk_interface": "ide",
"hdc_disk_image": "",
"hdc_disk_image_md5sum": null,
"hdc_disk_interface": "ide",
"hdd_disk_image": "",
"hdd_disk_image_md5sum": null,
"hdd_disk_interface": "ide",
"initrd": "",
"initrd_md5sum": null,
"kernel_command_line": "",
"kernel_image": "",
"kernel_image_md5sum": null,
"legacy_networking": false,
"linked_clone": true,
"mac_address": "0c:9b:e9:c8:cf:00",
"on_close": "power_off",
"options": "-nographic",
"platform": "x86_64",
"process_priority": "normal",
"qemu_path": "/usr/bin/qemu-system-x86_64",
"ram": 768,
"replicate_network_connection_state": true,
"usage": "There is no default password and enable password. There is no default configuration present."
},
"symbol": ":/symbols/multilayer_switch.svg",
"template_id": "906f55a1-3bc4-4faf-80cf-789382cda4a5",
"width": 51,
"x": -325,
"y": 126,
"z": 1
},
{
"compute_id": "local",
"console": 5016,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": "",
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "S6",
"x": 54,
"y": 7
},
"locked": false,
"name": "S6",
"node_id": "213a5582-e9db-4a8b-a0e2-3fa073827e37",
"node_type": "qemu",
"port_name_format": "Gi{1}/{0}",
"port_segment_size": 4,
"properties": {
"adapter_type": "e1000",
"adapters": 16,
"bios_image": "",
"bios_image_md5sum": null,
"boot_priority": "c",
"cdrom_image": "",
"cdrom_image_md5sum": null,
"cpu_throttling": 0,
"cpus": 1,
"hda_disk_image": "vios_l2-adventerprisek9-m.03.2017.qcow2",
"hda_disk_image_md5sum": "8f14b50083a14688dec2fc791706bb3e",
"hda_disk_interface": "virtio",
"hdb_disk_image": "",
"hdb_disk_image_md5sum": null,
"hdb_disk_interface": "ide",
"hdc_disk_image": "",
"hdc_disk_image_md5sum": null,
"hdc_disk_interface": "ide",
"hdd_disk_image": "",
"hdd_disk_image_md5sum": null,
"hdd_disk_interface": "ide",
"initrd": "",
"initrd_md5sum": null,
"kernel_command_line": "",
"kernel_image": "",
"kernel_image_md5sum": null,
"legacy_networking": false,
"linked_clone": true,
"mac_address": "0c:9b:e9:7e:37:00",
"on_close": "power_off",
"options": "-nographic",
"platform": "x86_64",
"process_priority": "normal",
"qemu_path": "/usr/bin/qemu-system-x86_64",
"ram": 768,
"replicate_network_connection_state": true,
"usage": "There is no default password and enable password. There is no default configuration present."
},
"symbol": ":/symbols/multilayer_switch.svg",
"template_id": "906f55a1-3bc4-4faf-80cf-789382cda4a5",
"width": 51,
"x": -100,
"y": 126,
"z": 1
},
{
"compute_id": "local",
"console": 5901,
"console_auto_start": false,
"console_type": "vnc",
"custom_adapters": [],
"first_port_name": "",
"height": 59,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "Kali",
"x": -71,
"y": 7
},
"locked": false,
"name": "Kali",
"node_id": "6ee7b7fb-b57c-49e3-8b65-03f39ed3d83e",
"node_type": "qemu",
"port_name_format": "eth{0}",
"port_segment_size": 0,
"properties": {
"adapter_type": "e1000",
"adapters": 8,
"bios_image": "",
"bios_image_md5sum": null,
"boot_priority": "d",
"cdrom_image": "",
"cdrom_image_md5sum": null,
"cpu_throttling": 0,
"cpus": 1,
"hda_disk_image": "kali-linux-persistence-1gb.qcow2",
"hda_disk_image_md5sum": "14e9c92f3ba5a0bd1128c1ea26a129ea",
"hda_disk_interface": "ide",
"hdb_disk_image": "",
"hdb_disk_image_md5sum": null,
"hdb_disk_interface": "sata",
"hdc_disk_image": "",
"hdc_disk_image_md5sum": null,
"hdc_disk_interface": "ide",
"hdd_disk_image": "",
"hdd_disk_image_md5sum": null,
"hdd_disk_interface": "ide",
"initrd": "",
"initrd_md5sum": null,
"kernel_command_line": "",
"kernel_image": "",
"kernel_image_md5sum": null,
"legacy_networking": false,
"linked_clone": true,
"mac_address": "0c:9b:e9:d8:3e:00",
"on_close": "power_off",
"options": "",
"platform": "x86_64",
"process_priority": "normal",
"qemu_path": "/usr/bin/qemu-system-x86_64",
"ram": 4096,
"replicate_network_connection_state": true,
"usage": "Default password is toor\nEnable persistence by selecting boot option 'Live USB Persistence'"
},
"symbol": ":/symbols/classic/qemu_guest.svg",
"template_id": "3b43c48f-a5d5-42c3-bb2c-071de3c9c663",
"width": 65,
"x": -782,
"y": -29,
"z": 1
},
{
"compute_id": "local",
"console": 5019,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": null,
"height": 59,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "DNS-1",
"x": -79,
"y": 6
},
"locked": false,
"name": "DNS-1",
"node_id": "341ff07c-d304-4610-82af-bb340e1b6495",
"node_type": "docker",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"adapters": 1,
"aux": 5020,
"console_http_path": "/",
"console_http_port": 80,
"console_resolution": "1024x768",
"container_id": "cec49d805889d076795bbbf1ee38a59a5a26fd2bf85d1f1f7775fa33858b901d",
"environment": null,
"extra_hosts": null,
"extra_volumes": [],
"image": "adosztal/dns:latest",
"start_command": null,
"usage": "You can add records by adding entries to the /etc/hosts file in the following format:\n%IP_ADDRESS% %HOSTNAME%.lab %HOSTNAME%\n\nExample:\n192.168.123.10 router1.lab router1"
},
"symbol": "linux_guest.svg",
"template_id": "5498cdb6-221b-4de8-831d-138b17fd0e43",
"width": 65,
"x": -782,
"y": 45,
"z": 1
},
{
"compute_id": "local",
"console": 5021,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": null,
"height": 59,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 12.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "ipterm-1",
"x": -115,
"y": 10
},
"locked": false,
"name": "ipterm-1",
"node_id": "07414fe2-70b5-4a62-ad13-9595eee83d79",
"node_type": "docker",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"adapters": 1,
"aux": 5022,
"console_http_path": "/",
"console_http_port": 80,
"console_resolution": "1024x768",
"container_id": "e125da78bebed3ad08bdba21f6cf63da0ea655bf6c9feb5b2a4f08b05d7aeec8",
"environment": null,
"extra_hosts": null,
"extra_volumes": [],
"image": "gns3/ipterm:latest",
"start_command": null,
"usage": "The /root directory is persistent."
},
"symbol": "linux_guest.svg",
"template_id": "178936e5-445c-4f61-8f80-c3c71d775004",
"width": 65,
"x": -782,
"y": -179,
"z": 1
},
{
"compute_id": "local",
"console": 5023,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": null,
"height": 45,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "R2",
"x": 21,
"y": -25
},
"locked": false,
"name": "R2",
"node_id": "ca5c6b81-0e40-4a1c-b1ed-b6a9ab0d88d3",
"node_type": "dynamips",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"auto_delete_disks": false,
"aux": null,
"chassis": "2610",
"clock_divisor": 8,
"disk0": 0,
"disk1": 0,
"dynamips_id": 1,
"exec_area": 64,
"idlemax": 500,
"idlepc": "",
"idlesleep": 30,
"image": "c2600-adventerprisek9_sna-mz.124-25b.bin",
"image_md5sum": "2b2f807cf1c8f12404977baabeb4e269",
"iomem": 15,
"mac_addr": "c801.57a4.0000",
"mmap": true,
"nvram": 128,
"platform": "c2600",
"ram": 160,
"slot0": "C2600-MB-1E",
"slot1": "NM-1FE-TX",
"sparsemem": true,
"system_id": "FTX0945W0MY",
"usage": "",
"wic0": "WIC-2T",
"wic1": null,
"wic2": null
},
"symbol": ":/symbols/classic/router.svg",
"template_id": "39c787a9-5bc4-4b5e-9d54-7442088b355a",
"width": 66,
"x": 117,
"y": -247,
"z": 1
},
{
"compute_id": "local",
"console": 5024,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": null,
"height": 45,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "R3",
"x": -26,
"y": 7
},
"locked": false,
"name": "R3",
"node_id": "e14c75d0-3125-41f0-bfc9-91da6db67698",
"node_type": "dynamips",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"auto_delete_disks": false,
"aux": null,
"chassis": "2610",
"clock_divisor": 8,
"disk0": 0,
"disk1": 0,
"dynamips_id": 2,
"exec_area": 64,
"idlemax": 500,
"idlepc": "",
"idlesleep": 30,
"image": "c2600-adventerprisek9_sna-mz.124-25b.bin",
"image_md5sum": "2b2f807cf1c8f12404977baabeb4e269",
"iomem": 15,
"mac_addr": "c802.57b3.0000",
"mmap": true,
"nvram": 128,
"platform": "c2600",
"ram": 160,
"slot0": "C2600-MB-1E",
"slot1": "NM-16ESW",
"sparsemem": true,
"system_id": "FTX0945W0MY",
"usage": "",
"wic0": "WIC-2T",
"wic1": null,
"wic2": null
},
"symbol": ":/symbols/classic/router.svg",
"template_id": "39c787a9-5bc4-4b5e-9d54-7442088b355a",
"width": 66,
"x": -33,
"y": -97,
"z": 1
},
{
"compute_id": "local",
"console": 5025,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": null,
"height": 45,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "R4",
"x": 72,
"y": 9
},
"locked": false,
"name": "R4",
"node_id": "f5a3a7be-a09c-4b26-8ec9-f2797aaef440",
"node_type": "dynamips",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"auto_delete_disks": false,
"aux": null,
"chassis": "2610",
"clock_divisor": 8,
"disk0": 0,
"disk1": 0,
"dynamips_id": 3,
"exec_area": 64,
"idlemax": 500,
"idlepc": "",
"idlesleep": 30,
"image": "c2600-adventerprisek9_sna-mz.124-25b.bin",
"image_md5sum": "2b2f807cf1c8f12404977baabeb4e269",
"iomem": 15,
"mac_addr": "c803.57c4.0000",
"mmap": true,
"nvram": 128,
"platform": "c2600",
"ram": 160,
"slot0": "C2600-MB-1E",
"slot1": "NM-16ESW",
"sparsemem": true,
"system_id": "FTX0945W0MY",
"usage": "",
"wic0": "WIC-2T",
"wic1": null,
"wic2": null
},
"symbol": ":/symbols/classic/router.svg",
"template_id": "39c787a9-5bc4-4b5e-9d54-7442088b355a",
"width": 66,
"x": 267,
"y": -97,
"z": 1
},
{
"compute_id": "local",
"console": null,
"console_auto_start": false,
"console_type": "none",
"custom_adapters": [],
"first_port_name": null,
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "ATMSW1",
"x": -59,
"y": 10
},
"locked": false,
"name": "ATMSW1",
"node_id": "9bbf578e-6feb-4f18-ab1d-c99b647492df",
"node_type": "atm_switch",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"mappings": {
"1:0:100": "10:0:200",
"2:0:100": "11:0:200",
"3:0:100": "12:0:200",
"4:0:100": "13:0:200"
}
},
"symbol": ":/symbols/atm_switch.svg",
"template_id": "aaa764e2-b383-300f-8a0e-3493bbfdb7d2",
"width": 51,
"x": 124,
"y": 126,
"z": 1
},
{
"compute_id": "local",
"console": null,
"console_auto_start": false,
"console_type": "none",
"custom_adapters": [],
"first_port_name": null,
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "ATMSW2",
"x": -1,
"y": -25
},
"locked": false,
"name": "ATMSW2",
"node_id": "da2ade8c-c28e-498c-9579-2a6b0ef74f36",
"node_type": "atm_switch",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"mappings": {
"1:0:100": "10:0:200",
"2:0:100": "11:0:200",
"3:0:100": "12:0:200",
"4:0:100": "13:0:200"
}
},
"symbol": ":/symbols/atm_switch.svg",
"template_id": "aaa764e2-b383-300f-8a0e-3493bbfdb7d2",
"width": 51,
"x": 349,
"y": 126,
"z": 1
},
{
"compute_id": "local",
"console": null,
"console_auto_start": false,
"console_type": "none",
"custom_adapters": [],
"first_port_name": null,
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "ATMSW3",
"x": -56,
"y": 13
},
"locked": false,
"name": "ATMSW3",
"node_id": "5047a781-7b2a-4609-af13-fd84056a0611",
"node_type": "atm_switch",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"mappings": {
"1:0:100": "10:0:200",
"2:0:100": "11:0:200",
"3:0:100": "12:0:200",
"4:0:100": "13:0:200"
}
},
"symbol": ":/symbols/atm_switch.svg",
"template_id": "aaa764e2-b383-300f-8a0e-3493bbfdb7d2",
"width": 51,
"x": 124,
"y": 351,
"z": 1
},
{
"compute_id": "local",
"console": null,
"console_auto_start": false,
"console_type": "none",
"custom_adapters": [],
"first_port_name": null,
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "ATMSW4",
"x": 56,
"y": 12
},
"locked": false,
"name": "ATMSW4",
"node_id": "ff297e3f-bcb6-47e2-b9f0-d5415e75f614",
"node_type": "atm_switch",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"mappings": {
"1:0:100": "10:0:200",
"2:0:100": "11:0:200",
"3:0:100": "12:0:200",
"4:0:100": "13:0:200"
}
},
"symbol": ":/symbols/atm_switch.svg",
"template_id": "aaa764e2-b383-300f-8a0e-3493bbfdb7d2",
"width": 51,
"x": 349,
"y": 351,
"z": 1
},
{
"compute_id": "local",
"console": 5900,
"console_auto_start": false,
"console_type": "vnc",
"custom_adapters": [],
"first_port_name": "",
"height": 59,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "IPAM",
"x": 12,
"y": -25
},
"locked": false,
"name": "IPAM",
"node_id": "fd77de72-aaef-4f69-bc5a-808995da1b5c",
"node_type": "qemu",
"port_name_format": "ens{0}",
"port_segment_size": 0,
"properties": {
"adapter_type": "virtio-net-pci",
"adapters": 4,
"bios_image": "",
"bios_image_md5sum": null,
"boot_priority": "c",
"cdrom_image": "",
"cdrom_image_md5sum": null,
"cpu_throttling": 0,
"cpus": 1,
"hda_disk_image": "Ubuntu%20Server%2018.04.3%20LTS%20(64bit).vmdk",
"hda_disk_image_md5sum": "435f15a54f7f673e302ad26f05226e0e",
"hda_disk_interface": "virtio",
"hdb_disk_image": "",
"hdb_disk_image_md5sum": null,
"hdb_disk_interface": "ide",
"hdc_disk_image": "",
"hdc_disk_image_md5sum": null,
"hdc_disk_interface": "ide",
"hdd_disk_image": "",
"hdd_disk_image_md5sum": null,
"hdd_disk_interface": "ide",
"initrd": "",
"initrd_md5sum": null,
"kernel_command_line": "",
"kernel_image": "",
"kernel_image_md5sum": null,
"legacy_networking": false,
"linked_clone": true,
"mac_address": "0c:9b:e9:1b:5c:00",
"on_close": "power_off",
"options": "-vga virtio",
"platform": "x86_64",
"process_priority": "normal",
"qemu_path": "/usr/bin/qemu-system-x86_64",
"ram": 2048,
"replicate_network_connection_state": true,
"usage": "Username: gns3\nPassword: gns3 | MD5: 435f15a54f7f673e302ad26f05226e0e"
},
"symbol": ":/symbols/classic/qemu_guest.svg",
"template_id": "ced16f81-8b49-49ae-bccc-24ef2f73c05e",
"width": 65,
"x": -107,
"y": -29,
"z": 1
},
{
"compute_id": "local",
"console": null,
"console_auto_start": false,
"console_type": "none",
"custom_adapters": [],
"first_port_name": null,
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "FRSW1",
"x": 1,
"y": -25
},
"locked": false,
"name": "FRSW1",
"node_id": "552f192e-1e80-4ddc-9507-ae408dd7251d",
"node_type": "frame_relay_switch",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"mappings": {
"1:100": "11:200",
"2:101": "12:201",
"3:102": "13:202",
"4:103": "14:203",
"5:104": "15:204",
"6:105": "16:205",
"7:106": "17:206",
"8:107": "18:207",
"9:108": "19:208"
}
},
"symbol": ":/symbols/frame_relay_switch.svg",
"template_id": "dd0f6f3a-ba58-3249-81cb-a1dd88407a47",
"width": 51,
"x": 424,
"y": -398,
"z": 1
},
{
"compute_id": "local",
"console": null,
"console_auto_start": false,
"console_type": "none",
"custom_adapters": [],
"first_port_name": null,
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "FRSW2",
"x": 1,
"y": -25
},
"locked": false,
"name": "FRSW2",
"node_id": "d4e76d64-2682-4ce3-a54c-a29e9501ef9c",
"node_type": "frame_relay_switch",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"mappings": {
"1:100": "11:200",
"2:101": "12:201",
"3:102": "13:202",
"4:103": "14:203",
"5:104": "15:204",
"6:105": "16:205",
"7:106": "17:206",
"8:107": "18:207"
}
},
"symbol": ":/symbols/frame_relay_switch.svg",
"template_id": "dd0f6f3a-ba58-3249-81cb-a1dd88407a47",
"width": 51,
"x": 649,
"y": -398,
"z": 1
},
{
"compute_id": "local",
"console": null,
"console_auto_start": false,
"console_type": "none",
"custom_adapters": [],
"first_port_name": null,
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "FRSW3",
"x": -49,
"y": 12
},
"locked": false,
"name": "FRSW3",
"node_id": "99dc8ad3-b55b-4489-bfaa-5187699e4721",
"node_type": "frame_relay_switch",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"mappings": {
"1:100": "11:200",
"2:101": "12:201",
"3:102": "13:202",
"4:103": "14:203",
"5:104": "15:204",
"6:105": "16:205",
"7:106": "17:206",
"8:107": "18:207"
}
},
"symbol": ":/symbols/frame_relay_switch.svg",
"template_id": "dd0f6f3a-ba58-3249-81cb-a1dd88407a47",
"width": 51,
"x": 424,
"y": -173,
"z": 1
},
{
"compute_id": "local",
"console": null,
"console_auto_start": false,
"console_type": "none",
"custom_adapters": [],
"first_port_name": null,
"height": 48,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "FRSW4",
"x": 54,
"y": 11
},
"locked": false,
"name": "FRSW4",
"node_id": "dc51f2ed-2b89-4d7a-a97e-46da9bc1b17d",
"node_type": "frame_relay_switch",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"mappings": {
"1:100": "11:200",
"2:101": "12:201",
"3:102": "13:202",
"4:103": "14:203",
"5:104": "15:204",
"6:105": "16:205",
"7:106": "17:206",
"8:107": "18:207"
}
},
"symbol": ":/symbols/frame_relay_switch.svg",
"template_id": "dd0f6f3a-ba58-3249-81cb-a1dd88407a47",
"width": 51,
"x": 649,
"y": -173,
"z": 1
},
{
"compute_id": "local",
"console": 5027,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": null,
"height": 45,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "R5",
"x": 21,
"y": -25
},
"locked": false,
"name": "R5",
"node_id": "75a49356-1431-4757-87d2-5d3504561a21",
"node_type": "dynamips",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"auto_delete_disks": true,
"aux": null,
"clock_divisor": 4,
"disk0": 0,
"disk1": 0,
"dynamips_id": 4,
"exec_area": 64,
"idlemax": 500,
"idlepc": "0x60632738",
"idlesleep": 30,
"image": "c7200-adventerprisek9-mz.152-4.M11.image",
"image_md5sum": "cee15ae61eda8e10f983390cd0c829fe",
"mac_addr": "ca04.a1f4.0000",
"midplane": "vxr",
"mmap": true,
"npe": "npe-400",
"nvram": 512,
"platform": "c7200",
"power_supplies": [
1,
1
],
"ram": 512,
"sensors": [
22,
22,
22,
22
],
"slot0": "C7200-IO-FE",
"slot1": "PA-FE-TX",
"slot2": "PA-POS-OC3",
"slot3": null,
"slot4": "PA-POS-OC3",
"slot5": null,
"slot6": null,
"sparsemem": true,
"system_id": "FTX0945W0MY",
"usage": "POS-OC3"
},
"symbol": ":/symbols/router.svg",
"template_id": "1e9667ad-438f-4b19-a8b3-816cac64a6de",
"width": 66,
"x": 417,
"y": -22,
"z": 1
},
{
"compute_id": "local",
"console": 5028,
"console_auto_start": false,
"console_type": "telnet",
"custom_adapters": [],
"first_port_name": null,
"height": 45,
"label": {
"rotation": 0,
"style": "font-family: DejaVu Sans Mono;font-size: 8.0;font-weight: bold;fill: #204a87;fill-opacity: 1.0;",
"text": "R6",
"x": 21,
"y": -25
},
"locked": false,
"name": "R6",
"node_id": "4a712f86-eb1d-4e2a-b53b-1a314fd84837",
"node_type": "dynamips",
"port_name_format": "Ethernet{0}",
"port_segment_size": 0,
"properties": {
"auto_delete_disks": true,
"aux": null,
"clock_divisor": 4,
"disk0": 0,
"disk1": 0,
"dynamips_id": 5,
"exec_area": 64,
"idlemax": 500,
"idlepc": "0x60171348",
"idlesleep": 30,
"image": "c7200-adventerprisek9-mz.151-4.M.image",
"image_md5sum": "b702cc16b3aae00deec519c939a7df5f",
"mac_addr": "ca05.a203.0000",
"midplane": "vxr",
"mmap": true,
"npe": "npe-400",
"nvram": 512,
"platform": "c7200",
"power_supplies": [
1,
1
],
"ram": 512,
"sensors": [
22,
22,
22,
22
],
"slot0": "C7200-IO-2FE",
"slot1": "PA-8T",
"slot2": "PA-8T",
"slot3": "PA-8T",
"slot4": "PA-8T",
"slot5": "PA-8T",
"slot6": "PA-2FE-TX",
"sparsemem": true,
"system_id": "FTX0945W0MY",
"usage": "HD Serial WAN"
},
"symbol": ":/symbols/router.svg",
"template_id": "c37acc62-17a5-49cc-9e6a-0a4aea87238f",
"width": 66,
"x": 42,
"y": -22,
"z": 1
}
]
},
"type": "topology",
"variables": null,
"version": "2.2.17",
"zoom": 200
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.