mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-06 23:31:15 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4bed19f20a | ||
|
|
4bc1e5e02e | ||
|
|
d5b6fda270 | ||
|
|
720f52655e | ||
|
|
4df10d1427 | ||
|
|
aa83fcc7d1 | ||
|
|
afbbf7a524 | ||
|
|
b24bb42a66 | ||
|
|
aa1b621c10 | ||
|
|
6aed064a86 | ||
|
|
615cffd9ac | ||
|
|
868c39acfe | ||
|
|
392678e757 | ||
|
|
a62168fde0 | ||
|
|
3df348ac2a | ||
|
|
d9c264ce77 | ||
|
|
6eb62ad179 | ||
|
|
966e644c51 | ||
|
|
c5412bf970 | ||
|
|
6cb87ef25d | ||
|
|
e90262eb95 | ||
|
|
f7a6a0d466 | ||
|
|
92ac250bc7 | ||
|
|
667d50aa4a | ||
|
|
d796f8d112 | ||
|
|
fb4ece5c67 | ||
|
|
ab4b391a02 | ||
|
|
dcdaffa056 | ||
|
|
60cc5c7bb4 | ||
|
|
6d66e4d5d5 | ||
|
|
82b42fffef |
No files matched your search
@@ -1,5 +1,31 @@
|
||||
# Change Log
|
||||
|
||||
## 2.2.6 26/03/2020
|
||||
|
||||
* Remove --local when starting Docker dev server.
|
||||
* Release 2020.1.0-alpha.1
|
||||
* Monitor ubrige processes.
|
||||
* Add Xvnc command to the VNC servers list. Fixes #172
|
||||
* Allow controller to reconnect to compute if communication is lost. Ref #1634
|
||||
* Improvement of support for docker USER directive. Fixes #1727.
|
||||
* Fix cannot delete Dynamips router the content of the "usage" field. Fixes https://github.com/GNS3/gns3-gui/issues/2947
|
||||
* Prevent locked drawings to be deleted. Fixes https://github.com/GNS3/gns3-gui/issues/2948
|
||||
* Fix issues with empty project variables. Fixes https://github.com/GNS3/gns3-gui/issues/2941
|
||||
* Upgrade psutil to version 5.6.6 due to CVE-2019-18874 https://github.com/advisories/GHSA-qfc5-mcwq-26q8
|
||||
* Remove 'format=raw' from the Qemu options of the disk interfaces. Ref #1699
|
||||
* Allocate application IDs for IOU nodes on the controller. An application ID is used by IOU to generate its interface Mac addresses. They must be unique across all opened projects sharing the same computes to avoid Mac address collisions.
|
||||
* Require VirtualBox >= 6.0 on AMD and >= 6.1 on Intel processors (for GNS3 VM only). Fixes #1610
|
||||
* Add nvme disk interface and fix scsi disk interface for Qemu VMs.
|
||||
* Disallow using "legacy networking mode" with Qemu >= 2.9.0
|
||||
* Add latest Qemu nic models.
|
||||
* Attempt to fix error when loading wmi module. Fixes #1712
|
||||
* Handle "aborted" state for VirtualBox VMs. Fixes #1702
|
||||
* Change how Hyper-V VMs are found. Ref #1612
|
||||
|
||||
## 2.2.5 09/01/2020
|
||||
|
||||
* No changes
|
||||
|
||||
## 2.2.4 08/01/2020
|
||||
|
||||
* Accept a node name when creating a node from a template using the API. Fixes #1708
|
||||
|
||||
+1
-2
@@ -16,7 +16,6 @@ RUN apt-get update && apt-get install -y \
|
||||
python3-pip \
|
||||
python3-dev \
|
||||
qemu-system-x86 \
|
||||
qemu-system-arm \
|
||||
qemu-kvm \
|
||||
libvirt-bin \
|
||||
x11vnc
|
||||
@@ -33,4 +32,4 @@ RUN pip3 install -r /server/requirements.txt
|
||||
|
||||
EXPOSE 3080
|
||||
|
||||
CMD python3 -m gns3server --local
|
||||
CMD python3 -m gns3server
|
||||
@@ -11,7 +11,7 @@
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
"dynamips": {
|
||||
"platform": "c3600",
|
||||
"platform": "c2691",
|
||||
"ram": 192,
|
||||
"nvram": 256,
|
||||
"startup_config": "ios_base_startup-config.txt",
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"documentation_url": "http://www.cisco.com/c/en/us/support/security/identity-services-engine/tsd-products-support-series-home.html",
|
||||
"product_name": "Identity Services Engine",
|
||||
"product_url": "http://www.cisco.com/c/en/us/products/security/identity-services-engine/index.html",
|
||||
"registry_version": 3,
|
||||
"registry_version": 4,
|
||||
"status": "experimental",
|
||||
"maintainer": "GNS3 Team",
|
||||
"maintainer_email": "developers@gns3.net",
|
||||
@@ -15,9 +15,10 @@
|
||||
"symbol": "cisco-ise.svg",
|
||||
"port_name_format": "GigabitEthernet{0}",
|
||||
"qemu": {
|
||||
"cpus": 2,
|
||||
"adapter_type": "e1000",
|
||||
"adapters": 2,
|
||||
"ram": 4096,
|
||||
"adapters": 6,
|
||||
"ram": 8192,
|
||||
"hda_disk_interface": "ide",
|
||||
"arch": "x86_64",
|
||||
"console_type": "vnc",
|
||||
@@ -26,12 +27,33 @@
|
||||
"options": "-smp 2 -smbios type=1,product=KVM"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "ise-2.7.0.356.SPA.x86_64.iso",
|
||||
"version": "2.7.0.356",
|
||||
"md5sum": "efbc831bf05513e4df8695eb3a362921",
|
||||
"filesize": 9184415744,
|
||||
"download_url": "https://software.cisco.com/download/home/283801620/type/283802505/release/2.7.0"
|
||||
},
|
||||
{
|
||||
"filename": "ise-2.6.0.156.SPA.x86_64.iso",
|
||||
"version": "2.6.0.156",
|
||||
"md5sum": "296e65b662821269ad67dd3dea8804d9",
|
||||
"filesize": 8618913792,
|
||||
"download_url": "https://software.cisco.com/download/home/283801620/type/283802505/release/2.6.0"
|
||||
},
|
||||
{
|
||||
"filename": "ise-2.4.0.357.SPA.x86_64.iso",
|
||||
"version": "2.4.0.357",
|
||||
"md5sum": "766945618a0ff35f6c720b3bc4b46bfb",
|
||||
"md5sum": "7f32a28f8d95c7525885786a6556913e",
|
||||
"filesize": 8326062080,
|
||||
"download_url": "https://software.cisco.com/download/home/283801620/type/283802505/release/2.4.0"
|
||||
},
|
||||
{
|
||||
"filename": "ise-2.3.0.298.SPA.x86_64.iso",
|
||||
"version": "2.3.0.298",
|
||||
"md5sum": "da98d1a34f6b11d63da0f29bd5ef9caf",
|
||||
"filesize": 8174278656,
|
||||
"download_url": "https://software.cisco.com/download/home/283801620/type/283802505/release/2.3.0"
|
||||
},
|
||||
{
|
||||
"filename": "ise-2.2.0.470.SPA.x86_64.iso",
|
||||
@@ -71,12 +93,33 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "2.7.0.356",
|
||||
"images": {
|
||||
"hda_disk_image": "empty200G.qcow2",
|
||||
"cdrom_image": "ise-2.7.0.356.SPA.x86_64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.6.0.156",
|
||||
"images": {
|
||||
"hda_disk_image": "empty200G.qcow2",
|
||||
"cdrom_image": "ise-2.6.0.156.SPA.x86_64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.4.0.357",
|
||||
"images": {
|
||||
"hda_disk_image": "empty200G.qcow2",
|
||||
"cdrom_image": "ise-2.4.0.357.SPA.x86_64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.3.0.298",
|
||||
"images": {
|
||||
"hda_disk_image": "empty200G.qcow2",
|
||||
"cdrom_image": "ise-2.3.0.298.SPA.x86_64.iso"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "2.2.0.470",
|
||||
|
||||
@@ -25,7 +25,21 @@
|
||||
"kvm": "require"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
{
|
||||
"filename": "nexus9500v.9.3.3.qcow2",
|
||||
"version": "9500v 9.3.3",
|
||||
"md5sum": "7230c944041fdaa0e1b18cecccbc9a32",
|
||||
"filesize": 1714159616,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(3)"
|
||||
},
|
||||
{
|
||||
"filename": "nexus9300v.9.3.3.qcow2",
|
||||
"version": "9300v 9.3.3",
|
||||
"md5sum": "8e9a7c4815907ef47d850623f77042e2",
|
||||
"filesize": 1714225152,
|
||||
"download_url": "https://software.cisco.com/download/home/286312239/type/282088129/release/9.3(3)"
|
||||
},
|
||||
{
|
||||
"filename": "nxosv.9.3.1.qcow2",
|
||||
"version": "9.3.1",
|
||||
"md5sum": "148fd38cb1ff78df2883f844e172fad9",
|
||||
@@ -134,6 +148,20 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "9500v 9.3.3",
|
||||
"images": {
|
||||
"bios_image": "OVMF-20160813.fd",
|
||||
"hda_disk_image": "nexus9500v.9.3.3.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9300v 9.3.3",
|
||||
"images": {
|
||||
"bios_image": "OVMF-20160813.fd",
|
||||
"hda_disk_image": "nexus9300v.9.3.3.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "9.3.1",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
"options": "-smp 2 -cpu host"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "BIGIP-14.1.2.3-0.0.5.qcow2",
|
||||
"version": "14.1.2.3",
|
||||
"md5sum": "356520eedb615c93e985474f2b2ec603",
|
||||
"filesize": 5036834816,
|
||||
"download_url": "https://downloads.f5.com"
|
||||
},
|
||||
{
|
||||
"filename": "BIGIP-14.0.0.3-0.0.4.qcow2",
|
||||
"version": "14.0.0 HF3",
|
||||
@@ -142,6 +149,13 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "14.1.2.3",
|
||||
"images": {
|
||||
"hda_disk_image": "BIGIP-14.1.2.3-0.0.5.qcow2",
|
||||
"hdb_disk_image": "empty100G.qcow2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "14.0.0 HF3",
|
||||
"images": {
|
||||
|
||||
@@ -27,6 +27,15 @@
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "chr-7.0beta5.img",
|
||||
"version": "7.0beta5",
|
||||
"md5sum": "3c9855f0efdc23df29511c76aee52c95",
|
||||
"filesize": 67108864,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/7.0beta5/chr-7.0beta5.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-7.0beta3.img",
|
||||
"version": "7.0beta3",
|
||||
"md5sum": "938c59989df039cb9f33e0da96c22174",
|
||||
@@ -34,8 +43,26 @@
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/7.0beta3/chr-7.0beta3.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.46.3.img",
|
||||
"version": "6.46.3",
|
||||
"md5sum": "72d72c4a585a04eb9ed24ec9e4678486",
|
||||
"filesize": 67108864,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/6.46.3/chr-6.46.3.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.45.8.img",
|
||||
"version": "6.45.8",
|
||||
"md5sum": "73cc01e22e0b301dc29416f59ced8a7d",
|
||||
"filesize": 67108864,
|
||||
"download_url": "http://www.mikrotik.com/download",
|
||||
"direct_download_url": "https://download.mikrotik.com/routeros/6.45.8/chr-6.45.8.img.zip",
|
||||
"compression": "zip"
|
||||
},
|
||||
{
|
||||
"filename": "chr-6.45.6.img",
|
||||
"version": "6.45.6",
|
||||
"md5sum": "e68db699ba23ac7e4fba95b3075c1c6b",
|
||||
@@ -155,10 +182,28 @@
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "7.0beta5",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-7.0beta5.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "7.0beta3",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-7.0beta3.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.46.3",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.46.3.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.45.8",
|
||||
"images": {
|
||||
"hda_disk_image": "chr-6.45.8.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "6.45.6",
|
||||
|
||||
@@ -21,6 +21,42 @@
|
||||
"kvm": "allow"
|
||||
},
|
||||
"images": [
|
||||
{
|
||||
"filename": "openwrt-19.07.1-x86-64-combined-ext4.img",
|
||||
"version": "19.07.1",
|
||||
"md5sum": "2d36f48bcc37edf3c5cfc28fed44b533",
|
||||
"filesize": 285736960,
|
||||
"download_url": "https://downloads.openwrt.org/releases/19.07.1/targets/x86/64/",
|
||||
"direct_download_url": "https://downloads.openwrt.org/releases/19.07.1/targets/x86/64/openwrt-19.07.1-x86-64-combined-ext4.img.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "openwrt-18.06.7-x86-64-combined-ext4.img",
|
||||
"version": "18.06.7",
|
||||
"md5sum": "f463f38cccf89e1a2229f74a4c42d3ef",
|
||||
"filesize": 285736960,
|
||||
"download_url": "https://downloads.openwrt.org/releases/18.06.7/targets/x86/64/",
|
||||
"direct_download_url": "https://downloads.openwrt.org/releases/18.06.7/targets/x86/64/openwrt-18.06.7-x86-64-combined-ext4.img.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "openwrt-19.07.0-x86-64-combined-ext4.img",
|
||||
"version": "19.07.0",
|
||||
"md5sum": "cf2a353d10e017b9e71cd3761f7aa724",
|
||||
"filesize": 285736960,
|
||||
"download_url": "https://downloads.openwrt.org/releases/19.07.0/targets/x86/64/",
|
||||
"direct_download_url": "https://downloads.openwrt.org/releases/19.07.0/targets/x86/64/openwrt-19.07.0-x86-64-combined-ext4.img.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "openwrt-18.06.6-x86-64-combined-ext4.img",
|
||||
"version": "18.06.6",
|
||||
"md5sum": "0afeec80ad7e5035f739e0ed0a07fb83",
|
||||
"filesize": 285736960,
|
||||
"download_url": "https://downloads.openwrt.org/releases/18.06.6/targets/x86/64/",
|
||||
"direct_download_url": "https://downloads.openwrt.org/releases/18.06.6/targets/x86/64/openwrt-18.06.6-x86-64-combined-ext4.img.gz",
|
||||
"compression": "gzip"
|
||||
},
|
||||
{
|
||||
"filename": "openwrt-18.06.5-x86-64-combined-ext4.img",
|
||||
"version": "18.06.5",
|
||||
@@ -68,6 +104,30 @@
|
||||
}
|
||||
],
|
||||
"versions": [
|
||||
{
|
||||
"name": "19.07.1",
|
||||
"images": {
|
||||
"hda_disk_image": "openwrt-19.07.1-x86-64-combined-ext4.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "18.06.7",
|
||||
"images": {
|
||||
"hda_disk_image": "openwrt-18.06.7-x86-64-combined-ext4.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "19.07.0",
|
||||
"images": {
|
||||
"hda_disk_image": "openwrt-19.07.0-x86-64-combined-ext4.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "18.06.6",
|
||||
"images": {
|
||||
"hda_disk_image": "openwrt-18.06.6-x86-64-combined-ext4.img"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "18.06.5",
|
||||
"images": {
|
||||
|
||||
@@ -564,12 +564,14 @@ class DockerVM(BaseNode):
|
||||
"""
|
||||
|
||||
self._display = self._get_free_display_port()
|
||||
if not (shutil.which("Xtigervnc") or shutil.which("Xvfb") and shutil.which("x11vnc")):
|
||||
raise DockerError("Please install tigervnc-standalone-server (recommended) or Xvfb + x11vnc before using VNC support")
|
||||
tigervnc_path = shutil.which("Xtigervnc") or shutil.which("Xvnc")
|
||||
|
||||
if shutil.which("Xtigervnc"):
|
||||
if not (tigervnc_path or shutil.which("Xvfb") and shutil.which("x11vnc")):
|
||||
raise DockerError("Please install TigerVNC (recommended) or Xvfb + x11vnc before using VNC support")
|
||||
|
||||
if tigervnc_path:
|
||||
with open(os.path.join(self.working_dir, "vnc.log"), "w") as fd:
|
||||
self._vnc_process = await asyncio.create_subprocess_exec("Xtigervnc",
|
||||
self._vnc_process = await asyncio.create_subprocess_exec(tigervnc_path,
|
||||
"-geometry", self._console_resolution,
|
||||
"-depth", "16",
|
||||
"-interface", self._manager.port_manager.console_host,
|
||||
@@ -606,8 +608,9 @@ class DockerVM(BaseNode):
|
||||
"""
|
||||
|
||||
self._display = self._get_free_display_port()
|
||||
if not (shutil.which("Xtigervnc") or shutil.which("Xvfb") and shutil.which("x11vnc")):
|
||||
raise DockerError("Please install tigervnc-standalone-server (recommended) or Xvfb + x11vnc before using VNC support")
|
||||
tigervnc_path = shutil.which("Xtigervnc") or shutil.which("Xvnc")
|
||||
if not (tigervnc_path or shutil.which("Xvfb") and shutil.which("x11vnc")):
|
||||
raise DockerError("Please install TigerVNC server (recommended) or Xvfb + x11vnc before using VNC support")
|
||||
await self._start_vnc_process()
|
||||
x11_socket = os.path.join("/tmp/.X11-unix/", "X{}".format(self._display))
|
||||
await wait_for_file_creation(x11_socket)
|
||||
|
||||
@@ -87,9 +87,5 @@ done
|
||||
ifup -a -f
|
||||
|
||||
# continue normal docker startup
|
||||
GNS3_CMD="PATH=$OLD_PATH exec"
|
||||
while test "$#" -gt 0 ; do
|
||||
GNS3_CMD="${GNS3_CMD} \"${1//\"/\\\"}\""
|
||||
shift
|
||||
done
|
||||
exec su ${GNS3_USER-root} -p -c "$GNS3_CMD"
|
||||
eval HOME=$(echo ~${GNS3_USER-root})
|
||||
exec su ${GNS3_USER-root} -p -- /gns3/run-cmd.sh "$OLD_PATH" "$@"
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
# run docker startup, first arg is new PATH, remainder is command
|
||||
|
||||
PATH="$1"
|
||||
shift
|
||||
exec "$@"
|
||||
@@ -493,7 +493,7 @@ class Dynamips(BaseManager):
|
||||
await vm.set_sparsemem(False)
|
||||
|
||||
usage = settings.get("usage")
|
||||
if usage and usage != vm.usage:
|
||||
if usage is not None and usage != vm.usage:
|
||||
vm.usage = usage
|
||||
|
||||
# update the configs if needed
|
||||
|
||||
@@ -25,7 +25,6 @@ import asyncio
|
||||
from ..base_manager import BaseManager
|
||||
from .iou_error import IOUError
|
||||
from .iou_vm import IOUVM
|
||||
from .utils.application_id import get_next_application_id
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
@@ -48,12 +47,7 @@ class IOU(BaseManager):
|
||||
:returns: IOUVM instance
|
||||
"""
|
||||
|
||||
async with self._iou_id_lock:
|
||||
# wait for a node to be completely created before adding a new one
|
||||
# this is important otherwise we allocate the same application ID
|
||||
# when creating multiple IOU node at the same time
|
||||
application_id = get_next_application_id(self.nodes)
|
||||
node = await super().create_node(*args, application_id=application_id, **kwargs)
|
||||
node = await super().create_node(*args, **kwargs)
|
||||
return node
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -70,6 +70,10 @@ class IOUVM(BaseNode):
|
||||
|
||||
super().__init__(name, node_id, project, manager, console=console, console_type=console_type)
|
||||
|
||||
log.info('IOU "{name}" [{id}]: assigned with application ID {application_id}'.format(name=self._name,
|
||||
id=self._id,
|
||||
application_id=application_id))
|
||||
|
||||
self._iou_process = None
|
||||
self._telnet_server = None
|
||||
self._iou_stdout_file = ""
|
||||
|
||||
@@ -1647,7 +1647,16 @@ class QemuVM(BaseNode):
|
||||
options.extend(["-device", 'ahci,id=ahci{}'.format(disk_index)])
|
||||
options.extend(["-drive", 'file={},if=none,id=drive{},index={},media=disk'.format(disk, disk_index, disk_index)])
|
||||
options.extend(["-device", 'ide-drive,drive=drive{},bus=ahci{}.0,id=drive{}'.format(disk_index, disk_index, disk_index)])
|
||||
|
||||
elif interface == "nvme":
|
||||
options.extend(["-drive", 'file={},if=none,id=drive{},index={},media=disk'.format(disk, disk_index, disk_index)])
|
||||
options.extend(["-device", 'nvme,drive=drive{},serial={}'.format(disk_index, disk_index)])
|
||||
elif interface == "scsi":
|
||||
options.extend(["-device", 'virtio-scsi-pci,id=scsi{}'.format(disk_index)])
|
||||
options.extend(["-drive", 'file={},if=none,id=drive{},index={},media=disk'.format(disk, disk_index, disk_index)])
|
||||
options.extend(["-device", 'scsi-hd,drive=drive{}'.format(disk_index)])
|
||||
#elif interface == "sd":
|
||||
# options.extend(["-drive", 'file={},id=drive{},index={}'.format(disk, disk_index, disk_index)])
|
||||
# options.extend(["-device", 'sd-card,drive=drive{},id=drive{}'.format(disk_index, disk_index, disk_index)])
|
||||
else:
|
||||
options.extend(["-drive", 'file={},if={},index={},media=disk,id=drive{}'.format(disk, interface, disk_index, disk_index)])
|
||||
|
||||
@@ -1723,10 +1732,13 @@ class QemuVM(BaseNode):
|
||||
|
||||
patched_qemu = False
|
||||
if self._legacy_networking:
|
||||
version = await self.manager.get_qemu_version(self.qemu_path)
|
||||
if version and parse_version(version) < parse_version("1.1.0"):
|
||||
# this is a patched Qemu if version is below 1.1.0
|
||||
patched_qemu = True
|
||||
qemu_version = await self.manager.get_qemu_version(self.qemu_path)
|
||||
if qemu_version:
|
||||
if parse_version(qemu_version) >= parse_version("2.9.0"):
|
||||
raise QemuError("Qemu version 2.9.0 and later doesn't support legacy networking mode")
|
||||
if parse_version(qemu_version) < parse_version("1.1.0"):
|
||||
# this is a patched Qemu if version is below 1.1.0
|
||||
patched_qemu = True
|
||||
|
||||
# Each 32 PCI device we need to add a PCI bridge with max 9 bridges
|
||||
pci_devices = 4 + len(self._ethernet_adapters) # 4 PCI devices are use by default by qemu
|
||||
|
||||
@@ -279,7 +279,7 @@ class VirtualBoxVM(BaseNode):
|
||||
await self._set_network_options()
|
||||
await self._set_serial_console()
|
||||
else:
|
||||
raise VirtualBoxError("VirtualBox VM not powered off")
|
||||
raise VirtualBoxError("VirtualBox VM '{}' is not powered off (current state is '{}')".format(self.name, vm_state))
|
||||
|
||||
# check if there is enough RAM to run
|
||||
self.check_available_ram(self.ram)
|
||||
@@ -320,7 +320,8 @@ class VirtualBoxVM(BaseNode):
|
||||
await self._stop_ubridge()
|
||||
await self._stop_remote_console()
|
||||
vm_state = await self._get_vm_state()
|
||||
if vm_state in ("running", "paused", "stuck"):
|
||||
log.info("Stopping VirtualBox VM '{name}' [{id}] (current state is {vm_state})".format(name=self.name, id=self.id, vm_state=vm_state))
|
||||
if vm_state in ("running", "paused"):
|
||||
|
||||
if self.on_close == "save_vm_state":
|
||||
# add a guest property to know the VM has been saved
|
||||
@@ -348,7 +349,10 @@ class VirtualBoxVM(BaseNode):
|
||||
result = await self._control_vm("poweroff")
|
||||
self.status = "stopped"
|
||||
log.debug("Stop result: {}".format(result))
|
||||
elif vm_state == "aborted":
|
||||
self.status = "stopped"
|
||||
|
||||
if self.status == "stopped":
|
||||
log.info("VirtualBox VM '{name}' [{id}] stopped".format(name=self.name, id=self.id))
|
||||
await asyncio.sleep(0.5) # give some time for VirtualBox to unlock the VM
|
||||
if self.on_close != "save_vm_state":
|
||||
|
||||
@@ -481,7 +481,7 @@ class Controller:
|
||||
@property
|
||||
def projects(self):
|
||||
"""
|
||||
:returns: The dictionary of projects managed by GNS3
|
||||
:returns: The dictionary of projects managed by the controller
|
||||
"""
|
||||
|
||||
return self._projects
|
||||
|
||||
@@ -448,11 +448,11 @@ class Compute:
|
||||
log.error("Error received on compute WebSocket '{}': {}".format(ws_url, ws.exception()))
|
||||
elif response.type == aiohttp.WSMsgType.CLOSED:
|
||||
pass
|
||||
self._connected = False
|
||||
break
|
||||
except aiohttp.client_exceptions.ClientResponseError as e:
|
||||
log.error("Client response error received on compute WebSocket '{}': {}".format(ws_url,e))
|
||||
finally:
|
||||
self._connected = False
|
||||
log.info("Connection closed to compute WebSocket '{}'".format(ws_url))
|
||||
|
||||
# Try to reconnect after 1 second if server unavailable only if not during tests (otherwise we create a ressources usage bomb)
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import hashlib
|
||||
import asyncio
|
||||
import base64
|
||||
import uuid
|
||||
import re
|
||||
|
||||
@@ -21,9 +21,6 @@ import asyncio
|
||||
import psutil
|
||||
import ipaddress
|
||||
|
||||
if sys.platform.startswith("win"):
|
||||
import wmi
|
||||
|
||||
from .base_gns3_vm import BaseGNS3VM
|
||||
from .gns3_vm_error import GNS3VMError
|
||||
log = logging.getLogger(__name__)
|
||||
@@ -47,6 +44,7 @@ class HyperVGNS3VM(BaseGNS3VM):
|
||||
self._conn = None
|
||||
self._vm = None
|
||||
self._management = None
|
||||
self._wmi = None
|
||||
|
||||
def _check_requirements(self):
|
||||
"""
|
||||
@@ -64,8 +62,12 @@ class HyperVGNS3VM(BaseGNS3VM):
|
||||
raise GNS3VMError("Hyper-V with nested virtualization is only supported on Windows 10 Anniversary Update (build 10.0.14393) or later")
|
||||
|
||||
try:
|
||||
conn = wmi.WMI()
|
||||
except wmi.x_wmi as e:
|
||||
import pythoncom
|
||||
pythoncom.CoInitialize()
|
||||
import wmi
|
||||
self._wmi = wmi
|
||||
conn = self._wmi.WMI()
|
||||
except self._wmi.x_wmi as e:
|
||||
raise GNS3VMError("Could not connect to WMI: {}".format(e))
|
||||
|
||||
if not conn.Win32_ComputerSystem()[0].HypervisorPresent:
|
||||
@@ -86,8 +88,8 @@ class HyperVGNS3VM(BaseGNS3VM):
|
||||
self._check_requirements()
|
||||
|
||||
try:
|
||||
self._conn = wmi.WMI(namespace=r"root\virtualization\v2")
|
||||
except wmi.x_wmi as e:
|
||||
self._conn = self._wmi.WMI(namespace=r"root\virtualization\v2")
|
||||
except self._wmi.x_wmi as e:
|
||||
raise GNS3VMError("Could not connect to WMI: {}".format(e))
|
||||
|
||||
if not self._conn.Msvm_VirtualSystemManagementService():
|
||||
@@ -182,10 +184,10 @@ class HyperVGNS3VM(BaseGNS3VM):
|
||||
|
||||
vms = []
|
||||
try:
|
||||
for vm in self._conn.Msvm_VirtualSystemSettingData():
|
||||
if vm.VirtualSystemType == "Microsoft:Hyper-V:System:Realized":
|
||||
for vm in self._conn.Msvm_ComputerSystem():
|
||||
if vm.ElementName != self._management.SystemName:
|
||||
vms.append({"vmname": vm.ElementName})
|
||||
except wmi.x_wmi as e:
|
||||
except self._wmi.x_wmi as e:
|
||||
raise GNS3VMError("Could not list Hyper-V VMs: {}".format(e))
|
||||
return vms
|
||||
|
||||
@@ -194,7 +196,7 @@ class HyperVGNS3VM(BaseGNS3VM):
|
||||
Gets the WMI object.
|
||||
"""
|
||||
|
||||
return wmi.WMI(moniker=path.replace('\\', '/'))
|
||||
return self._wmi.WMI(moniker=path.replace('\\', '/'))
|
||||
|
||||
async def _set_state(self, state):
|
||||
"""
|
||||
|
||||
@@ -23,6 +23,8 @@ import socket
|
||||
|
||||
from .base_gns3_vm import BaseGNS3VM
|
||||
from .gns3_vm_error import GNS3VMError
|
||||
from gns3server.utils import parse_version
|
||||
from gns3server.utils.asyncio import wait_run_in_executor
|
||||
|
||||
from ...compute.virtualbox import (
|
||||
VirtualBox,
|
||||
@@ -38,6 +40,7 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
|
||||
|
||||
self._engine = "virtualbox"
|
||||
super().__init__(controller)
|
||||
self._system_properties = {}
|
||||
self._virtualbox_manager = VirtualBox()
|
||||
|
||||
async def _execute(self, subcommand, args, timeout=60):
|
||||
@@ -63,6 +66,42 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
|
||||
return value.strip('"')
|
||||
return "unknown"
|
||||
|
||||
async def _get_system_properties(self):
|
||||
"""
|
||||
Returns the VM state (e.g. running, paused etc.)
|
||||
|
||||
:returns: state (string)
|
||||
"""
|
||||
|
||||
properties = await self._execute("list", ["systemproperties"])
|
||||
for prop in properties.splitlines():
|
||||
try:
|
||||
name, value = prop.split(':', 1)
|
||||
except ValueError:
|
||||
continue
|
||||
self._system_properties[name.strip()] = value.strip()
|
||||
|
||||
async def _check_requirements(self):
|
||||
"""
|
||||
Checks if the GNS3 VM can run on VirtualBox
|
||||
"""
|
||||
|
||||
if not self._system_properties:
|
||||
await self._get_system_properties()
|
||||
if "API version" not in self._system_properties:
|
||||
raise VirtualBoxError("Can't access to VirtualBox API version:\n{}".format(self._system_properties))
|
||||
from cpuinfo import get_cpu_info
|
||||
cpu_info = await wait_run_in_executor(get_cpu_info)
|
||||
vendor_id = cpu_info['vendor_id']
|
||||
if vendor_id == "GenuineIntel":
|
||||
if parse_version(self._system_properties["API version"]) < parse_version("6_1"):
|
||||
raise VirtualBoxError("VirtualBox version 6.1 or above is required to run the GNS3 VM with nested virtualization enabled on Intel processors")
|
||||
elif vendor_id == "AuthenticAMD":
|
||||
if parse_version(self._system_properties["API version"]) < parse_version("6_0"):
|
||||
raise VirtualBoxError("VirtualBox version 6.0 or above is required to run the GNS3 VM with nested virtualization enabled on AMD processors")
|
||||
else:
|
||||
log.warning("Could not determine CPU vendor: {}".format(vendor_id))
|
||||
|
||||
async def _look_for_interface(self, network_backend):
|
||||
"""
|
||||
Look for an interface with a specific network backend.
|
||||
@@ -173,13 +212,16 @@ class VirtualBoxGNS3VM(BaseGNS3VM):
|
||||
List all VirtualBox VMs
|
||||
"""
|
||||
|
||||
return (await self._virtualbox_manager.list_vms())
|
||||
await self._check_requirements()
|
||||
return await self._virtualbox_manager.list_vms()
|
||||
|
||||
async def start(self):
|
||||
"""
|
||||
Start the GNS3 VM.
|
||||
"""
|
||||
|
||||
await self._check_requirements()
|
||||
|
||||
# get a NAT interface number
|
||||
nat_interface_number = await self._look_for_interface("nat")
|
||||
if nat_interface_number < 0:
|
||||
|
||||
@@ -38,6 +38,7 @@ from .topology import project_to_topology, load_topology
|
||||
from .udp_link import UDPLink
|
||||
from ..config import Config
|
||||
from ..utils.path import check_path_allowed, get_default_project_directory
|
||||
from ..utils.application_id import get_next_application_id
|
||||
from ..utils.asyncio.pool import Pool
|
||||
from ..utils.asyncio import locking
|
||||
from ..utils.asyncio import aiozipstream
|
||||
@@ -126,6 +127,8 @@ class Project:
|
||||
assert self._status != "closed"
|
||||
self.dump()
|
||||
|
||||
self._iou_id_lock = asyncio.Lock()
|
||||
|
||||
def emit_notification(self, action, event):
|
||||
"""
|
||||
Emit a notification to all clients using this project.
|
||||
@@ -516,17 +519,7 @@ class Project:
|
||||
node = await self.add_node(compute, name, node_id, node_type=node_type, **template)
|
||||
return node
|
||||
|
||||
@open_required
|
||||
async def add_node(self, compute, name, node_id, dump=True, node_type=None, **kwargs):
|
||||
"""
|
||||
Create a node or return an existing node
|
||||
|
||||
:param dump: Dump topology to disk
|
||||
:param kwargs: See the documentation of node
|
||||
"""
|
||||
|
||||
if node_id in self._nodes:
|
||||
return self._nodes[node_id]
|
||||
async def _create_node(self, compute, name, node_id, node_type=None, **kwargs):
|
||||
|
||||
node = Node(self, compute, name, node_id=node_id, node_type=node_type, **kwargs)
|
||||
if compute not in self._project_created_on_compute:
|
||||
@@ -547,10 +540,39 @@ class Project:
|
||||
data["variables"] = self._variables
|
||||
|
||||
await compute.post("/projects", data=data)
|
||||
|
||||
self._project_created_on_compute.add(compute)
|
||||
|
||||
await node.create()
|
||||
self._nodes[node.id] = node
|
||||
|
||||
return node
|
||||
|
||||
@open_required
|
||||
async def add_node(self, compute, name, node_id, dump=True, node_type=None, **kwargs):
|
||||
"""
|
||||
Create a node or return an existing node
|
||||
|
||||
:param dump: Dump topology to disk
|
||||
:param kwargs: See the documentation of node
|
||||
"""
|
||||
|
||||
if node_id in self._nodes:
|
||||
return self._nodes[node_id]
|
||||
|
||||
if node_type == "iou":
|
||||
async with self._iou_id_lock:
|
||||
# wait for a IOU node to be completely created before adding a new one
|
||||
# this is important otherwise we allocate the same application ID (used
|
||||
# to generate MAC addresses) when creating multiple IOU node at the same time
|
||||
if "properties" in kwargs.keys():
|
||||
# allocate a new application id for nodes loaded from the project
|
||||
kwargs.get("properties")["application_id"] = get_next_application_id(self._controller.projects, compute)
|
||||
elif "application_id" not in kwargs.keys() and not kwargs.get("properties"):
|
||||
# allocate a new application id for nodes added to the project
|
||||
kwargs["application_id"] = get_next_application_id(self._controller.projects, compute)
|
||||
node = await self._create_node(compute, name, node_id, node_type, **kwargs)
|
||||
else:
|
||||
node = await self._create_node(compute, name, node_id, node_type, **kwargs)
|
||||
self.emit_notification("node.created", node.__json__())
|
||||
if dump:
|
||||
self.dump()
|
||||
@@ -662,6 +684,8 @@ class Project:
|
||||
@open_required
|
||||
async def delete_drawing(self, drawing_id):
|
||||
drawing = self.get_drawing(drawing_id)
|
||||
if drawing.locked:
|
||||
raise aiohttp.web.HTTPConflict(text="Drawing ID {} cannot be deleted because it is locked".format(drawing_id))
|
||||
del self._drawings[drawing.id]
|
||||
self.dump()
|
||||
self.emit_notification("drawing.deleted", drawing.__json__())
|
||||
@@ -1102,12 +1126,11 @@ class Project:
|
||||
data['z'] = z
|
||||
data['locked'] = False # duplicated node must not be locked
|
||||
new_node_uuid = str(uuid.uuid4())
|
||||
new_node = await self.add_node(
|
||||
node.compute,
|
||||
node.name,
|
||||
new_node_uuid,
|
||||
node_type=node_type,
|
||||
**data)
|
||||
new_node = await self.add_node(node.compute,
|
||||
node.name,
|
||||
new_node_uuid,
|
||||
node_type=node_type,
|
||||
**data)
|
||||
try:
|
||||
await node.post("/duplicate", timeout=None, data={
|
||||
"destination_node_id": new_node_uuid
|
||||
|
||||
@@ -171,6 +171,11 @@ def load_topology(path):
|
||||
if "console_type" in node and node["console_type"] is None:
|
||||
node["console_type"] = "none"
|
||||
|
||||
# make sure we can open a project with empty variable name
|
||||
variables = topo.get("variables")
|
||||
if variables:
|
||||
topo["variables"] = [var for var in variables if var.get("name")]
|
||||
|
||||
try:
|
||||
_check_topology_schema(topo)
|
||||
except aiohttp.web.HTTPConflict as e:
|
||||
|
||||
@@ -58,7 +58,7 @@ class CrashReport:
|
||||
Report crash to a third party service
|
||||
"""
|
||||
|
||||
DSN = "https://daf38ec184724ec5bee0c8374a2b986e:d0a1e12bed364f3089c681c41828ee52@sentry.io/38482"
|
||||
DSN = "https://03a62c6395a54334b0818302138c6555:d7977024b6314ffbaddae057f9bb53b8@sentry.io/38482"
|
||||
if hasattr(sys, "frozen"):
|
||||
cacert = get_resource("cacert.pem")
|
||||
if cacert is not None and os.path.isfile(cacert):
|
||||
|
||||
@@ -58,16 +58,17 @@ class IOUHandler:
|
||||
|
||||
iou = IOU.instance()
|
||||
vm = await iou.create_node(request.json.pop("name"),
|
||||
request.match_info["project_id"],
|
||||
request.json.get("node_id"),
|
||||
path=request.json.get("path"),
|
||||
console=request.json.get("console"),
|
||||
console_type=request.json.get("console_type", "telnet"))
|
||||
request.match_info["project_id"],
|
||||
request.json.get("node_id"),
|
||||
application_id=request.json.get("application_id"),
|
||||
path=request.json.get("path"),
|
||||
console=request.json.get("console"),
|
||||
console_type=request.json.get("console_type", "telnet"))
|
||||
|
||||
for name, value in request.json.items():
|
||||
if hasattr(vm, name) and getattr(vm, name) != value:
|
||||
if name == "application_id":
|
||||
continue # we must ignore this to avoid overwriting the application_id allocated by the IOU manager
|
||||
continue # we must ignore this to avoid overwriting the application_id allocated by the controller
|
||||
if name == "startup_config_content" and (vm.startup_config_content and len(vm.startup_config_content) > 0):
|
||||
continue
|
||||
if name == "private_config_content" and (vm.private_config_content and len(vm.private_config_content) > 0):
|
||||
|
||||
@@ -21,8 +21,11 @@ import platform
|
||||
from gns3server.web.route import Route
|
||||
from gns3server.config import Config
|
||||
from gns3server.schemas.version import VERSION_SCHEMA
|
||||
from gns3server.schemas.server_statistics import SERVER_STATISTICS_SCHEMA
|
||||
from gns3server.compute.port_manager import PortManager
|
||||
from gns3server.version import __version__
|
||||
from aiohttp.web import HTTPConflict
|
||||
from psutil._common import bytes2human
|
||||
|
||||
|
||||
class ServerHandler:
|
||||
@@ -37,6 +40,42 @@ class ServerHandler:
|
||||
local_server = config.get_section_config("Server").getboolean("local", False)
|
||||
response.json({"version": __version__, "local": local_server})
|
||||
|
||||
@Route.get(
|
||||
r"/statistics",
|
||||
description="Retrieve server statistics",
|
||||
output=SERVER_STATISTICS_SCHEMA,
|
||||
status_codes={
|
||||
200: "Statistics information returned",
|
||||
409: "Conflict"
|
||||
})
|
||||
def statistics(request, response):
|
||||
|
||||
try:
|
||||
memory_total = psutil.virtual_memory().total
|
||||
memory_free = psutil.virtual_memory().available
|
||||
memory_used = memory_total - memory_free # actual memory usage in a cross platform fashion
|
||||
swap_total = psutil.swap_memory().total
|
||||
swap_free = psutil.swap_memory().free
|
||||
swap_used = psutil.swap_memory().used
|
||||
cpu_percent = int(psutil.cpu_percent())
|
||||
load_average_percent = [int(x / psutil.cpu_count() * 100) for x in psutil.getloadavg()]
|
||||
memory_percent = int(psutil.virtual_memory().percent)
|
||||
swap_percent = int(psutil.swap_memory().percent)
|
||||
disk_usage_percent = int(psutil.disk_usage('/').percent)
|
||||
except psutil.Error as e:
|
||||
raise HTTPConflict(text="Psutil error detected: {}".format(e))
|
||||
response.json({"memory_total": memory_total,
|
||||
"memory_free": memory_free,
|
||||
"memory_used": memory_used,
|
||||
"swap_total": swap_total,
|
||||
"swap_free": swap_free,
|
||||
"swap_used": swap_used,
|
||||
"cpu_usage_percent": cpu_percent,
|
||||
"memory_usage_percent": memory_percent,
|
||||
"swap_usage_percent": swap_percent,
|
||||
"disk_usage_percent": disk_usage_percent,
|
||||
"load_average_percent": load_average_percent})
|
||||
|
||||
@Route.get(
|
||||
r"/debug",
|
||||
description="Return debug information about the compute",
|
||||
|
||||
@@ -130,6 +130,24 @@ class ServerHandler:
|
||||
response.json(iou_license)
|
||||
response.set_status(201)
|
||||
|
||||
@Route.get(
|
||||
r"/statistics",
|
||||
description="Retrieve server statistics",
|
||||
status_codes={
|
||||
200: "Statistics information returned",
|
||||
409: "Conflict"
|
||||
})
|
||||
async def statistics(request, response):
|
||||
|
||||
compute_statistics = []
|
||||
for compute in list(Controller.instance().computes.values()):
|
||||
try:
|
||||
r = await compute.get("/statistics")
|
||||
compute_statistics.append({"compute_id": compute.id, "compute_name": compute.name, "statistics": r.json})
|
||||
except HTTPConflict as e:
|
||||
log.error("Could not retrieve statistics on compute {}: {}".format(compute.name, e.text))
|
||||
response.json(compute_statistics)
|
||||
|
||||
@Route.post(
|
||||
r"/debug",
|
||||
description="Dump debug information to disk (debug directory in config directory). Work only for local server",
|
||||
|
||||
@@ -96,7 +96,7 @@ IOU_CREATE_SCHEMA = {
|
||||
},
|
||||
},
|
||||
"additionalProperties": False,
|
||||
"required": ["name", "path"]
|
||||
"required": ["application_id", "name", "path"]
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -38,7 +38,8 @@ VARIABLES_OBJECT_SCHEMA = {
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "Variable name"
|
||||
"description": "Variable name",
|
||||
"minLength": 1
|
||||
},
|
||||
"value": {
|
||||
"type": "string",
|
||||
|
||||
@@ -64,9 +64,9 @@ QEMU_TEMPLATE_PROPERTIES = {
|
||||
"adapter_type": {
|
||||
"description": "QEMU adapter type",
|
||||
"type": "string",
|
||||
"enum": ["e1000", "i82550", "i82551", "i82557a", "i82557b", "i82557c", "i82558a","i82558b", "i82559a",
|
||||
"i82559b", "i82559c", "i82559er", "i82562", "i82801", "ne2k_pci", "pcnet", "rtl8139", "virtio",
|
||||
"virtio-net-pci", "vmxnet3"],
|
||||
"enum": ["e1000", "e1000-82544gc", "e1000-82545em", "e1000e", "i82550", "i82551", "i82557a", "i82557b", "i82557c", "i82558a",
|
||||
"i82558b", "i82559a", "i82559b", "i82559c", "i82559er", "i82562", "i82801", "ne2k_pci", "pcnet", "rocker", "rtl8139",
|
||||
"virtio", "virtio-net-pci", "vmxnet3"],
|
||||
"default": "e1000"
|
||||
},
|
||||
"mac_address": {
|
||||
@@ -115,7 +115,7 @@ QEMU_TEMPLATE_PROPERTIES = {
|
||||
},
|
||||
"hda_disk_interface": {
|
||||
"description": "QEMU hda interface",
|
||||
"enum": ["ide", "sata", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
|
||||
"enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
|
||||
"default": "ide"
|
||||
},
|
||||
"hdb_disk_image": {
|
||||
@@ -125,7 +125,7 @@ QEMU_TEMPLATE_PROPERTIES = {
|
||||
},
|
||||
"hdb_disk_interface": {
|
||||
"description": "QEMU hdb interface",
|
||||
"enum": ["ide", "sata", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
|
||||
"enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
|
||||
"default": "ide"
|
||||
},
|
||||
"hdc_disk_image": {
|
||||
@@ -135,7 +135,7 @@ QEMU_TEMPLATE_PROPERTIES = {
|
||||
},
|
||||
"hdc_disk_interface": {
|
||||
"description": "QEMU hdc interface",
|
||||
"enum": ["ide", "sata", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
|
||||
"enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
|
||||
"default": "ide"
|
||||
},
|
||||
"hdd_disk_image": {
|
||||
@@ -145,7 +145,7 @@ QEMU_TEMPLATE_PROPERTIES = {
|
||||
},
|
||||
"hdd_disk_interface": {
|
||||
"description": "QEMU hdd interface",
|
||||
"enum": ["ide", "sata", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
|
||||
"enum": ["ide", "sata", "nvme", "scsi", "sd", "mtd", "floppy", "pflash", "virtio", "none"],
|
||||
"default": "ide"
|
||||
},
|
||||
"cdrom_image": {
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2015 GNS3 Technologies Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
SERVER_STATISTICS_SCHEMA = {
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"type": "object",
|
||||
"required": ["memory_total",
|
||||
"memory_free",
|
||||
"memory_used",
|
||||
"swap_total",
|
||||
"swap_free",
|
||||
"swap_used",
|
||||
"cpu_usage_percent",
|
||||
"memory_usage_percent",
|
||||
"swap_usage_percent",
|
||||
"disk_usage_percent",
|
||||
"load_average_percent"],
|
||||
"additionalProperties": False,
|
||||
"properties": {
|
||||
"memory_total": {
|
||||
"description": "Total physical memory (exclusive swap) in bytes",
|
||||
"type": "integer",
|
||||
},
|
||||
"memory_free": {
|
||||
"description": "Free memory in bytes",
|
||||
"type": "integer",
|
||||
},
|
||||
"memory_used": {
|
||||
"description": "Memory used in bytes",
|
||||
"type": "integer",
|
||||
},
|
||||
"swap_total": {
|
||||
"description": "Total swap memory in bytes",
|
||||
"type": "integer",
|
||||
},
|
||||
"swap_free": {
|
||||
"description": "Free swap memory in bytes",
|
||||
"type": "integer",
|
||||
},
|
||||
"swap_used": {
|
||||
"description": "Swap memory used in bytes",
|
||||
"type": "integer",
|
||||
},
|
||||
"cpu_usage_percent": {
|
||||
"description": "CPU usage in percent",
|
||||
"type": "integer",
|
||||
},
|
||||
"memory_usage_percent": {
|
||||
"description": "Memory usage in percent",
|
||||
"type": "integer",
|
||||
},
|
||||
"swap_usage_percent": {
|
||||
"description": "Swap usage in percent",
|
||||
"type": "integer",
|
||||
},
|
||||
"disk_usage_percent": {
|
||||
"description": "Disk usage in percent",
|
||||
"type": "integer",
|
||||
},
|
||||
"load_average_percent": {
|
||||
"description": "Average system load over the last 1, 5 and 15 minutes",
|
||||
"type": "array",
|
||||
"items": [{"type": "integer"}],
|
||||
"minItems": 3,
|
||||
"maxItems": 3
|
||||
},
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -93,6 +93,8 @@ THE SOFTWARE.
|
||||
|
||||
@angular/material/checkbox
|
||||
|
||||
@angular/material/chips
|
||||
|
||||
@angular/material/core
|
||||
|
||||
@angular/material/dialog
|
||||
@@ -1792,8 +1794,14 @@ the License, but only in their entirety and only with respect to the Combined
|
||||
Software.
|
||||
|
||||
|
||||
ng-circle-progress
|
||||
MIT
|
||||
|
||||
ng2-file-upload
|
||||
|
||||
ngx-childprocess
|
||||
MIT
|
||||
|
||||
ngx-device-detector
|
||||
MIT
|
||||
The MIT License
|
||||
@@ -2674,30 +2682,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
|
||||
webpack
|
||||
MIT
|
||||
Copyright JS Foundation and other contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
'Software'), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
zone.js
|
||||
MIT
|
||||
The MIT License
|
||||
|
||||
@@ -33,9 +33,19 @@
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<link rel="stylesheet" href="styles.06678052914fe71fbfae.css"></head>
|
||||
<link rel="stylesheet" href="styles.b9b50fa6f0efb42b5d70.css"></head>
|
||||
<!-- <body class="mat-app-background" oncontextmenu="return false;"> -->
|
||||
<body class="mat-app-background" oncontextmenu="return false;">
|
||||
<app-root></app-root>
|
||||
<script src="runtime.3b1df53b846aa25ed7e6.js" defer></script><script src="polyfills-es5.8928d61b0c56a8998c1c.js" nomodule defer></script><script src="polyfills.b9cf08f4f6defdfd6c4f.js" defer></script><script src="main.89a8d561ddbdc1d9fa28.js" defer></script></body>
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-5D6FZL9923"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag()
|
||||
|
||||
{dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-5D6FZL9923');
|
||||
</script>
|
||||
<script src="runtime.a8ef3a8272419c2e2c66.js" defer></script><script src="polyfills-es5.adfecedb3e8b94a475d4.js" nomodule defer></script><script src="polyfills.312ad1f991887572d9bc.js" defer></script><script src="main.c31c0c40fa0fcdc2cdcf.js" defer></script></body>
|
||||
</html>
|
||||
@@ -1 +0,0 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{"+/L5":function(n,e,t){var l=t("t1UP").isCustomProperty,o=t("vd7W").TYPE,i=t("4njK").mode,r=o.Ident,a=o.Hash,u=o.Colon,s=o.Semicolon,d=o.Delim,c=33,p=35,f=36,h=38,m=42,v=43,g=47;function b(n){return this.Raw(n,i.exclamationMarkOrSemicolon,!0)}function _(n){return this.Raw(n,i.exclamationMarkOrSemicolon,!1)}function y(){var n=this.scanner.tokenIndex,e=this.Value();return"Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==s&&!1===this.scanner.isDelim(c)&&!1===this.scanner.isBalanceEdge(n)&&this.error(),e}function C(){var n=this.scanner.tokenStart;if(this.scanner.tokenType===d)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case m:case f:case v:case p:case h:this.scanner.next();break;case g:this.scanner.next(),this.scanner.isDelim(g)&&this.scanner.next()}return this.eat(this.scanner.tokenType===a?a:r),this.scanner.substrToCursor(n)}function w(){this.eat(d),this.scanner.skipSC();var n=this.consume(r);return"important"===n||n}n.exports={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var n,e=this.scanner.tokenStart,t=this.scanner.tokenIndex,o=C.call(this),i=l(o),r=i?this.parseCustomProperty:this.parseValue,a=i?_:b,d=!1;return this.scanner.skipSC(),this.eat(u),i||this.scanner.skipSC(),n=r?this.parseWithFallback(y,a):a.call(this,this.scanner.tokenIndex),this.scanner.isDelim(c)&&(d=w.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==s&&!1===this.scanner.isBalanceEdge(t)&&this.error(),{type:"Declaration",loc:this.getLocation(e,this.scanner.tokenStart),important:d,property:o,value:n}},generate:function(n){this.chunk(n.property),this.chunk(":"),this.node(n.value),n.important&&this.chunk(!0===n.important?"!important":"!"+n.important)},walkContext:"declaration"}},"+Kd2":function(n,e,t){var l=t("vd7W").TYPE,o=t("4njK").mode,i=l.Comma;n.exports=function(){var n=this.createList();return this.scanner.skipSC(),n.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===i&&(n.push(this.Operator()),n.push(this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,o.exclamationMarkOrSemicolon,!1))),n}},"+gEr":function(n,e,t){"use strict";t.d(e,"a",(function(){return r})),t.d(e,"b",(function(){return a}));var l=t("mrSG"),o=t("MGBS"),i=t("zotm"),r={leading:!0,trailing:!1};function a(n,e){return void 0===e&&(e=r),function(t){return t.lift(new u(n,e.leading,e.trailing))}}var u=function(){function n(n,e,t){this.durationSelector=n,this.leading=e,this.trailing=t}return n.prototype.call=function(n,e){return e.subscribe(new s(n,this.durationSelector,this.leading,this.trailing))},n}(),s=function(n){function e(e,t,l,o){var i=n.call(this,e)||this;return i.destination=e,i.durationSelector=t,i._leading=l,i._trailing=o,i._hasValue=!1,i}return l.c(e,n),e.prototype._next=function(n){this._hasValue=!0,this._sendValue=n,this._throttled||(this._leading?this.send():this.throttle(n))},e.prototype.send=function(){var n=this._sendValue;this._hasValue&&(this.destination.next(n),this.throttle(n)),this._hasValue=!1,this._sendValue=null},e.prototype.throttle=function(n){var e=this.tryDurationSelector(n);e&&this.add(this._throttled=Object(i.a)(this,e))},e.prototype.tryDurationSelector=function(n){try{return this.durationSelector(n)}catch(e){return this.destination.error(e),null}},e.prototype.throttlingDone=function(){var n=this._throttled,e=this._trailing;n&&n.unsubscribe(),this._throttled=null,e&&this.send()},e.prototype.notifyNext=function(n,e,t,l,o){this.throttlingDone()},e.prototype.notifyComplete=function(){this.throttlingDone()},e}(o.a)},"+ryv":function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var l=t("CcnG");e.HotkeyOptions=new l.InjectionToken("HotkeyOptions")},"+tJ4":function(n,e,t){"use strict";t.d(e,"a",(function(){return l}));var l=function(n){return function(e){for(var t=0,l=n.length;t<l&&!e.closed;t++)e.next(n[t]);e.complete()}}},"+umK":function(n,e,t){"use strict";function l(){}t.d(e,"a",(function(){return l}))},"/+5V":function(n,e){function t(n){function e(n){return null!==n&&("Type"===n.type||"Property"===n.type||"Keyword"===n.type)}var t=null;return null!==this.matched&&function l(o){if(Array.isArray(o.match)){for(var i=0;i<o.match.length;i++)if(l(o.match[i]))return e(o.syntax)&&t.unshift(o.syntax),!0}else if(o.node===n)return t=e(o.syntax)?[o.syntax]:[],!0;return!1}(this.matched),t}function l(n,e,l){var o=t.call(n,e);return null!==o&&o.some(l)}n.exports={getTrace:t,isType:function(n,e){return l(this,n,(function(n){return"Type"===n.type&&n.name===e}))},isProperty:function(n,e){return l(this,n,(function(n){return"Property"===n.type&&n.name===e}))},isKeyword:function(n){return l(this,n,(function(n){return"Keyword"===n.type}))}}},"/21U":function(n,e,t){"use strict";t.d(e,"a",(function(){return o}));var l=t("isby");function o(n){return!Object(l.a)(n)&&n-parseFloat(n)+1>=0}},"/BcF":function(n,e){n.exports={nLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{"+/L5":function(n,e,t){var l=t("t1UP").isCustomProperty,o=t("vd7W").TYPE,i=t("4njK").mode,r=o.Ident,a=o.Hash,u=o.Colon,s=o.Semicolon,d=o.Delim,c=33,p=35,f=36,h=38,m=42,v=43,g=47;function b(n){return this.Raw(n,i.exclamationMarkOrSemicolon,!0)}function _(n){return this.Raw(n,i.exclamationMarkOrSemicolon,!1)}function y(){var n=this.scanner.tokenIndex,e=this.Value();return"Raw"!==e.type&&!1===this.scanner.eof&&this.scanner.tokenType!==s&&!1===this.scanner.isDelim(c)&&!1===this.scanner.isBalanceEdge(n)&&this.error(),e}function C(){var n=this.scanner.tokenStart;if(this.scanner.tokenType===d)switch(this.scanner.source.charCodeAt(this.scanner.tokenStart)){case m:case f:case v:case p:case h:this.scanner.next();break;case g:this.scanner.next(),this.scanner.isDelim(g)&&this.scanner.next()}return this.eat(this.scanner.tokenType===a?a:r),this.scanner.substrToCursor(n)}function w(){this.eat(d),this.scanner.skipSC();var n=this.consume(r);return"important"===n||n}n.exports={name:"Declaration",structure:{important:[Boolean,String],property:String,value:["Value","Raw"]},parse:function(){var n,e=this.scanner.tokenStart,t=this.scanner.tokenIndex,o=C.call(this),i=l(o),r=i?this.parseCustomProperty:this.parseValue,a=i?_:b,d=!1;return this.scanner.skipSC(),this.eat(u),i||this.scanner.skipSC(),n=r?this.parseWithFallback(y,a):a.call(this,this.scanner.tokenIndex),this.scanner.isDelim(c)&&(d=w.call(this),this.scanner.skipSC()),!1===this.scanner.eof&&this.scanner.tokenType!==s&&!1===this.scanner.isBalanceEdge(t)&&this.error(),{type:"Declaration",loc:this.getLocation(e,this.scanner.tokenStart),important:d,property:o,value:n}},generate:function(n){this.chunk(n.property),this.chunk(":"),this.node(n.value),n.important&&this.chunk(!0===n.important?"!important":"!"+n.important)},walkContext:"declaration"}},"+Kd2":function(n,e,t){var l=t("vd7W").TYPE,o=t("4njK").mode,i=l.Comma;n.exports=function(){var n=this.createList();return this.scanner.skipSC(),n.push(this.Identifier()),this.scanner.skipSC(),this.scanner.tokenType===i&&(n.push(this.Operator()),n.push(this.parseCustomProperty?this.Value(null):this.Raw(this.scanner.tokenIndex,o.exclamationMarkOrSemicolon,!1))),n}},"+gEr":function(n,e,t){"use strict";t.d(e,"a",(function(){return r})),t.d(e,"b",(function(){return a}));var l=t("mrSG"),o=t("MGBS"),i=t("zotm"),r={leading:!0,trailing:!1};function a(n,e){return void 0===e&&(e=r),function(t){return t.lift(new u(n,e.leading,e.trailing))}}var u=function(){function n(n,e,t){this.durationSelector=n,this.leading=e,this.trailing=t}return n.prototype.call=function(n,e){return e.subscribe(new s(n,this.durationSelector,this.leading,this.trailing))},n}(),s=function(n){function e(e,t,l,o){var i=n.call(this,e)||this;return i.destination=e,i.durationSelector=t,i._leading=l,i._trailing=o,i._hasValue=!1,i}return l.c(e,n),e.prototype._next=function(n){this._hasValue=!0,this._sendValue=n,this._throttled||(this._leading?this.send():this.throttle(n))},e.prototype.send=function(){var n=this._sendValue;this._hasValue&&(this.destination.next(n),this.throttle(n)),this._hasValue=!1,this._sendValue=null},e.prototype.throttle=function(n){var e=this.tryDurationSelector(n);e&&this.add(this._throttled=Object(i.a)(this,e))},e.prototype.tryDurationSelector=function(n){try{return this.durationSelector(n)}catch(e){return this.destination.error(e),null}},e.prototype.throttlingDone=function(){var n=this._throttled,e=this._trailing;n&&n.unsubscribe(),this._throttled=null,e&&this.send()},e.prototype.notifyNext=function(n,e,t,l,o){this.throttlingDone()},e.prototype.notifyComplete=function(){this.throttlingDone()},e}(o.a)},"+ryv":function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var l=t("CcnG");e.HotkeyOptions=new l.InjectionToken("HotkeyOptions")},"+tJ4":function(n,e,t){"use strict";t.d(e,"a",(function(){return l}));var l=function(n){return function(e){for(var t=0,l=n.length;t<l&&!e.closed;t++)e.next(n[t]);e.complete()}}},"+umK":function(n,e,t){"use strict";function l(){}t.d(e,"a",(function(){return l}))},"/+5V":function(n,e){function t(n){function e(n){return null!==n&&("Type"===n.type||"Property"===n.type||"Keyword"===n.type)}var t=null;return null!==this.matched&&function l(o){if(Array.isArray(o.match)){for(var i=0;i<o.match.length;i++)if(l(o.match[i]))return e(o.syntax)&&t.unshift(o.syntax),!0}else if(o.node===n)return t=e(o.syntax)?[o.syntax]:[],!0;return!1}(this.matched),t}function l(n,e,l){var o=t.call(n,e);return null!==o&&o.some(l)}n.exports={getTrace:t,isType:function(n,e){return l(this,n,(function(n){return"Type"===n.type&&n.name===e}))},isProperty:function(n,e){return l(this,n,(function(n){return"Property"===n.type&&n.name===e}))},isKeyword:function(n){return l(this,n,(function(n){return"Keyword"===n.type}))}}},"/21U":function(n,e,t){"use strict";t.d(e,"a",(function(){return o}));var l=t("isby");function o(n){return!Object(l.a)(n)&&n-parseFloat(n)+1>=0}},"/BcF":function(n,e){n.exports={nLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["./node_modules/css-tree/lib/syntax/node/Declaration.js","./node_modules/css-tree/lib/syntax/function/var.js","./node_modules/rxjs/_esm5/internal/operators/throttle.js.pre-build-optimizer.js","./node_modules/angular2-hotkeys/src/hotkey.options.js","./node_modules/rxjs/_esm5/internal/util/subscribeToArray.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/util/noop.js.pre-build-optimizer.js","./node_modules/css-tree/lib/lexer/trace.js","./node_modules/rxjs/_esm5/internal/util/isNumeric.js.pre-build-optimizer.js","./node_modules/css-tree/lib/syntax/node/Selector.js","./node_modules/rxjs/_esm5/internal/operators/withLatestFrom.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/util/isPromise.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/sampleTime.js.pre-build-optimizer.js","./node_modules/css-tree/lib/lexer/generic-an-plus-b.js","./node_modules/rxjs/_esm5/internal/observable/from.js.pre-build-optimizer.js","./node_modules/css-tree/lib/syntax/node/Value.js","./node_modules/rxjs/_esm5/internal/operators/skipUntil.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/skip.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/timeout.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/skipLast.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/switchMap.js.pre-build-optimizer.js","./node_modules/css-tree/lib/common/SyntaxError.js","./node_modules/rxjs/_esm5/internal/util/canReportError.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/BehaviorSubject.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/util/isFunction.js.pre-build-optimizer.js","./node_modules/css-tree/lib/syntax/node/AttributeSelector.js","./node_modules/css-tree/lib/lexer/generic-urange.js","./node_modules/rxjs/_esm5/internal/operators/finalize.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/util/isArrayLike.js.pre-build-optimizer.js","./node_modules/css-tree/lib/syntax/pseudo/common/selectorList.js","./node_modules/raven-js/vendor/md5/md5.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/exhaust.js.pre-build-optimizer.js","./node_modules/css-tree/lib/syntax/node/MediaQuery.js","./node_modules/rxjs/_esm5/internal/operators/publishBehavior.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/util/TimeoutError.js.pre-build-optimizer.js","./node_modules/css-tree/lib/tokenizer/char-code-definitions.js","./node_modules/rxjs/_esm5/internal/util/EmptyError.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/dematerialize.js.pre-build-optimizer.js","./node_modules/css-tree/lib/walker/create.js","./node_modules/raven-js/vendor/TraceKit/tracekit.js.pre-build-optimizer.js","./node_modules/uuid/lib/rng-browser.js","./node_modules/css-tree/lib/syntax/node/Raw.js","./node_modules/css-tree/lib/syntax/node/index.js","./node_modules/rxjs/_esm5/internal/operators/timestamp.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/retry.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/Notification.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/map.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/count.js.pre-build-optimizer.js","./node_modules/css-tree/lib/syntax/node/StyleSheet.js","./node_modules/rxjs/_esm5/internal/operators/exhaustMap.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/Observer.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/Observable.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/util/toSubscriber.js.pre-build-optimizer.js","./node_modules/css-tree/lib/syntax/atrule/index.js","./node_modules/rxjs/_esm5/internal/operators/timeInterval.js.pre-build-optimizer.js","./node_modules/create-point-cb/dist/bundle.js","./node_modules/css-tree/lib/syntax/scope/default.js","./node_modules/rxjs/_esm5/internal/observable/using.js.pre-build-optimizer.js","./node_modules/css-tree/lib/syntax/scope/index.js","./node_modules/css-tree/lib/syntax/config/mix.js","./node_modules/rxjs/_esm5/internal/util/ObjectUnsubscribedError.js.pre-build-optimizer.js","./node_modules/css-tree/lib/syntax/node/Combinator.js","./node_modules/css-tree/lib/common/TokenStream.js","./node_modules/rxjs/_esm5/internal/observable/zip.js.pre-build-optimizer.js","./node_modules/css-tree/lib/syntax/node/HexColor.js","./node_modules/rxjs/_esm5/internal/operators/catchError.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/observable/SubscribeOnObservable.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/subscribeOn.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/throttleTime.js.pre-build-optimizer.js","./node_modules/raven-js/src/console.js.pre-build-optimizer.js","./node_modules/rxjs/_esm5/internal/operators/takeLast.js.pre-build-optimizer.js","./node_modules/css-tree/Line truncated
|
||||
@@ -1 +0,0 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{"+5Eg":function(t,e,n){var r=n("wA6s"),o=n("6XUM"),i=n("M7Xk").onFreeze,a=n("cZY6"),c=n("rG8t"),u=Object.seal;r({target:"Object",stat:!0,forced:c((function(){u(1)})),sham:!a},{seal:function(t){return u&&o(t)?u(i(t)):t}})},"+IJR":function(t,e,n){n("wA6s")({target:"Number",stat:!0},{isNaN:function(t){return t!=t}})},"/AsP":function(t,e,n){var r=n("yIiL"),o=n("SDMg"),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},"/Ybd":function(t,e,n){var r=n("T69T"),o=n("XdSI"),i=n("F26l"),a=n("LdO1"),c=Object.defineProperty;e.f=r?c:function(t,e,n){if(i(t),e=a(e,!0),i(n),o)try{return c(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},"0Ds2":function(t,e,n){var r=n("m41k")("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,"/./"[t](e)}catch(o){}}return!1}},"0luR":function(t,e,n){"use strict";var r=n("wA6s"),o=n("T69T"),i=n("ocAm"),a=n("OG5q"),c=n("6XUM"),u=n("/Ybd").f,s=n("NIlc"),f=i.Symbol;if(o&&"function"==typeof f&&(!("description"in f.prototype)||void 0!==f().description)){var l={},p=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),e=this instanceof p?new f(t):void 0===t?f():f(t);return""===t&&(l[e]=!0),e};s(p,f);var h=p.prototype=f.prototype;h.constructor=p;var v=h.toString,d="Symbol(test)"==String(f("test")),g=/^Symbol\((.*)\)[^)]+$/;u(h,"description",{configurable:!0,get:function(){var t=c(this)?this.valueOf():this,e=v.call(t);if(a(l,t))return"";var n=d?e.slice(7,-1):e.replace(g,"$1");return""===n?void 0:n}}),r({global:!0,forced:!0},{Symbol:p})}},1:function(t,e,n){n("mRIq"),t.exports=n("hN/g")},"149L":function(t,e,n){var r=n("Ew/G");t.exports=r("document","documentElement")},"1p6F":function(t,e,n){var r=n("6XUM"),o=n("ezU2"),i=n("m41k")("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==o(t))}},"2MGJ":function(t,e,n){var r=n("ocAm"),o=n("yIiL"),i=n("HEFl"),a=n("OG5q"),c=n("Fqhe"),u=n("uxAC"),s=n("XH/I"),f=s.get,l=s.enforce,p=String(u).split("toString");o("inspectSource",(function(t){return u.call(t)})),(t.exports=function(t,e,n,o){var u=!!o&&!!o.unsafe,s=!!o&&!!o.enumerable,f=!!o&&!!o.noTargetGet;"function"==typeof n&&("string"!=typeof e||a(n,"name")||i(n,"name",e),l(n).source=p.join("string"==typeof e?e:"")),t!==r?(u?!f&&t[e]&&(s=!0):delete t[e],s?t[e]=n:i(t,e,n)):s?t[e]=n:c(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&f(this).source||u.call(this)}))},"2RDa":function(t,e,n){var r=n("F26l"),o=n("5y2d"),i=n("aAjO"),a=n("yQMY"),c=n("149L"),u=n("qx7X"),s=n("/AsP")("IE_PROTO"),f=function(){},l=function(){var t,e=u("iframe"),n=i.length;for(e.style.display="none",c.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write("<script>document.F=Object<\/script>"),t.close(),l=t.F;n--;)delete l.prototype[i[n]];return l()};t.exports=Object.create||function(t,e){var n;return null!==t?(f.prototype=r(t),n=new f,f.prototype=null,n[s]=t):n=l(),void 0===e?n:o(n,e)},a[s]=!0},"3caY":function(t,e,n){var r=n("wA6s"),o=Math.asinh,i=Math.log,a=Math.sqrt;r({target:"Math",stat:!0,forced:!(o&&1/o(0)>0)},{asinh:function t(e){return isFinite(e=+e)&&0!=e?e<0?-t(-e):i(e+a(e*e+1)):e}})},"3vMK":function(t,e,n){"use strict";var r=n("6XUM"),o=n("/Ybd"),i=n("wIVT"),a=n("m41k")("hasInstance"),c=Function.prototype;a in c||o.f(c,a,{value:function(t){if("function"!=typeof this||!r(t))return!1;if(!r(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})},"3xQm":function(t,e,n){var r,o,i,a,c,u,s,f,l=n("ocAm"),p=n("7gGY").f,h=n("ezU2"),v=n("Ox9q").set,d=n("4U6Q"),g=l.MutationObserver||l.WebKitMutationObserver,y=l.process,m=l.Promise,b="process"==h(y),w=p(l,"queueMicrotask"),k=w&&w.value;k||(r=function(){var t,e;for(b&&(t=y.domain)&&t.exit();o;){e=o.fn,o=o.next;try{e()}catch(n){throw o?a():i=void 0,n}}i=void 0,t&&t.enter()},b?a=function(){y.nextTick(r)}:g&&!/(iphone|ipod|ipad).*applewebkit/i.test(d)?(c=!0,u=document.createTextNode(""),new g(r).observe(u,{characterData:!0}),a=function(){u.data=c=!c}):m&&m.resolve?(s=m.resolve(void 0),f=s.then,a=function(){f.call(s,r)}):a=function(){v.call(l,r)}),t.exports=k||function(t){var e={fn:t,next:void 0};i&&(i.next=e),o||(o=e,a()),i=e}},"48xZ":function(t,e,n){var r=n("n/2t"),o=Math.abs,i=Math.pow,a=i(2,-52),c=i(2,-23),u=i(2,127)*(2-c),s=i(2,-126);t.exports=Math.fround||function(t){var e,n,i=o(t),f=r(t);return i<s?f*(i/s/c+1/a-1/a)*s*c:(n=(e=(1+c/a)*i)-(e-i))>u||n!=n?f*(1/0):f*n}},"4GtL":function(t,e,n){"use strict";var r=n("VCQ8"),o=n("7Oj1"),i=n("xpLY"),a=Math.min;t.exports=[].copyWithin||function(t,e){var n=r(this),c=i(n.length),u=o(t,c),s=o(e,c),f=arguments.length>2?arguments[2]:void 0,l=a((void 0===f?c:o(f,c))-s,c-u),p=1;for(s<u&&u<s+l&&(p=-1,s+=l-1,u+=l-1);l-- >0;)s in n?n[u]=n[s]:delete n[u],u+=p,s+=p;return n}},"4Kt7":function(t,e,n){"use strict";var r=n("wA6s"),o=n("Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{"+5Eg":function(t,e,n){var r=n("wA6s"),o=n("6XUM"),i=n("M7Xk").onFreeze,a=n("cZY6"),c=n("rG8t"),u=Object.seal;r({target:"Object",stat:!0,forced:c((function(){u(1)})),sham:!a},{seal:function(t){return u&&o(t)?u(i(t)):t}})},"+IJR":function(t,e,n){n("wA6s")({target:"Number",stat:!0},{isNaN:function(t){return t!=t}})},"/AsP":function(t,e,n){var r=n("yIiL"),o=n("SDMg"),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},"/Ybd":function(t,e,n){var r=n("T69T"),o=n("XdSI"),i=n("F26l"),a=n("LdO1"),c=Object.defineProperty;e.f=r?c:function(t,e,n){if(i(t),e=a(e,!0),i(n),o)try{return c(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},"0Ds2":function(t,e,n){var r=n("m41k")("match");t.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,"/./"[t](e)}catch(o){}}return!1}},"0TWp":function(t,e,n){var r,o,i=this&&this.__values||function(t){var e="function"==typeof Symbol&&t[Symbol.iterator],n=0;return e?e.call(t):{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}}};void 0===(o="function"==typeof(r=function(){"use strict";!function(t){var e=t.performance;function n(t){e&&e.mark&&e.mark(t)}function r(t,n){e&&e.measure&&e.measure(t,n)}n("Zone");var o=t.__Zone_symbol_prefix||"__zone_symbol__";function i(t){return o+t}var a=!0===t[i("forceDuplicateZoneCheck")];if(t.Zone){if(a||"function"!=typeof t.Zone.__symbol__)throw new Error("Zone already loaded.");return t.Zone}var c=function(){function e(t,e){this._parent=t,this._name=e?e.name||"unnamed":"<root>",this._properties=e&&e.properties||{},this._zoneDelegate=new f(this,this._parent&&this._parent._zoneDelegate,e)}return e.assertZonePatched=function(){if(t.Promise!==M.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(e,"root",{get:function(){for(var t=e.current;t.parent;)t=t.parent;return t},enumerable:!0,configurable:!0}),Object.defineProperty(e,"current",{get:function(){return P.zone},enumerable:!0,configurable:!0}),Object.defineProperty(e,"currentTask",{get:function(){return I},enumerable:!0,configurable:!0}),e.__load_patch=function(o,i){if(M.hasOwnProperty(o)){if(a)throw Error("Already loaded patch: "+o)}else if(!t["__Zone_disable_"+o]){var c="Zone:"+o;n(c),M[o]=i(t,e,j),r(c,c)}},Object.defineProperty(e.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),e.prototype.get=function(t){var e=this.getZoneWith(t);if(e)return e._properties[t]},e.prototype.getZoneWith=function(t){for(var e=this;e;){if(e._properties.hasOwnProperty(t))return e;e=e._parent}return null},e.prototype.fork=function(t){if(!t)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,t)},e.prototype.wrap=function(t,e){if("function"!=typeof t)throw new Error("Expecting function got: "+t);var n=this._zoneDelegate.intercept(this,t,e),r=this;return function(){return r.runGuarded(n,this,arguments,e)}},e.prototype.run=function(t,e,n,r){P={parent:P,zone:this};try{return this._zoneDelegate.invoke(this,t,e,n,r)}finally{P=P.parent}},e.prototype.runGuarded=function(t,e,n,r){void 0===e&&(e=null),P={parent:P,zone:this};try{try{return this._zoneDelegate.invoke(this,t,e,n,r)}catch(o){if(this._zoneDelegate.handleError(this,o))throw o}}finally{P=P.parent}},e.prototype.runTask=function(t,e,n){if(t.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(t.zone||b).name+"; Execution: "+this.name+")");if(t.state!==k||t.type!==A&&t.type!==O){var r=t.state!=E;r&&t._transitionTo(E,x),t.runCount++;var o=I;I=t,P={parent:P,zone:this};try{t.type==O&&t.data&&!t.data.isPeriodic&&(t.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,t,e,n)}catch(i){if(this._zoneDelegate.handleError(this,i))throw i}}finally{t.state!==k&&t.state!==_&&(t.type==A||t.data&&t.data.isPeriodic?r&&t._transitionTo(x,E):(t.runCount=0,this._updateTaskCount(t,-1),r&&t._transitionTo(k,E,k))),P=P.parent,I=o}}},e.prototype.scheduleTask=function(t){if(t.zone&&t.zone!==this)for(var e=this;e;){if(e===t.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+t.zone.name);e=e.parent}t._transitionTo(w,k);var n=[];t._zoneDelegates=n,t._zone=this;try{t=this._zoneDelegate.scheduleTask(this,t)}catch(r){throw t._transitionTo(_,w,k),this._zoneDelegate.handleError(this,r),r}return t._zoneDelegates===n&&this._updateTaskCount(t,1),t.state==w&&t._transitionTo(x,w),t},e.prototype.scheduleMicroTask=function(t,e,n,r){return this.scheduleTask(new l(T,t,e,n,r,void 0))},e.protoLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.seal.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-nan.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/shared-key.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-property.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/correct-is-regexp-logic.js","./node_modules/zone.js/dist/zone.js.pre-build-optimizer.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.symbol.description.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/html.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-regexp.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-create.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.asinh.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.function.has-instance.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/microtask.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/math-fround.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/array-copy-within.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.sub.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/user-agent.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.blink.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-array-iterator-method.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.parse-float.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-define-properties.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.parse-int.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.find.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/is-object.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.sort.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.index-of.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.log2.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.slice.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-set-prototype-of.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/own-keys.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/to-absolute-index.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/promise-resolve.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/object-get-own-property-descriptor.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.symbol.search.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.symbol.unscopables.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.json.to-string-tag.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/redefine-all.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.atanh.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.to-fixed.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.date.now.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/define-well-known-symbol.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/forced-string-html-method.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.symbol.to-primitive.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/internals/add-to-unscopables.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.object.get-prototype-of.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.parse-float.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.string.repeat.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.array.of.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.math.sign.js","./node_modules/@angular-devkit/build-angular/node_modules/core-js/modules/es.number.is-integer.js","./node_modules/@angular-devkit/build-angular/node_moLine truncated
|
||||
@@ -0,0 +1 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{"0TWp":function(e,t,n){var r,o,a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;return t?t.call(e):{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}};void 0===(o="function"==typeof(r=function(){"use strict";!function(e){var t=e.performance;function n(e){t&&t.mark&&t.mark(e)}function r(e,n){t&&t.measure&&t.measure(e,n)}n("Zone");var o=e.__Zone_symbol_prefix||"__zone_symbol__";function a(e){return o+e}var i=!0===e[a("forceDuplicateZoneCheck")];if(e.Zone){if(i||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}var c=function(){function t(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new u(this,this._parent&&this._parent._zoneDelegate,t)}return t.assertZonePatched=function(){if(e.Promise!==D.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(t,"root",{get:function(){for(var e=t.current;e.parent;)e=e.parent;return e},enumerable:!0,configurable:!0}),Object.defineProperty(t,"current",{get:function(){return C.zone},enumerable:!0,configurable:!0}),Object.defineProperty(t,"currentTask",{get:function(){return z},enumerable:!0,configurable:!0}),t.__load_patch=function(o,a){if(D.hasOwnProperty(o)){if(i)throw Error("Already loaded patch: "+o)}else if(!e["__Zone_disable_"+o]){var c="Zone:"+o;n(c),D[o]=a(e,t,j),r(c,c)}},Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),t.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},t.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},t.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},t.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},t.prototype.run=function(e,t,n,r){C={parent:C,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{C=C.parent}},t.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),C={parent:C,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(o){if(this._zoneDelegate.handleError(this,o))throw o}}finally{C=C.parent}},t.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||m).name+"; Execution: "+this.name+")");if(e.state!==b||e.type!==Z&&e.type!==P){var r=e.state!=E;r&&e._transitionTo(E,T),e.runCount++;var o=z;z=e,C={parent:C,zone:this};try{e.type==P&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(a){if(this._zoneDelegate.handleError(this,a))throw a}}finally{e.state!==b&&e.state!==S&&(e.type==Z||e.data&&e.data.isPeriodic?r&&e._transitionTo(T,E):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(b,E,b))),C=C.parent,z=o}}},t.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+e.zone.name);t=t.parent}e._transitionTo(k,b);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(r){throw e._transitionTo(S,k,b),this._zoneDelegate.handleError(this,r),r}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==k&&e._transitionTo(T,k),e},t.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new f(O,e,t,n,r,void 0))},t.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new f(P,e,t,n,r,o))},t.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new f(Z,e,t,n,r,o))},t.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||m).name+"; Execution: "+this.name+")");e._transitionTo(w,T,E);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(S,w),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(b,w),e.runCount=0,e},t.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},t}();c.__symbol__=a;var s,l={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.Line truncated
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["./node_modules/zone.js/dist/zone.js.pre-build-optimizer.js","./src/polyfills.ts"],"names":["__values","this","o","m","Symbol","iterator","i","call","next","length","value","done","global","performance","mark","name","performanceMeasure","label","symbolPrefix","__symbol__","checkDuplicate","Error","Zone","parent","zoneSpec","_parent","_name","_properties","properties","_zoneDelegate","ZoneDelegate","assertZonePatched","patches","Object","defineProperty","get","zone","current","enumerable","configurable","_currentZoneFrame","_currentTask","__load_patch","fn","hasOwnProperty","perfName","_api","prototype","key","getZoneWith","fork","wrap","callback","source","_callback","intercept","runGuarded","arguments","run","applyThis","applyArgs","invoke","error","handleError","runTask","task","NO_ZONE","state","notScheduled","type","eventTask","macroTask","reEntryGuard","running","_transitionTo","scheduled","runCount","previousTask","data","isPeriodic","cancelFn","undefined","invokeTask","unknown","_updateTaskCount","scheduleTask","newZone","scheduling","zoneDelegates","_zoneDelegates","_zone","err","scheduleMicroTask","customSchedule","ZoneTask","microTask","scheduleMacroTask","customCancel","scheduleEventTask","cancelTask","canceling","count","nativeMicroTaskQueuePromise","DELEGATE_ZS","onHasTask","delegate","_","target","hasTaskState","hasTask","onScheduleTask","onInvokeTask","onCancelTask","parentDelegate","_taskCounts","_parentDelegate","_forkZS","onFork","_forkDlgt","_forkCurrZone","_interceptZS","onIntercept","_interceptDlgt","_interceptCurrZone","_invokeZS","onInvoke","_invokeDlgt","_invokeCurrZone","_handleErrorZS","onHandleError","_handleErrorDlgt","_handleErrorCurrZone","_scheduleTaskZS","_scheduleTaskDlgt","_scheduleTaskCurrZone","_invokeTaskZS","_invokeTaskDlgt","_invokeTaskCurrZone","_cancelTaskZS","_cancelTaskDlgt","_cancelTaskCurrZone","_hasTaskZS","_hasTaskDlgt","_hasTaskDlgtOwner","_hasTaskCurrZone","zoneSpecHasTask","targetZone","apply","returnTask","push","scheduleFn","isEmpty","counts","prev","change","options","_state","self","useG","args","_numberOfNestedTaskFrames","drainMicroTaskQueue","cancelScheduleRequest","toState","fromState1","fromState2","toString","handleId","toJSON","symbolSetTimeout","symbolPromise","symbolThen","_microTaskQueue","_isDrainingMicrotaskQueue","resolve","nativeThen","queue","onUnhandledError","microtaskDrainDone","symbol","currentZoneFrame","noop","showUncaughtError","patchEventTarget","patchOnProperties","patchMethod","bindArguments","patchThen","patchMacroTask","setNativePromise","NativePromise","patchEventPrototype","isIEOrEdge","getGlobalObjects","ObjectDefineProperty","ObjectGetOwnPropertyDescriptor","ObjectCreate","ArraySlice","patchClass","wrapWithCurrentZone","filterProperties","attachOriginToPatched","_redefineProperty","patchCallbacks","window","api","getOwnPropertyDescriptor","_uncaughtPromiseErrors","creationTrace","e","rejection","console","message","stack","_loop_1","uncaughtPromiseError","shift","handleUnhandledRejection","UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL","handler","isThenable","then","forwardResolution","forwardRejection","ZoneAwarePromise","reject","symbolState","symbolValue","symbolFinally","symbolParentPromiseValue","symbolParentPromiseState","UNRESOLVED","RESOLVED","REJECTED","REJECTED_NO_CATCH","makeResolver","promise","v","resolvePromise","once","wasCalled","wrappedFunction","TYPE_ERROR","CURRENT_TASK_TRACE_SYMBOL","obj","onceWrapper","TypeError","clearRejectedNoCatch","trace","currentTask","writable","scheduleResolveOrReject","constructor","JSON","stringify","REJECTION_HANDLED_HANDLER","splice","chainPromise","onFulfilled","onRejected","promiseState","parentPromiseValue","isFinallyPromise","executor","race","values","e_1","_a","res","rej","onResolve","onReject","values_1","values_1_1","e_1_1","return","all","allWithCallback","allSettled","thenCallback","status","errorCallback","reason","e_2","unresolvedCount","valueIndex","resolvedValues","_loop_2","this_1","curValueIndex","thenErr","values_2","values_2_1","e_2_1","toStringTag","catch","finally","onFinally","ZONE_AWARE_PROMISE","desc","set","NewNativePromise","symbolThenPatched","Ctor","proto","prop","originalThen","_this","fetch_1","resultPromise","ctor","Promise","ObjectGetPrototypeOf","getPrototypeOf","create","Array","slice","ADD_EVENT_LISTENER_STR","REMOVE_EVENT_LISTENER_STR","ZONE_SYMBOL_ADD_EVENT_LISTENER","ZONE_SYMBOL_REMOVE_EVENT_LISTENER","TRUE_STR","FALSE_STR","ZONE_SYMBOL_PREFIX","scheduleMacroTaskWithCurrentZone","zoneSymbol","isWindowExists","internalWindow","_global","REMOVE_ATTRIBUTE","NULL_ON_PROP_VALUE","isPropertyWritable","propertyDesc","isWebWorker","WorkerGlobalScope","isNode","process","isBrowser","isMix","zoneSymbolEventNames","wrapFn","event","eventNameSymbol","result","listener","errorEvent","filename","lineno","colno","preventDefault","patchProperty","onPropPatchedSymbol","originalDescGet","originalDescSet","eventName","substr","newValuLine truncated
|
||||
@@ -1 +0,0 @@
|
||||
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{2:function(e,t,n){e.exports=n("hN/g")},PDX0:function(e,t){(function(t){e.exports=t}).call(this,{})},"hN/g":function(e,t,n){"use strict";n.r(t);var r,o=n("mrSG");r=function(){!function(e){var t=e.performance;function n(e){t&&t.mark&&t.mark(e)}function r(e,n){t&&t.measure&&t.measure(e,n)}n("Zone");var o=e.__Zone_symbol_prefix||"__zone_symbol__";function a(e){return o+e}var i=!0===e[a("forceDuplicateZoneCheck")];if(e.Zone){if(i||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}var c=function(){function t(e,t){this._parent=e,this._name=t?t.name||"unnamed":"<root>",this._properties=t&&t.properties||{},this._zoneDelegate=new l(this,this._parent&&this._parent._zoneDelegate,t)}return t.assertZonePatched=function(){if(e.Promise!==D.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")},Object.defineProperty(t,"root",{get:function(){for(var e=t.current;e.parent;)e=e.parent;return e},enumerable:!0,configurable:!0}),Object.defineProperty(t,"current",{get:function(){return C.zone},enumerable:!0,configurable:!0}),Object.defineProperty(t,"currentTask",{get:function(){return z},enumerable:!0,configurable:!0}),t.__load_patch=function(o,a){if(D.hasOwnProperty(o)){if(i)throw Error("Already loaded patch: "+o)}else if(!e["__Zone_disable_"+o]){var c="Zone:"+o;n(c),D[o]=a(e,t,j),r(c,c)}},Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!0,configurable:!0}),t.prototype.get=function(e){var t=this.getZoneWith(e);if(t)return t._properties[e]},t.prototype.getZoneWith=function(e){for(var t=this;t;){if(t._properties.hasOwnProperty(e))return t;t=t._parent}return null},t.prototype.fork=function(e){if(!e)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,e)},t.prototype.wrap=function(e,t){if("function"!=typeof e)throw new Error("Expecting function got: "+e);var n=this._zoneDelegate.intercept(this,e,t),r=this;return function(){return r.runGuarded(n,this,arguments,t)}},t.prototype.run=function(e,t,n,r){C={parent:C,zone:this};try{return this._zoneDelegate.invoke(this,e,t,n,r)}finally{C=C.parent}},t.prototype.runGuarded=function(e,t,n,r){void 0===t&&(t=null),C={parent:C,zone:this};try{try{return this._zoneDelegate.invoke(this,e,t,n,r)}catch(o){if(this._zoneDelegate.handleError(this,o))throw o}}finally{C=C.parent}},t.prototype.runTask=function(e,t,n){if(e.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(e.zone||_).name+"; Execution: "+this.name+")");if(e.state!==m||e.type!==Z&&e.type!==P){var r=e.state!=E;r&&e._transitionTo(E,T),e.runCount++;var o=z;z=e,C={parent:C,zone:this};try{e.type==P&&e.data&&!e.data.isPeriodic&&(e.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,e,t,n)}catch(a){if(this._zoneDelegate.handleError(this,a))throw a}}finally{e.state!==m&&e.state!==S&&(e.type==Z||e.data&&e.data.isPeriodic?r&&e._transitionTo(T,E):(e.runCount=0,this._updateTaskCount(e,-1),r&&e._transitionTo(m,E,m))),C=C.parent,z=o}}},t.prototype.scheduleTask=function(e){if(e.zone&&e.zone!==this)for(var t=this;t;){if(t===e.zone)throw Error("can not reschedule task to "+this.name+" which is descendants of the original zone "+e.zone.name);t=t.parent}e._transitionTo(k,m);var n=[];e._zoneDelegates=n,e._zone=this;try{e=this._zoneDelegate.scheduleTask(this,e)}catch(r){throw e._transitionTo(S,k,m),this._zoneDelegate.handleError(this,r),r}return e._zoneDelegates===n&&this._updateTaskCount(e,1),e.state==k&&e._transitionTo(T,k),e},t.prototype.scheduleMicroTask=function(e,t,n,r){return this.scheduleTask(new f(O,e,t,n,r,void 0))},t.prototype.scheduleMacroTask=function(e,t,n,r,o){return this.scheduleTask(new f(P,e,t,n,r,o))},t.prototype.scheduleEventTask=function(e,t,n,r,o){return this.scheduleTask(new f(Z,e,t,n,r,o))},t.prototype.cancelTask=function(e){if(e.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(e.zone||_).name+"; Execution: "+this.name+")");e._transitionTo(w,T,E);try{this._zoneDelegate.cancelTask(this,e)}catch(t){throw e._transitionTo(S,w),this._zoneDelegate.handleError(this,t),t}return this._updateTaskCount(e,-1),e._transitionTo(m,w),e.runCount=0,e},t.prototype._updateTaskCount=function(e,t){var n=e._zoneDelegates;-1==t&&(e._zoneDelegates=null);for(var r=0;r<n.length;r++)n[r]._updateTaskCount(e.type,t)},t}();c.__symbol__=a;var s,u={name:"",onHasTask:function(e,t,n,r){return e.hasTask(n,r)},onScheduleTask:function(e,t,n,r){return e.scheduleTask(n,r)},onInvokeTask:function(e,t,n,r,o,a){return e.invokeTask(n,r,o,a)},onCancelTask:functioLine truncated
|
||||
File renamed without changes.
@@ -0,0 +1 @@
|
||||
{"version":3,"sources":["webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","splice","__webpack_require__","s","installedModules","0","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAKlC,IAFGe,GAAqBA,EAAoBhB,GAEtCO,EAASC,QACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,IAER,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAEX,IAA3BX,EADSS,EAAeE,MACMD,GAAY,GAE3CA,IACFL,EAAgBO,OAAOnB,IAAK,GAC5Be,EAASK,EAAoBA,EAAoBC,EAAIL,EAAe,KAItE,OAAOD,EAIR,IAAIO,EAAmB,GAKnBf,EAAkB,CACrBgB,EAAG,GAGAX,EAAkB,GAGtB,SAASQ,EAAoBzB,GAG5B,GAAG2B,EAAiB3B,GACnB,OAAO2B,EAAiB3B,GAAU6B,QAGnC,IAAIC,EAASH,EAAiB3B,GAAY,CACzCK,EAAGL,EACH+B,GAAG,EACHF,QAAS,IAUV,OANAf,EAAQd,GAAUW,KAAKmB,EAAOD,QAASC,EAAQA,EAAOD,QAASJ,GAG/DK,EAAOC,GAAI,EAGJD,EAAOD,QAKfJ,EAAoBO,EAAIlB,EAGxBW,EAAoBQ,EAAIN,EAGxBF,EAAoBS,EAAI,SAASL,EAASM,EAAMC,GAC3CX,EAAoBY,EAAER,EAASM,IAClC3B,OAAO8B,eAAeT,EAASM,EAAM,CAAEI,YAAY,EAAMC,IAAKJ,KAKhEX,EAAoBgB,EAAI,SAASZ,GACX,oBAAXa,QAA0BA,OAAOC,aAC1CnC,OAAO8B,eAAeT,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DpC,OAAO8B,eAAeT,EAAS,aAAc,CAAEe,OAAO,KAQvDnB,EAAoBoB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQnB,EAAoBmB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKxC,OAAOyC,OAAO,MAGvB,GAFAxB,EAAoBgB,EAAEO,GACtBxC,OAAO8B,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOnB,EAAoBS,EAAEc,EAAIE,GAAK,SAASA,GAAO,OAAON,EAAMM,KAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRvB,EAAoB2B,EAAI,SAAStB,GAChC,IAAIM,EAASN,GAAUA,EAAOiB,WAC7B,WAAwB,OAAOjB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAL,EAAoBS,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRX,EAAoBY,EAAI,SAASgB,EAAQC,GAAY,OAAO9C,OAAOC,UAAUC,eAAeC,KAAK0C,EAAQC,IAGzG7B,EAAoB8B,EAAI,GAExB,IAAIC,EAAaC,OAAqB,aAAIA,OAAqB,cAAK,GAChEC,EAAmBF,EAAW3C,KAAKsC,KAAKK,GAC5CA,EAAW3C,KAAOf,EAClB0D,EAAaA,EAAWG,QACxB,IAAI,IAAItD,EAAI,EAAGA,EAAImD,EAAWjD,OAAQF,IAAKP,EAAqB0D,EAAWnD,IAC3E,IAAIU,EAAsB2C,EAI1BvC,I","file":"runtime.a8ef3a8272419c2e2c66.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction _Line truncated
|
||||
@@ -1,6 +0,0 @@
|
||||
/*!
|
||||
* Bootstrap v4.3.1 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2019 The Bootstrap Authors
|
||||
* Copyright 2011-2019 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0}dl,ol,p,ul{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote,figure{margin:0 0 1rem}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:dotted 1px;outline:-webkit-focus-ring-color auto 5px}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{box-sizing:content-box;height:0;overflow:visible;margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:Line truncated
|
||||
@@ -0,0 +1,6 @@
|
||||
/*!
|
||||
* Bootstrap v4.3.1 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2019 The Bootstrap Authors
|
||||
* Copyright 2011-2019 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||
*/:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0}dl,ol,p,ul{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote,figure{margin:0 0 1rem}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:dotted 1px;outline:-webkit-focus-ring-color auto 5px}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{box-sizing:content-box;height:0;overflow:visible;margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:Line truncated
|
||||
@@ -1 +1 @@
|
||||
@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.e79bfd88537def476913.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(MaterialIcons-Regular.570eb83859dc23dd0eec.woff2) format('woff2'),url(MaterialIcons-Regular.012cf6a10129e2275d79.woff) format('woff'),url(MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf) format('truetype')}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:100;src:local('Roboto Thin '),local('Roboto-Thin'),url(roboto-latin-100.7370c3679472e9560965.woff2) format('woff2'),url(roboto-latin-100.5cb7edfceb233100075d.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:100;src:local('Roboto Thin italic'),local('Roboto-Thinitalic'),url(roboto-latin-100italic.f8b1df51ba843179fa1c.woff2) format('woff2'),url(roboto-latin-100italic.f9e8e590b4e0f1ff8346.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:local('Roboto Light '),local('Roboto-Light'),url(roboto-latin-300.ef7c6637c68f269a882e.woff2) format('woff2'),url(roboto-latin-300.b00849e00f4c2331cddd.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:300;src:local('Roboto Light italic'),local('Roboto-Lightitalic'),url(roboto-latin-300italic.14286f3ba79c66274335.woff2) format('woff2'),url(roboto-latin-300italic.4df32891a5f2f98a3633.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:local('Roboto Regular '),local('Roboto-Regular'),url(roboto-latin-400.479970ffb74f2117317f.woff2) format('woff2'),url(roboto-latin-400.60fa3c0614b8fb2f394f.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:400;src:local('Roboto Regular italic'),local('Roboto-Regularitalic'),url(roboto-latin-400italic.51521a2a8da71e50d871.woff2) format('woff2'),url(roboto-latin-400italic.fe65b8335ee19dd94428.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:local('Roboto Medium '),local('Roboto-Medium'),url(roboto-latin-500.020c97dc8e0463259c2f.woff2) format('woff2'),url(roboto-latin-500.87284894879f5b1c229c.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:500;src:local('Roboto Medium italic'),local('Roboto-Mediumitalic'),url(roboto-latin-500italic.db4a2a231f52e497c019.woff2) format('woff2'),url(roboto-latin-500italic.288ad9c6e8b43cf02443.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:local('Roboto Bold '),local('Roboto-Bold'),url(roboto-latin-700.2735a3a69b509faf3577.woff2) format('woff2'),url(roboto-latin-700.adcde98f1d584de52060.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:700;src:local('Roboto Bold italic'),local('Roboto-Bolditalic'),url(roboto-latin-700italic.da0e717829e033a69dec.woff2) format('woff2'),url(roboto-latin-700italic.81f57861ed4ac74741f5.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:900;src:local('Roboto #000 '),local('Roboto-Black'),url(roboto-latin-900.9b3766ef4a402ad3fdee.woff2) format('woff2'),url(roboto-latin-900.bb1e4dc6333675d11ada.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:900;src:local('Roboto #000 italic'),local('Roboto-Blackitalic'),url(roboto-latin-900italic.ebf6d1640ccddb99fb49.woff2) format('woff2'),url(roboto-latin-900italic.28f9151055c950874d2c.woff) format('woff')}.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,"Helvetica Neue",sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * .83)/20px Roboto,"Helvetica Neue",sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * .67)/20px Roboto,"Helvetica Neue",sans-serif;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400Line truncated
|
||||
@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.e79bfd88537def476913.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(MaterialIcons-Regular.570eb83859dc23dd0eec.woff2) format('woff2'),url(MaterialIcons-Regular.012cf6a10129e2275d79.woff) format('woff'),url(MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf) format('truetype')}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:100;src:local('Roboto Thin '),local('Roboto-Thin'),url(roboto-latin-100.7370c3679472e9560965.woff2) format('woff2'),url(roboto-latin-100.5cb7edfceb233100075d.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:100;src:local('Roboto Thin italic'),local('Roboto-Thinitalic'),url(roboto-latin-100italic.f8b1df51ba843179fa1c.woff2) format('woff2'),url(roboto-latin-100italic.f9e8e590b4e0f1ff8346.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:local('Roboto Light '),local('Roboto-Light'),url(roboto-latin-300.ef7c6637c68f269a882e.woff2) format('woff2'),url(roboto-latin-300.b00849e00f4c2331cddd.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:300;src:local('Roboto Light italic'),local('Roboto-Lightitalic'),url(roboto-latin-300italic.14286f3ba79c66274335.woff2) format('woff2'),url(roboto-latin-300italic.4df32891a5f2f98a3633.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:local('Roboto Regular '),local('Roboto-Regular'),url(roboto-latin-400.479970ffb74f2117317f.woff2) format('woff2'),url(roboto-latin-400.60fa3c0614b8fb2f394f.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:400;src:local('Roboto Regular italic'),local('Roboto-Regularitalic'),url(roboto-latin-400italic.51521a2a8da71e50d871.woff2) format('woff2'),url(roboto-latin-400italic.fe65b8335ee19dd94428.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:local('Roboto Medium '),local('Roboto-Medium'),url(roboto-latin-500.020c97dc8e0463259c2f.woff2) format('woff2'),url(roboto-latin-500.87284894879f5b1c229c.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:500;src:local('Roboto Medium italic'),local('Roboto-Mediumitalic'),url(roboto-latin-500italic.db4a2a231f52e497c019.woff2) format('woff2'),url(roboto-latin-500italic.288ad9c6e8b43cf02443.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:local('Roboto Bold '),local('Roboto-Bold'),url(roboto-latin-700.2735a3a69b509faf3577.woff2) format('woff2'),url(roboto-latin-700.adcde98f1d584de52060.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:700;src:local('Roboto Bold italic'),local('Roboto-Bolditalic'),url(roboto-latin-700italic.da0e717829e033a69dec.woff2) format('woff2'),url(roboto-latin-700italic.81f57861ed4ac74741f5.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:900;src:local('Roboto #000 '),local('Roboto-Black'),url(roboto-latin-900.9b3766ef4a402ad3fdee.woff2) format('woff2'),url(roboto-latin-900.bb1e4dc6333675d11ada.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:900;src:local('Roboto #000 italic'),local('Roboto-Blackitalic'),url(roboto-latin-900italic.ebf6d1640ccddb99fb49.woff2) format('woff2'),url(roboto-latin-900italic.28f9151055c950874d2c.woff) format('woff')}.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,"Helvetica Neue",sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * .83)/20px Roboto,"Helvetica Neue",sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * .67)/20px Roboto,"Helvetica Neue",sans-serif;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400Line truncated
|
||||
@@ -1 +1 @@
|
||||
@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.e79bfd88537def476913.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(MaterialIcons-Regular.570eb83859dc23dd0eec.woff2) format('woff2'),url(MaterialIcons-Regular.012cf6a10129e2275d79.woff) format('woff'),url(MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf) format('truetype')}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:100;src:local('Roboto Thin '),local('Roboto-Thin'),url(roboto-latin-100.7370c3679472e9560965.woff2) format('woff2'),url(roboto-latin-100.5cb7edfceb233100075d.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:100;src:local('Roboto Thin italic'),local('Roboto-Thinitalic'),url(roboto-latin-100italic.f8b1df51ba843179fa1c.woff2) format('woff2'),url(roboto-latin-100italic.f9e8e590b4e0f1ff8346.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:local('Roboto Light '),local('Roboto-Light'),url(roboto-latin-300.ef7c6637c68f269a882e.woff2) format('woff2'),url(roboto-latin-300.b00849e00f4c2331cddd.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:300;src:local('Roboto Light italic'),local('Roboto-Lightitalic'),url(roboto-latin-300italic.14286f3ba79c66274335.woff2) format('woff2'),url(roboto-latin-300italic.4df32891a5f2f98a3633.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:local('Roboto Regular '),local('Roboto-Regular'),url(roboto-latin-400.479970ffb74f2117317f.woff2) format('woff2'),url(roboto-latin-400.60fa3c0614b8fb2f394f.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:400;src:local('Roboto Regular italic'),local('Roboto-Regularitalic'),url(roboto-latin-400italic.51521a2a8da71e50d871.woff2) format('woff2'),url(roboto-latin-400italic.fe65b8335ee19dd94428.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:local('Roboto Medium '),local('Roboto-Medium'),url(roboto-latin-500.020c97dc8e0463259c2f.woff2) format('woff2'),url(roboto-latin-500.87284894879f5b1c229c.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:500;src:local('Roboto Medium italic'),local('Roboto-Mediumitalic'),url(roboto-latin-500italic.db4a2a231f52e497c019.woff2) format('woff2'),url(roboto-latin-500italic.288ad9c6e8b43cf02443.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:local('Roboto Bold '),local('Roboto-Bold'),url(roboto-latin-700.2735a3a69b509faf3577.woff2) format('woff2'),url(roboto-latin-700.adcde98f1d584de52060.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:700;src:local('Roboto Bold italic'),local('Roboto-Bolditalic'),url(roboto-latin-700italic.da0e717829e033a69dec.woff2) format('woff2'),url(roboto-latin-700italic.81f57861ed4ac74741f5.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:900;src:local('Roboto #000 '),local('Roboto-Black'),url(roboto-latin-900.9b3766ef4a402ad3fdee.woff2) format('woff2'),url(roboto-latin-900.bb1e4dc6333675d11ada.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:900;src:local('Roboto #000 italic'),local('Roboto-Blackitalic'),url(roboto-latin-900italic.ebf6d1640ccddb99fb49.woff2) format('woff2'),url(roboto-latin-900italic.28f9151055c950874d2c.woff) format('woff')}.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,"Helvetica Neue",sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * .83)/20px Roboto,"Helvetica Neue",sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * .67)/20px Roboto,"Helvetica Neue",sans-serif;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400Line truncated
|
||||
@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.e79bfd88537def476913.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(MaterialIcons-Regular.570eb83859dc23dd0eec.woff2) format('woff2'),url(MaterialIcons-Regular.012cf6a10129e2275d79.woff) format('woff'),url(MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf) format('truetype')}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:'liga'}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:100;src:local('Roboto Thin '),local('Roboto-Thin'),url(roboto-latin-100.7370c3679472e9560965.woff2) format('woff2'),url(roboto-latin-100.5cb7edfceb233100075d.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:100;src:local('Roboto Thin italic'),local('Roboto-Thinitalic'),url(roboto-latin-100italic.f8b1df51ba843179fa1c.woff2) format('woff2'),url(roboto-latin-100italic.f9e8e590b4e0f1ff8346.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:300;src:local('Roboto Light '),local('Roboto-Light'),url(roboto-latin-300.ef7c6637c68f269a882e.woff2) format('woff2'),url(roboto-latin-300.b00849e00f4c2331cddd.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:300;src:local('Roboto Light italic'),local('Roboto-Lightitalic'),url(roboto-latin-300italic.14286f3ba79c66274335.woff2) format('woff2'),url(roboto-latin-300italic.4df32891a5f2f98a3633.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:400;src:local('Roboto Regular '),local('Roboto-Regular'),url(roboto-latin-400.479970ffb74f2117317f.woff2) format('woff2'),url(roboto-latin-400.60fa3c0614b8fb2f394f.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:400;src:local('Roboto Regular italic'),local('Roboto-Regularitalic'),url(roboto-latin-400italic.51521a2a8da71e50d871.woff2) format('woff2'),url(roboto-latin-400italic.fe65b8335ee19dd94428.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:500;src:local('Roboto Medium '),local('Roboto-Medium'),url(roboto-latin-500.020c97dc8e0463259c2f.woff2) format('woff2'),url(roboto-latin-500.87284894879f5b1c229c.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:500;src:local('Roboto Medium italic'),local('Roboto-Mediumitalic'),url(roboto-latin-500italic.db4a2a231f52e497c019.woff2) format('woff2'),url(roboto-latin-500italic.288ad9c6e8b43cf02443.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:700;src:local('Roboto Bold '),local('Roboto-Bold'),url(roboto-latin-700.2735a3a69b509faf3577.woff2) format('woff2'),url(roboto-latin-700.adcde98f1d584de52060.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:700;src:local('Roboto Bold italic'),local('Roboto-Bolditalic'),url(roboto-latin-700italic.da0e717829e033a69dec.woff2) format('woff2'),url(roboto-latin-700italic.81f57861ed4ac74741f5.woff) format('woff')}@font-face{font-family:Roboto;font-style:normal;font-display:swap;font-weight:900;src:local('Roboto #000 '),local('Roboto-Black'),url(roboto-latin-900.9b3766ef4a402ad3fdee.woff2) format('woff2'),url(roboto-latin-900.bb1e4dc6333675d11ada.woff) format('woff')}@font-face{font-family:Roboto;font-style:italic;font-display:swap;font-weight:900;src:local('Roboto #000 italic'),local('Roboto-Blackitalic'),url(roboto-latin-900italic.ebf6d1640ccddb99fb49.woff2) format('woff2'),url(roboto-latin-900italic.28f9151055c950874d2c.woff) format('woff')}.mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,"Helvetica Neue",sans-serif}.mat-badge-small .mat-badge-content{font-size:9px}.mat-badge-large .mat-badge-content{font-size:24px}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font:400 calc(14px * .83)/20px Roboto,"Helvetica Neue",sans-serif;margin:0 0 12px}.mat-h6,.mat-typography h6{font:400 calc(14px * .67)/20px Roboto,"Helvetica Neue",sans-serif;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400Line truncated
|
||||
@@ -28,6 +28,7 @@ import re
|
||||
|
||||
from gns3server.utils import parse_version
|
||||
from gns3server.utils.asyncio import wait_for_process_termination
|
||||
from gns3server.utils.asyncio import monitor_process
|
||||
from gns3server.utils.asyncio import subprocess_check_output
|
||||
from .ubridge_hypervisor import UBridgeHypervisor
|
||||
from .ubridge_error import UbridgeError
|
||||
@@ -176,6 +177,7 @@ class Hypervisor(UBridgeHypervisor):
|
||||
env=env)
|
||||
|
||||
log.info("ubridge started PID={}".format(self._process.pid))
|
||||
monitor_process(self._process, self._termination_callback)
|
||||
except (OSError, subprocess.SubprocessError) as e:
|
||||
ubridge_stdout = self.read_stdout()
|
||||
log.error("Could not start ubridge: {}\n{}".format(e, ubridge_stdout))
|
||||
@@ -188,9 +190,12 @@ class Hypervisor(UBridgeHypervisor):
|
||||
:param returncode: Process returncode
|
||||
"""
|
||||
|
||||
log.info("uBridge process has stopped, return code: %d", returncode)
|
||||
if returncode != 0:
|
||||
self._project.emit("log.error", {"message": "uBridge process has stopped, return code: {}\n{}".format(returncode, self.read_stdout())})
|
||||
error_msg = "uBridge process has stopped, return code: {}\n{}\n".format(returncode, self.read_stdout())
|
||||
log.error(error_msg)
|
||||
self._project.emit("log.error", {"message": error_msg})
|
||||
else:
|
||||
log.info("uBridge process has stopped, return code: %d", returncode)
|
||||
|
||||
async def stop(self):
|
||||
"""
|
||||
|
||||
+14
-6
@@ -15,24 +15,32 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from ..iou_error import IOUError
|
||||
import aiohttp
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def get_next_application_id(nodes):
|
||||
def get_next_application_id(projects, compute):
|
||||
"""
|
||||
Calculates free application_id from given nodes
|
||||
|
||||
:param nodes:
|
||||
:raises IOUError when exceeds number
|
||||
:param projects: all projects managed by controller
|
||||
:param compute: Compute instance
|
||||
:raises HTTPConflict when exceeds number
|
||||
:return: integer first free id
|
||||
"""
|
||||
|
||||
used = set([n.application_id for n in nodes])
|
||||
nodes = []
|
||||
|
||||
# look for application id for in all nodes across all opened projects that share the same compute
|
||||
for project in projects.values():
|
||||
if project.status == "opened" and compute in project.computes:
|
||||
nodes.extend(list(project.nodes.values()))
|
||||
|
||||
used = set([n.properties["application_id"] for n in nodes if n.node_type == "iou"])
|
||||
pool = set(range(1, 512))
|
||||
try:
|
||||
return (pool - used).pop()
|
||||
except KeyError:
|
||||
raise IOUError("Cannot create a new IOU VM (limit of 512 VMs on one host reached)")
|
||||
raise aiohttp.web.HTTPConflict(text="Cannot create a new IOU node (limit of 512 nodes across all opened projects using compute {} reached".format(compute.name))
|
||||
@@ -23,8 +23,8 @@
|
||||
# or negative for a release candidate or beta (after the base version
|
||||
# number has been incremented)
|
||||
|
||||
__version__ = "2.2.4"
|
||||
__version_info__ = (2, 2, 4, 0)
|
||||
__version__ = "2.2.6"
|
||||
__version_info__ = (2, 2, 6, 0)
|
||||
|
||||
if "dev" in __version__:
|
||||
try:
|
||||
|
||||
+2
-1
@@ -6,6 +6,7 @@ aiofiles==0.4.0
|
||||
async_generator>=1.10
|
||||
Jinja2>=2.7.3
|
||||
raven>=5.23.0
|
||||
psutil==5.6.3
|
||||
psutil==5.6.6
|
||||
async-timeout==3.0.1
|
||||
distro>=1.3.0
|
||||
py-cpuinfo==5.0.0
|
||||
@@ -18,6 +18,6 @@
|
||||
# A docker server use for localy test a remote GNS3 server
|
||||
|
||||
docker build -t gns3-server .
|
||||
docker run -i -h gns3vm -p 8001:8001/tcp -t gns3-server python3 -m gns3server --local --port 8001
|
||||
docker run -i -h gns3vm -p 8001:8001/tcp -t gns3-server python3 -m gns3server --port 8001
|
||||
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2015 GNS3 Technologies Inc.
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
import pytest
|
||||
from unittest.mock import patch
|
||||
import uuid
|
||||
import sys
|
||||
|
||||
pytestmark = pytest.mark.skipif(sys.platform.startswith("win"), reason="Not supported on Windows")
|
||||
|
||||
if not sys.platform.startswith("win"):
|
||||
from gns3server.compute.iou import IOU
|
||||
from gns3server.compute.iou.iou_error import IOUError
|
||||
|
||||
from gns3server.compute.project_manager import ProjectManager
|
||||
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def iou(port_manager):
|
||||
# Cleanup the IOU object
|
||||
IOU._instance = None
|
||||
iou = IOU.instance()
|
||||
iou.port_manager = port_manager
|
||||
return iou
|
||||
|
||||
|
||||
def test_application_id(loop, project, iou):
|
||||
vm1_id = str(uuid.uuid4())
|
||||
vm2_id = str(uuid.uuid4())
|
||||
vm3_id = str(uuid.uuid4())
|
||||
vm1 = loop.run_until_complete(iou.create_node("PC 1", project.id, vm1_id))
|
||||
vm2 = loop.run_until_complete(iou.create_node("PC 2", project.id, vm2_id))
|
||||
assert vm1.application_id == 1
|
||||
assert vm2.application_id == 2
|
||||
loop.run_until_complete(iou.delete_node(vm1_id))
|
||||
vm3 = loop.run_until_complete(iou.create_node("PC 3", project.id, vm3_id))
|
||||
assert vm3.application_id == 1
|
||||
|
||||
|
||||
def test_get_application_id_multiple_project(loop, iou):
|
||||
vm1_id = str(uuid.uuid4())
|
||||
vm2_id = str(uuid.uuid4())
|
||||
vm3_id = str(uuid.uuid4())
|
||||
project1 = ProjectManager.instance().create_project(project_id=str(uuid.uuid4()))
|
||||
project2 = ProjectManager.instance().create_project(project_id=str(uuid.uuid4()))
|
||||
vm1 = loop.run_until_complete(iou.create_node("PC 1", project1.id, vm1_id))
|
||||
vm2 = loop.run_until_complete(iou.create_node("PC 2", project1.id, vm2_id))
|
||||
vm3 = loop.run_until_complete(iou.create_node("PC 2", project2.id, vm3_id))
|
||||
assert vm1.application_id == 1
|
||||
assert vm2.application_id == 2
|
||||
assert vm3.application_id == 3
|
||||
|
||||
|
||||
def test_get_application_id_no_id_available(loop, project, iou):
|
||||
with pytest.raises(IOUError):
|
||||
for i in range(1, 513):
|
||||
node_id = str(uuid.uuid4())
|
||||
vm = loop.run_until_complete(iou.create_node("PC {}".format(i), project.id, node_id))
|
||||
assert vm.application_id == i
|
||||
|
||||
|
||||
def test_get_images_directory(iou, tmpdir):
|
||||
with patch("gns3server.config.Config.get_section_config", return_value={"images_path": str(tmpdir)}):
|
||||
assert iou.get_images_directory() == str(tmpdir / "IOU")
|
||||
@@ -28,6 +28,7 @@ from uuid import uuid4
|
||||
|
||||
from gns3server.controller.project import Project
|
||||
from gns3server.controller.template import Template
|
||||
from gns3server.controller.node import Node
|
||||
from gns3server.controller.ports.ethernet_port import EthernetPort
|
||||
from gns3server.config import Config
|
||||
|
||||
@@ -204,6 +205,131 @@ def test_add_node_non_local(async_run, controller):
|
||||
project.emit_notification.assert_any_call("node.created", node.__json__())
|
||||
|
||||
|
||||
def test_add_node_iou(async_run, controller):
|
||||
"""
|
||||
Test if an application ID is allocated for IOU nodes
|
||||
"""
|
||||
compute = MagicMock()
|
||||
compute.id = "local"
|
||||
project = async_run(controller.add_project(project_id=str(uuid.uuid4()), name="test1"))
|
||||
project.emit_notification = MagicMock()
|
||||
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock(return_value=response)
|
||||
|
||||
node1 = async_run(project.add_node(compute, "test1", None, node_type="iou"))
|
||||
node2 = async_run(project.add_node(compute, "test2", None, node_type="iou"))
|
||||
node3 = async_run(project.add_node(compute, "test3", None, node_type="iou"))
|
||||
assert node1.properties["application_id"] == 1
|
||||
assert node2.properties["application_id"] == 2
|
||||
assert node3.properties["application_id"] == 3
|
||||
|
||||
|
||||
def test_add_node_iou_with_multiple_projects(async_run, controller):
|
||||
"""
|
||||
Test if an application ID is allocated for IOU nodes with different projects already opened
|
||||
"""
|
||||
compute = MagicMock()
|
||||
compute.id = "local"
|
||||
project1 = async_run(controller.add_project(project_id=str(uuid.uuid4()), name="test1"))
|
||||
project1.emit_notification = MagicMock()
|
||||
project2 = async_run(controller.add_project(project_id=str(uuid.uuid4()), name="test2"))
|
||||
project2.emit_notification = MagicMock()
|
||||
project3 = async_run(controller.add_project(project_id=str(uuid.uuid4()), name="test3"))
|
||||
project3.emit_notification = MagicMock()
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock(return_value=response)
|
||||
|
||||
node1 = async_run(project1.add_node(compute, "test1", None, node_type="iou"))
|
||||
node2 = async_run(project1.add_node(compute, "test2", None, node_type="iou"))
|
||||
node3 = async_run(project1.add_node(compute, "test3", None, node_type="iou"))
|
||||
|
||||
node4 = async_run(project2.add_node(compute, "test4", None, node_type="iou"))
|
||||
node5 = async_run(project2.add_node(compute, "test5", None, node_type="iou"))
|
||||
node6 = async_run(project2.add_node(compute, "test6", None, node_type="iou"))
|
||||
|
||||
node7 = async_run(project3.add_node(compute, "test7", None, node_type="iou"))
|
||||
node8 = async_run(project3.add_node(compute, "test8", None, node_type="iou"))
|
||||
node9 = async_run(project3.add_node(compute, "test9", None, node_type="iou"))
|
||||
|
||||
assert node1.properties["application_id"] == 1
|
||||
assert node2.properties["application_id"] == 2
|
||||
assert node3.properties["application_id"] == 3
|
||||
|
||||
assert node4.properties["application_id"] == 4
|
||||
assert node5.properties["application_id"] == 5
|
||||
assert node6.properties["application_id"] == 6
|
||||
|
||||
assert node7.properties["application_id"] == 7
|
||||
assert node8.properties["application_id"] == 8
|
||||
assert node9.properties["application_id"] == 9
|
||||
|
||||
controller.remove_project(project1)
|
||||
project4 = async_run(controller.add_project(project_id=str(uuid.uuid4()), name="test4"))
|
||||
project4.emit_notification = MagicMock()
|
||||
|
||||
node10 = async_run(project3.add_node(compute, "test10", None, node_type="iou"))
|
||||
node11 = async_run(project3.add_node(compute, "test11", None, node_type="iou"))
|
||||
node12 = async_run(project3.add_node(compute, "test12", None, node_type="iou"))
|
||||
|
||||
assert node10.properties["application_id"] == 1
|
||||
assert node11.properties["application_id"] == 2
|
||||
assert node12.properties["application_id"] == 3
|
||||
|
||||
|
||||
def test_add_node_iou_with_multiple_projects_different_computes(async_run, controller):
|
||||
"""
|
||||
Test if an application ID is allocated for IOU nodes with different projects already opened
|
||||
"""
|
||||
compute1 = MagicMock()
|
||||
compute1.id = "remote1"
|
||||
compute2 = MagicMock()
|
||||
compute2.id = "remote2"
|
||||
project1 = async_run(controller.add_project(project_id=str(uuid.uuid4()), name="test1"))
|
||||
project1.emit_notification = MagicMock()
|
||||
project2 = async_run(controller.add_project(project_id=str(uuid.uuid4()), name="test2"))
|
||||
project2.emit_notification = MagicMock()
|
||||
response = MagicMock()
|
||||
compute1.post = AsyncioMagicMock(return_value=response)
|
||||
compute2.post = AsyncioMagicMock(return_value=response)
|
||||
|
||||
node1 = async_run(project1.add_node(compute1, "test1", None, node_type="iou"))
|
||||
node2 = async_run(project1.add_node(compute1, "test2", None, node_type="iou"))
|
||||
|
||||
node3 = async_run(project2.add_node(compute2, "test3", None, node_type="iou"))
|
||||
node4 = async_run(project2.add_node(compute2, "test4", None, node_type="iou"))
|
||||
|
||||
assert node1.properties["application_id"] == 1
|
||||
assert node2.properties["application_id"] == 2
|
||||
|
||||
assert node3.properties["application_id"] == 1
|
||||
assert node4.properties["application_id"] == 2
|
||||
|
||||
node5 = async_run(project1.add_node(compute2, "test5", None, node_type="iou"))
|
||||
node6 = async_run(project2.add_node(compute1, "test6", None, node_type="iou"))
|
||||
|
||||
assert node5.properties["application_id"] == 3
|
||||
assert node6.properties["application_id"] == 4
|
||||
|
||||
|
||||
def test_add_node_iou_no_id_available(async_run, controller):
|
||||
"""
|
||||
Test if an application ID is allocated for IOU nodes
|
||||
"""
|
||||
compute = MagicMock()
|
||||
compute.id = "local"
|
||||
project = async_run(controller.add_project(project_id=str(uuid.uuid4()), name="test"))
|
||||
project.emit_notification = MagicMock()
|
||||
response = MagicMock()
|
||||
compute.post = AsyncioMagicMock(return_value=response)
|
||||
|
||||
with pytest.raises(aiohttp.web.HTTPConflict):
|
||||
for i in range(1, 513):
|
||||
prop = {"properties": {"application_id": i}}
|
||||
project._nodes[i] = Node(project, compute, "Node{}".format(i), node_id=i, node_type="iou", **prop)
|
||||
async_run(project.add_node(compute, "test1", None, node_type="iou"))
|
||||
|
||||
|
||||
def test_add_node_from_template(async_run, controller):
|
||||
"""
|
||||
For a local server we send the project path
|
||||
|
||||
@@ -42,7 +42,7 @@ def fake_iou_bin(images_dir):
|
||||
@pytest.fixture
|
||||
def base_params(tmpdir, fake_iou_bin):
|
||||
"""Return standard parameters"""
|
||||
return {"name": "PC TEST 1", "path": "iou.bin"}
|
||||
return {"application_id": 42, "name": "PC TEST 1", "path": "iou.bin"}
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
@@ -37,3 +37,8 @@ def test_version_output(http_compute):
|
||||
def test_debug_output(http_compute):
|
||||
response = http_compute.get('/debug')
|
||||
assert response.status == 200
|
||||
|
||||
|
||||
def test_statistics_output(http_compute):
|
||||
response = http_compute.get('/statistics')
|
||||
assert response.status == 200
|
||||
@@ -70,3 +70,8 @@ def test_debug_non_local(http_controller, config, tmpdir):
|
||||
config.set("Server", "local", False)
|
||||
response = http_controller.post('/debug')
|
||||
assert response.status == 403
|
||||
|
||||
|
||||
def test_statistics_output(http_controller):
|
||||
response = http_controller.get('/statistics')
|
||||
assert response.status == 200
|
||||
Reference in new issue
Block a user