From 81d1f0c67a3cef986a53808173ad0dda1fd008e5 Mon Sep 17 00:00:00 2001 From: Jakub Man Date: Mon, 21 Dec 2020 10:04:09 +0100 Subject: [PATCH 01/22] ADD files for the new version --- .gitignore | 57 +- LICENSE | 222 +- NETCONF GUI mock.xd | Bin 0 -> 637194 bytes README.md | 91 +- app.config.json | 16 - assets/tools-config.json | 26 + assets/tools/3rdpartylicenses.txt | 211 + assets/tools/img/configure.png | Bin 0 -> 12106 bytes assets/tools/img/example.png | Bin 0 -> 14285 bytes assets/tools/img/explorer.png | Bin 0 -> 13466 bytes backend/__init__.py | 84 +- backend/config.ini | 6 +- backend/connections.py | 634 +- backend/data.py | 444 +- backend/devices.py | 203 +- backend/error.py | 6 - backend/inventory.py | 26 - backend/netconf.py | 413 + backend/profiles.py | 390 + backend/requirements.txt | 0 backend/runtest.py | 129 + backend/schemas.py | 477 +- backend/socketio.py | 39 - backend/sockets.py | 44 + config.json | 20 +- docker/.gitkeep | 0 docs/screenshots/configuration.png | Bin 176466 -> 0 bytes docs/screenshots/devices.png | Bin 84321 -> 0 bytes docs/screenshots/yang.png | Bin 98414 -> 0 bytes frontend-assets/icons/add.svg | 69 - frontend-assets/icons/add_active.svg | 69 - frontend-assets/icons/back.svg | 215 - frontend-assets/icons/close.svg | 69 - frontend-assets/icons/close_active.svg | 69 - frontend-assets/icons/collapse.svg | 69 - frontend-assets/icons/collapse_active.svg | 69 - frontend-assets/icons/confirm.svg | 254 - frontend-assets/icons/confirm_active.svg | 254 - frontend-assets/icons/container.svg | 80 - frontend-assets/icons/edit.svg | 131 - frontend-assets/icons/edit_active.svg | 142 - frontend-assets/icons/info.svg | 77 - frontend-assets/icons/info_active.svg | 77 - frontend-assets/icons/key.svg | 80 - frontend-assets/icons/leaf.svg | 65 - frontend-assets/icons/leaflist.svg | 75 - frontend-assets/icons/menu.svg | 74 - frontend-assets/icons/menu_active.svg | 74 - frontend-assets/icons/module.svg | 231 - frontend-assets/icons/reload.svg | 420 - frontend-assets/icons/reload_active.svg | 419 - frontend-assets/icons/show.svg | 83 - frontend-assets/icons/show_active.svg | 83 - frontend-assets/icons/show_all.svg | 69 - frontend-assets/icons/show_all_active.svg | 69 - frontend-assets/icons/show_children.svg | 64 - .../icons/show_children_active.svg | 64 - frontend-assets/icons/tree_branch.svg | 77 - frontend-assets/icons/tree_cont.svg | 73 - frontend-assets/icons/tree_empty.svg | 66 - frontend-assets/icons/tree_last_branch.svg | 71 - frontend-assets/icons/tree_root.svg | 71 - frontend-assets/icons/yangfile.svg | 277 - frontend-assets/logo.png | Bin 33137 -> 0 bytes frontend-assets/starthere.svg | 128 - frontend/.editorconfig | 13 + frontend/.gitignore | 39 + frontend/README.md | 27 + frontend/_netopeer-common.scss | 134 - frontend/angular-shared.json | 18 + frontend/angular.json | 214 + frontend/builders/builders.json | 9 + frontend/builders/package.json | 3 + frontend/builders/plugin-builder/index.js | 106 + frontend/builders/plugin-builder/index.ts | 162 + frontend/builders/plugin-builder/schema.json | 466 + frontend/builders/tsconfig.builders.json | 13 + .../common/loading/loading.component.html | 2 - .../common/loading/loading.component.scss | 15 - frontend/common/loading/loading.component.ts | 14 - frontend/common/pipes.ts | 41 - frontend/config/config.component.html | 80 - frontend/config/config.component.scss | 49 - frontend/config/config.component.ts | 218 - frontend/config/modifications.service.ts | 911 -- frontend/config/ordering.directive.ts | 203 - frontend/config/session.ts | 53 - frontend/config/sessions.service.ts | 550 - frontend/config/tree-create.html | 20 - frontend/config/tree-edit.html | 27 - frontend/config/tree-indent.html | 84 - frontend/config/tree-node.html | 90 - frontend/config/tree.component.html | 55 - frontend/config/tree.component.scss | 202 - frontend/config/tree.component.ts | 386 - frontend/config/tree.service.ts | 393 - frontend/dashboard.component.html | 19 - frontend/dashboard.component.ts | 25 - frontend/e2e/protractor.conf.js | 28 + frontend/e2e/src/app.e2e-spec.ts | 14 + frontend/e2e/src/app.po.ts | 11 + frontend/e2e/tsconfig.e2e.json | 13 + frontend/inventory/device.ts | 21 - frontend/inventory/devices.component.html | 88 - frontend/inventory/devices.component.ts | 245 - frontend/inventory/devices.service.ts | 34 - frontend/inventory/inventory.component.html | 6 - frontend/inventory/inventory.component.scss | 139 - frontend/inventory/inventory.component.ts | 57 - frontend/inventory/schema.ts | 11 - frontend/inventory/schemas.component.html | 37 - frontend/inventory/schemas.component.ts | 88 - frontend/monitoring/monitoring.component.html | 11 - frontend/monitoring/monitoring.component.scss | 1 - frontend/monitoring/monitoring.component.ts | 11 - frontend/netopeer.component.html | 13 - frontend/netopeer.component.ts | 70 - frontend/netopeer.module.ts | 159 - frontend/netopeer.scss | 51 - frontend/package-lock.json | 12556 ++++++++++++++++ frontend/package-shared.json | 7 + frontend/package.json | 74 +- frontend/plugins/plugins.component.html | 11 - frontend/plugins/plugins.component.scss | 1 - frontend/plugins/plugins.component.ts | 21 - frontend/projects/netconf-lib/browserslist | 5 + frontend/projects/netconf-lib/karma.conf.js | 31 + frontend/projects/netconf-lib/ng-package.json | 7 + frontend/projects/netconf-lib/package.json | 10 + .../src/lib/classes/ConnectionStatus.ts | 15 + .../src/lib/classes/DeviceWithStatus.ts | 13 + .../src/lib/classes/GenericServerResponse.ts | 9 + .../src/lib/classes/ModificationType.ts | 17 + .../netconf-lib/src/lib/classes/device.ts | 13 + .../netconf-lib/src/lib/classes/session.ts | 12 + .../lib/components/content-box.component.scss | 25 + .../lib/components/content-box.component.ts | 31 + .../device-quickswitch.component.html | 8 + .../device-quickswitch.component.scss | 54 + .../device-quickswitch.component.ts | 52 + .../device-selection.component.html | 32 + .../device-selection.component.scss | 39 + .../components/device-selection.component.ts | 83 + .../now-connecting-form.component.html | 68 + .../now-connecting-form.component.scss | 24 + .../now-connecting-form.component.ts | 228 + .../src/lib/components/popup.component.scss | 46 + .../src/lib/components/popup.component.ts | 48 + .../schema-list/schema-list.component.html | 14 + .../schema-list/schema-list.component.scss | 27 + .../schema-list/schema-list.component.ts | 57 + .../device-selection-item.component.html | 18 + .../device-selection-item.component.ts | 32 + .../src/lib/netconf-lib.component.ts | 24 + .../netconf-lib/src/lib/netconf-lib.module.ts | 45 + .../src/lib/netconf-lib.service.ts | 24 + .../src/lib/pipes/connectionStatus.pipe.ts | 38 + .../src/lib/services/configuration.service.ts | 24 + .../src/lib/services/device.service.ts | 72 + .../src/lib/services/schemas.service.ts | 98 + .../src/lib/services/session.service.ts | 168 + .../src/lib/services/socket.service.ts | 38 + .../projects/netconf-lib/src/public_api.ts | 12 + frontend/projects/netconf-lib/src/test.ts | 22 + .../projects/netconf-lib/tsconfig.lib.json | 32 + .../projects/netconf-lib/tsconfig.spec.json | 17 + frontend/projects/netconf-lib/tslint.json | 17 + frontend/projects/shared-styles/_colors.scss | 14 + .../projects/shared-styles/_components.scss | 39 + frontend/projects/shared-styles/_forms.scss | 61 + frontend/projects/shared-styles/netconf.scss | 2 + .../src/color-picker/color-picker.module.ts | 26 + .../components/color-picker.component.html | 16 + .../components/color-picker.component.scss | 3 + .../components/color-picker.component.ts | 36 + .../tools/src/example/example.component.html | 9 + .../tools/src/example/example.component.scss | 3 + .../tools/src/example/example.component.ts | 33 + .../tools/src/example/example.module.ts | 26 + frontend/projects/tools/src/index.html | 0 frontend/projects/tools/src/main.ts | 0 .../src/yang-configure/classes/NodeType.ts | 24 + .../components/confirm-commit.component.html | 8 + .../components/confirm-commit.component.scss | 10 + .../components/confirm-commit.component.ts | 51 + .../components/yang-configure.component.html | 18 + .../components/yang-configure.component.scss | 8 + .../components/yang-configure.component.ts | 119 + .../yang-schema-node.component.html | 63 + .../yang-schema-node.component.scss | 57 + .../components/yang-schema-node.component.ts | 88 + .../services/node-control.service.ts | 42 + .../yang-configure/yang-configure.module.ts | 30 + .../yang-explorer.component.html | 16 + .../yang-explorer.component.scss | 25 + .../yang-explorer/yang-explorer.component.ts | 47 + .../src/yang-explorer/yang-explorer.module.ts | 26 + frontend/projects/tools/tsconfig.app.json | 12 + frontend/src/app/_colors.scss | 1 + frontend/src/app/angular.json | 18 + .../src/app/classes/GenericServerResponse.ts | 9 + frontend/src/app/classes/Notification.ts | 10 + frontend/src/app/classes/ProfileDevice.ts | 14 + frontend/src/app/classes/ProfileItem.ts | 7 + .../device-list/device-list.component.html | 20 + .../device-list/device-list.component.scss | 0 .../device-list/device-list.component.ts | 35 + .../components/devices/devices.component.html | 18 + .../components/devices/devices.component.scss | 7 + .../components/devices/devices.component.ts | 19 + .../src/app/components/netconf.component.html | 24 + .../src/app/components/netconf.component.scss | 35 + .../src/app/components/netconf.component.ts | 99 + .../notifications.component.html | 3 + .../notifications.component.scss | 0 .../notifications/notifications.component.ts | 19 + .../profiles/popup-add-profile.component.html | 17 + .../profiles/popup-add-profile.component.ts | 53 + .../popup-connect-profile.component.html | 12 + .../popup-connect-profile.component.ts | 53 + .../profiles/profile-edit.component.html | 62 + .../profiles/profile-edit.component.scss | 26 + .../profiles/profile-edit.component.ts | 144 + .../profiles/profiles.component.html | 83 + .../profiles/profiles.component.scss | 35 + .../components/profiles/profiles.component.ts | 136 + .../add-device-form.component.html | 61 + .../add-device-form.component.scss | 10 + .../add-device-form.component.ts | 65 + .../notification-display.component.html | 13 + .../notification-display.component.scss | 36 + .../notification-display.component.ts | 65 + .../notification-info.component.html | 11 + .../notification-info.component.scss | 104 + .../notification-info.component.ts | 53 + .../pagination/pagination.component.html | 31 + .../pagination/pagination.component.scss | 61 + .../shared/pagination/pagination.component.ts | 102 + .../app/components/tools/tools.component.html | 31 + .../app/components/tools/tools.component.scss | 46 + .../app/components/tools/tools.component.ts | 69 + frontend/src/app/netconf.module.ts | 163 + frontend/src/app/package.json | 7 + .../src/app/pipes/connectionStatus.pipe.ts | 38 + frontend/src/app/pipes/device-filter.pipe.ts | 25 + frontend/src/app/pipes/pagination.pipe.ts | 18 + frontend/src/app/services/config.service.ts | 27 + .../src/app/services/notification.service.ts | 47 + frontend/src/app/services/profile.service.ts | 57 + .../src/app/services/tool-config.provider.ts | 60 + .../tool-loader/client-tool-loader.service.ts | 74 + .../tool-loader/tool-externals.prod.ts | 50 + .../services/tool-loader/tool-externals.ts | 49 + .../tool-loader/tool-loader.service.ts | 36 + frontend/src/app/styles/_inputs.scss | 75 + frontend/src/app/styles/netconf.scss | 0 frontend/src/app/tsconfig.json | 28 + frontend/src/app/typings.d.ts | 7 + frontend/src/assets/.gitkeep | 0 frontend/src/assets/tools/example.js | 1 + frontend/src/assets/tools/index.html | 1 + frontend/src/assets/tools/lib.js | 1 + frontend/src/browserslist | 11 + frontend/src/environments/environment.prod.ts | 3 + frontend/src/environments/environment.ts | 16 + frontend/src/favicon.ico | Bin 0 -> 5430 bytes frontend/src/index.html | 14 + frontend/src/karma.conf.js | 31 + frontend/src/main.ts | 13 + frontend/src/polyfills.ts | 80 + frontend/src/styles.css | 1 + frontend/src/test.ts | 20 + frontend/src/tsconfig.app.json | 11 + frontend/src/tsconfig.spec.json | 18 + frontend/src/tslint.json | 17 + frontend/src/typings.d.ts | 7 + frontend/tsconfig.json | 29 + frontend/tslint.json | 131 + frontend/yang/schemas.service.ts | 228 - frontend/yang/yang.component.html | 41 - frontend/yang/yang.component.scss | 98 - frontend/yang/yang.component.ts | 421 - frontend/yang/yang.feature.html | 23 - frontend/yang/yang.identity.html | 30 - frontend/yang/yang.module.html | 233 - frontend/yang/yang.node.html | 191 - frontend/yang/yang.restriction.html | 30 - frontend/yang/yang.type.html | 112 - frontend/yang/yang.typedef.html | 28 - schema.svg | 874 -- vagrant/OpenSUSE/Vagrantfile | 124 - vagrant/README.md | 80 - vagrant/Ubuntu-release/Vagrantfile | 67 - vagrant/Ubuntu-release/lgui-config.ini | 67 - vagrant/Ubuntu-release/ncgui.conf | 27 - vagrant/Ubuntu-release/ncgui.service | 12 - vagrant/Ubuntu-release/netopeer-config.ini | 2 - vagrant/Ubuntu-release/run.sh | 5 - vagrant/Ubuntu-release/setvenv.sh | 7 - vagrant/{Ubuntu => }/Vagrantfile | 27 +- 300 files changed, 21155 insertions(+), 13250 deletions(-) create mode 100644 NETCONF GUI mock.xd delete mode 100644 app.config.json create mode 100644 assets/tools-config.json create mode 100644 assets/tools/3rdpartylicenses.txt create mode 100644 assets/tools/img/configure.png create mode 100644 assets/tools/img/example.png create mode 100644 assets/tools/img/explorer.png delete mode 100644 backend/error.py delete mode 100644 backend/inventory.py create mode 100644 backend/netconf.py create mode 100644 backend/profiles.py create mode 100644 backend/requirements.txt create mode 100644 backend/runtest.py delete mode 100644 backend/socketio.py create mode 100644 backend/sockets.py create mode 100644 docker/.gitkeep delete mode 100644 docs/screenshots/configuration.png delete mode 100644 docs/screenshots/devices.png delete mode 100644 docs/screenshots/yang.png delete mode 100644 frontend-assets/icons/add.svg delete mode 100644 frontend-assets/icons/add_active.svg delete mode 100644 frontend-assets/icons/back.svg delete mode 100644 frontend-assets/icons/close.svg delete mode 100644 frontend-assets/icons/close_active.svg delete mode 100644 frontend-assets/icons/collapse.svg delete mode 100644 frontend-assets/icons/collapse_active.svg delete mode 100644 frontend-assets/icons/confirm.svg delete mode 100644 frontend-assets/icons/confirm_active.svg delete mode 100644 frontend-assets/icons/container.svg delete mode 100644 frontend-assets/icons/edit.svg delete mode 100644 frontend-assets/icons/edit_active.svg delete mode 100644 frontend-assets/icons/info.svg delete mode 100644 frontend-assets/icons/info_active.svg delete mode 100644 frontend-assets/icons/key.svg delete mode 100644 frontend-assets/icons/leaf.svg delete mode 100644 frontend-assets/icons/leaflist.svg delete mode 100644 frontend-assets/icons/menu.svg delete mode 100644 frontend-assets/icons/menu_active.svg delete mode 100644 frontend-assets/icons/module.svg delete mode 100644 frontend-assets/icons/reload.svg delete mode 100644 frontend-assets/icons/reload_active.svg delete mode 100644 frontend-assets/icons/show.svg delete mode 100644 frontend-assets/icons/show_active.svg delete mode 100644 frontend-assets/icons/show_all.svg delete mode 100644 frontend-assets/icons/show_all_active.svg delete mode 100644 frontend-assets/icons/show_children.svg delete mode 100644 frontend-assets/icons/show_children_active.svg delete mode 100644 frontend-assets/icons/tree_branch.svg delete mode 100644 frontend-assets/icons/tree_cont.svg delete mode 100644 frontend-assets/icons/tree_empty.svg delete mode 100644 frontend-assets/icons/tree_last_branch.svg delete mode 100644 frontend-assets/icons/tree_root.svg delete mode 100644 frontend-assets/icons/yangfile.svg delete mode 100644 frontend-assets/logo.png delete mode 100644 frontend-assets/starthere.svg create mode 100644 frontend/.editorconfig create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md delete mode 100644 frontend/_netopeer-common.scss create mode 100644 frontend/angular-shared.json create mode 100644 frontend/angular.json create mode 100644 frontend/builders/builders.json create mode 100644 frontend/builders/package.json create mode 100644 frontend/builders/plugin-builder/index.js create mode 100644 frontend/builders/plugin-builder/index.ts create mode 100644 frontend/builders/plugin-builder/schema.json create mode 100644 frontend/builders/tsconfig.builders.json delete mode 100644 frontend/common/loading/loading.component.html delete mode 100644 frontend/common/loading/loading.component.scss delete mode 100644 frontend/common/loading/loading.component.ts delete mode 100644 frontend/common/pipes.ts delete mode 100644 frontend/config/config.component.html delete mode 100644 frontend/config/config.component.scss delete mode 100644 frontend/config/config.component.ts delete mode 100644 frontend/config/modifications.service.ts delete mode 100644 frontend/config/ordering.directive.ts delete mode 100644 frontend/config/session.ts delete mode 100644 frontend/config/sessions.service.ts delete mode 100644 frontend/config/tree-create.html delete mode 100644 frontend/config/tree-edit.html delete mode 100644 frontend/config/tree-indent.html delete mode 100644 frontend/config/tree-node.html delete mode 100644 frontend/config/tree.component.html delete mode 100644 frontend/config/tree.component.scss delete mode 100644 frontend/config/tree.component.ts delete mode 100644 frontend/config/tree.service.ts delete mode 100644 frontend/dashboard.component.html delete mode 100644 frontend/dashboard.component.ts create mode 100644 frontend/e2e/protractor.conf.js create mode 100644 frontend/e2e/src/app.e2e-spec.ts create mode 100644 frontend/e2e/src/app.po.ts create mode 100644 frontend/e2e/tsconfig.e2e.json delete mode 100644 frontend/inventory/device.ts delete mode 100644 frontend/inventory/devices.component.html delete mode 100644 frontend/inventory/devices.component.ts delete mode 100644 frontend/inventory/devices.service.ts delete mode 100644 frontend/inventory/inventory.component.html delete mode 100644 frontend/inventory/inventory.component.scss delete mode 100644 frontend/inventory/inventory.component.ts delete mode 100644 frontend/inventory/schema.ts delete mode 100644 frontend/inventory/schemas.component.html delete mode 100644 frontend/inventory/schemas.component.ts delete mode 100644 frontend/monitoring/monitoring.component.html delete mode 100644 frontend/monitoring/monitoring.component.scss delete mode 100644 frontend/monitoring/monitoring.component.ts delete mode 100644 frontend/netopeer.component.html delete mode 100644 frontend/netopeer.component.ts delete mode 100644 frontend/netopeer.module.ts delete mode 100644 frontend/netopeer.scss create mode 100644 frontend/package-lock.json create mode 100644 frontend/package-shared.json delete mode 100644 frontend/plugins/plugins.component.html delete mode 100644 frontend/plugins/plugins.component.scss delete mode 100644 frontend/plugins/plugins.component.ts create mode 100644 frontend/projects/netconf-lib/browserslist create mode 100644 frontend/projects/netconf-lib/karma.conf.js create mode 100644 frontend/projects/netconf-lib/ng-package.json create mode 100644 frontend/projects/netconf-lib/package.json create mode 100644 frontend/projects/netconf-lib/src/lib/classes/ConnectionStatus.ts create mode 100644 frontend/projects/netconf-lib/src/lib/classes/DeviceWithStatus.ts create mode 100644 frontend/projects/netconf-lib/src/lib/classes/GenericServerResponse.ts create mode 100644 frontend/projects/netconf-lib/src/lib/classes/ModificationType.ts create mode 100644 frontend/projects/netconf-lib/src/lib/classes/device.ts create mode 100644 frontend/projects/netconf-lib/src/lib/classes/session.ts create mode 100644 frontend/projects/netconf-lib/src/lib/components/content-box.component.scss create mode 100644 frontend/projects/netconf-lib/src/lib/components/content-box.component.ts create mode 100644 frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.html create mode 100644 frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.scss create mode 100644 frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.ts create mode 100644 frontend/projects/netconf-lib/src/lib/components/device-selection.component.html create mode 100644 frontend/projects/netconf-lib/src/lib/components/device-selection.component.scss create mode 100644 frontend/projects/netconf-lib/src/lib/components/device-selection.component.ts create mode 100644 frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.html create mode 100644 frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.scss create mode 100644 frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.ts create mode 100644 frontend/projects/netconf-lib/src/lib/components/popup.component.scss create mode 100644 frontend/projects/netconf-lib/src/lib/components/popup.component.ts create mode 100644 frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.html create mode 100644 frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.scss create mode 100644 frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.ts create mode 100644 frontend/projects/netconf-lib/src/lib/components/subcomponents/device-selection-item.component.html create mode 100644 frontend/projects/netconf-lib/src/lib/components/subcomponents/device-selection-item.component.ts create mode 100644 frontend/projects/netconf-lib/src/lib/netconf-lib.component.ts create mode 100644 frontend/projects/netconf-lib/src/lib/netconf-lib.module.ts create mode 100644 frontend/projects/netconf-lib/src/lib/netconf-lib.service.ts create mode 100644 frontend/projects/netconf-lib/src/lib/pipes/connectionStatus.pipe.ts create mode 100644 frontend/projects/netconf-lib/src/lib/services/configuration.service.ts create mode 100644 frontend/projects/netconf-lib/src/lib/services/device.service.ts create mode 100644 frontend/projects/netconf-lib/src/lib/services/schemas.service.ts create mode 100644 frontend/projects/netconf-lib/src/lib/services/session.service.ts create mode 100644 frontend/projects/netconf-lib/src/lib/services/socket.service.ts create mode 100644 frontend/projects/netconf-lib/src/public_api.ts create mode 100644 frontend/projects/netconf-lib/src/test.ts create mode 100644 frontend/projects/netconf-lib/tsconfig.lib.json create mode 100644 frontend/projects/netconf-lib/tsconfig.spec.json create mode 100644 frontend/projects/netconf-lib/tslint.json create mode 100644 frontend/projects/shared-styles/_colors.scss create mode 100644 frontend/projects/shared-styles/_components.scss create mode 100644 frontend/projects/shared-styles/_forms.scss create mode 100644 frontend/projects/shared-styles/netconf.scss create mode 100644 frontend/projects/tools/src/color-picker/color-picker.module.ts create mode 100644 frontend/projects/tools/src/color-picker/components/color-picker.component.html create mode 100644 frontend/projects/tools/src/color-picker/components/color-picker.component.scss create mode 100644 frontend/projects/tools/src/color-picker/components/color-picker.component.ts create mode 100644 frontend/projects/tools/src/example/example.component.html create mode 100644 frontend/projects/tools/src/example/example.component.scss create mode 100644 frontend/projects/tools/src/example/example.component.ts create mode 100644 frontend/projects/tools/src/example/example.module.ts create mode 100644 frontend/projects/tools/src/index.html create mode 100644 frontend/projects/tools/src/main.ts create mode 100644 frontend/projects/tools/src/yang-configure/classes/NodeType.ts create mode 100644 frontend/projects/tools/src/yang-configure/components/confirm-commit.component.html create mode 100644 frontend/projects/tools/src/yang-configure/components/confirm-commit.component.scss create mode 100644 frontend/projects/tools/src/yang-configure/components/confirm-commit.component.ts create mode 100644 frontend/projects/tools/src/yang-configure/components/yang-configure.component.html create mode 100644 frontend/projects/tools/src/yang-configure/components/yang-configure.component.scss create mode 100644 frontend/projects/tools/src/yang-configure/components/yang-configure.component.ts create mode 100644 frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.html create mode 100644 frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.scss create mode 100644 frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.ts create mode 100644 frontend/projects/tools/src/yang-configure/services/node-control.service.ts create mode 100644 frontend/projects/tools/src/yang-configure/yang-configure.module.ts create mode 100644 frontend/projects/tools/src/yang-explorer/yang-explorer.component.html create mode 100644 frontend/projects/tools/src/yang-explorer/yang-explorer.component.scss create mode 100644 frontend/projects/tools/src/yang-explorer/yang-explorer.component.ts create mode 100644 frontend/projects/tools/src/yang-explorer/yang-explorer.module.ts create mode 100644 frontend/projects/tools/tsconfig.app.json create mode 120000 frontend/src/app/_colors.scss create mode 100644 frontend/src/app/angular.json create mode 100644 frontend/src/app/classes/GenericServerResponse.ts create mode 100644 frontend/src/app/classes/Notification.ts create mode 100644 frontend/src/app/classes/ProfileDevice.ts create mode 100644 frontend/src/app/classes/ProfileItem.ts create mode 100644 frontend/src/app/components/devices/device-list/device-list.component.html create mode 100644 frontend/src/app/components/devices/device-list/device-list.component.scss create mode 100644 frontend/src/app/components/devices/device-list/device-list.component.ts create mode 100644 frontend/src/app/components/devices/devices.component.html create mode 100644 frontend/src/app/components/devices/devices.component.scss create mode 100644 frontend/src/app/components/devices/devices.component.ts create mode 100644 frontend/src/app/components/netconf.component.html create mode 100644 frontend/src/app/components/netconf.component.scss create mode 100644 frontend/src/app/components/netconf.component.ts create mode 100644 frontend/src/app/components/notifications/notifications.component.html create mode 100644 frontend/src/app/components/notifications/notifications.component.scss create mode 100644 frontend/src/app/components/notifications/notifications.component.ts create mode 100644 frontend/src/app/components/profiles/popup-add-profile.component.html create mode 100644 frontend/src/app/components/profiles/popup-add-profile.component.ts create mode 100644 frontend/src/app/components/profiles/popup-connect-profile.component.html create mode 100644 frontend/src/app/components/profiles/popup-connect-profile.component.ts create mode 100644 frontend/src/app/components/profiles/profile-edit.component.html create mode 100644 frontend/src/app/components/profiles/profile-edit.component.scss create mode 100644 frontend/src/app/components/profiles/profile-edit.component.ts create mode 100644 frontend/src/app/components/profiles/profiles.component.html create mode 100644 frontend/src/app/components/profiles/profiles.component.scss create mode 100644 frontend/src/app/components/profiles/profiles.component.ts create mode 100644 frontend/src/app/components/shared/add-device-form/add-device-form.component.html create mode 100644 frontend/src/app/components/shared/add-device-form/add-device-form.component.scss create mode 100644 frontend/src/app/components/shared/add-device-form/add-device-form.component.ts create mode 100644 frontend/src/app/components/shared/notification-display/notification-display.component.html create mode 100644 frontend/src/app/components/shared/notification-display/notification-display.component.scss create mode 100644 frontend/src/app/components/shared/notification-display/notification-display.component.ts create mode 100644 frontend/src/app/components/shared/notification-info/notification-info.component.html create mode 100644 frontend/src/app/components/shared/notification-info/notification-info.component.scss create mode 100644 frontend/src/app/components/shared/notification-info/notification-info.component.ts create mode 100644 frontend/src/app/components/shared/pagination/pagination.component.html create mode 100644 frontend/src/app/components/shared/pagination/pagination.component.scss create mode 100644 frontend/src/app/components/shared/pagination/pagination.component.ts create mode 100644 frontend/src/app/components/tools/tools.component.html create mode 100644 frontend/src/app/components/tools/tools.component.scss create mode 100644 frontend/src/app/components/tools/tools.component.ts create mode 100644 frontend/src/app/netconf.module.ts create mode 100644 frontend/src/app/package.json create mode 100644 frontend/src/app/pipes/connectionStatus.pipe.ts create mode 100644 frontend/src/app/pipes/device-filter.pipe.ts create mode 100644 frontend/src/app/pipes/pagination.pipe.ts create mode 100644 frontend/src/app/services/config.service.ts create mode 100644 frontend/src/app/services/notification.service.ts create mode 100644 frontend/src/app/services/profile.service.ts create mode 100644 frontend/src/app/services/tool-config.provider.ts create mode 100644 frontend/src/app/services/tool-loader/client-tool-loader.service.ts create mode 100644 frontend/src/app/services/tool-loader/tool-externals.prod.ts create mode 100644 frontend/src/app/services/tool-loader/tool-externals.ts create mode 100644 frontend/src/app/services/tool-loader/tool-loader.service.ts create mode 100644 frontend/src/app/styles/_inputs.scss create mode 100644 frontend/src/app/styles/netconf.scss create mode 100644 frontend/src/app/tsconfig.json create mode 100644 frontend/src/app/typings.d.ts create mode 100644 frontend/src/assets/.gitkeep create mode 100644 frontend/src/assets/tools/example.js create mode 100644 frontend/src/assets/tools/index.html create mode 100644 frontend/src/assets/tools/lib.js create mode 100644 frontend/src/browserslist create mode 100644 frontend/src/environments/environment.prod.ts create mode 100644 frontend/src/environments/environment.ts create mode 100644 frontend/src/favicon.ico create mode 100644 frontend/src/index.html create mode 100644 frontend/src/karma.conf.js create mode 100644 frontend/src/main.ts create mode 100644 frontend/src/polyfills.ts create mode 100644 frontend/src/styles.css create mode 100644 frontend/src/test.ts create mode 100644 frontend/src/tsconfig.app.json create mode 100644 frontend/src/tsconfig.spec.json create mode 100644 frontend/src/tslint.json create mode 100644 frontend/src/typings.d.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tslint.json delete mode 100644 frontend/yang/schemas.service.ts delete mode 100644 frontend/yang/yang.component.html delete mode 100644 frontend/yang/yang.component.scss delete mode 100644 frontend/yang/yang.component.ts delete mode 100644 frontend/yang/yang.feature.html delete mode 100644 frontend/yang/yang.identity.html delete mode 100644 frontend/yang/yang.module.html delete mode 100644 frontend/yang/yang.node.html delete mode 100644 frontend/yang/yang.restriction.html delete mode 100644 frontend/yang/yang.type.html delete mode 100644 frontend/yang/yang.typedef.html delete mode 100644 schema.svg delete mode 100644 vagrant/OpenSUSE/Vagrantfile delete mode 100644 vagrant/README.md delete mode 100644 vagrant/Ubuntu-release/Vagrantfile delete mode 100644 vagrant/Ubuntu-release/lgui-config.ini delete mode 100644 vagrant/Ubuntu-release/ncgui.conf delete mode 100644 vagrant/Ubuntu-release/ncgui.service delete mode 100644 vagrant/Ubuntu-release/netopeer-config.ini delete mode 100755 vagrant/Ubuntu-release/run.sh delete mode 100755 vagrant/Ubuntu-release/setvenv.sh rename vagrant/{Ubuntu => }/Vagrantfile (86%) diff --git a/.gitignore b/.gitignore index 9f11b75..238b738 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,56 @@ -.idea/ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc + +# dependencies +/node_modules +/frontend/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db + +# Linked stylesheets +/frontend/_colors.scss + +# Devkit +/frontend/dist + +# Backend cache +/backend/__pycache__ +# User configuration files +/backend/userfiles + +# Compiled tools +/frontend/src/app/netconf-lib +/assets/tools/*.js +/assets/tools/index.html diff --git a/LICENSE b/LICENSE index 8dada3e..fe5fdfd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,21 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +MIT License + +Copyright (c) 2020 Jakub Man + +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. diff --git a/NETCONF GUI mock.xd b/NETCONF GUI mock.xd new file mode 100644 index 0000000000000000000000000000000000000000..c19fde60579e87f12dd911c0f086056fbc1fbf83 GIT binary patch literal 637194 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

H4^k!m`AeT_nea=uT-7xU$z-27}(O5lXq{X%R zfM#lL&1n8yR25+z(9I~|WXEtSf+yHES_%0A!~_bSi|l9(CtSqk0!Gpzdez})v^h@3 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⪙_O2l zkAFoJqYaBij=t@4k?xaa^F|f%2e3?A+$n1BZ(O{^8o6Uu?H-it0e&oqClVkqB4law z*?;e%%?vuR`ULdw`C8AwM*00L^`3v<{idSJHax~@n%cg$OTk$AJ9z!H@7mWxAju`j z!_%e9b-QyI^a6|MAIaw#0~y?nv+Eb+oy&;XOqhMb%szjoyvC86!`c7Cq+<#aVN=fR zo>r@69lNS-Pc>e6n8_EbS>f}`hUNL5F>5sfY5c_4DyXFk9tKq~Y7FU@VN|;>=HE7B zEz_5|w(UYDzSey!bJ#9a?rw*ro(Pd)saFu?O@pJf?qvrbL_)f{yMITw>;0TGJoa}Q zQ}tqIvIy1}iPc7ar*vdSZLOgo(}Bifow#5KVb)7jD3GR4?-Uv~NyE(MCb|)sq1U&W zq1B>t9INQlKsBgyxXj0)shd1X)8MstGzjHIWF^=VO>kW8a}HBZ?QW5KA6O;<8K|Od zE^09HHwa-TevcU*R?Cuv!hENGiUr-6j-;c-KG1#`kn$~!_dHz+HQ@-qWh>olBOqq} z(IqjJ=HXPBB}Xr({@$jN%n^uv&`6C@610miQ6ygR!PPW8R1Rv{byhJ#H())5m=Cr0 zyIV)#++@3zGZI7*Ugts9TdC3$y+X|`a4DW{UQWiVf~ESJ^jXCtJ%4dFOc=Ck?VIFR z2<2>EvdC{U12n|GxLF!{j0Z+kls>npM8`3mNuo|TjHXwerMqSTdlX2N>dF}>+!L4; z#S*_Z`Jot*831O#-4k9$uMDPALJcM0Ue2O>OZ5HIbbo7D$TtCYfHJ7n;lZVqd6Nsvqg@Q=8@B&>eS zkuRilpFKQ7$A5acG>p6U`9Gd!-|gB%TNMzt8OuUGDEweDu@cMv$z7uqFO{irZ78Nu ztI@^%8LO~6=xNVtdJXUEZ`o_&)531=oI>BSq+~{i>A=WEI8~p;KqvRewVXL?hx)c? z1WR>_xPHZm*~EQ+#`bPfC(z5cyQI^Rs@dc)vFE@Wc%%BOS@UYanx#>#J8^{^8_&v$ zsLddMcdJ!9TgkZ@E`~?QrzPxp-YM4es72}#dR(Ozov-=FokoRppc5;(-4$A~I8+NV zwT&04_Kl2p?w8L#E#$!z&P8s`{D$W>NkA?ZYOfWhKGiLYhAf+DTh6Rv_IqL{k8I47 zf6`q1eAJn8^-vOn;NK&f?=^!YHwo-v9tP8r<5p%t(P{)SZxv?oRM zAU_ioati;^#ZRy**GlsCN)+@C8B3jx$QQm;j7M{nUP0e1=@(<3VhGU7jNjlH0e>3p zS(rP79*`5|Ab1NZMfBZc)xDu6GYF9%T>2Uiy76y2@vfpp$)*z)tWVekqCtxEJ#EdT zE#ZCT{B6!@lJ8ZPUGcbqbu0Hd6$;`d^EL^CgP%T?ZkNm|%24kKDEDPZ@07Oi;t!E2 z_eZ5P{E;>$AzPLQ@!z)IOZ$Z)t1|!=*SY5SKya_ zyhpB#mUPa3#Mqd7Dmv~vr`M%6#rS_W_!QM`v71=GDWP+yre!FZEt)w>WXm0S4I4(D z-I!oL>mE>5h#qDFY1||ueLfQ6Egb_Y|Na)ny3tK(z}?GIjg7(J=?9nX{A#}KBW>}e zOd9S+inf|N!;F!Ud*4Gy&_sMO%pm;MwEQ<;^*D=IFXhQmK3)9Omnb9OpWQ;ILz4Txy_ll=-Eu! zI60Y&ElkMjBpTk$h$m$@mm*EHtihHyxu%oeJiU70kl|~vCmv-*HHv98>?N&8oRz^24Exm8gF0VJVpS>Gv*5DJq z|6XmJW=x0omp+&2mAcL5W3uOqBI9grrjo0c&V+4RiWi%l(qx>`w5C0>yvR38TN-|P zyMHOZz47St_xEkq?D}T!GF@2s?cBGmjILPZ0pQSf%<)4N(^T~C? z`PJ(Dfb|+pK{vv->Mk96?YNmny;}2yY<2qTukWjR&vy>``j7fNzrvWqjg7aLy{3=X zc1ufZueaaNm7SVhP&5g1zp`=f0*(^oyuVHlt@o(2d*lGjNTp*tD7So-*&OY8f`(X3Os|&+1=) zzE^&MmUIzM-`ef7n_b-VW72&U6;lk{>E9k?;+ zOl^0ter17kH{kp#P_W7)2^0Jjx9hs_FXo-7l zoXw>%h2r=-wRTnJmsQ8HS92-eZFMPF3ZD}U{u*F1#`=ao)-vzNpn(bULi$f$G7L!W z8{NM+POgLBs~`)&iDdjAPNc;00Nn_+cFGnAvmQ9GeW4RRk3B+>+jh(D5dMMLyDW13 z9LDS{izdGr`9R!dUJOAyJRS)Z`9@P*7!F61c*2(^9E(Jzdmef_vibp zFGrto2@LA$I5bzhojNa8LhT*fKALA9hYt-CtAqU1>zBMKnSuA7#dm7F=mYGR9$>yi z6b=#2c(#%o_`VB$V5c_(x(}3eM+dWp(1|(2CTO$<56dkcz5m0Cbn2e+^I|GVj>=W6 zvHQ$r;})TZZ{CuoAkM;5?F)F}RwJ68%*cW$&bGQra}poI{hOsHrTBts80X;fP7ynI zUjS);XaNjoXqgaX6L`NJwhR1y1*1rgI`PeU*ePQz8zRT#p+({B%JuDintrL~H>|RQ z8SsBPi7-q)^yb&TS7HGg>ogs}K|M6{U>9+3ww$tFDTS~+E0i{!$Iw@$)vYdR3{YnOpW=~nnY zfz>d!*dmu^@Qfg6-ba3%J&dtdQ`<�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 z zLl5o}%ke!iO91^g9N>}-)jW`4L ztxBF6*}$K9&`GrgG1vw<*@#EXMZ+bpva1brwrI0vsuHCJ<&h??$nzOggYMgzrYN!! zw~fnX9fe6Wnw8{{!VA&PF8;!<_{`Ba$K^IQ&IUCGCm14Aj6QnCyx*KcQ*O1i+Cnl_ zm!|iX)eRo0nz-~&=k;G?QahJP1#oPoi~Og0$~1SCl)x8O8DI$~0agQP_oh;){UwS{ z>3jdi-IKL-#dl@L{IW9#HWS&EKMvlq4T-`oTybCBRT{ZkZ<)ML+xj{W0OARhdv)Ir+nXg&_$oPuF~h(D!^agHj`Xb1>vM+` z_>OSazDatilMQF1C)ZgleMGIvqNpMA;u7{n2?UR(H5rL>g)RYk*bKdrFbNi{hNRKC zUb2D-i1pr9tl7k}FA7vxv==<7xm@LNf{nin5iCs-iYvj!wMD4RZ|G9lP2j>B`}z!i zRFaH}mhhxD1=9pzy3T2@8ib^Kh3raR;NUi`OfGKN)GKCLP=H2_0FE+X!5Nk^lVmUj zbL=D(?-GAa6_eUhdQk`4y`xPBH`lin(hvGqX=@*~Dg8KiWH=lY*lGf=l6GyOmvk>l0#ie8o6zXDPWL^j08>#3Y<#*(_2vm?&C&ngCts# zH!}l@4OB<RGDR)lmiY?~VaB zb1R)Lr4r9?5Gcy`W3$S4e5ICtXR2ex%F`Yb=uAXiktorH9}V5t$p$pUP$MY3Pl~8V zR$QfJ?s;#AssLHBR?8l0_SG|4uE7WgmQ7g&nbN3-!u&I9|66f73xYHjMp(uk{fyFp zh0V6+1R+%=`eaJ^2gU&=av|yzE>`fI&lc^j?)m319C*q1uxKKBd%NjwgKV`w-5-Co z?0j9Ekol5FwT;lsMBO`G=hTTyoRD@~2KG4!1+@)Wl9kwEYs{NHM$v0hDPuL*m3anp zBnP$2#N%J;?!qe~uz*C@4m=Z-T$)n()D~$ND z1d9(51G+_8fyFC})&!E+wS&K#8}%13T0Qx239wsah$e6uL)R}w1B-H~HI7uWH#mEH zU$fB-&a{}DHr5R2A zG&Fw4kT{5hqqk9=SXoMCEeNM}(yxR6Uj)GC#;~BhEm!wgQsGc%#iO9J|p@V1| z3n_{o5P{HA6Tqr;G7VM@*wVVSx?WD-&E&*2K8N{o@(5+7-Q4vBjuIf4KSKtRw0hKw z$tsdg91~Jn$ykt?_2lkEaAV3=jsF6XIe`TT6)XW zDw!s}GN(@QSxv7%wCocp9GX(QB_m(4l6kZyeB41_*Fsvq9?+arSO93C`NA^59nXMT z&}5nJmNiwB*b07{RtXCta24aGRI|v}UX6(^2mlDl%c6W3a%3xEkw(PBf(*^wANJY_ zauvx8gVkk&6U^jKKZ8{b9fiP@v%qv1<(RUNxr@BqIyaja&%W?6m~IJ&BECU!7{i8#>T$?ZQv> zG*rUaMD?7zF(0D)pN*mdiT#ftHKmRWrAkC?0Rd1(9iG1n4OU*x;4xdn?nB$E1kTu@==Nta6BPY=A_kTscC&wE_i6o$Ojb3Iara; z&>lAehQ{0zG!WV*NtMBhimHemAt{GAUO)JONoz_~a$M9m>Q5!P$!1nDfX+fpp)+7e zXDKNyCyCSXYrOb!_&CHQw5@mXSZWqJEVYCb6|+=374*!MoyA14Dic7+kTIcGH0ljI zKE<;t?UVQUV;k?mp=VWc zwCQ(`{;F_N*##m{3{{^#OT`0#VyyJms-9_@`r~l05X6Bk%`DM_E$vp_Ggel@#Ft4v z3jjfo$Z4!!Z=^d=Ns(V(ayl7mWXYC>?>CycNQeOohbElG@>fd2uo#_2f2CnmvMqGT zIicT#Esd{Wl*T6eJc24cy1eYuL?9i7#aT9!vXCXYXbM5QX*y=uMiVHj!4es2k6K2wR;!g+U0D^)pXVThkvS5U_zxHO{vGi zrf~6`@vmH(gB#tj`Sho-!qGT}EIoDDYr5c4gOZajcGe<@xzAk1KYrqu`h-hqStRV! zu+pjW9)KT(gpd~;0iddJ^ujnO`?DH<7B#h6uw<7n$>Js2(acaQ|FtFL_$?fz$#aYSmYDtn|ikeVb(Y4{Dz@&;Hk zGr~U%QhH1NK0>igH=1yY@`zz{Iz{OdSeyJqzDRtz>nSZtp{Bbbw zJ%&?0NoXb#j}&0p%S*}Ig75J!CQ(!AjxmhBnO}<4J)C;ZhdzJxR5Ko5>j^AKy6N3& z{bRFMx_T4;2?rz;0*n{~#`_SH538I3_mcHR4F$XpZGS8;KDe`oYxF)^w3eYIUVY5G zuFT}Rd?msMyFY__&+C0Qf-SqZvRyRj$WzYKHHv;H0_6N-xrl!>wNcIwDn$nlz*Zy3 z=3XQKJCCat8~>i;s~`RW?`cr5-+6SmN5v-F^@(0B`;_+cjzn&|mwIz=+f47b*a@W~OSU zrn;xP&v#Cr^Ep*981Ii7eu-qOPveTlQPtYOu||WJ>SEfj-ObMJ`-Urp=TojaLnRy3 z)`fXLgi(5i6zfyp7Jjbq4hp+{EWmu~yZ!Wihs&YS>g9yZ>e5(r>YlXS{#CwLjdKxQ z=34~B_T|;s@z})kPpl8G!e9mePC2D}i^59hjUSZC{mofVhdf}@`pZcN2GGQ4_WGf$ zog0QCPOYrAF?D3MrnhX<@|mnxNctwG`|rp_Ep#Wxh+Hg)GVxcoC!(!oT22KL|( zBSMEKyJc!li#ZR&&eHMUOne`;i6w5pPwqdX#hMiK4LeH832EU9%R~#h zt-yXTfg~KS-l`X)pqjqQWc(8wFT9Yr@}7t&)v6qZ%8h11;<*qcfHiJ_^m{LwH9 z!;(^NwQ;hZh@>R5Tswv*j3ry2?r#qB%p+jvMNy`*1+5> z0ROJ0`JF|^F`(4=N$|7GTcLjJ+L`D7#%BetZD{HIJ^6=e)tG@On5ul3L?|d&56UK| zBRJj$mB=VSFMQEt$fZUgN^1l`lH9acA~81^HF5Ml@p=`qb-5lqp-akQ_d!arf2)4* zv6~bp`fojfs7Syk_Wq2#Ax0LO6UK_m5?AD~m~_#igj#|!dRe2i+%y67mV0Io=0}nm z|H9Hq$tS!KQy-NS+=~dF0Q}UjzfFj9Kc70&)bHNXVE)mUMMJcE3DqMWTJ3da-EGXh zEecqFsZk#p8h90}`_BHPCR9%z>R4j4isxG5OcrvpGz{_nEE+3@F-@#VR3uwYa7!je zg;lmvXT|D;7TI&^<*+C?&9Ay_KbF4j;{%jlAT|(+porBvvNUt~JWZb>QC_4%e;qgV zPt8uv@%jI@mQDcd8&h%@qCM3~<0yLU=Au&$#rP?UNDGD6HACMW{F4Q`W6eM7O7`>) zT<@m$8P3UweQ4rRyh-isvfO29+b*xK4EjtM%b*dq-b$t~OI3<7BBS+khR3LKPs1Ej zStqr?S_^rWo(OVq^G8D#r7b=CvYczy6TdtE4h(1cWurH=yc8c}-k(2)h^qT4Gnod* zPQXq{t0XFx6%w(kqNYs+28=;h$SO}V9s4dM{`5=R_p9pYMAw4E?`QFyc1pX){fQwkuML+@o<#sxOCmYwTiAg_uaI?K*9hcDG-Ua? z3&pi^wd6@S-~gN>>+AL(AkqoGr#q?#O7(5bZtwAxoSweVG8gJ!u=)wn@Y)bB0o{fG zP;&SZ|L9ml?KOsxs=rrbc*L6(xKvEP2o>e8UOV<;0GQm0jFRI|kG#|%(rlSB)fH`W z?m|7ps$4T#6ffJ%smte%h^i`*EIqGbevA{|2CJ=8|76OCcm&>Gy@i8LYR3dSX6|Lm z_1q3g`%tdY4?xD`O6>*h1j65rpDQ}Bbcb$q6L3ZmIkb-&v`Ot1qC7j=B28)K{UtvJ z9bf>&u&KdI}0zHs0Y2wNkZ6-bkMEyM;MSouz!*86Jl(lC3 z^&^}_%gP}bn`x*5B`)zI&W5n{eel+}+80iSNWI6{Xy1Qk8?{rPMTXp4vw_#y8D6Oa z$Ra?pY-9kr&+N)0NpOg;6XMW*9!W z7EExt0ukg%lv{@KPG2QDy(rZkr`Fa2%2LK`e#FJc=awLacU%b+{{rO$L?aoNB+OFjWU=vY~b zsjbk*8$zxeeYc$<`IYh`JEG7V7A|y@OTi9;wt?G{7z-La<`*@#S(AQ^MM(Bm{V1;= zQQn|_P@K2zJqdg4r@+?S05oNl$`PU2;lfA3>?i$y)QhQ<;coMY9YGl{5bcHnV@Dys zSoSd++Nmd_qiSm`thbzL1|wlD>HJzAUu+geT^sVVb)Gi9fE3wyS z`2LlZteIYyl|RqU%7EUk0ys$nW$6GgB+4RkXS%xcw&Rb`<*Z!Q*DbT8=+t^o=L0L4 z-KGdYX(#f+g*gKKJqJAM{ zu5H1|L8d50g14|>?Q))R06#Bf`4P}WH z7%Y8X>u4p9L&;V2)_aZ*;V}-|rc}p8O1d{n$%(#Ff&jTpnjJU;Yl>G>gIoP>XK4&(zY6iG1V+x|`3Je@+{kdAw1p~?n>WTU5AsqC z$#`Hf$^2u{aNEm%7aqLHqaHbD6}dnp&EaF~4B!JKrHD9Pq}ao+q>@>M{-oHEpxjZb z6$VJ>^pC7Mya-aynr;F2%DZ;j;W*WGZ31*AvKDL&zXjhjulD^KUy;uL?f*+1sm0YC zpw3cZZmRfVE!FE`pzwW<{YLozQ!QW|2g^nxbvk?R`Jb z(opMPJYF)^g+csC5ztl(x#QhKbIc65`wPu?GI8vz2=UF%q`#hH;?xW(dUiK zoGo^>j?ZQtolCdeYS&Bet%k2XHH;0wv*Y(Y_BzMH^vQzvnGwc#kc5Rkd2|SlUgm`NxST(=Gu!zwOP7Z>yzCh9lbc?xL;Rg5yGtcb{01 zB=KLDPlhfo+YHYi)_J_V?oDmShb;nK>N?u|ADK-t=ZzbY&q_c%4&);5))6nF zgU^FCI$MM5teRW|UGS=heyficK20}^(L3YY;!Y#QQdhMd)((+o3l+wr3#k>=xh-1w zq$fA+HjR3vQZpUZ^>xdDjXfeFN*jQAYNRTE)RNw1N+z9B)~9>T_i5qL zG?EYZBW`K^u|m0x&yhNCbF2N@u}OF0D(FPF#qh71#NLx%Pw(2xD9`Gdz!}2^f$IL# zLgQ1znJltz6{2t0M4Rot&`P)7)AEo>?IW+Jon~|A=F`NzYsjuK1TM0H> z;g*qCtFS!3>kUChW=^QR-!CZl;={Z3lb`+>ZpouY^05-t?K=SkLSs|)d_OMDzVG)N z8q^2`zV|;^BnUF*7i0v7?5&y|FM^y(MeR~Q>zRFwXsoi!*F7%EO*-tG0r$Rnv>W_= zT!Abt9lW;oB_+^@G~xZVl-T#O(2#|tp=BrXh9K0Cxo)=FBqs$>7w@@)jv<7P9}Q|| zJG|fCcS8a_o-N?sxBHoXzL^$&;)a^fHR?~9uRTMwp+JJ>t)~cO8DJtywO2LtN|ybD zD-{*jJqZ~BM=6;VpC^~+OV~U)IW6x~H`b$f3pMYyF83LsD?byVWwpBcIaHGfNo_=L zf}26@J95P`e|5ip3x9$9Uq{=&H@c0xbCZs3MdL8iEAZO0zkD7a%$FcM0}UI$*;Eiz zIht<;ITC7X1DBpZzZ^T-+6Zrphjx5Zy$_*)m6oRQVV6sdwZ|AFF1nO-DpMju3JpB9 z*i7pxHEWXCva{XBiP9E6iNz9n4q;ti5q;wwpD9Bl)gtLh>wBb4NSYAR_vDT`1aoPr zJYU^oYfm`d@gogyT{m>CH_j(wL;c%MYYO|3Ac8f`Q#O*KV~-JpEBK1&!V$|4po9Jx z;@=5GJt8WnZse`^QHC#2?W)dAT2B!iHAWJ#+x5K5J#^Xlc_*`HZ@ZPhS3jFSES=uC zMRq5}83KLfq&LBAaY&n0AZ~E|d7oFxq^)ajCV|bQZ+=9vO57c_8DJ;qpALCBN4Vus zg30d^u=z-Sal-M1Yum3oeYf}?unZXLQhq0(yi0J;MRwPFz~DGn=}Xyqxq5cXQ_G0_ zuAQwIDj!rOp~E*#Ca$sQ(8oREj@hLF@ztA(Mp)vdtGiCJ1Q{wc!tz z=0*4PW2x~!*MmQQzSxUz^%Zx3yclmdCBR>ui)2;dp5*n>sOl;P0tlJ~d@kz|JfEs% zPQBUrb<<^vH1zmUne4}TUA^B27SF7iXg#*;sWdnFEVZ}QpgZAAb!yPs2>4|P@NgK< z@2uv2XYh-M$PkKU?U|!0Gqtzd20o`R;A#Ksp5W6IPj@q$M_3txU$@)WnOA6!Y|?WD zlxqEgwuH5*giZ!jpJ70d((p4`;GR=9zcNZ5C`bZV!=>R&8EC%Bua9pt6#bOpLBGRz z&{{e5GB@r4Va}m_clBGdtI+8I?>kQYWuK?_Z`o~PysW#V{joe_MyIsjP;n-6waI`U z`~^kH<6n)k%f{sIBy5cQ<~;Z&!6XEjSK`i3{+saXQ09I!uSjA9!@OHA;JgoXi|oJ; z@AumZ2BcX$O26Ld5rt16j93B+8IO;f31Fk7lYUpF#m?)b79ZudZgB93>@wnNWwz?` zf7Q3exAK<4j1Gzk+291Sy|1hsNb8RP33P!?qRpo#P)HBv5GVV>ARNAZk&*-HA;T;9 z1uyo`XH&8`LNUK&dJawhx4n|X9ujXvphx87B0v5NU%omPf0+|1O{;^jdS65G6BIO4 zO^>)xF%J|#BQIZODJKc8Ru$;ni1>;7c*BE7jrGFf`fsj*U4T)(a+MK_{`9q+DIWbE<$Akj) zd!~rwD|e!4_nRzKT>ARy1%>)>@*ouFC{d}^4p{p5MWmHNt4Bd2i1L zDuL2$?v7xqtTAFWj4vJ%{Ur#+D1kD;IAWJ6tJk*YZ!+kG!TkI__= zr*hj|W`Z3i7!%YVsLjvUIEt`MfpuWUHe|cSS!LZgaEYx|;`thn6#QJdnz;74F6X(Z zfLr0mIh?VhxSI%Tgje~Ll7aVEQ$8tM^dDaN+v-hboKknTMv>LLgKPjU98`Ud#t1H$ zV|jF*V8Wr5>Gb+=M%azzKK-BSL_Hj;=S+$ATuQ!$Mi6IYO)O1)P`E#o_*=EWX&KqO z$x)i>5Zb)pX{x{p!qCADmUxGS-)4wk~QHDK_W>6D~(l+JA z&xZ5Jqb@*etJhJg^b<_ngxL;K{cPjmD3583`C+$7W<`d{93mw<(u3{H<`G&VWjHh+ zQzaPO5J4^PaT<4F>&rx5v^Ck_dIHvWC4POnkJu;WKip*$iAFxS1VEn3;LTQ;Yl=)h zNZH69=<{j>D>Wh(9|NJIg)gyEQZcuW{LA;|V1XMjx+6Nr^vR@L$HlPZ79w3>WaUuw zE$%!2E37T1qC*_so~LMNgDD!mrdx(CBZd=Qa48H@&nyd1!hstkuiV!cPh0J6WPxDy zFtlgv7hMNt6%-YoY<`GqFS{zWI%(i1XK&ZgC!B^R2##xZS2MPf4@5&Bgh)GE))m}dNm zjg9e2u<1e@Pt*o8tG7VV30E|T_FwV77>3|n{(%?dm=U>QGrn7atW3_-O+Gq?i7ygp zg5ghMgs-=X)56|r3>qUH296kZrFnuhVgVAfLvSV{iCiR-5fZFa9{3+Y(&WYYaGpsO zO=@1CVA08})xZiG_rb>Wogf1PT$_E4&6ER*(Pz z6;nh5wOz1bQ9CaG8#rgd!9wI=E+~1)Hn2pAG%?bYUgk2hmozY3Tv&a@yz#^2n6N5R zQ=YM+xI7DxpeFRlfHh;;RagQNYOv~BV>)XBc?u~)cV2uBXO_a)_8_#_fsAu3OEkWI zEcRZ6`n)+mR34373VuHb>{kw{%NUU-~8G3y3K&da7x(*?F{sNM?*g)KdEV(8W=!DjwzxM(cT|NdKNV2@@P$!XmkV|ic zGCPw*dJXo__qZ;mAZ}=ajEKrK$@C1}n30|qB;1D&YjHy@T@VFG&x!^rG(-&2n2RHP z$RNU`CE_2>4l{%nD`<)QU-}Cg`SM4~;Yvsn`H{u(<0M)oQzAc!+XA9jM7kXk5_Swy4v z(~~9=lqgdqq}|bglM~CC0e^GN_QBT-=+x~U#N`S*hq)vgMcC+;MHKovXMdrG{6q{; zlsZzxq>+t8jv#~l_WX+kY_yLogg-Cg-8*?>FDD-0k6phtjYKt;3l|#}tIonl`kRmZ zWR#>IgG4bDD z__D=A_%|mYP#S2O{k8gC?(XZU_qCb^(MYt1Nf8&nS zK(ndIIYFSQ3SUaR6)nT!KaZ*s@7Ll8<}%7YjJUFdNRh6MIp)^|LvI=f@{1ZE+@`QP zx^~9BxpwTC?p^QY9KaqCu)qS@d!KS$BY^Hs!2BaPjy$uV31Fb9wm7GzPbus**<#qb zvxu&C>6BugMC60#>-2MbUBQI_T9gLmBqchw8(o}V(qP=S#@syxlz`wyKK|qGDpaXb z4f~+LP=y5kQe{uoc(O<28nRk=6$(pOhW5`@mdFkx= z-4l_9D-DCtv`Hpyq*&Mo?SX_)Dp?C;K@6>ul1%Al#m!bJwZ4VKBau)IT?>a77!^EU z$DF}ZnG7E_Gn+S$`}Z>n!UiaBj&WWbnTofX!?gIf5D70oAl{NRH!53Zyu|z*sVd)h zGo2cDYyMawFDIO-fa+8T)FU6Xm)t*k*IH7qF&z@FQaDcaZ&bZ%012dHoWW$$HS-IT z5{=#XJZk{P9N%AJ9VIIf_}P;6ff0wB+msY%a*@tiUr_beg-cY*|ALz)dR zhW4DYaO|3ooA=O!CgtdztFAfB&ANGp|SULgvG#`bP zyw!aeaf;~?8WMKcK#(z`f6Ot11&Fdw8*~>KfM9{?gvlV%0^ckC+G|f0?C;DaK$h`g z%mtt?h|1F@C^?mJrcuD(i$;#P0^MZ_DC7(kuQ^3#WjEL+qy8-n{37WIf(_+7k{#4* z1JZ)bK-L4X2tBw2^pfE6haALPX@=an=2%jU#D7OUjVsw4JPW};)uA;Q*idFovyh?| zms58L;smh{Nn=W&CAew>*?_q}oOTuqzs~rpZ*i{`@Z1jC<&yYp?+HSZNs^o=?gM(% z{hwoxGPRi--}9WZpgm^1x&bHXr?wmHu6@kzV;ig~P+ngn3Rgmp!!s^=Etd;oj3x^H zz#!FkkhdQ;ApzPmUI@Kl&WXJu%+WU+!n^9nQGHMfOjvYg_{P6?SmeGEb~%jz&}lh1)|0M`_%ng7aJ8ofjLLBn|3?3J5N*wJwhN^IXW%=hV$6Kp$c13vrx&1 zF&Pnxo`yldrnm;$i5uB5I*GxNn&f+Az=foObtT*eMM*gxr%~_3&iOta`@j+EnU3-T zsk*i+lg2^g!v=1nP4~(H^`o3p9Y8X_0X0etNPR-S(Wxyk7xab&P1?;8`R9#!V+cJp zHaHT{vG_$nKt)kAa_D11(xOo9GVR7J@?gO!>!Hdmra6a`!^zfahz+eGkx?FC+>Fd( z!;BqTXIvY>g2BPG&$K3(r(EH|s;#S(OJZf^Z|JWE;v-<&gU$ZZE#U0D3sH5XE_QAG z&X)pJJ&Bq$=vQh+M-gjH>AV0>kVvHxW{8TJ?O&SA8pAPkc4XtAF%nL~K~_Mm2J|H& zm3HEh7o@2`FkcR(#YfFT%4n?;Q;fGIBgNh-wNPMOwbtsl%T!xn<|PCOAV|n%deR8x zqmn}^5OYX@(Rv4+5t||)vJzlh5K~~OjBCt-ba@Zxasm1{%~zCHW-t?FTJ^(&;-SQW z>WGMuP33y+F!K{Ea3Q1%OJ*jM^XP_N5;~EA9f>gHg&>Uk=75>fz=l>94rxY6lqM7~ zS$HhEDW_0CU=Ip5LDMBg^@h{SEZVFSAKgV0tQw6AVHcbxdbOjX;v5M`Tkj0ARwlsH zU|+(|YsnM%BI5%|(J9$4`s{ zqhFI*&(j!!Z>2~G57feB$gOX;y?LNSVd9Xk=hVZpZWne(%KucL$qYE_(EdfDVnF>kap{hYM-XMpm3Aa!y< zu({LKz9IR#GcOpsTke`*B=lQi=eSYx!uH!~ctzqiTdv{Bkf?IY7xbX!^Zlz+Yi*teaypLnFEpI%Az)7Bn7rgiw7s*zKRyy|$IF^l>< za&P)L>v*($9k>~IDx*&|Mao%Zm5`2i_JZ6_jUDd|Lnl} z`g&Y*;O%f9xGzgox?LRqW!CgqOzU@)s{Qcq^7UX_S@({(InoKAZIicunnLH_!P45B z$%ltW)0bbQ?WfrGQ0aMH>W8`eLd7FD6G^)v-2OjjhcD(wD__^BP462|kG@R3?*~hV zx8tkp?^^8!rGdDHJ=+?7bKq8#>%m2S9@96I2)E*$q;mN2WwF%Jm|MAHKc^K8f_7*p zyN`;^cd^a*GAfr=ZxqEyvyqb^LIS^*QzaBNZ$?V-1&vE3DN$%SjB09OMKx|z*;q%` zqB$2ktjNV&y{8GZ#E%Ik!yixgp2vp4vLYzIMgf;5PO!meL!}-WikrV?Hr)n+EgO}t zZlUXE!pxzrfX(4BCHjHv`VUT0sv1|#`%->lDfPQuy*e%|n%uF;{poG?YoI9hXy-z~ z%`NBtsIBrF7-!~h%m6n0#DwNJc#Cu|$VkIb*+qBcy>y|uQ;T4`ZHeX3x&sSoKzed` z*Xx%%l%J0)%Yc{ATSUd+{X&CtVcV(>5;B)>+0qK{h@0Qn{szPM^-?N>uHWsW8bgoq zsg7a>1vK}IjsfN}#S--scUeDmD)dTAvAI$SG|EJwkc`XP#F|5^r+PHub?Jx?vD=G7 zAMAvI!DX!}pey-MUKz46^`sME{BWfTxqPNa%(D^w@0>xe=jHfZ0MF;KrKeL1qTBOv zYNs2o>c@$;py4@X(qr*O71*{#yoxKgaNK%~*zd?GeNr-T8yuHQH|_TlxeBLUt(Q~t zjk-fW9d~$;>d>|6+stA~w4}w~sjgeiu(7mn*j0xS(l<0!bHu$v_Z7X3ozmlj zqQ)UkG2!O2U4+(hwBp0tF*qBSzPi>Q(?U&4;K#A~XJpOSwF_WF2We)hrnbFU|6Gqo z>nm~2QE{|H6?$!dtJg!&XgrKw1~_A9wt6Jg4l;cy%+#bBaoC%KMe{+Dr4yI9p=OW1 z6dD@Dt;7=h6%`O|y0~<6qhv*R>%1MMiG zo>{Ll{p#2C=)k(au#6-@Iy{jmNrOw3b5dmOv+i`9Qzv5-#e6M(0NHt?uzNP($RKw+GfY{ZS>|a zN8EjlS`^zD@02jJHlkOwP|?swnX`>z>*v>z7};}2(42@9PaXe*6b(~{!|?#PN+p*Y zom6M^yEIV?Wsdh3@~6$NV{VvEi&fkB6rdEXo)OsYZ??n>q-owP_V`F#Ko0Vi3|@v! zG3A+fx!)OqboH__LD~ziQCu@4KaFbV~J^3d4c4_CB{3PoR7@H96ur{o)FH{S; z$rfb{XXZag6jWIQ6yM9Kt+U(tA8qtPJou%{xRTgIH$iD0u9eRiUq#QHIRzJLrx^K@ z63DPDw!}(YU9NN+Wb&C2>{32Ga2!1lCo17vN)#T(ikq25ABw25WC4mC%NQah-v4Az zu?6JK-Dn%eeG8S%jWUsdHz6Qu3dC|tYr3qmBuP((XE=w5I)D2%=RE1vuEoBguGr0& zx607;Uwk-P;SLV7SJAE459za~bcrBQs_+HGtDp#us2MnMvTll{?Q?%AYP$WnS?GNj zr)g%ew~|lB5I;h}+@sbZ+{@plvy<@-?OAAAO@4_e_L$Vehs*lB51k9J2oNk#tpmnz zNT#1JE+nl$l#^+)T3qH3WsKJ{G;wTP^dxC-cU{(PUw$GT`aE?Y3M$!6sEyOFSWe;L zS#2N83q+q!XZLPvBoA)b|Giwi{;_c{Q8E%LKu5GGZehjAF>a?AlN_`D(^!ljli%yonXPT{c=y8^@3gVIsz%Bsf zdChzbp?VR$;CVewbkf`hZqrgx8d&fj_m87#Y&_t#{uJC&da?S-{j?tua^~*ZIx?u! z%yL-?r3!w$JDRmP;OG5E!OHAmu<2s%TPp2XjQDAKSMV7jEW$hO>bm^(3ZfndrA_f$ zy&Y&!15Fl^4zZ+3RD~V2DzejA%dOb$I`2!AlL}6*pxkmFr!S-OLtJ7q>FNG9>Fxej z-70$97HGL+TvOomAZHr8Va>JHPeuPNd()-xyLi(U2&lhFwLN3ePuYeYC^Ga~uygKm zj{lE1r!^27<6on`3aC$l*!21D+fu5ZlX~%klf#BNoQSVjGw}yM-WrrQfuftr`3|-( zpdhcpTdhT}9nbBhOB_7geCfOkZN=g0eMmd)xyGX5NGn|R9x0oZnYq3GEHL8{HC#RN z+6OId*N<1TlBGw*Xztq+o)(WawrkBIl9yW_^v`S@Zhqb|aERwFiH=qrGj1km@=8o4~vt!ST5}=OIVj!RYIL@Vfbi3ohtxS_QsfD<4FBJsV5~ zwt;`~V;I4#o5x|Da@y$6A6#0BLT(4LGHlv}dUOOyIXy2WZZ#epb*`b|$Re%rnyS@z zm)%Z*`QyP|m|dye^gUp$Vg2xZor4N040|L6>3YGeXF{1_%u6h#jr#H=6D|7`c_a;Q zL_k7wZ`UnJR9UQ)7}o?s6AcYP$giKzL!mtqzVMqF>r4i1g*g!C?kNz@s~OCz@TE}! zGSK~p(xeLqkNAx{e5b5&hh=vt>T{T}&JuYjy5x>*>fTO`Xt)fP!G>Xy#7mI6N3t2O zRN#K+{9bUVlfCcbE@eu_Xu?b&cwYa|UGAWmW|__kV>(hY8Rc}uSVyLdHIhR-YifK2 zx~x3bZfS_IZ!z{3cNEMMc?rOxr>h7vI#~meuHZeVrlC`o35<4ZruVoJByJoIt&PC2 zr;V48ogxMolGWBh@8PXu!?L|2Q%lHoE4+1*s)UXS%UvosMGDt+T0 zN%?J+5^kX%Qv$)X!HX?MCmpD;AI-dGqMr&EgmXeoUeC)ER`*oN=0p>zLlvdJ2T}mmL0vV@1u+DWg zq6RlBId<6!k`D;U$bzAufhsqIOPu5fX*3kIKr$o^)TUPzBtaZVpmZ3L9#rwBX7xvm z4CC^GDX;br6UihM##hJBS`x7Xx}QT?j;gppWex#fN0Pg5!`pLbe1$}UrpAw`gv56r)1~ZK9ySpq)ZiS<=7h!x zOEZNPs)j^eWmbv7h&v&7?Taa+j&-c(gNvLnMP4mVM;;k=ER>sNTC-PR+>gj8!fmWK z9$Bt8OPvl)FsNk3337rD-!u4SA!Pc3-4XZ;CDDrL-JH7v3?+8BAmj+DVaCym0y~to z0wo2o98ZBl(}lhH`)5FA9+oCy?Fct0iHOz=W+|8FmPavDFsvrJe;6oG+%lQ+XVKn{9{{N(n>o1a8{{ zC~8EM5XF}hqp|6ngHjw3Z|ZsJ64i+9rcrw9DbZPq9{x&i{?M9U%S^n)4&$;Cir91? z;)LzoJ$#VW8AY%ZMY}_O>FXJybMZ?D@ELnF8NulL?G@}j$?z%Jc<{*0dp*VT2pe}` zkz%|W@ns}s}BbU49QQPa&sS)C*z(HW)o5*r#Oh>F+x z+~=npNmTd!8=}XYCxnQLX$#EBpXza`Fn@4O=4d$7cI74F9=M*!j%hrF;7~c8BzA=~ z)?PD$6V;|7-fJp|49lQU!gjxw%#^D*!4)wN#aUD62njc>Ib;}#>9t0;nCb-xP0cy& zLIZl4qpqG3sE%$!xu;#$xgy}QJ9C|L%h|kH?Yt2<1VVLMUhvH%di5Q z$I3~5fKABGjKP?#fgE9ZO@i#cuK3N+`0glOox1#T)N*je?wo+(VkjOuEjH-s^@7VL zoa3@#%yL9Scq6VAaU<3a%S%OYQ}_bGLD77Cb5;tvJAZz8*gX{!+KpN;ueqB&)dCoR zcIkeYXh!W1v59}rAA=>(CKiBnbVR$)ndlSXgWHu++cs>Z%LrZ8=X&@uwETefkEtD* z2j0zS!7S7CS=?0|ftAhp!Sq1zorU$5wIH0|xbF%=J0z+V=l8#jrG&zsEPCg}!&lZd zaC&PL57!15=anYhcfek_Fk-Qzu}Ee;O@0;jQb$f#YYs|rKYZaPnHff>+cAYf7g15D za#$38jHSbQ7|I_-*S=^?JnVh*8FUO`Du6?CYtrHc(Q-UzHf5R8pR0+4$sK<5Jlj5O zE+454SKMIV6fk|~tQS1>mpxEikyg7a_e7>|g|p%7+@dD~MK}_27F8^C&ShYB`i*)K zEJocU*g@gGi$06}n;~3ECfH`kwJ%DCre|@BLbx6fKTr}L`>+WE`VrJ(GTVefGDyPR zO`~q3BKu7u958Uy5sH%3K5O6?!cpSaf8G&1W54CpCoyox6Yjm7LvPc{IQqYg37`yGU8N=#A4i`zK_?cu3)D2{buhUL(H_&v8dCT|aF_G`egW>}pDT~3r zg3>+>3&STyWg$=^UwFijLYVvV%ibemub9xnAa`vIXKwzz*D&IJ|ITM?terc5v5f(bP$X@p|K3HQs1p( zmL*F~F;f7ch_qtjf}kqYjnhvQ0UeA^!#rw5hN$UR6D}Xz+w#ISMed2P$FY*I9+dA| zHlKtkL?ej0-YwY2uYD_Es)P_^)fVHGbd7*s+VD#YCu;3~w`1e7wDT2LY_?11%M!1JHiV8 zV%jBpHnP*8IvuhhHVppmMNTg>!HZ5;U!F?~U&7>@8cYj+&cI~L$eU}AIrcEr5jQGc zK|A*^4NBEV!QmE64|ll5Tb4YKD)&XbQlB<&y~7}{WNscxDB@-rQ6d$ zc3*`TtI*7rPzj_9@j`+y5XS5Ibf0twj2I1DF?pty5f!9jBVf-=e`Um+xPPb~Fx3|u z@c=R5JRt!8s>K+ybMK>6#d7-LHWe)hw_4fF#tBJJrtVS|{}OL~StF%K!X{FY#EsYA zaEEnlHhYnP4EjBoO@ownNZA{UA83S(MZkx6#q&6sB| z0Lce$pp;Z#sG}jhUnjiiWr=Da40Y>tD!D2V==K*L**?*q=DjGZrjQx=z(fpk%O<}# zV3y+P0&zz7D~4YT2SGtubD z^mmShGa0Prb`B)90TI;?&5T?;yw;-#>eR67z3fCR`&!csg@qA2s4JwXjU%%_an~qlaZ8 zw#*j`SEI#b>94n)WAv!nhWC>L z4dhNw+$WP3qs3(f%)RG;adHy488je~b9aN$Qa5BI zwqEqHrMLd;Q+6Q5g|@V^J!q8Qo^2s0h0#i^Iaaqh&FBcDmMA0J(J3YBXDPGpz*6#+ zi%El0JR9h;a6WPr5Zs_OD_F&aD8HrYA0j}5ej z@Y7bK27r7>f{22_67WOBl<_}Oq5&{@5bnI9V-m4Ktim4$!eLP9_VnuSLSdl-8Dk_i zcboLVkQ@+KH9@-cuMZTh9}bZ)e{U0&K&fvaM)q+eH==_5VFj%ddLBkBAIkL~iuOWb zrP%mAEu*A(!#=8)aFc9I7$r8A*Ct@;EinJy#=(X&=q*W75vCu#eHDj=NsA8#a*|9z z;x0t$9p)(|7HBMhs5NLb*J4}IwbPjcum zUTlSU43aK2kU=QCH9g^3=n0ZPi}+Hee9-;~b#}a)5L!eC^AD;F$hb_YN|+=&d2s-# zcf19u1}kz&cI%M)?2852gweOsiXFYYI6EnnY2ZSfC>fU@nxf;!;yIOZq7Ybk5@g|^ z?;qPZeUUd{l&RDwRYP9mj>1lu3jcQvr<&VRsJ&i2f=yrMbkZ?!$xY~VUZi++f;8lL zImq2OaWW{b!;~;(0c5qiW>zd2C3L}4p*RXGvB^L+iU>hw%65Lzo;yzwYuS%A ztZD(pS-Jc><;KH=nTzL^)T_@YG%=ccO)k+HIdUBr2)*kqJ34MFQO9TUQ*h)`fS$f) ze~qBEif8PU+a^6 zZT}bbQnZ47DnkBdCk^_M*!-_Dg_%XXverz$=Y31?lDoIlkI#OX1`CYzrBKszWcJo? z#%6lSgY~OD-vI@tLcO8If5saL|7JDAFogZ5riX>@5WQs*BG@8ptU}$962AoQOLxlz zTwD7gEuu;Ny+dcE;+7QlRoEId}xsHiDEOTXlW*$|#7b&^khXmT_N$%EmrFNnYoiYwlI z*A~R}4pjYdeo=fmigiS+#$W~JRF~Z*!+EX+kx}}4r39{z#Lt>{OORsLAI~xs*!Ed; z(TKx*Any;7_-T`vjJq-JW?$M652nQ_E94ke#NZjI7Ja=@Jl7B-3jNCdCZuv+a5_OM zKWBgROy}tv`aRg>_pZ>XJL82(+tSmWS99ozfYfD1kRG*tZN7a)eNhAIp1!pC4nS^Q;v?&mg!=usF3WU@O1ENSM@nQC=z2XYJaCG;Wech_H?*RLOg)Fuk3oXmdEPq1ZY8&Fqq|+neAmA@F+&b*C z6VgJQ=xA{?}dt}le&J#V0o58PLNuV|CwyJpw@}AkP9Yz z1R&w;p#A-uC-3r$thaK(kw+XMGntK=oDbKE(7rKXa-4vDkdmq6&WIQmQ9T%Tg*g|ICG%Xm>f;NP9=!@K&eC zcO&S&!{uI~&>_{5itZkI=$2?VjDk>xVY3rDi@4q_Dc+ifc4_%{g#lS-p?%(&8o~j9 z@ce_SW52T}EW56H^osSIIje5qMPy7O7Zl$}7l5bg^tgX57jWb~@35q<|@C(+80(evC#x zD9$91(Q%TsrhwNu~U@MP|0Z|5Iq1mw9m3v_hw-K?!@DXNA&o&?|MyP(m zI71hc^jpgkgBC+1Uc#dy{E;NN68Z&+4c0^Yl~wjf2w|K`3TQ0Nj3)#p4Dx5X-U-&; zx(UfoN35Er0Uj8gbB{?gZ0bm(&tj#V$s>=&Mcq3vrgp_8dNCelWv+S#vK&}q2xdD6 z+D{DT1oBWiEEy^481fIj;dm#|fs#7O1_TmTm3>#vrRSQFw^Cy3hq9NK6T;&!u5J@h zshTOlqNN*N5>iOQo2Lt)&T(JDxA!-$VVh<|JES`FCPbVa{!N0FA1m(lh~Leh$gJIk zFRUvNN`hCp>=m*23=gblJwRu>?vM!|+Pur2$6=b)N?4C@&R`sk3aaT=H!DQQrRv6XOR)P3OZ_i)r|;CuV} z1^DMNO_0Td-AAjN_Q!s$=)Jq>h4P*=a%XII@0WnD-Kuko;78mA;KUF#7W*x*@jb4x zqabTuAr>NPk9IFu`(9^=+El?Y!7^PVNP_H~igVkdXjtNuSrs;0;BvLF#)DI;W#dUT zQJ8`JF)(MLqOS6Ht5MY&1fX~hv-v4rGPlbb`xA1W!|@UQSZfp#J|>$5m0qZW9lS1+ z*rTdc6{|ntVXje|(yRiz_;$i|Sx**LcNKW$^U$AeKWXLzPhmlWjXR};jj~3ed}p4X z9cr(42Zv|iDl+q`-ZJvPB`iW^rq0_FxMMrP#ST;bR9OI4fvs1xAfx@dae(pOG?Xz< zJ|#BUcoJVBKr|iCd_Z__vBnj_Dy9j~=+#N|a;X|Pu{o=NR?I*e%uWGHG%9RtGp6<0 zZEOCds+&vuinM2(o>xlq)oo%;JTSLLU!KK#y5zuP($jZ(dmE`@;^uo?IImIG!;G9> zxqoh?moW_o0e|*`Zst(inqr}_Kj&q|dW#px9Bi#ScWI+Y)r)^r>&3NDi#p)?-}4+j~WD)%KzRrRx> zudtW^*cD5NY*iPibhja&9LMmj_cure+Q$Xaaf%tb4@nG)zxmJD01}i(GE0-bd-?fu$7h96 zW2J#(mwpBUXn+nM^OHjf(W_Ln=~yi8*G{ZA?Oj}Rt**Ht zTN>wZ;zpze(JU}eenJIJq$c?CMUDlg0Z%g%&lZ1CDIYzDGsb_x;3hf9%SB^v`5F3b zbk6_&oCL*_oo_MP4?t+Y_kb&K8WoK#xr&FzmZfpW)wA^ZiclEd!I9f|9v`^7bDN(B zu3;c93}J%f!}ihZ*qBFB3CzTe_PlNcm5iy0-387^tqxO)UXEak5uQTCWxv&(WPy7D zdUJqv+J!z^GAfjqVS3SpjKL8EUBTfWGAbN)9%z51z5I`}1f-j=R3 z%(bDCc=8t1DUd+)Br+@L@jz?oWjJk zSK#}t0w@{e14jI&A&s;kLfh+L{?=p88+|<9p|sGQZHrgmZ{Y#h7sTHfO9w~k>t@P2 zt$5Z?sTrFTZlVU#g28)fHkKUOKC*$iU_6p_=@s@od#kt{Wap zE0=io7&xmjSt+1Ih}b~wjD~)d#NON#3;98yKPS3QATQ+6VCM)M%5e|Hm7sJ=A>dlB zh+-~tqUKpLwZt(hcx}_M< zbsIAg)o8f9In#vp%$sv`7C_oKz;mF_pvmexo>~;~?3IGZ@&N)Sa z?~h${mEw^%Fjyul&cP0qc58nO#Br$WEdc?gG$zv=)M~^Pswsr`NK88KU-L6qiSLtj zx%U|e8;j22mjlP~!@x%h|jfC-`dE|&^e(G+|bM`6Q88oQJ z5}mgoho_^84i*T>?w&;(&k!p_*;=zowKDrVC2T)@;{9D$cSmQTn&=(`{Js%~9jr|} z&78ECS%Kd?* zbyX2?kc3i8koPlS16T}HU$z905r|B4R$5U0gW5Qhzh?g0eYVzWsXzhwWRZSsCvn4& z^}RsH<|-bX?0AC4pN&4L2VTWEBX@GaM;7cb=anP0wQ`R*VC$wQFQ!Uv&bbt39eT_CT07_ z+e>o8X03Low5_wHy0g^)FN|Ta8dU~-hecR$&ag)&nYx}*zv)~PlOP#8?NuJ|s$_k# z6Yzyurr;FFs#vJ~hUoUTmq)mzov@$2B#mxbbWDt8=Jd331zhjvC-5r6+~L+N3S3d* zH!QCXQdSJ6g?jiAvFo*`~h5PHIA)Yj` z6HZ`FEE?IiNK<`URh2{=P}3}M{JerbN16I;Q)x3G4$wMm|0$p<)o*bLzjT3kX@sW0 z>y&wT8Md>*cqGYllL{rka~O*!xiNbS5|d0D3SY*->qaydA8Vu%f7ldBJS6A?p?JD~ zFY6Gq(uEgQ%(sx6u*$;y`XEN{#&tp7`zbmt`$!8!O zPtP6yCacYwDkZ>sFhm{WshO3syUF`$~W)2E3c=^V{HGA?=*(Q zT+TW2YI803`4q|Fpo`Sn#Ub6pfmSJZjcl}k@7c!%tsyG?Abhqcl8?B0^By2s>)JjoCeEtZN=V z@>h{W8sTd3B1Ds54(nL*4B%C`-v4dQoD%72pbIvITcg=CfTsH!Lm1X_XR`uj$+wP0 z@wQiBspr9{S)yt$G_q6}|teuOP$Fn5HBkXj}SuLUB|g=Mhhwwq2$ zF}>O!f%c92YEK)WahQtv47Uj3800{=AyYfHxry1h)&8T264k90$ARJwb zXXk+0&z+B#DEpqGs6U*3Z*JkVxp}$8EAiew3-7GWb@;U!8nfWNXbzbj*TcYiXsg0!A_BQQ)Hs_M0WIQBG!c$0k=Z!3l5nh> z3sLGaQ^3<`4gJ2*>%L35F|h~0xuJdMAsodn*-=VZhk9Ih!S7Q1O%$X6)LS7h$@Aqh z%1sS9-Gp`(9E zF>(Q5tN*Yk{(66GRyGJoEYZ9!u=kdPyKW^fw}FbBx#W$D9q>jC2IhI~fewt8;MsDQRr96)WnuUl!&1DyII57# z4y&m3g)4BYx=;poq^Vaes~qZZLh>pPz#dbOM(?Y-MW`%{xXySx5XOOs$A}Ug3DS-rodu3Sz3t z;?+5!gLC&5#g*3K&AiqyTcO`kT`?<*x8**AaRm(=(h~)%pwL(kd>+4+Qe63X4(h% z{t2=7EIrZ9u$H<%92OYY+hNB=9GqC^RMs|7uJK#;$TjfBOX%>P3_1>8s>X@UoY=Ub zXa4-zy4a;zK-RwuC0(kv+!wzY*aU*2;;58%V!raA4XDIeCHno%x#n+F_`9nA-^mCk zZ6)E}`^Ey9ssvJWm;8UoP87CSM633u-V0aA*+z1x>xWDOFphMSI8z`u&W5zV?kNBb zbdEmhRsDFvyqi?nL=A$ZimWGFd)#gPjh8lu3$R)gbsrX>7Auu4ul;H1D4p%B5{t88 zH2x#k``f_zl_`>v4hTcqr&XY;r)tUH#EC^4wC%^gz}Uvo3hekM2#qRGn|M0#9U5VNs3wtsq(F2#TM?NswoiQ(3zHipyUIrDJ@?KVzW)3Gq6X@ z0alb%QXG>PdrzcVUu)(l`28Qhf$Q}h2eN@5*9OOooEIDI5+&=&r)&=J69=LJ2V#T$ zx3gp`%!f41>a8gQN8Jy`f9Gu3t|+-L&y~EpeFmzcmsXWSzaZ29MI|Y^v94Y;_MleQ zmtuLtevaugT+ zQeF;*@_y~qrTreiY_C31sbazYHxu;z_$+xLM6YqZ1b2Msw=E6tguD6#jB7hzVFH7++C<}#jDTO~ zMR4`ml7`>z0^z~h(ha?DiuYeR?9r7S#AAi`b)@8t*Eg!Wm|s2~knu;6@6 zA_3j_3V4R3?N))i{1i;4`Cqxp`+=xgjAJvL%0JCJ-*L{c>l+WfK5sHF;Xoi5=T8Y* z*W(AYJWss@IGNF&_`CBg3RLVG#&DBZqj9YjKP}`vG*vh*UtCRSK~cnR=CtMfp|&<5 zZ3nPx2lMk@w(rZ#t}%`y~HLP5;Nk@&`y0 zi_(M;^p-Ec+FuVnfgei7Uti_Y2EQt2$QIz2Tci5_C>9xzjll|6RegSNJ?TudwGoEB zsHg(;^|Cyl|=%Pbr(biwEa1JQN$Bc-?UL;=FLUVrG%gm1eS?G3n8sIS{5 zP>O#6f}h&}rM0jE7A!>`u%>?@3t%`Ua2o{{UCh%t-L+hTsbWe60K75>*i2Db;KDa^ zjU4^AinfBZI0e5{+nr!DpbL+uY04Bcob>KnrePl}OiqhL7B z*+`-UhqZkl*+dh3I)biTy)mXphRJ zP%G`!^8dhS3I6j0c%|zo_^NM~OGx}BP5;ddY&A+^VQMDn+fGX($|)dlT|CQaXLpYQ z(G@s6hyl@|`S9}_Fe87g~SG>@H>&{SV8{g;NWcE?C;v=s0#?gC}x{^b5) z1WRar)U=?-S^Mxev<@i)(g{EgHUB%<=jw#I1~i0RKtVOXKEEtF63`I6SnD@l^1pne z5TIoXJsO&CQ7x&zf>_!~l=~Hn#yQ@5 zNM2rk%xfOMD*9O(jeFp(ST={75A~!?v<~g#xdxRSzto4GmN_xurBDC^MD|Jq3eSr@ zct#EuUYQ?Ii1mLo3IJMUU#5_(j9GOZBs`Oft|k8zstk`+Y^GIXhbo672vuUcWoWC`TM~qs`c~o^O6xq6X5U;wB4?(=DdI2%O-#>j$wOwoR++9 zh`7Q?Gu5#7KVuK#I3|9`Ky1l0qPVdDy-}qqLl_F00=3x5U06^^vzt)=Ai{%oz!+9( znn>lhCB|X@cU)ty7S;|I0|+x&!J64)o?A|9BkPUi@tu~RIsg%Ia z%>055v{D-Ogzpx5>JGG%o+0=<2Zd_Ai2+tt_Qv^1Oki^eslkP+%GvVRp)1=@dJu+~ zTbXXQ+BnU6-4U3gkQom%cTczChZ-{+e*A);=Lrb^to*;DA3)GN40J_pv`_TI1)I{N z>YHj#T#7WOE7n7`1{wb=<6E|s)eB?tn{$i^RhWynj$N)^0;!M#|ihZCqSPtRek8FX%vwrCZSy z6$A+A55gwdm`WGk+68jqboih;w+bJ7sy4KX7yQPXvkA=Fp6A!fGy@sN5xE-ABq84< ztEh@gVlwNLqxfciqhdwQ-7Wc3Ek!1Ho64z;#p3N0|0g@?2^@dgvvGv?i9UE*;f3cT z#7^Qc0KvtU<1>TMIuq-+9?Uw~c;L~(#V;v@d7K8@aVS5;sa~$<+z9{Fs3^GOlgClo zs#teqb-(!G{bKW6d*9TPaM%gY*28^1e|F+i8uR<8Q{zvi#?JetPN*KpuUvA=%@?^p z3Z4ze07Nj+F88>!{O!tp{k+!A^+=8$CWz@DuIU1z^nwY%L46zOu19u6rM0&fAFMCl z%L`&C4rk+`{Z^IF;=aD9?G_*O(%szCLTG(05E)Lm>H1uZ5Os9)+Mq|zuxwzT+1?#}ZtA$9_)GBD5tnl~l5f2kcV?w)2Ob0AzX>O` zN{$?r2bQv>pP+mqJvdiBg}8k4BHCjjl@mewx&{H~ANX)?jtm-~ykDCZ`aRkra}2x> ziBFq&^5SZ_>AT5+-&J{4UYX7uc#EANb2#=bf0^WUEl+xu$^|glwM_FK!`nQx#APSs zD02zskQmzWtUjH`mYh^r3K<@U+uOFfdqy4%>ujXxsVJ|jDzASpZa4TjN)2|d+SFZr z!8cnuztQ@_7ngQ-Wu5cM@a{Tt8VhS{uOX%KPOe`|EA2 z$zJtK4elb{sl|Si#ZE7mW@Vu_ z<}@;+=i*>xdy=C83xp_|LE;0s@8_(pn~&J^*xXiMa_Xxot&Lk4 z49|m6zV)=9|3TyrDd+qYz3L)$x3G%FXE2~#-Cw))R2Ur*WLVcNMJK$Uoa2x_FR_JL zd8u(=b`y`((`nL6NxpJf;(0MC`+RTEsaZYTi6a)>vWK79xbH;3y&1!qrgq)U+F5NG zUB(+!GoScP$Qhl?!06QI+h^`n>1Q`OOf|jlx=rvaQl=(b{e8`kPGjfOt6ohz*ilrW7mK1}UHUSI!@eJdAlQm4Jv6A5%kZX^844&VUSe<<9sox_#Ww2+$*N54z+ z5si;4+8i2GV~s2t4vCcZiRlprF13+{rU;#G{i7@K4&5);HHHpxyRYPBD40vpqiB|T zG?aLD-B-R34waajCG z{P$b@D-YZu{2IDdLnZX(M@e;c9TDG5wx2*Y!HbaX~JD>OOVb@;= zC!IYXM;~N2Ta|>Lk4_HnX=Npi@2F`X`JbJ$N9rO(xblA_vDvizoV^_M{C0DE2t{N}O*@}3Yi`rDuL|*Xtbc3P zJsuhQ>TiKyUj8LtnX`ZRTr<7#Yro~aL)JVk9lHUwm2CAkHR$Mo@U8QPYh$K{d}-O& zp~OiI`x`k8taRP8q<)V+eXYDw*T>M;bGvyWG>S59Pq9{|_x>4nVQl%7bc(ogH%&IQ zo{}e;6np#gj8{FjL*%7Y6tzWMOl+%8XD7!MXL%xhqc`xm{Wga|>%kxV`H7NG`T->>T z=Fr(P>u!bF%{P6Q2lg=`wvTT6(dlX3dFi)_>+wdYujBeOcfL(z5u81)BbH^H(oiXq zpRf_4B8{0cfLzugBd%kfROy8>_egOTYH>M2yk5=4$hpsFtSbVepjK=hw&h1ZMPG4j z+yAcck|qxN(yfu^M+(jBQlK9D@#?KZAUu0}0tLBWQz%rZ+{W_rA8kQs36tHgQCIB@|9t z4s8)YM}WCzFq;4){d5QAjSuZc^FiA-t_o*2%&z5iR zo6WzC6c zANikh(79$EZCfR;Jz39h=-=|kGzi)s&?6eBsoka`ut4|;pB5~}VkJM?Dz$ddbTq)x zl&vR=;r{Fw4dQuC)eCh&1w9)`nH^>!eQkw@(GQExEi3)8!Is1{Jw3rSg#XKsv(@*} zfGD<*q4eSW7Y)OoNF?5#%}j_0DoG8DZS_IOtc%Fx>V3_#)m{B(RT-hTU6Y94JkLtp z-hu5(FTLh?%#tpgqpUbTzT$Udl{R+ewYJ(D8~Cy9IKcBR{DID7AJ5|37AI=`URgJs z6@KGBgxfhEP6tNSAjnI`N^@qK++o>sl#1*FwVQcMJALCWss8vaFM@45D}ZC#eA^yx z;)P3zkN17EZZ0%pyI&*>vPVMiJuCd6@t}th6QwTraOQ1OmL#t3L;BI4)R6lzOX%9V zC6bEqHu0c`pdGcpDmT7GeVMdzg4FwdUn&f>P_~~Wg~4`l?)LN#DH&h?7B*@ir|EsJ z!b{bc_o22LwTYG|Nc;J?L@hTq2|1~CsQXcF5N$}3A?eecIxUER+9uz?_Q$?-dBiT3 zmf32J)ggB!YUQ3NA!!@~cYOjUUX3Sn1Mh&^jJtibN}uy83jw^wTH&7adf^^!x1mB< z=K#ONRl}C0xm*)X1El0{Fq6P)-dlj$ z@sZZ*dqSE5t?Oca)0q=4-JMo|zi@ldfer&{t6jLq0URzA(0N^P z1xx=1D0hh9Dy%;X&n4H5Q}9=q_3*P_n^p8zSmnjs4fl)9O=$nuz!vf+;ng|RR~$26 z>Ai2PVDC18!#l@bmp$Lk?@N3{@1)F7Q95n8lcA9Lz5#vY20mdJ zh*y?`LP~i`fz6vgjIouKg)naWJ5Q0Gj!6LaHfZ$e2f{}eNSA8NBYf$ORR|}VuG*q2 zQ(L@Tl^O-fiabkaSXehXM74sAWfu)S1VYOouU@gA9B3^MOFkte>d&yeo%|PXLFx}y z1BRVL8x`*JZQ>#mAmv1S;j@f2Vfkn|wc zA8-d?x0U}JyLBUPFl``IG8qX~RQI5=X|~CHkiVtoJ;=W1Ts}z7e?T+hAoV6>&gDC< zh*8_O7<)<1U8j#ZRl{MRFAX=qjQ8KJ=xraDp1@Gi5zPUdZFQ3ipl(C{Qnz>sigH85 zLy6DanEN*$5!Ge3NrFzf6|#)L;s;W!F$SqabZa zBZNV1ixt7N;%4_`k#S*x!XngMQ#ABdlRs9~V39R`6=wH{^W0F}kW&=vhOJ1<_pXxv zy7Y!V6xgf1i!8e}m+b`j6+ zebwaA7s}0=1xHay8Ep4ho!TS$Mq->vpAflC>IxDU(HqbQMT>&C;ZQ7TY@M*S9de>I zEKQ1)?W_ogxS@i|Hjqb*4g$^Gj?sizN=m-!!9~DvPkA9Qf}ibxw^$|5rOqvx3x~4{ z*`6OV$h78FiuXz-9*u&G0u3tZ7~2v!%=C*(=Q~>*QuH~aI`MQn$04BoUui;ccv^23 zsWmqwR0`-W^&WHEKDUqXyY%5KhftW!Z~JysOd%Uo|3L8i^XG__7(P$xWDstrTqvuy z*$3T7l3i0zZH^gHdj_PQ1||&NVwV}&O?)}94^@&}Vs5Gt=Ozj$!h-wPv=zz((4b^u zwUbIephJ|-@Ynmq`}l(;1Z01oy~58&8-7&)Z_9S7b2yqqPGaXZ9`d=WPF+jT+S?vvlZGv) z_;~6Os_ck%IvQ{j=w>htVnt6C{%)Gx8I|aPZDD%Fn-hFbQazk>Q1K{LRuMTU^wFq4 z{{6cfxev${@onMpoz`LkLS_#Cz_!eASC4`8;xEnvdV`W> z*o28p{A9;-q<7zD(NN%C>pB91W{LTL6A_fi9OYs&$sMw?d0awd64Qf-`+Ly?1K_G- zNS+h;!vC_izkUe_Kx+u^YZ^OEiY|ajN0o*4aeKFQIeiEyu?~l2ch?uJKw7gYH^bC{ z@P^G19g+wma^c9q^7qb=%Fb3)iNncOVIo}Hv$rXZg^a2|vm22|a0m$ZMPUc59;gO; z&WV??Ccut5K3iQ3L0IQD!c_FRiG3JbhoU@URf+67a0Uw)EjO|W^Mm@S) z99lx){um9|ifO%Ha_DqfoLEW>>}glE(Aa(9Dh6k;t7NuMgLzplDT!{ELNW4^aKgA8JxF;hpm4u zo1Wp7qGI31k=k_aM;U1O@AY)&InBhrSQZ(Pa&FPOBHhT7+GE37ME{gM$A-+!|{Yz+u%EfZi%Hc{^k(cBg|93>an+Z5WW( zJbnVCeotf9-tfC*avPPil1h4Nn>0!qk-xul+)HdqUd8}ERugW5gu)7Ax`}> zItR4?3r2K0BUduP2Y=gu!_+FSk>9>f;>~dE$fp=Oq6YuSbH8OT(J&55wRF7C_l*9! z{>(v~0WnG2G>?qCvQSwQsnNR~%V!h4hZ3ll6Pfadgv)RrU#*1tF)}a50eN6YDZM>JA2yV_-IW zY#ZYvE<5lB0Y}Fuc!LwrZXC8Z@dYK?G_+w9TK^Q`0f*+0W)s>BPf&}cHM*hkVK0-x z+wK}MqP(pv(nBvGRb_tE4q~6lSNCE1gdjwJ@?RjV+GB$%*kjq3CZU$mwEr@aNZp0G z?pZpi==#9sn>I{Co_Kx}cWGdrY%6IPh^cR#kdYrZ|EL)!-M+DQz=nWga#cL`-z|y_cjn$;1pcj%seoH!mxE%Jj(Y9_O34S zP95UH?Adim&3T$Yi5m5NrJVfZ369`rw1%inYJS2R@oa^4K4Lt8Hx2qg=Nfzc>>rvb zv5T06%9q&>2ipj>{@KVsASr?cMslSa(MwhVBna4YCYB0C4EB!h5`lx*cNk=d58rjAtPnAq|)u4`An=s?KyPWHw*hf;b#uwS(6%53<>t( zQDL5fW=#kwLbzq7QyR$#HYB@7)R8%okpyKF`Xx|)k)9I)b3(U~FpBp;#HJ8wh>v1c z(^^~Pkz;8*-trGo2C)M`+nvch8t#8UTk7!hLVu)%UF|Z;0&dN=U_DOoA60AKS99#% zyhJl>0RD{LUI8qn4vAQn8Cy~Vx*q%=&^E08I5g)P$AOfWNi(R6V{@vH=AwD89Zo$) z5m;hy>zF{Vu@$sS>rLOw3w8_sFJ?Qxbz>Wv7yYp$um!&yJ-=nRM70I49y8mwOD(x_ z!GA=xb&8q|PttDuC=KJ3d~wqwg@bgGY6D;49({3BK!e9OW|t&PLdz@S7Q|lool}!t z#w|##aHR8Tv(Wm=u9s>FzRWWFEHv_a^x1691&Jk2!}AXpv*60`iUSRq@_LWrLng^* z=QgwGv(U=nGP^b_DW!p90-eTMnUOLC_k>_n92|qD8TdFQy?7e12!)?ULq{B>s+_9d zL@RJ>unRl(DwqKuaFiEs+DDczY0y1Nw*I;_7fV`gPH6l zCx~4XK$93Vzsvf&S{XnM$_md3S&VKjrR1q%go@VNKE2@;9)Y>NiOooc^8d`&`e_Dn zd)2w=XffM4-TQeVvIW+{s&u8!9?{?>XW-&=ztW^xOa}f#P2sG9_&j_n%wi|mMJ230 z$}6drQW4PN`)9cS-oQvN^U?@GaS`;va?pFF#7H^ZK=a_M@Ihi^>J6j#%a0H+VJu0q znkQ|hz;G_9bpTv@xE)rBbias_L(>bNphY{8^Z)od3#n9(g|ul>O` z*i<EJ}AGOmH8KQs!G_=u=@wp7%n7@MIcGLn74j?j^!n!1jIsk%PV` zOCY6K|65t9Dw)&+XuUX}I-FGhPGU|f3wQ-yQ7|ZG08wVLNBtQ2XH`*A@kQJjQAD9k zc9sPev1X())F_h2;4XGm{tfH|G$|_Q+@mY%rcGVsIH`>y4U>n!*>YPv`Q38bvl4Va zw5&&7BssU%rh8!9eyOp%%q7|t!~+JGXBBb0&~t!%q}&Q_DT}W79>Ne(y5-=Kr=$$C zXHj1>6-(em@lKQ?iCxKJmm+^4Vks4G5(Tp^x44yQ9um1YfUZRW(6u&YY~j-E0J;{< zN6C^*4M5l8w+}hY-B=cn|C_F5Cj&Q2EX|LUvHFxLID9T&(FufB=y7%R=jodqp9g*GM+q z7c$Hx5srnyW8KCsOts06ZCqAu^H29uQ4 z?;)s;6A3=!ibMs!h@(kQAvTAozDor^zoM3J9J`beAM9_yURDQq9bFfN%QdAW^CB>U z-9}Opp=;V;JHZAL)SQVUyGA8PDb8Pk7`b7lt$aPL&>u83=%mzAN`+lQ z?VZJZNX0B*k8TO;Q>PBovpvCct2@=Y`%uIRc^5>*%J1Cf9!&*uFV$EZyyotd#40qOxAz+h|c5;&9@tgQPu_gl%_dHN9-8 z(+!%B(0?eTM+q_AUBC4qT~qAZ@A=7uzTkMH-%8r^+mZ@4UiQ#2)XuMQ&RcB?Lbj6E zuNM+U8n#=0^IxzxObUk`O~8jM42P7noIa;#13ilTp#5m|TmHJ%!>4Nv|MW)y^u$75 za6lW0=$0^7%_$TPZL{BV+QLZw*&?oD8tGh47NN#j>~eU3`tf^^Id?mv=sBR8ftO~N zfe@_JGY#QAw85L@FI>ygrepZzQU#tFd^6rZqJXRKYaV{F<2)(*t4lx{}Ri_4T z1S&j-smab(`Q6~SKQk7EcXFe(Q2}kbq^P(g&DsV$K~XiclKzYiqhknDMOA z-oW?mLE-DqR%Oq7#8BmD+>t%F+!A`JM?0wG&>CD+={deNMII%8UJ*na zRLk(1a?Z;i)5B`-Owu~Doy{?=iX_yy_hhz51ZLVG<>b) zKW&ld7@Q_|aR3KI?>4Z}a2{q;?#W>+BH41l)`dNF59!$I(=H!*m!IOOdOmT;6`0j3 zwUo);43cTV(>T#P2z^&lQPatyKnG-mwhFm*rwdKmVHADxexmYkuWw_SRdpY3nm`b= zS}*PyRk-rVI@l6xUA8k{D-x8y7>`}+#$;UAVixmLt}ZdosSaL1M;~xFlgHpZQ!?e0 z#eU`}aB`iK$D${+XzpsGL?h}Uc@$-0c#o@zQpoQ_hU;Yq1vYEKVtrsla_8-2+yPBC zI6Mv?SuB_t4pwJ9&h~Iodp7Ia`1^aSZ4JBzQY|ttC^hv!rE7UNpE+|rQ&5J_WDnLD zL+>00dP38+YaS8A!+!5OT3ef-=efC>TlZ<#&$efDveDj5gg`FG)s-$lPCh-J#waO- zo1!q*`w;kS01JNz5jq6r{E&sN+00iJ9uU=Wl9_T%YoG;ReIB2tHO zfN<;EL40Vt?bo}+-AfHcbOsL67TR)@anHG-@VZ*FwX2+*F)Q^8FzMqnI)ChMUehO? z;%#76mxDhS!MWw-9@neOvAz5d*a+Ur^qM-0Z0GekjzqNVc0PoNlw*^?a~*wHq#~Z6J>Ajv_ApO5*I;I1@K7qW+^; z%&fIAW)>6CdKTnW5l{v=e1nT^+r(;tTLBxc{t|eIvNzBoj=evepH~Scz|xHEsf_jG zxOp!49=VIdEt=WdURYQF%i&sd;CO}dB~=My!@#~2e{8TO3@RJeHWsJed$aG-ef5|7 z8kPO(Ns(5!QPm-Ec+LvOg^K`*F@H#$UGO{??biEeXcoaXf3g!w-)~Pr&T<CXzRO()qe)AM=gcK#0D}|9E%_QNZKf%$< z82_ES9#Kw0NSeU%XJO;_g)Nds=)-SbinYf3;Q`tO)(DV6OX^JO-bB-2_E}sYF_ZOV zxfLa#F|k;Ia(4$Tobe5>r?_~jqM?o&C@Cp5{@ciD!*o}AcElR6dV#Z4syDJ9ER=xZ zFE@(BNLF#O_FHEd6Q~|V^ZGC+V-g45=UhjvHC$bVPa4Rp!SB$?JLB)j7LGH|1w098 zfyioICpc{QES|Nn zz?C%=S9pIE$2u%p(94hzl5Nr#4U$n%eJ_)W4!p8qlvYo&!V5ibg##_;c31h*ASb{xW( zEtUQO;f!-6&k)dezWLxFJ9ZrWlX0^2iN~>h&rF%X+aU!!Kq{Ni$M|e^N z$}!t`Qv6GyZX@NN>tVkqkRikoBLjJykjG+qN`KgI7U4XzSK5oxNn!S7dyViC>X}7w z?(zfK638zPK+QtVIHn<(Z)^)x?bVLWMr2uFeC_fMDlNhHMN=9Q^`N0XjF@=If!r5w zJ&UX}mdT9NF^N*QkSG-5SA6eij`z0~9R;9?LFEc^X%)YH-`Pr)2v(Q;s@P;EO*c}L zb=bdk5@*X&@CI;dGqr;%*>qrt%~O+!9xNObEAgejsmY4r>>{jJoFbZDwbtG~dNNvK zz%L+0{`Rd>04HXmj+t+L_RIayqaHQp-fUd)jM%<4DW_<*_si;XCRkDa!y#&tz5 zSi!^!b6;TuTz;jtp1;>(-!JU@iU!~{PvwofYza>k;%0>miPLaIX7gBI_pR?zRM3OS z0YyN1u1$p?r0oAPV{gACsdG)B@NZZiNf5!R8=6~&4%^e(95c4*Evl93!?4n6Nzi^o z%)^g)<>QQP)FtKEr9k^IqoB4pTbYoOxS8*KFgX;=7k|fN@k_P_%#yt$NNm?nyZFz9 zUAvcaQfzV@u%3r|fQ_? zMu3z93km_X^jxPr#pa^xTe5ImVR^?kaV^0+Wtj~5yL3dRu&o8Ao4o``GmvB~HWjVJ zJws&T#>>0{j^Yz7?ir&-Pw;cs7f9hLxEVBJLqqS|te>1b71AY0#W;p7Y^D$NpqrM0 z?8M9#l|nskF{FPoTO=}D2R+g6V_@r6*}~Nh;1PM!pL$_QxejC}WN_k`x)ADX2lWb8 z`yNefFhC~}Ult`snnZIDwD?1EYGOOjaFaeuE=gdc^2d{w$=oq_s`FHB9|0M1?CG^& zarmq(<++pjhBRW5D{8n?gSvas6_3TPh3T0ur3BGiJnZmT!v0?BYZ^@-!{0OHQ*8L9 z)y# z$dSE26+PFq(2_1oYk09}P_hNbsLktCVp!fOACLPxw%ke#Fe)`9rx43>dCz$PEoFcD4EI8gkBy zwfX4)AJ3L}*`KFEKTWE6Y@w>Ai0S8QCwW0C776R~Tm1g}Dpz`}9rq|;X%X-&1zILY zmk$5b=-)%9f2;w|kI10H2c?vfTAyy3mZQzwv@8YOvEKK4P0QqxN*P6e{4J^`U>?T3 z%@Vi}@?2Pmp16mmZ;$Y0E2T39MJ4h=)nx_Ez)5t9Vi?kd^U*_0>X03?gVUMq*hkVF zg%?a+0ta+3DlX?WW^A#h9#!9!=#rq*TS|44oHaBu0x(rTl;Tpw%fF{LT{#g`qpBj% z+p-r1MO84DpE~I!P2}B?IAa_MAUDr7ytXsFYz-xaNiOo~|B&1CV4dn;I#j_@Q^5!w zlO3CN9TGc{785X6>TaWpq%bZLT6@r9LDWNq#ThZx{$GUsLzrY;*G3DcjY`|LZQHh4 zsY=_nZQG2rZQHK2S${t7_g|-T8mAS}*gLSX;$AD}m;=_;qsaddJ_&$Gz!5c&FXovF ztKh}Z1F;+zVGX1&r_>9sA9bH(`kgJ-5jRB;13An5&t&{FKFDMuZV+z(@MnGTM|16B zTCa@pd!mt=FT&{5Jh=nQ%q1m*J$**O>ErOdjRk9F+j>#n-B(&iS(RlRZ995^WP{dmeE9Mpo=cH98HW!=rIo$4U3N>wn-|2 zmp*JElxbzXy_1x6LOTH};d4qmfihL-EM3L@JMyl{5W5BG7tHefzM5N10n#w*)7Pz9 zIZH0nJw7VQO+zE)21HRh%}l$~IB#*HqEb{IL3-iXtMT+wPz2@bYPxC|hKW%Qy zitG}lZed9ZedX0gFEQbDR7tTd(4h*h!0OKgnk5O7A}26iLFX)%0zSDM`r3+OektTl z(ND&v%aEgE!J%tOk{TG<5ITynADiy1E=$3liq}^lE@aR2+6r>RA`qguTMRmZyU9fC z_tucI5)?1_J%}Wl2tuI|j?c)x%%q;ww@1Jdl?Yei1Vj~u-Wj<<%X})ukNBje-=LQ=B149mqZr#M%v7E1W(dH6I@%I1nv(ieitg(!3D zP-BWPp}e@;E!4^^%<$mX5DPRg2cHyTk09+)`bHC@6F|{SBG}qpAK^9PVR8tWd(AOP z!~mAU)g2VW93^k<-tM%#>IMLo2fr zuu~odsR@BI`X+9VX4*vIldLX3Dzdqvm@SlYrO``@ikPS}HZgIvP)(|cTcU$3<+j_0 zrlMLi#E+a9Cel`-3Nr?3+4hM~8byS6Sa@I<-HUyrc6BuLHoe)kl9^lJr?2*UCQJ>1 zDADA!(VMESHe_e*OKB}4bJ$)Ar@AQ>5ay#0XjZX=GVRSK%9UdqGzGaX&T_1|vxMX_ zM32lmu&~af-zd={Mo{Q@`MxXvX}=i!i!Z)9_H6ltq^kH|2_n?S${X?+`GU&-&>G(+ zo8v=`U7x|S-r}YzU#8xLjYo~Yy^dl%Kb{Bl))O79dfK%1|4auTLRc(?81d!|&F{H* zUw5+xy`Rs1Jzh_PyZVhyX?x~5$9b4k_aa{}TlMyr9T>;%^NmV1u_emx(ELnYOY{D_ zFSQt4EvkIXwXx8>D(;u$@+AT@qBdJpoKb%JAjl|j6Kb2OMQs5`wtn5v3e#Gs=jZPO zjg)dWP#+84AP-|u3@1iGh%$Q4`7~=_8Y~pAzFYrY3Y-@_KQ~UlellkBqx6cH9sCBB z;tyJXEeGo_I05gFwCG@L*Swf5=3(gTSxp)4G$$+R{xG|YM#fha}Fs}?HUCi3JHMh?kOt;DhFPHYflcP{-)=%MmoJ=>N-j$jRU!{OQ-jn#p`nJ)Tw;{ZnyD(C z$w4Fnp5UNR;ui@2R9KH($e5v=um`5=$G3P!Lspq5pRB)NUr9!EHBw&rWYSS$mhWt0 z&1Wqwd1ku9W+KxAx*^NC=~tX&7W0^vO6H2VKT4!*#z>`h)l&jhlqMJZBp#%!o={0# z{&n(n-0WNRvjr;hsT0iv3TD(n3sc32j3SxjhZXahoV?tFS!i{C2MzGq>?m;iTa(ksvO2qRS#7;CHLR(4(;#wq$; z1}L1_h{2-kHw)Fcwf5R2HoS2zy?{a*MzK_If7((c2)8WQd{n(I3Fsa6ub4z)L4-<} zyJPwNcLm4g6VeHatk4%tsboMErk6Ajt5_J6dSHcQ6~NFnEAdfU?gt!|=mLLyf0RN6 zxVlXz<{HG zVS&0SJva22$Jz5Bb2Y|nk6F!rJPyrE&d!1>w&ySqB}bN0qwm((vwAuXPRM5RKO;S9 zWQ9-Rh#zs6~D$>6FE{KG*5Y2+_i9tE+CBuWzSapc9bD0?RU?0Z%A1OkjLRk5vd zmR3s}XYBd)mSs|8&neQ##v=s2WvU&H^6Fw!UBz{@*3vgUwOS+UZPuheBM+H(T~IGl z<=5k5p9`8d)Z`q&;WRmvla;`B#isnJqMjzIR>;y5(WhkF3~!GYv^BpF5OotdXHyMw zBS492LDm8mP`c1I2fJia_zy12<;RuOCe9iHYeHv?>L9m=1sFe74& zjs;olKo4bfv{i%;Gwqb2*X7c!uSI{pih(u-jM-$ugiPc~3>^7#pF%0Q3RfOZpb<>< z+C?tacn8XVfom(`9*jrH8hl3-B^-xkCm|j^R{lN|34@HyL})&v@TMZ?ME?ImbRp%h zjS5Q9TZp|n&!AAH`E+(UM_Ha*ylpuZ-UA$71{Da_cM9;w3uOsNxt~f#5M<~?CPtA1 zC@W?mZK?ULEcAsOFQr^#hRDV}1VsiDnE=*TUf^yA65|}IgBE>II5jG91xLdr@nlfHN(KCWTu3Jk@Gjl>0{G_s~IRAYQ|BEYzxlGAiuue`c zpyG1DA`?qw8MGJx2sbNcFM*aT-C7NGRL1v}FPbt@@)h8pJS|h^{#R0>6m1=|65O56 z$dIFlDmoVc`N`BMvPI2AsTIIXge|g|jzpTY0)&@p z7_`Q-pbcPDf1N+?gPllgTh)WT#I9syRHmAI>lq_N-4pAaz7MXX+ z&`+*>T9h=0JbQxDN`~MioeWyk05$KPgia^*{~M)zs@RfZRhS#h%EVE`J8qtgSGa1C zEe1SXGW^3XME!vsGCQ}j083ywG;PPI~X5qqO55nm7`P`$0PJkCYA6!A#yx+S#9ZeiOETR z$PSwnhzQ>(n<}KVa4=WV07GQXh7G(TOZ5bAm4a~r33F2>zGiBo>;bP*N-KqG!Qcog zHjZ2ZHv9ngC<{Q$RR{SAL_Z-lX|k}H==b{_k*%2jga`NN9Lh^_F?}a?1 z?p)y$Z}CS@kZ}ER4O!qtEHCM7h`1tsGeV+__#DUOWjOP03W)iwXl9NgZ!4|j%4t+s zm5Bi;n{y|KC`$1~$vf}Tx~lW~(d*;D*>HWtZ5FPdaAJyHQp(;QyFe%Cs3gAHerV?#|lmjc!ON#03Qh4Dz=f4!6(2+~!>X2q!pH4$h5 zfx%|fnKKfh5vJsi@|6T0&9u^+)O+L1=bncD#=DgpBMO{*>hY1>;ahts*AXr^ymlW!IQDRP&R(qb3X85&MY9T0`piNS9c9!qL>Fi_;?h zP_ds{F>1zTh$-cMx<@tDnhZL;O`&#EJ1+!F0##pdhbgBYw9fvQH}8)cDP>icVk>`b zS(4Ln(=o=%G9(syXxo#RF&ZhKcwdYCx18`3e*x?AqaB*fnxH+}2)`~huq2c4Jy`|1;mb^NkmitYT=hd zm*xDtSWtA@)~`=CTW@u}Tp>F}Q3IuDm7S8R#Gg`0=>&!wm_aAFg3-lg^22~u$J@s{|l-Ty{7lzEfAVfu+Ih^ga&3Dtx!7e>wma)vU4A3 zqaG%~5y^VHymO8k+~WKi*8ku?U97SjG=BeMom}?N=QGgHsq^p%-J`=ey_^Q(9oe+< zIiP-1=vcru5YKNm!_19m?PdQA$mY{o`PU`Yc6&J6c3tlytkv0h$rhft-{D4JhkvYQ zjiJHo-?e?+eomwyySsflOXK~$CzVhr zUuCnda(|(hKCZ7-mpIu6@Kj9~@f@zEVN9A#-lsNKl!eg@yU2{wUEcMf;k}ubSPs27 zh7~msLd!}6Op2dQIUF_b&Zge%6W7wMtqd?vh3XoxR}ClO2?Ae6BjkT_X#P9hoMNeU zChh;iuke}{T}(!pU8V`fDJgQibjjC+J%dV)CC<#TQDbTjyj!D7u6z_N33}h5#w)m^ z;!NGmEf`^VAd)`a#9;WozaO=?r^-RKiQO|YmGhou<5X$^5?3SQK-1DX+>m<4XM!3V8>YEg;f%3FbO~g&ocon^)5=|^RgEoMX)#(Z^)_s)-A!|5 zR=F3z`c4YYCwy69N)9TPDEXk9PME$EeQB;7?R`3-=}Huzm(A{8xPk5aOalG>d*iBC zxZC^d)6~a4@rgAW;w^nKbeH(@OZ?~T%#vet=Q;i#CDmTi%p4Fg?4BS;xeLR=P+mD9YqWGjZ$Rff0O1yG;?Y&8YzYVq1wu~sIsyf0_vOxt@RWUa)?{+|T?WZk>@?KrV!pum2a*RyH2B7o5Q*TSWN-;CWcZt+PRqFcX> zdDFi4J+R8YYLTO}F4wzM+0*sj@m~|Z@AvcHVs1Xa;m?T@8nt_~@D)mwW~bgeA`YL2 z_rHJgs2Du-*{WDdvFl154y8Arma`VGqAt>&vabH=w`^+M(*wG2z544iIeeP7U8}?I z{|dEubZ~pkKk4|kMQ`c7`ufad8GJuqT^v_!=J_@3G^z~7FYa6I`p!YzlI}#5__z+- zPa^MX`d&?-$|N;A@_XV{SO2@Nm=$owIN^Wg@OVb+5K&S2>u^^YNSB+F4Ik`%zg>BC zVLccUz~!x40Hda{)VdlX*Fs--sl0Cs)3cCrr}PR}DbRVgii7^PiZZ4MFEi+!WwdMr zT5Ge98=h9RY0y5k6}wll=<;yLhNFgYs@LSx&*m|wz*9I+#&cJ>Y43#<#-oAL^St_W zGMP8KiZf<38oE`({q?;zu0O51a(9sE^|5?j!Rs^Iews3OiWTMXR=1n6zE5Mom~$O< zt@h+frt8PN^|3ylWppK@Muul>aEXee_g;Hb9pzJRhS$x37U$h^{*JLc{7i7^x?Bf% zW>`jNQkw8SCb@QR%=!pu=F-U<&m|zTfj~FiJt~93DLD@PNU>0F5rL=fy z4k)bEupCUiV|2{}Ps!S^ghYWtBbE}xq&vk_zp0-noox6rr^PT4H`Pe+& z^?uvk^?m#NnC<<(7*2!hmJ@oQ6dZPts=43jv~3uFFV<69AHiT}t(0td5>r_n$5|c) zIPyMQrp{68@*UYR^L%?7dK^15ny)eDK~VK|IDd3`5ToV?PCaCLggDnx8g72k1~;Y2 z8u-0^J^1;4tqyDad;jQ!-m9|z_g44wAEsZwmGg$rtnELoe{qV(`m}_<^j$k2GE^Yd z_M3UUxUwY_U(YZ8j`l_s_FcU{tv}Z-UoKObdfyjr)V{1fOMHwA09>C=*f3^SF*c*j zo49wcQG<;f{ya5oopvt&3({a~tnyH^t(}o>y_we9v~{N?cv(IN&kU&^f^TqX+~w=| z+`dIEZR&NU%6+B|S{^4Sa86W#q1OCbvo)|?vDbIpK;Zay6&4_79xkTF-FXO81aW}9 zHo(fSHlIFFu8F~pt)n{rELN_fld;6g9X`gDNhfPnm*+^}&4jxK3E9Tj@;7Ac!OeEP zzx8G|=#s8??S`T)+2_rB(slY0G4CV?GA--V@0Z=Nw%lXl~HEz0UR;@L(@9)4de^lM$Q}*S?$G-cH<> zHH*65UvDi(Xh8=gNnP6I(wxM`D?;i)do>qxMTsB68Z)RXp@4AP3K+eW8U-J%7V-3F z%l@jCPTvV1hatVdm;Us?lsBIO-yq!U_={B%S7SX7yZ5jtmv#_3z?{*!Ev?K|i;FZk zAM$0|Ur!DZzh3>k9uA%$2j{HHgh4Ae?Cvcs+S*v#RZ_JzKtqUa5xDf9)^fGQke*te z5>d{&8GV&`Y3YcHMJ5j)_?#2WGjH^H0!!>v+GK+c%`gt_b=jhRYlA8u&YaJ z@3_?Z2s@cRRq5EB%6;v4nPU11=b~$=z207~{i>wQlxj7P$C}pNiSUdAYhW5f=X9Dq z*Jnph%?wtjj)ZS_^HLNJ!(dviQjKE;9rhq1<$U8hN&Zz|~|6q&}pXsVkQ zS|2MaB5TpaCOiyO>6gWBwROxkCzhLNHER~|*Y2#KL(_D_H$s_{LsPnJMdjX6_`y0B zj&o*HeYR>~#7~jpZ#igJnDRF{^8EgBpucaxHiBLt`jB{ef8X8%9T4b$ZsISeTrywb zEyR1;SN(!^$T!N4S8;K^YS{lxF~aARL_btAXUZ+pir&2i|IMwBm&$dfQei~m?s`@7WYuSYcGU-MfmvHwYEvwIi z1l}VV<;J1+E3oSXXVc3U?w8khiqU1O z1Vf5%-?DU!s^?a9Zsy1xi^W~4IUcoE0ClIZTP7xG&~LVt*Z6}y_DEaMb}othI1Zn( zJv3>$7>?Q@85~pqSl{|~>q4GNzYHuMgyWo0eDN;V8>C3Zdqt;a?{(xAKHV1ZOesf= zu)v7~=-yUo;q`h?BqR7~=0>|G{+`XRP%;>cjBIsw{r9gxV=p_DqwXxJk*%jQA-x`w zlS5Fn=YWfy)mZ*|irQp9Z_{57Jda*81DX(3-C|}OjD5oEW}@3d6>$*?0}cn9C2D{p zR{Ht4qJ3}Lv=t=x0rZp+LxS=3->Eamutsw|?X_aFF82*cwgeK{{rGc&sZ>UimS*+- z@FsI2HS7_P;YsemD#)A0B8vE5ux_{_4rd+)*bSZV8b9km@e4>X{Y?$T&GN9Ll)qoe zj4Hx7Wxan+Nk<%7Qb0Q=aTD*$!U4+h)i4eIFDP>*#}>*0p$2<*0~_oqf^V+qV~*4I z5gc$M{0<5xoUX73=$}%&rUxWWec%a`r>J?-heLMV0n9%ztx4;6v59UiWH*DfS}9|R zpT5k7n=h3138z%{jK`jOxtiwzCt=W1R1Fa13Qr1k|S%16$@Vf?VYKpOaT zB(s8K-L9y~MW2irTnz`DOzG)c0ep!$>WH;|Q9-0c@t5>^T6BGAz6nCjfpEhTSDk={ z&~0QysuA>87Nx_Kq+P9dqh=V{$MEF%1KSX?L!^}E&Jv~vqIt|bs~}6~=>r4@e(Py` zUlI{+68b;=PZ9P$m`TBH>1aJT?&lD{`b3z6?TRv+0A(AL$v$iac;l7~Y-&0k5GCWN z#x?rPp^-==iSh*6*3jtwS7~f0@nKv zL_`_O*C-lE)^-uJD3yO()CjRsI$Flf5@o&7 zD;z+C+ul-W{%VQcb>AMF>Q;m~8uKMC-xua_pn?Qun6%O2h3sAj@-{Q1Rj*V9Ww>*O zo;2wd;}vmKj5Yb~@{9jy4o6>~jsypSN~Cgbl@a&|xoYh0d`N<5vx=4&=xv~6|Bm*D znREYfRPr2+)esTeLHsatnhH7-s%A<=IB@@eW-iwWWTU0={x578kZ?jst0GHSvjcFE zG_50PC$2FJ^oXq6CcIX}TMTB>acWGk?7H~AY_l1cvSKP{>K--NkD{_v0({CNFh-N7 z92_Rso7ld%E0l}VGQnEA9J&C+qk%vX)0?NBUwGLGW`J=n&ViPgPd9s|7T%qyf0BK%j0=*vzctk$V#Ngw*M`2%TM9|MOF({^zHxgib_Pf)8qX zaqwy!Vv7ql@5xJGQ@ZI(NjJG3H+a)(pWQJpVQlY=}bHq zXP*SkT39A=(S014!5YjsP7mqiKRYE#hd*vu9l3MuUHWNsp!FOcm+w5=U8n38bj0A| zulI1PVu5C!%(@%h!jmdbk5 zNapKL08*AX?=E7tQY!Bs@6l%K=q8W-KQ;g&FqyC=sW>kuAlPaDCbW@%pp@yh-ZEO zp;8c8_#cFofb)U(#)z((jlN-mnHn|2G66;8v_o0qj9Le?#LslMxas-fB0_j0mE=Uq3_|*M*^v_##%# zJyWO4Xl>(HJ&X7+uc#C%*9A)~2@~>X;ULZ?NJF1J>HhVKuYn1RdH+nXGYF~79kn^a zVBA4M^J)s{POdd|S(K2AraG+2{=Sx(KBrH0-NO%N&Yl z7glpm17I+J??6HyDCg?%2%jIX%^XpP7F}JM-pMF#YGf#IBpS6h8doG@muK2bU7-DiAjE_WwY@WSiPw z*LX%|^mgEqjR9#w`v()2Yv>x7eQ=M|tTJbJ^kcIOumv}g-Mh*LFp~%J6wM;+S&yg8 zWA^JHVmR?iyMm{qdFL1o0SAVpi@zMWgGh@Ef=C`; z$szS=sSl4RiCPt@=bW2g7}@OC-daI88bFGe&VC;*aBEiB?Wb9myM@RxSpZARD0`dr3e|A;Kle?*pv|A{Qm3|S|~nIN08i+Ngx)_}w@ zS`>^gV?F~Q`+Bs4NFXP|m2dksa6Q7 zoNa*2E&1KCO#(cv+CTaF0w+Ykr%|IcH^O#L7s-#iIh|H{@QaDjAKO)xdjE#ryLk0h z(Z~{A6Z(|f4%mYH_&V^LKkPcIpq4;J5;JAqNWOjD#0od>>^Z3Ip|Rbxp5V>`Nf`%l zepq*(PJp{gjxP}v(;%-qZGbtd(qX@*=PHtOzQ^kFFNX{Tu%&IiNvOV1*4asI7*5MD zjrTY&_RklugjA07%W&DKP8pnS3a9Ovv2+bqtIQ7S0lp3GjKEifE@#auRSG3JB(-TF z?8{oY2N<_49;YixSeaWlSPGwfx3kC%_X)`58GxL*q&RwnoqwUT4)}q^+^8@@|oYPctiix->#`9c4?tDh1J3Ho}AV1z+3ht<+|^)grMueWl0U>xwk*wk4%L1a=}! zx%LicvxZn7mE(43`GuwUjox`4wkPm*xYd6i;&KoaPVSGl7ms93=-#6#fiCq+br&j2 z{FWg$eu z@11NyGrL|{_iW1{O`uW;Y~vSAAu)^(QXe3*!;#b2QQ|7e#Gv9TguYqwx-cjApcPGeMvE*K( z6CvIJ8&c__fx;~dluTjNDuXF+=@J6lQVK!`yrlYZ>@}Loj&9KRWO5yJNG_uizT`t` z8R+H5N}YYco1wZtLhG&K#8a;KkdoZk@4*^1ZGq}a$LKD)5{9!3-f~WJv7a1L$zua) zpkx^!%^6bQ$y3`FYQ5i7N%!lykwJD)abXn+>=y%#P>RrN%@QT8XW&74FPo>|rKo9lTI5n@oUN6IfcbZV0l9h6^w~C z(j#QgoeS1cMIuE8mIO+2L~qQ7i6maE zJrqI!g*F|Vjc?o9Nx$~BZ5N3((-rGs)ne3`S7i!2QkZqTDHTBcU&Y(gmjjewhT58ztWR&9 zhR^%cizlvpW1dHE_m}7H-U#uaG%oTD7o~42nydGRQP!ogX@w(Rsa2->+K6v%4bg4n zzXsCO>}ABp5U7YE@Jx%Zl~p{{P`^fbaS=I>?NTpXXa48YMO}ucR3z?`;aPJA)-~b@$Rylk zg!~(sz@?aa3gn$FPWO|F|Nf1;o>D=yZvHbOcfUkbwKc8kb?wy$3M2JOm7{>Sp{6mf zG%0azBZrvUfrS!sgdpdHn9T*bXE`s${Pw_!;ZaaL-U4WAjP@48$98$E6I3~p^IS6x9T+4lt zfSuVh<2apQ2f*+HZGPKNq#F!yk8|x_-PKW2&BMek&m`Z7-5Fk@CyZ=`94hw&w7qi= zrGjL6v(pIY7+1bjG2r7i@c2I%ZH!rPI;n>Vf+c>bG_dKTCeh1&Ia3=eW<~4tq6>>uv2KUGIM zify5!BKtUV+<~y#ZTZ<1Zq1aFaWJ4S)(@LgF|4v`qKC$M!!rS1!Tw<*o^rt>TU|Li zu{wb(Y+jC2Q7Z4RLnINKa`hGmv*EKqCq3svW~VQL9GTll0!`!J9Pq=h#@M zvAj6%2@2z!;fr&SBmePVsd!RWEtFMPW4Jz^7&2FX_6`Ll2utI~L;#c2p-Lo{a)tV&{RVxm2t_8w(=sE#Ct4>fyXeR2HwJh%We{VS)YI0DM&_4$4vc^^*-U34u(FWQC1a9sd#u%1MajNY^|5zEh3 zUCDp?A+N9hc$X7`gXm}rtQ2!7spc>;h%5nsC(gr8QWwm=2?{~ALV#5%hYL(H-pmd&f%UCKQ+9%bE0&)=gR$irTQw$7|5U9YMgbdOy! z+5*O~e!(XK1|Pt%p%!67j2vq9TLi2P#@Qi?)la>psP3vde-RGcoRTpNYM}A+jWl1d zt78O7@2|GRoF|BJIo)rcwP%-Y zLqXb(>{9R?qg7@GPE?n-7%Y{A9llE211=&mF@e0?=h6Z$TSQE9(jPGlAzDLuxl`^! z_j5OUUP6v5Cv#*M1f(gVK-Tg1**c1{?e)nk8tNn;>t!w%DHX$soHuEuujuMb;st}M zTRlBx*h7vY{S0bygR&!wlEkC(zEP$YN7cQ>7?@(YxOr2K1u;=< z9>Bz6ibBOe3VKUN?L_1B`aoI&CP!wyMx92P`$#Ah{8FG#T20a=Qbz@p&&p|wM7Ms| z!_)9{;d=E##+fWE+@Iu{<-#**K5n?D0t!mdFzT>* zE=gE%lp!;GC!a*90SVFyAKrwxH2;EyfGdBN*&Fej>&HS0tIXBRQKUzcSB9F(wUSNWz5P+YplFcQs z>*S1$i!*+Cf(+DYyib8tVJ&H8USl3Txr`7xLHZ&Ym+Ul1y2$nh6|L}6i*CZcFd$Bk zvHseb+C>e0j92RWKvu3u3em3J`R5V^hQ<4>1FZ2KgP8IvBy``SR#J0^E(Lb#~(rP$7}Dr?76tW`a!zYiy2fxuwAPXZ3!rrwJxU<;L-%LY8@3>HQT ztyUwKzJOEku$prb4#J#~(E`SgJ7d7Mk{1Egs+(u2u4PHl{!Hx`j)4+qJ*ldXdi)R@ zrX>L%b3GfW;`4&)c2b-0Z%IH+lBrg60bC8a5g9y=D* zw6u~EOOh|X)IQ0Ljk71y%*KrIHo+fu;`WPn9ZKNyb`x<{o_$$i*G)jh?cpfD{bXB> zvoo)1^|WleQLFb`)=KKuz1;dLPkX#C)HSB1aLg5plJU3N#W^)xU#-l9^x6((mie73 z1Smm788hbVQD0xFDw%|m0V{H|otJ!N&+#;b&mKl~Q6PF-oqTs{5y z7;z?+$K`!xIB1d~_3HB?e88E*V$gtvd(&%Xlt3;Wz+Db^`@=*vemq*g`67a$re=ZkxFuIE8!(S90Et5MT?!)DJ$^=_9b?EA%I;l~x^iYrB$ zioz43LD-fK)u2wN!uS13!@%Lm*5%!t5Rbp`eXJ=d?IRB;|C2r$*u(axsx#=hjaMg6 zN^`37Ml!2!KXy>zdQ72XUrlLc+jX+o*G~ZPY`>BI%eRxDowB=^#P|0sw%fyufjS26 zqJ>_QSpz<;>1EPB0X8Yc^0Ko_OfFCo0%I>dUE*{~?M*anX%^aYRdUD<3uynI7o3p0 z)31MwroC9K(=<#VLA9+kn7w>POCBv1`gWBM8Xu{HRV{wMjH})oaY?Bv#FF7 zT;Nw9oR~rGA%Z^Hp(d)zxcN9QND@=`KHOsea9A z6mMo&V#jw(f2E2UCF%9O=jxN}a#qo<6fbjiaYBNq=HY=AG*+eJYx~tkRO8%e&N;tC zgHP*!{grsIcG<84G!+a#lvw(yDUH2br}T&|s9G>6bcXO7m-KwyzrE!7eJw{ZbO0N} z5E<0Wv@!s4*Os;`^$fmT*_tB-x<0?&y?LLbo?L0N7=r55X`k^jB~``N3!>_4Srcxt zC2;jJl_V}izpA)sN>#Daq{JpLaWVt0)-GltYNM7 ztiGKCtTC1ksz3g3p;BhOhXk?W_dvQBz2Bu>;{33*q?&QTe>Ia`JGmD>*sk73PPtdx zN5;d66YB6~5A`Bo_~|rm-R;=jrJ?GFG$VB(qnaaJo)=q@A~RHeI~%as;GVhHODe}3 zp$&?3BcOeFR2{|H^a^`+=Q}8v?bX9R;{-K~gpT8aYFUGpxW5R)4R**bmk5DbwJ@j| zdmDA8wfqh$n;ONIlCMNtlBP*YRamT+6iZo%8SOgk>!cf`N1;54tXof{_>MjDn3?b3 zuNe~Uu`1O^S(SXp^*v0$>eH&cBi z%m@*oAx3zic-)cyR+L#5V#b}n4?@|PKR1at_Vds1bYfvRo{IUMmU_X)#oJu%q0u^@ zt7T^m0XgyPPgitamucM6LkTbt9maj!nb9zl1{4_L+CdZdQ}V6P!AvDjJRZd<$2sPr zp9bnc;J6T1L&dx+#~o5jbp{%kCF+xc^#SYMPEA=txknuk~BA9ylH)ejYF^BN49 zG3HYH5P33=9nlN?nUstJ4NN!A&nBRXgH@wX;m9>`mQ7}ogzau_b#90@G_TIrp=^>Z zq3c!&J&=>8!p~0&Dwo~~EAP7B8lzXsH;gd?N@`Fa*^4Uet{erU@)^(hyYNRsLmW?f zdg;iBH@i%Wm>@<*edHEA7f;4>|GaMy*SSBvM8eHR)(xi6+P0>4JIA zQw;o*j~WZ#fceTOo_&V%7~{gBV?-pEA=%;z?&ZX8JY+$3EBqz}6+K{xl17#Yi5xYb z%U}8`JXqF!4Q5FoY)j7#xONgVC*oIQ73vdS3~oSD(MQnjEdujHF!V-h`$JgJA+L%s zbygll+t2fH&# z4L1xejb@&p54t7~`@xMlbO1vaEF6FZ3fnN@pM?aGz}3bvNxud#3z7q`%wmUBq9HiQ zK2pX+U7+FN2UJLv$r)z+3b8F2$Q@`_b~<@K5Lo}3iHU9NS2oH8ON7Po4viG6MRZh} z>|Yrh7^osGHJFgeG734ZKr|7if7E+?b_vgzgCZdXs~7VtC?+AouH%LvPv`JD_lY|j z!af4a1DP;2q(S!D+cQc&Flj*4xIm2hu5nCZ7$Gy( zF(t0!L@p-pMkC!p^GgzP5 zc9=htI|m+)k}}ee0h6h+aBmKJPka-{^<5!3Qr*fW_fp8xG5;&qTt6%cVy(X8h09Gw z_=twtjxxLOe^MJE3pa);@;OmjmU6$Fn<$jT7*f0G!pZZJA>CS1l8Z?wx~mBey^>E5 ztH{H2Q4Y0Zi7ae!ME4D65he3%n?-S~05{PNJ&TUM>;oFK$J=1=@XPekBAclzp$PIQ zM(b+gPiK?{HWBL}MI6R~kMPZ#nC%c3p=N~oEZ9$2oH#Z`>>NYji9;v@>wn{z2!lp+ z@Ei^SRgp|)JT zVklVgty5aIiQdn2mWS;Op%!ZG7>X zKYcqSUkw$Co|JlBBAG%j%NTQmt8$E@xE^fg{{SZxJIqOD_+50wW$2#U6cWymFG*O| zyEA)$APzq|NWQ4r=vaSGu^$xXa^ECs44YY=bQ)4RW8F8TU6!Co@R_#v}=qz-lVz1WM4;D>gLvfGoq&bCE2ib z@8rVCDCi5b8;w7d;+&L^i>c=FimLE z6{)C!uh6vl^=WY}H`!OJa`7;B_c~Ozi(3hWVj8w{EyIEPA2zo}fCGYhfKVz9T$b%P zh9c=0425yG#Z;gm#YXdnR3QMAkCElt!_Wx|w_&$Mf+F)xE>&uBg&eRqPSRfu%3d%C zA&dNXLb5R<+?3KB46@4$XV+XwFZ!A+s3XP%(BL3uXX{4Te#iX1KI}X3~CWUClgdxpvR;P4s{e$`-HEajZOlK`oh7eeAexk4$a zmDEAGtgI(EC%S`aA#PGlG{S#nQiuj*b5n4A9cE64<`XcfkP+_#D2yYY~+`}q%LmsCQ5XiGVn?%F11f7ZSn*8UY=QXxW?*Y6fTXbPK z{+X0SNy{@pG)qn@4-ZHp*uLnY;92p`qd5eoH8!uLI!AOFj-y8$4zYix5#XIa^E{;g z006swy~K(E7*EjM`6Vaz3}d!KU&wg&gcCP@So$ke?-}O6C-olJbm!K<>*v=2_kU+x zW9xhn`J>&l#>Rcv?frDc_x%Jzy1`=%tL1!!15=wL>pA*1bozi&d;IdFr`>95kqSIG_%hu)vp#UpeBcBi5~%dIB`*KHv+x zV^`E6y0nelo#Io;E&^o;vfj_Z$tb_rkHuBd{yegeb#1tk!onC6>sIDLM8hR83JGaH z%ztku_jQgPm*PF}pPS8m2+7ghrcY8%n3vIFR#3*%Y5^ItE0tMoEUu_5zP#_eKJ%O7 zuw_4iL1M~&2yxuLy~;FqVC0SIG!UB3D}WSLNcbRkA4r5K@KY9uFyEN1q4x`|I?Wvh=dOhq?%kF@3fhfuJ5U(EXKsp>3xKEj0R zn9LK{va3WtGoRD8%S+wk?+vnbY-J@a@CaFe`;|m6{ww!?8a|F4J8~*KOw3zN zu}37so>ELpWAP`Njo@OdCu+JM75pm_`%2 zI=DYjGJ^d)SY!JzWTg7A%W{x8E4yE4D|V`;$g+}@l9T>x@I}BO0!cx6zjK#dQ^iNTY54hRUFhYoo|D?3cx76JqqWquN2yL=(ExtdiFMLUn!oj zSXrF?F%1PRAjyIYIdzm(j3SyNn_2400&~>p$X~F!rR5(n?k*k_32KjX5$U={B;T(f;#7V^GTdb!L)`?iqf zP%!#Rh#k*Aqxme{wU;tmPj~S8r^n$(l?Xe8D2WUhD6y&BP--c8*v6Cq(;p5S)w{kz zxP>Z7ygSJmyGbt26yxt{O+UB5ZU##CJ5gm&uXI6zX_A2ii zc-aB0y z6e!!h#F^gSyTs8w{O3-7N6%9tRLd%@%+o9?ZZMj`o=ooXF*>4?O*gr=+FEWjL-a+SXC%voscB!dWO17Kg03?-qczpS(g%nqVJ055-=p9DizVKZ!fsh zJvCXHp{Px6@9~AZrY3ikpB3NzJUJc-3~Nkau9^E1G^ z^61**Nh4H5H2$TXFRZ6bxah}rqV^2^R}udn@-Nmp{$*goNR&Y+2XC+)n?r1m> zocyz7(>T*@0}#YZrI}orj-gfI{~4h3=gu#2y3a|aj~M2XqG2gLL%-#3>>gLP4UjBo zExE&sn#f#R^FGZBq47l2s$iq7tFqNho|w~5A&!-y0~Nfa)Piz-$(hBvg|_)xbE^nuDe zchWea-9>Dqho!E^v+H>1JmX9nm@)|e*VcZlj*sQ0wr18Q+@ESRd;m_dCE_c+nIav& zLzYU#<*9NT;y?2IXa%pub#iU3N9DUzXBh(Nqgz!tJpXGFhMJyH+#xtu%0x{Alq%)?-)b!3?-x zZmuMeL4kK0xYV5A;B;E0s+`w8sH=8v^Bw@Ec*cX9@V+1s|cR;Qgbs= zlN&C2tYhdmcH2NZUD9;{-FS6Td1qNgK4ck%6NZ!8oWQtRLuVnL)U}<;5GTm0AL~G} zv4>oj!im!!&QMOKeN(gzENAk6{o}_Rgq|oU3MC_9)DnwXqL+&= z4=Ryp|Lb?J2hXq>h1NI(VFuYed3FS7-An)JSsGqDjFpJmG%Fl3KE%#P6u3a z9?$?Kv;*1Y88i>W#Jrufg%x{XkF?S~GbtI09-SE%IPWv{fEBEkNDc<6p%wECnfKpF zBH@6>N4I)rXh2%QDNxkV{u7s@axYWV2_7C2{oA=ug4dtS;`W?i-)&uZEx6h)(xw zE)T_?F8$}7m+LppJ((_OWI3NFD+vqNmq*V_wb=j0Q>KBkZc}}{n?J3dJeDCA<8ES-LhH<+LkRJzXchUd)sz_;9~U9u5CChT{KO3b>4{Of^)W_;c}41 z=d%;NrzB;O_G>V8)vRt0Cr?t&PsrQEfOffrJKID(r<%>-^Qk@QV#ntRL~Td4#5TnC z4k75x;Z^I@B}`>E`X}CkcVp|)%!{Py_R^I&Kd=>&v-u~d9-gmCbIoyx&m_T^v!^Ek zEV0&iOp3B~)wX`q18NMWrUwIj|NOJ<+p@!O`wF69`aj40*OB(lf8&dtB6t`9{++@E zMMc#a$fvHQzqI`~<|)|E2cgs8;%Yx8Q^q)XQjXuZldBeo_x&NbhBH2f$)=E zO^8j3aehPB!>Y4FP@$!a*ll5edETOE-cn&f8SbJ)$uuKiUg1

n{^Bdxey$rBn2!DEmh_{Hv;EzI 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

qg=1f2w!NTg1)^+nsv|^?`;py#Z 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

m}tp*wiPRa^9D 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index d3520e7..55e2b87 100644 --- a/README.md +++ b/README.md @@ -1,54 +1,43 @@ -# Netopeer2GUI -Web-based NETCONF management center - -This tool is currently under development and not intended for production use. -However, we welcome your feedback provided via the [issue tracker](https://github.com/CESNET/Netopeer2GUI/issues). - - - -Several screenshots can be found in the [`docs`](./docs/). - -# Features List - -- [x] manage devices to connect to - - [ ] manage devices groupings for bulk configuration -- [x] manage YANG schemas stored in GUI to represent received data - - [ ] interaction with user by asking unknown module used by the connected device -- [x] display configuration and data of the connected device (data tree view) -- [x] edit configuration data of the device -- [ ] bulk configuration (set configuration of multiple device at once) -- [x] YANG explorer to display/browse YANG schema (currently just basic textual information) -- [ ] receive NETCONF notifications and present them to user -- [ ] accept NETCONF Call Home connections -- [ ] plugin interface for schema-specific applications - -# Dependencies -The application is created as a module to the [liberouter-gui](https://github.com/CESNET/liberouter-gui) -framework, so to install it, follow the [liberouter-gui instructions](https://github.com/CESNET/liberouter-gui/wiki/Deploying-LiberouterGUI). When you decide to deploy production version, there is pre-built Netopeer2GUI as a [release package](https://github.com/CESNET/Netopeer2GUI/releases). To configure your web server, please follow the mentioned liberouter-gui instructions or have a look at [`*-release` vagrant image(s)](./vagrant/). - -The backend is a Flask server written in Python 3 and utilizing [libyang](https://github.com/CESNET/libyang) -and [libnetconf2](https://github.com/CESNET/libnetconf2) Python bindings. -Unfortunatelly, the code of the bindings is not yet finished, so please use -the devel branches of the mentioned libraries: -``` -$ git clone -b devel https://github.com/CESNET/libyang -$ mkdir -p libyang/build && cd libyang/build -$ cmake -DGEN_LANGUAGE_BINDINGS=ON .. -$ make -# make install -``` -``` -$ git clone -b devel https://github.com/CESNET/libnetconf2 -$ mkdir -p libnetconf2/build && cd libnetconf2/build -$ cmake -DENABLE_PYTHON=ON .. -$ make -# make install -``` +# netconf-gui +A GUI for the libnetconf2 library. +**This version is in development and NOT for production use yet!** +We are unable to provide full support right now for this version since some parts are not yet finished. + +## Installation + +To install the NetconfGUI, follow these steps: + +1. Follow the instructions in the [libyang repository](https://github.com/CESNET/libyang) and install libyang. +2. Follow the instructions in the [libnetconf2 repository](https://github.com/CESNET/libnetconf2) and install libnetconf2 with python bindings (Option `-DENABLE_PYTHON=on` when using cmake) +3. Follow the quick start guide in the [liberouter GUI repository](https://github.com/CESNET/liberouter-gui). On step two, copy the NetconfGUI repository to liberouter GUI `modules` folder. +4. Start the liberouter GUI and navigate to `http://localhost:4200` in your browser -Or alternatively install binary packages of [libyang](https://software.opensuse.org//download.html?project=home%3Aliberouter&package=libyang-experimental) and [libnetconf2](https://software.opensuse.org//download.html?project=home%3Aliberouter&package=libnetconf2-experimental). -# Vagrant -For fast and simple testing/development deployment, you can use the prepared -Vagrantfiles for instantiating virtual machine. More information can be found -[here](./vagrant/). +## Docker +Comming soon. + +## Vagrant +To try out the NetconfGUI without installing it, clone this repository, install [VirtualBox](https://www.virtualbox.org/wiki/Downloads) and [Vagrant](https://www.vagrantup.com/docs/installation/)), navigate to the `vagrant` folder in this repository and type `vargant up`. + +This will bring up a virtual machine and install all dependencies automatically. The virtual machine also contains running `netopeer2-server` as a NETCONF enabled device. +You can connect to this device using the following credentials: +- Username: vagrant +- Password: vagrant +- Hostname: localhost +- Port: 830 + +To stop the virtual machine, use the `vagrang halt` command. To connect to the virtual machine, use `vagrant ssh`. + +You can connect to the GUI in the virtual machine just as if it was running on your machine. Just type `vagrant port` to check, which port in your system is the port 4200 from the virtual machine mapped to. + +``` +$ vagrant port +The forwarded ports for the machine are listed below. Please note that +these values may differ from values configured in the Vagrantfile if the +provider supports automatic port collision detection and resolution. + + 22 (guest) => 2203 (host) + 4200 (guest) => 2201 (host) + 830 (guest) => 2202 (host) +``` diff --git a/app.config.json b/app.config.json deleted file mode 100644 index 63cb023..0000000 --- a/app.config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "logo" : "assets/netopeer/logo.png", - "name" : "Netopeer", - "colorTheme" : { - "colorMain" : "#354b68", - "colorHighlight" : "#3d5676", - "colorSelected" : "#3d5676", - "colorSelected2" : "#6888b1" - }, - "api" : { - "url" : "/libapi", - "host" : null, - "port" : null, - "proto" : null - } -} diff --git a/assets/tools-config.json b/assets/tools-config.json new file mode 100644 index 0000000..e42be8c --- /dev/null +++ b/assets/tools-config.json @@ -0,0 +1,26 @@ +{ + "yang-configure": { + "name": "Yang Configure", + "path": "/assets/libnetconf/tools/yang-configure.js", + "image": "/assets/libnetconf/tools/img/configure.png", + "description": "Configure devices using the NETCONF protocol" + }, + "yang-explorer": { + "name": "Yang Explorer", + "path": "/assets/libnetconf/tools/yang-explorer.js", + "image": "/assets/libnetconf/tools/img/explorer.png", + "description": "Browse uploaded yang schemas" + }, + "example": { + "name": "Example tool", + "path": "/assets/libnetconf/tools/example.js", + "image": "/assets/libnetconf/tools/img/example.png", + "description": "Does nothing... yet." + }, + "color-picker": { + "name": "Color picker", + "path": "/assets/libnetconf/tools/color-picker.js", + "image": "/assets/libnetconf/tools/img/example.png", + "description": "Pick a color for RGB enabled devices." + } +} diff --git a/assets/tools/3rdpartylicenses.txt b/assets/tools/3rdpartylicenses.txt new file mode 100644 index 0000000..cc22582 --- /dev/null +++ b/assets/tools/3rdpartylicenses.txt @@ -0,0 +1,211 @@ +@angular/common@6.1.10 +MIT +MIT + +@angular/router@6.1.10 +MIT +MIT + +rxjs@6.2.2 +Apache-2.0 +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/assets/tools/img/configure.png b/assets/tools/img/configure.png new file mode 100644 index 0000000000000000000000000000000000000000..25db3d1aadcf3d1cdd939ce855bebb2975dea34c GIT binary patch literal 12106 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 literal 0 HcmV?d00001 diff --git a/backend/__init__.py b/backend/__init__.py index 92ae9c0..ea4db46 100644 --- a/backend/__init__.py +++ b/backend/__init__.py @@ -1,37 +1,47 @@ -""" -Netopeer2 GUI backend -File: __init__.py -Author: Radek Krejci - -Backend initialization via liberouter GUI. -""" - -from liberouterapi import config, modules - -# Get Netopeer backend config -config.load(path = __path__[0] + '/config.ini') - -# Register a blueprint -module_bp = modules.module.Module('netopeer', __name__, url_prefix = '/netopeer', no_version = True) - -from .schemas import * -from .devices import * -from .connections import * - -module_bp.add_url_rule('/inventory/schemas', view_func = schemas_list, methods = ['GET']) -module_bp.add_url_rule('/inventory/schemas', view_func = schemas_add, methods=['POST']) -module_bp.add_url_rule('/inventory/schemas', view_func = schemas_rm, methods = ['DELETE']) -module_bp.add_url_rule('/inventory/schema', view_func = schema_get, methods = ['GET']) -module_bp.add_url_rule('/inventory/devices/list', view_func = devices_list, methods=['GET']) -module_bp.add_url_rule('/inventory/devices', view_func = devices_add, methods=['POST']) -module_bp.add_url_rule('/inventory/devices', view_func = devices_rm, methods = ['DELETE']) -module_bp.add_url_rule('/session', view_func = connect, methods=['POST']) -module_bp.add_url_rule('/session', view_func = session_close, methods = ['DELETE']) -module_bp.add_url_rule('/session/alive', view_func = session_alive, methods=['GET']) -module_bp.add_url_rule('/session/capabilities', view_func = session_get_capabilities, methods=['GET']) -module_bp.add_url_rule('/session/rpcGet', view_func = session_get, methods=['GET']) -module_bp.add_url_rule('/session/commit', view_func = session_commit, methods = ['POST']) -module_bp.add_url_rule('/session/element/checkvalue', view_func = data_checkvalue, methods = ['GET']) -module_bp.add_url_rule('/session/schema', view_func = schema_info, methods = ['GET']) -module_bp.add_url_rule('/session/schema/checkvalue', view_func = schema_checkvalue, methods = ['GET']) -module_bp.add_url_rule('/session/schema/values', view_func = schema_values, methods = ['GET']) +""" +Liberouter GUI module setup and HTTP path setup +File: init.py +Author: Jakub Man +""" + +from liberouterapi import config +from liberouterapi.dbConnector import dbConnector +from liberouterapi.modules.module import Module + +if 'netconf' not in config.config.sections(): + config.load(path=__path__[0] + '/config.ini') + conf_path = config['netconf'] + +from .connections import * +from .netconf import * + +netconf_bp = Module('netconf', __name__, url_prefix='/netconf', no_version=True) + +# Devices +netconf_bp.add_url_rule('/devices', view_func=devices_get, methods=['GET']) +netconf_bp.add_url_rule('/device', view_func=device_add, methods=['POST']) + +# Connections +netconf_bp.add_url_rule('/connect', view_func=connect_device, methods=['POST']) + +# Sessions +netconf_bp.add_url_rule('/session/alive/', view_func=session_alive, methods=['GET']) +netconf_bp.add_url_rule('/session/', view_func=session_destroy, methods=['DELETE']) +netconf_bp.add_url_rule('/sessions', view_func=sessions_get_open, methods=['GET']) +netconf_bp.add_url_rule('/sessions', view_func=session_destroy_all, methods=['DELETE']) +netconf_bp.add_url_rule('/session/rpcGet', view_func=session_rpc_get, methods=['GET']) +netconf_bp.add_url_rule('/session/commit', view_func=session_commit, methods=['POST']) + +# Profiles +netconf_bp.add_url_rule('/activateProfile', view_func=activate_profile, methods=['POST']) +netconf_bp.add_url_rule('/profiles', view_func=profiles, methods=['GET']) +netconf_bp.add_url_rule('/profile/', view_func=profile_get, methods=['GET']) +netconf_bp.add_url_rule('/removeProfile', view_func=profile_remove, methods=['POST']) +netconf_bp.add_url_rule('/profileOnLogin', view_func=profile_on_login, methods=['GET']) +netconf_bp.add_url_rule('/profile/setConnectOnLogin', view_func=profile_set_connect_on_login, methods=['POST']) +netconf_bp.add_url_rule('/profile', view_func=profile_add, methods=['POST']) +netconf_bp.add_url_rule('/profileSet', view_func=profile_set, methods=['POST']) + +# Schemas +netconf_bp.add_url_rule('/schemas', view_func=schemas_get_all, methods=['GET']) +netconf_bp.add_url_rule('/schema/', view_func=schema_get, methods=['GET']) diff --git a/backend/config.ini b/backend/config.ini index 3fe97d2..346aac0 100644 --- a/backend/config.ini +++ b/backend/config.ini @@ -1,2 +1,4 @@ -[netopeer] -usersdata_path=./ \ No newline at end of file +[netconf] +database = netconfdb +collection = netconf +savePasswords = 0 diff --git a/backend/connections.py b/backend/connections.py index 7dfbd41..aebe6ca 100644 --- a/backend/connections.py +++ b/backend/connections.py @@ -1,501 +1,133 @@ -""" -NETCONF connections -File: connections.py -Author: Radek Krejci -""" - -import json -import os -import logging - -from liberouterapi import socketio, auth -from flask import request -from eventlet.timeout import Timeout -import yang -import netconf2 as nc - -from .inventory import INVENTORY -from .socketio import sio_emit, sio_wait, sio_clean -from .devices import devices_get, devices_replace -from .error import NetopeerException -from .schemas import getschema, schemas_update -from .data import * - -log = logging.getLogger(__name__) - -sessions = {} - -def hostkey_check(hostname, state, keytype, hexa, priv): - if 'fingerprint' in priv['device']: - # check according to the stored fingerprint from previous connection - if hexa == priv['device']['fingerprint']: - return True - elif state != 2: - log.error("Incorrect host key state") - state = 2 - - # ask frontend/user for hostkey check - params = {'id': priv['session']['session_id'], 'hostname' : hostname, 'state' : state, 'keytype' : keytype, 'hexa' : hexa} - sio_emit('hostcheck', params) - - result = False - timeout = Timeout(30) - try: - # wait for response from the frontend - data = sio_wait(priv['session']['session_id']) - result = data['result'] - except Timeout: - # no response received within the timeout - log.info("socketio: hostcheck timeout.") - except KeyError: - # invalid response - log.error("socketio: invalid hostcheck_result received.") - finally: - # we have the response - sio_clean(priv['session']['session_id']) - timeout.cancel() - - if result: - # store confirmed fingerprint for future connections - priv['device']['fingerprint'] = hexa; - devices_replace(priv['device']['id'], priv['session']['user'].username, priv['device']) - - return result - - -def auth_common(session_id): - result = None - timeout = Timeout(60) - try: - # wait for response from the frontend - data = sio_wait(session_id) - result = data['password'] - except Timeout: - # no response received within the timeout - log.info("socketio: auth request timeout.") - except KeyError: - # no password - log.info("socketio: invalid credential data received.") - finally: - # we have the response - sio_clean(session_id) - timeout.cancel() - - return result - - -def auth_password(username, hostname, priv): - sio_emit('device_auth', {'id': priv, 'type': 'Password Authentication', 'msg': username + '@' + hostname}) - return auth_common(priv) - - -def auth_interactive(name, instruction, prompt, priv): - sio_emit('device_auth', {'id': priv, 'type': name, 'msg': instruction, 'prompt': prompt}) - return auth_common(priv) - -@auth.required() -def connect(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - path = os.path.join(INVENTORY, user.username) - - data = request.get_json() - if 'id' in data: - # stored device - device = devices_get(data['id'], user.username) - elif 'device' in data: - # one-time connect, the device is specified in request - device = data['device'] - else: - raise NetopeerException('Invalid connection request.') - - if not device: - raise NetopeerException('Unknown device to connect to request.') - - nc.setSearchpath(path) - nc.setSchemaCallback(getschema, session) - - if 'password' in device: - ssh = nc.SSH(device['username'], password = device['password']) - else: - ssh = nc.SSH(device['username']) - ssh.setAuthPasswordClb(auth_password, session['session_id']) - ssh.setAuthInteractiveClb(auth_interactive, session['session_id']) - - ssh.setAuthHostkeyCheckClb(hostkey_check, {'session': session, 'device' : device}) - try: - ncs = nc.Session(device['hostname'], device['port'], ssh) - except Exception as e: - nc.setSchemaCallback(None) - return(json.dumps({'success': False, 'error-msg': str(e)})) - nc.setSchemaCallback(None) - - if not user.username in sessions: - sessions[user.username] = {} - - # use key (as hostname:port:session-id) to store the created NETCONF session - key = ncs.host + ":" + str(ncs.port) + ":" + ncs.id - sessions[user.username][key] = {} - sessions[user.username][key]['session'] = ncs - - # update inventory's list of schemas - schemas_update(session) - - return(json.dumps({'success': True, 'session-key': key})) - - -@auth.required() -def session_get_capabilities(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - req = request.args.to_dict() - - if not 'key' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing session key.'})) - - if not user.username in sessions: - sessions[user.username] = {} - - key = req['key'] - if not key in sessions[user.username]: - return(json.dumps({'success': False, 'error-msg': 'Invalid session key.'})) - - cpblts = [] - for c in sessions[user.username][key]['session'].capabilities: - cpblts.append(c) - - return(json.dumps({'success': True, 'capabilities': cpblts})) - -@auth.required() -def session_get(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - req = request.args.to_dict() - - if not 'key' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing session key.'})) - if not 'recursive' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing recursive flag.'})) - - if not user.username in sessions: - sessions[user.username] = {} - - key = req['key'] - if not key in sessions[user.username]: - return(json.dumps({'success': False, 'error-msg': 'Invalid session key.'})) - - try: - sessions[user.username][key]['data'] = sessions[user.username][key]['session'].rpcGet() - except ConnectionError as e: - reply = {'success': False, 'error': [{'msg': str(e)}]} - del sessions[user.username][key] - return(json.dumps(reply)) - except nc.ReplyError as e: - reply = {'success': False, 'error': []} - for err in e.args[0]: - reply['error'].append(json.loads(str(err))) - return(json.dumps(reply)) - - if not 'path' in req: - return(dataInfoRoots(sessions[user.username][key]['data'], True if req['recursive'] == 'true' else False)) - else: - return(dataInfoSubtree(sessions[user.username][key]['data'], req['path'], True if req['recursive'] == 'true' else False)) - - -def _checkvalue(session, req, schema): - user = session['user']; - - if not 'key' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing session key.'})) - if not 'path' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing path to validate value.'})) - if not 'value' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing value to validate.'})) - - key = req['key'] - if not key in sessions[user.username]: - return(json.dumps({'success': False, 'error-msg': 'Invalid session key.'})) - - ctx = sessions[user.username][key]['session'].context; - if schema: - search = ctx.find_path(req['path']) - else: - search = sessions[user.username][key]['data'].find_path(req['path']) - - if search.number() != 1: - return(json.dumps({'success': False, 'error-msg': 'Invalid data path.'})) - - if schema: - node = search.schema()[0] - else: - node = search.data()[0] - - if node.validate_value(req['value']): - errors = yang.get_ly_errors(ctx) - if errors.size(): - return(json.dumps({'success': False, 'error-msg': errors[errors.size() - 1].errmsg()})) - else: - return(json.dumps({'success': False, 'error-msg': 'unknown error'})) - - return(json.dumps({'success': True})) - -@auth.required() -def data_checkvalue(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - req = request.args.to_dict() - - return _checkvalue(session, req, False) - - -@auth.required() -def schema_checkvalue(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - req = request.args.to_dict() - - return _checkvalue(session, req, True) - - -@auth.required() -def schema_values(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - req = request.args.to_dict() - - if not 'key' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing session key.'})) - if not 'path' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing path to validate value.'})) - - key = req['key'] - if not key in sessions[user.username]: - return(json.dumps({'success': False, 'error-msg': 'Invalid session key.'})) - - search = sessions[user.username][key]['session'].context.find_path(req['path']) - if search.number() != 1: - return(json.dumps({'success': False, 'error-msg': 'Invalid data path.'})) - schema = search.schema()[0] - - if schema.nodetype() != yang.LYS_LEAF and schema.nodetype != yang.LYS_LEAFLIST: - result = None - else: - result = typeValues(schema.subtype().type(), []) - return(json.dumps({'success': True, 'data': result})) - - -@auth.required() -def schema_info(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - req = request.args.to_dict() - - if not 'key' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing session key.'})) - if not 'path' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing path to validate value.'})) - - key = req['key'] - if not key in sessions[user.username]: - return(json.dumps({'success': False, 'error-msg': 'Invalid session key.'})) - - if req['path'] == '/': - node = None - else: - search = sessions[user.username][key]['session'].context.find_path(req['path']) - if search.number() != 1: - return(json.dumps({'success': False, 'error-msg': 'Invalid data path.'})) - node = search.schema()[0] - - result = []; - if 'relative' in req: - if req['relative'] == 'children': - if node: - instantiables = node.child_instantiables(0) - else: - # top level - instantiables = sessions[user.username][key]['session'].context.data_instantiables(0) - elif req['relative'] == 'siblings': - if node.parent(): - instantiables = node.parent().child_instantiables(0) - else: - # top level - instantiables = sessions[user.username][key]['session'].context.data_instantiables(0) - else: - return(json.dumps({'success': False, 'error-msg': 'Invalid relative parameter.'})) - - for child in instantiables: - if child.flags() & yang.LYS_CONFIG_R: - # ignore status nodes - continue - if child.nodetype() & (yang.LYS_RPC | yang.LYS_NOTIF | yang.LYS_ACTION): - # ignore RPCs, Notifications and Actions - continue - result.append(schemaInfoNode(child)) - else: - result.append(schemaInfoNode(node)) - - return(json.dumps({'success': True, 'data': result})) - - -def _create_child(ctx, parent, child_def): - at = child_def['info']['module'].find('@') - if at == -1: - module = ctx.get_module(child_def['info']['module']) - else: - module = ctx.get_module(child_def['info']['module'][:at], child_def['info']['module'][at + 1:]) - # print('child: ' + json.dumps(child_def)) - # print('parent: ' + parent.schema().name()) - # print('module: ' + module.name()) - # print('name: ' + child_def['info']['name']) - if child_def['info']['type'] == 4 : - # print('value: ' + str(child_def['value'])) - yang.Data_Node(parent, module, child_def['info']['name'], child_def['value']) - elif child_def['info']['type'] == 8: - # print('value: ' + child_def['value'][0]) - yang.Data_Node(parent, module, child_def['info']['name'], child_def['value'][0]) - else: - child = yang.Data_Node(parent, module, child_def['info']['name']) - if 'children' in child_def: - for grandchild in child_def['children']: - _create_child(ctx, child, grandchild) - - -@auth.required() -def session_commit(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - - req = request.get_json(keep_order = True) - if not 'key' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing session key.'})) - if not 'modifications' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing modifications.'})) - - mods = req['modifications'] - ctx = sessions[user.username][req['key']]['session'].context - root = None - reorders = [] - for key in mods: - recursion = False - # get correct path and value if needed - path = key - value = None - if mods[key]['type'] == 'change': - value = mods[key]['value'] - elif mods[key]['type'] == 'create' or mods[key]['type'] == 'replace': - if mods[key]['data']['info']['type'] == 1: - # creating/replacing container - recursion = True - elif mods[key]['data']['info']['type'] == 4: - # creating/replacing leaf - value = mods[key]['data']['value'] - elif mods[key]['data']['info']['type'] == 8: - # creating/replacing leaf-list - value = mods[key]['data']['value'][0] - path = mods[key]['data']['path'] - elif mods[key]['data']['info']['type'] == 16: - recursion = True - path = mods[key]['data']['path'] - elif mods[key]['type'] == 'reorder': - # postpone reorders - reorders.extend(mods[key]['transactions']) - continue - - # create node - # print("creating " + path) - # print("value " + str(value)) - if root: - root.new_path(ctx, path, value, 0, 0) - else: - root = yang.Data_Node(ctx, path, value, 0, 0) - node = root.find_path(path).data()[0]; - - # set operation attribute and add additional data if any - if mods[key]['type'] == 'change': - node.insert_attr(None, 'ietf-netconf:operation', 'merge') - elif mods[key]['type'] == 'delete': - node.insert_attr(None, 'ietf-netconf:operation', 'delete') - elif mods[key]['type'] == 'create': - node.insert_attr(None, 'ietf-netconf:operation', 'create') - elif mods[key]['type'] == 'replace': - node.insert_attr(None, 'ietf-netconf:operation', 'replace') - else: - return(json.dumps({'success': False, 'error-msg': 'Invalid modification ' + key})) - - if recursion and 'children' in mods[key]['data']: - for child in mods[key]['data']['children']: - if 'key' in child['info'] and child['info']['key']: - continue - _create_child(ctx, node, child) - - # finally process reorders which must be last since they may refer newly created nodes - # and they do not reflect removed nodes - for move in reorders: - try: - node = root.find_path(move['node']).data()[0]; - parent = node.parent() - node.unlink() - if parent: - parent.insert(node) - else: - root.insert_sibling(node) - except: - if root: - root.new_path(ctx, move['node'], None, 0, 0) - else: - root = yang.Data_Node(ctx, move['node'], None, 0, 0) - node = root.find_path(move['node']).data()[0]; - node.insert_attr(None, 'yang:insert', move['insert']) - if move['insert'] == 'after' or move['insert'] == 'before': - if 'key' in move: - node.insert_attr(None, 'yang:key', move['key']) - elif 'value' in move: - node.insert_attr(None, 'yang:value', move['value']) - - # print(root.print_mem(yang.LYD_XML, yang.LYP_FORMAT)) - try: - sessions[user.username][req['key']]['session'].rpcEditConfig(nc.DATASTORE_RUNNING, root) - except nc.ReplyError as e: - reply = {'success': False, 'error': []} - for err in e.args[0]: - reply['error'].append(json.loads(str(err))) - return(json.dumps(reply)) - - return(json.dumps({'success': True})) - - -@auth.required() -def session_close(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - req = request.args.to_dict() - - if not 'key' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing session key.'})) - - if not user.username in sessions: - sessions[user.username] = {} - - key = req['key'] - if not key in sessions[user.username]: - return(json.dumps({'success': False, 'error-msg': 'Invalid session key.'})) - - del sessions[user.username][key] - return(json.dumps({'success': True})) - -@auth.required() -def session_alive(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - req = request.args.to_dict() - - if not 'key' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing session key.'})) - - if not user.username in sessions: - sessions[user.username] = {} - - key = req['key'] - if not key in sessions[user.username]: - return(json.dumps({'success': False, 'error-msg': 'Invalid session key.'})) - - return(json.dumps({'success': True})) +""" +HTTP request handling +File: connections.py +Author: Jakub Man +""" + +from liberouterapi import db, auth, config, socketio +from liberouterapi.dbConnector import dbConnector +import json + +from .profiles import * +from .devices import * +from .schemas import * + +""" +DB connection setup +""" +netconf_db = dbConnector('netconf', provider='mongodb', config={'database': config['netconf']['database']}) +netconf_coll = netconf_db.db[config['netconf']['collection']] + +""" +Helpers +""" + + +@auth.required() +def get_username_from_session(): + session = auth.lookup(request.headers.get('lgui-Authorization', None)) + return session['user'].username + + +""" +Devices +""" + + +@auth.required() +def devices_get(): + return json.dumps(get_saved_devices(get_username_from_session(), netconf_coll)) + + +@auth.required() +def device_add(): + data = request.json + device = data['device'] + return json.dumps({'id': add_device(get_username_from_session(), device, netconf_coll)}) + + +""" +Profiles +""" + + +@auth.required() +def activate_profile(): + data = request.json + name = data['profile'] + if set_active_profile(get_username_from_session(), name): + return json.dumps({'success': True, 'code': 200}) + else: + return json.dumps({'success': False, 'code': 500}) + + +@auth.required() +def profiles(): + return json.dumps(get_profile_names(get_username_from_session())) + + +@auth.required() +def profile_add(): + data = request.json + name = data['profile'] + if add_profile(get_username_from_session(), name): + return json.dumps({'success': True, 'code': 200}) + else: + return json.dumps({'success': False, 'code': 500}) + + +@auth.required() +def profile_get(profile_name): + return json.dumps(get_profile_devices(get_username_from_session(), profile_name, netconf_coll)) + + +@auth.required() +def profile_remove(): + data = request.json + name = data['profile'] + if remove_profile(get_username_from_session(), name): + return json.dumps({'success': True, 'code': 200}) + else: + return json.dumps({'success': False, 'code': 500}) + + +@auth.required() +def profile_on_login(): + return json.dumps(get_on_login_profile(get_username_from_session(), netconf_coll)) + + +@auth.required() +def profile_set(): + data = request.json + val = data['value'] + profile = data['profile'] + if set_profile_devices(get_username_from_session(), profile, val): + return json.dumps({'success': True, 'code': 200}) + else: + return json.dumps({'success': False, 'code': 500}) + + +@auth.required() +def profile_set_connect_on_login(): + data = request.json + profile = data['profile'] + value = data['value'] + if set_connect_on_login(get_username_from_session(), profile, value): + return json.dumps({'success': True, 'code': 200}) + else: + return json.dumps({'success': False, 'code': 500}) + + +""" +Schemas +""" + + +@auth.required() +def schemas_get_all(): + return json.dumps(get_all_schema_names(get_username_from_session())) + + +@auth.required() +def schema_get(name): + return json.dumps(get_schema_detail(get_username_from_session(), name)) diff --git a/backend/data.py b/backend/data.py index 35e1f03..0f23f3e 100644 --- a/backend/data.py +++ b/backend/data.py @@ -1,213 +1,231 @@ -""" -NETCONF data helper functions -File: data.py -Author: Radek Krejci -""" - -import json -import os - -import yang -import netconf2 as nc -from .schemas import make_schema_key - - -def infoBuiltInType(base): - return { - - 1 : 'error', - 0 : 'derived', - 1 : 'binary', - 2 : 'bits', - 3 : 'boolean', - 4 : 'decimal64', - 5 : 'empty', - 6 : 'enumeration', - 7 : 'identityref', - 8 : 'instance-identifier', - 9 : 'leafref', - 10: 'string', - 11: 'union', - 12: 'int8', - 13: 'uint8', - 14: 'int16', - 15: 'uint16', - 16: 'int32', - 17: 'uint32', - 18: 'int64', - 19: 'uint64', - }[base] - - -def schemaInfoType(schema, info): - info["datatype"] = schema.type().der().name() - info["datatypebase"] = infoBuiltInType(schema.type().base()) - - -def typeValues(type, result): - while type.der(): - if type.base() == 2: - # bits - if type.info().bits().count(): - for bit in type.info().bits().bit(): - result.append(bit.name()) - elif type.base() == 6: - # enumeration - if type.info().enums().count(): - for enm in type.info().enums().enm(): - result.append(enm.name()) - else: - return result - type = type.der().type() - - return result - -def schemaInfoNode(schema): - info = {} - - info["type"] = schema.nodetype() - if schema.module().rev_size(): - info["module"] = schema.module().name() + '@' + schema.module().rev().date() - else: - info["module"] = schema.module().name() - info["name"] = schema.name() - info["dsc"] = schema.dsc() - info["config"] = True if schema.flags() & yang.LYS_CONFIG_W else False - if info["type"] == 1: - info["presence"] = schema.subtype().presence() - info["path"] = schema.path() - - if info["type"] == yang.LYS_LEAF: - schemaInfoType(schema.subtype(), info) - info["key"] = False if schema.subtype().is_key() == None else True - dflt = schema.subtype().dflt() - if dflt: - info["default"] = dflt - else: - tpdf = schema.subtype().type().der() - while tpdf and not tpdf.dflt(): - tpdf = tpdf.type().der() - if tpdf: - info["default"] = tpdf.dflt() - elif info["type"] == yang.LYS_LEAFLIST: - schemaInfoType(schema.subtype(), info) - if schema.flags() & yang.LYS_USERORDERED: - info["ordered"] = True; - elif info["type"] == yang.LYS_LIST: - if schema.flags() & yang.LYS_USERORDERED: - info["ordered"] = True; - info["keys"] = [] - for key in schema.subtype().keys(): - info["keys"].append(key.name()) - - return info - - -def _sortChildren(node): - sorted = [] - for index, item in enumerate(node["children"]): - sorted.append(item) - if item["info"]["type"] == yang.LYS_LIST: - removed = 0 - if "ordered" in item["info"]: - item["order"] = removed - for i, instance in enumerate(node["children"][index + 1:]): - if item["info"]["name"] == instance["info"]["name"] and item["info"]["module"] == instance["info"]["module"]: - sorted.append(node["children"].pop(index + 1 + i - removed)) - removed += 1; - if "ordered" in item["info"]: - instance["order"] = removed - if item["info"]["type"] == yang.LYS_LEAFLIST: - lastLeafList = len(sorted) - 1 - item["first"] = True - removed = 0 - if "ordered" in item["info"]: - item["order"] = removed - for i, instance in enumerate(node["children"][index + 1:]): - if item["info"]["name"] == instance["info"]["name"] and item["info"]["module"] == instance["info"]["module"]: - instance["first"] = False - sorted.append(node["children"].pop(index + 1 + i - removed)) - removed += 1; - if "ordered" in item["info"]: - instance["order"] = removed - node["children"] = sorted - last = node["children"][len(node["children"]) - 1] - if last["info"]["type"] == yang.LYS_LEAFLIST: - node["children"][lastLeafList]["last"] = True - for item in node["children"][lastLeafList + 1:]: - item["lastLeafList"] = True; - else: - last["last"] = True - - -def dataInfoNode(node, parent=None, recursion=False): - schema = node.schema() - casted = node.subtype() - - if node.dflt(): - return None - - info = schemaInfoNode(schema); - - result = {} - if info["type"] == yang.LYS_LEAF or info["type"] == yang.LYS_LEAFLIST: - result["value"] = casted.value_str() - if info["datatypebase"] == "identityref": - info["refmodule"] = make_schema_key(casted.value().ident().module()) - elif recursion: - result["children"] = [] - if node.child(): - for child in node.child().tree_for(): - childNode = dataInfoNode(child, result, True) - if not childNode: - continue - result["children"].append(childNode) - # sort list instances - _sortChildren(result) - if info["type"] == yang.LYS_LIST: - result["keys"] = [] - index = 0 - for key in schema.subtype().keys(): - if len(result["children"]) <= index: - break - if key.subtype().name() == result["children"][index]["info"]["name"]: - result["keys"].append(result["children"][index]["value"]) - index = index + 1 - result["info"] = info - result["path"] = node.path() - - return result - -def dataInfoSubtree(data, path, recursion=False): - try: - node = data.find_path(path).data()[0] - except: - return(json.dumps({'success': False, 'error-msg': 'Invalid data path.'})) - - result = dataInfoNode(node) - if not result: - return(json.dumps({'success': False, 'error-msg': 'Path refers to a default node.'})) - - result["children"] = [] - if node.child(): - for child in node.child().tree_for(): - childNode = dataInfoNode(child, result, recursion) - if not childNode: - continue - result["children"].append(childNode) - _sortChildren(result) - - return(json.dumps({'success': True, 'data': result})) - - -def dataInfoRoots(data, recursion=False): - top = {} - top["children"] = [] - for root in data.tree_for(): - rootNode = dataInfoNode(root, top, recursion) - if not rootNode: - continue - if not recursion: - rootNode['subtreeRoot'] = True - top["children"].append(rootNode) - _sortChildren(top) - return(json.dumps({'success': True, 'data': top["children"]})) +""" + Copyright 2017 Radek Krejčí + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +import json +import os + +import yang +import netconf2 as nc + + +def info_built_in_type(base): + return { + - 1: 'error', + 0: 'derived', + 1: 'binary', + 2: 'bits', + 3: 'boolean', + 4: 'decimal64', + 5: 'empty', + 6: 'enumeration', + 7: 'identityref', + 8: 'instance-identifier', + 9: 'leafref', + 10: 'string', + 11: 'union', + 12: 'int8', + 13: 'uint8', + 14: 'int16', + 15: 'uint16', + 16: 'int32', + 17: 'uint32', + 18: 'int64', + 19: 'uint64', + }[base] + + +def make_schema_key(module): + result = module.name() + if module.rev_size(): + result = result + '@' + module.rev().date() + '.yang' + return result + + +def schema_info_type(schema, info): + info["datatype"] = schema.type().der().name() + info["datatypebase"] = info_built_in_type(schema.type().base()) + + +def type_values(type, result): + while type.der(): + if type.base() == 2: + # bits + if type.info().bits().count(): + for bit in type.info().bits().bit(): + result.append(bit.name()) + elif type.base() == 6: + # enumeration + if type.info().enums().count(): + for enm in type.info().enums().enm(): + result.append(enm.name()) + else: + return result + type = type.der().type() + + return result + + +def schema_info_node(schema): + info = {"type": schema.nodetype()} + + if schema.module().rev_size(): + info["module"] = schema.module().name() + '@' + schema.module().rev().date() + else: + info["module"] = schema.module().name() + info["name"] = schema.name() + info["dsc"] = schema.dsc() + info["config"] = True if schema.flags() & yang.LYS_CONFIG_W else False + if info["type"] == 1: + info["presence"] = schema.subtype().presence() + info["path"] = schema.path() + + if info["type"] == yang.LYS_LEAF: + schema_info_type(schema.subtype(), info) + info["key"] = False if schema.subtype().is_key() is None else True + dflt = schema.subtype().dflt() + if dflt: + info["default"] = dflt + else: + tpdf = schema.subtype().type().der() + while tpdf and not tpdf.dflt(): + tpdf = tpdf.type().der() + if tpdf: + info["default"] = tpdf.dflt() + elif info["type"] == yang.LYS_LEAFLIST: + schema_info_type(schema.subtype(), info) + if schema.flags() & yang.LYS_USERORDERED: + info["ordered"] = True + elif info["type"] == yang.LYS_LIST: + if schema.flags() & yang.LYS_USERORDERED: + info["ordered"] = True + info["keys"] = [] + for key in schema.subtype().keys(): + info["keys"].append(key.name()) + + return info + + +def _sort_children(node): + sorted = [] + last_leaf_list = 0 + for index, item in enumerate(node["children"]): + sorted.append(item) + if item["info"]["type"] == yang.LYS_LIST: + removed = 0 + if "ordered" in item["info"]: + item["order"] = removed + for i, instance in enumerate(node["children"][index + 1:]): + if item["info"]["name"] == instance["info"]["name"] and item["info"]["module"] == instance["info"][ + "module"]: + sorted.append(node["children"].pop(index + 1 + i - removed)) + removed += 1 + if "ordered" in item["info"]: + instance["order"] = removed + if item["info"]["type"] == yang.LYS_LEAFLIST: + last_leaf_list = len(sorted) - 1 + item["first"] = True + removed = 0 + if "ordered" in item["info"]: + item["order"] = removed + for i, instance in enumerate(node["children"][index + 1:]): + if item["info"]["name"] == instance["info"]["name"] and item["info"]["module"] == instance["info"][ + "module"]: + instance["first"] = False + sorted.append(node["children"].pop(index + 1 + i - removed)) + removed += 1 + if "ordered" in item["info"]: + instance["order"] = removed + node["children"] = sorted + last = node["children"][len(node["children"]) - 1] + if last["info"]["type"] == yang.LYS_LEAFLIST: + node["children"][last_leaf_list]["last"] = True + for item in node["children"][last_leaf_list + 1:]: + item["last_leaf_list"] = True; + else: + last["last"] = True + + +def data_info_node(node, parent=None, recursion=False): + schema = node.schema() + casted = node.subtype() + + if node.dflt(): + return None + + info = schema_info_node(schema) + + result = {} + if info["type"] == yang.LYS_LEAF or info["type"] == yang.LYS_LEAFLIST: + result["value"] = casted.value_str() + if info["datatypebase"] == "identityref": + info["refmodule"] = make_schema_key(casted.value().ident().module()) + elif recursion: + result["children"] = [] + if node.child(): + for child in node.child().tree_for(): + child_node = data_info_node(child, result, True) + if not child_node: + continue + result["children"].append(child_node) + # sort list instances + _sort_children(result) + if info["type"] == yang.LYS_LIST: + result["keys"] = [] + index = 0 + for key in schema.subtype().keys(): + if len(result["children"]) <= index: + break + if key.subtype().name() == result["children"][index]["info"]["name"]: + result["keys"].append(result["children"][index]["value"]) + index = index + 1 + result["info"] = info + result["path"] = node.path() + + return result + + +def data_info_subtree(data, path, recursion=False): + try: + node = data.find_path(path).data()[0] + except Exception: + return json.dumps({'success': False, 'code': 500, 'message': 'Invalid data path.'}) + result = data_info_node(node) + if not result: + return json.dumps({'success': False, 'code': 500, 'message': 'Path refers to a default node.'}) + + result["children"] = [] + if node.child(): + for child in node.child().tree_for(): + child_node = data_info_node(child, result, recursion) + if not child_node: + continue + result["children"].append(child_node) + _sort_children(result) + + return json.dumps({'success': True, 'code': 200, 'data': result}) + + +def data_info_roots(data, recursion=False): + top = {"children": []} + for root in data.tree_for(): + root_node = data_info_node(root, top, recursion) + if not root_node: + continue + if not recursion: + rootNode['subtreeRoot'] = True + top["children"].append(root_node) + _sort_children(top) + return json.dumps({'success': True, 'code': 200, 'data': top["children"]}) diff --git a/backend/devices.py b/backend/devices.py index b849756..d26d398 100644 --- a/backend/devices.py +++ b/backend/devices.py @@ -1,144 +1,59 @@ -""" -Manipulation with the devices to connect. -File: devices.py -Author: Radek Krejci -""" - -import json -import os -import errno - -from liberouterapi import auth -from flask import request - -from .inventory import INVENTORY, inventory_check -from .error import NetopeerException - -__DEVICES_EMPTY = '{"device":[]}' - - -def __devices_init(): - return json.loads(__DEVICES_EMPTY) - -def __devices_inv_load(path): - devicesinv_path = os.path.join(path, 'devices.json') - try: - with open(devicesinv_path, 'r') as devices_file: - devices = json.load(devices_file) - except OSError as e: - if e.errno == errno.ENOENT: - devices = __devices_init() - else: - raise NetopeerException('Unable to use user\'s devices inventory ' + devicesinv_path + ' (' + str(e) + ').') - except ValueError: - devices = __devices_init() - - return devices - -def __devices_inv_save(path, devices): - devicesinv_path = os.path.join(path, 'devices.json') - - #store the list - try: - with open(devicesinv_path, 'w') as devices_file: - json.dump(devices, devices_file) - except Exception: - pass - - return devices - -@auth.required() -def devices_list(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - path = os.path.join(INVENTORY, user.username) - - inventory_check(path) - devices = __devices_inv_load(path) - - for dev in devices['device']: - if 'password' in dev: - del dev['password'] - - return(json.dumps(devices['device'])) - -@auth.required() -def devices_add(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - path = os.path.join(INVENTORY, user.username) - - device = request.get_json() - if not device or not device['id']: - raise NetopeerException('Invalid device remove request.') - - devices = __devices_inv_load(path) - for dev in devices['device']: - if dev['id'] == device['id']: - return (json.dumps({'success': False})) - - device_json = {'id':device['id'], - 'name':device['name'], - 'hostname':device['hostname'], - 'port':device['port'], - 'autoconnect':device['autoconnect'], - 'username':device['username']} - if 'password' in device and device['password']: - device_json['password'] = device['password'] - devices['device'].append(device_json) - - #store the list - __devices_inv_save(path, devices) - - return(json.dumps({'success': True})) - -@auth.required() -def devices_rm(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - path = os.path.join(INVENTORY, user.username) - - rm_id = request.get_json()['id'] - if not rm_id: - raise NetopeerException('Invalid device remove request.') - - devices = __devices_inv_load(path) - for i in range(len(devices['device'])): - device = devices['device'][i] - if device['id'] == rm_id: - devices['device'].pop(i) - device = None - break - - if device: - # device not in inventory - return (json.dumps({'success': False})) - - # update the inventory database - __devices_inv_save(path, devices) - - return(json.dumps({'success': True})) - -def devices_get(device_id, username): - path = os.path.join(INVENTORY, username) - devices = __devices_inv_load(path) - - for i in range(len(devices['device'])): - device = devices['device'][i] - if device['id'] == device_id: - return device - - return None - - -def devices_replace(device_id, username, device): - path = os.path.join(INVENTORY, username) - devices = __devices_inv_load(path) - - for i in range(len(devices['device'])): - if devices['device'][i]['id'] == device_id: - devices['device'][i] = device - break - - # update the inventory database - __devices_inv_save(path, devices) +""" +Device database manipulation +File: devices.py +Author: Jakub Man +""" + +import json +from flask import request +from bson.objectid import ObjectId +# import netconf2 as nc + + +def get_saved_devices(username, db_coll): + list = [] + for item in db_coll.find({'owner': username}): + item['_id'] = str(item['_id']) + item['id'] = str(item['_id']) + list.append(item) + return list + + +def add_device(username, device, db_coll): + device['owner'] = username + # Check if device parameter has all required keys + if all (k in device for k in ('hostname', 'port', 'username')): + return str(db_coll.insert_one(device).inserted_id) + return False + + +def get_device_by_id(device_id: str, db_coll): + device = db_coll.find_one({'_id': ObjectId(device_id)}) + if device is not None: + device['_id'] = str(device['_id']) + device['id'] = str(device['_id']) + return device + + +def update_device(device_id, update_dict, db_coll): + db_coll.update_one({'_id': ObjectId(device_id)}, {'$set': update_dict}) + + +def update_hexa(device_id, new_hexa, db_coll): + db_coll.update_one({'_id': ObjectId(device_id)}, {'$set': {'fingerprint': new_hexa}}) + + +def update_hexa_by_device(device, new_hexa, db_coll): + db_coll.update_one({'hostname': device['hostname'], 'port': device['port'], 'username': device['username']}, + {'$set': {'fingerprint': new_hexa}}) + + +def get_device_from_session_data(host, port, owner, username, db_coll): + print(host) + device = db_coll.find_one({'hostname': host, 'port': port, 'owner': owner, 'username': username}) + if device is None and host == '127.0.0.1': + device = db_coll.find_one({'hostname': 'localhost', 'port': port, 'owner': owner, 'username': username}) + if device is not None: + device['_id'] = str(device['_id']) + device['id'] = str(device['_id']) + return device diff --git a/backend/error.py b/backend/error.py deleted file mode 100644 index 6db14c8..0000000 --- a/backend/error.py +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/python3 - -from liberouterapi.error import ApiException - -class NetopeerException(ApiException): - status_code = 500 diff --git a/backend/inventory.py b/backend/inventory.py deleted file mode 100644 index 3bb0d23..0000000 --- a/backend/inventory.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -Manipulation with the YANG schemas. -File: schemas.py -Author: Radek Krejci -""" - -import os -import errno - -from liberouterapi import config - -from .error import NetopeerException - -INVENTORY = config['netopeer'].get('usersdata_path', './') - -def inventory_check(path): - try: - os.makedirs(path, mode=0o750) - except OSError as e: - if e.errno == errno.EEXIST and os.path.isdir(path): - pass - elif e.errno == errno.EEXIST: - raise NetopeerException('User\'s inventory (' + path + ') already exists and it\'s not a directory.') - else: - raise NetopeerException('Unable to use inventory path ' + path +' (' + str(e) + ').') - diff --git a/backend/netconf.py b/backend/netconf.py new file mode 100644 index 0000000..caa9f14 --- /dev/null +++ b/backend/netconf.py @@ -0,0 +1,413 @@ +# coding=utf-8 +""" +Netconf session operations +File: netconf.py +Author: Jakub Man + + +Parts of this file was taken from the Netopeer2GUI project by Radek Krejčí +Available here: https://github.com/CESNET/Netopeer2GUI + + Copyright 2017 Radek Krejčí + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +from liberouterapi import db, auth, config, socketio +from liberouterapi.dbConnector import dbConnector +import netconf2 as nc +import json +from eventlet.timeout import Timeout +from flask import request +import logging +from .sockets import * +import os +import yang +from .schemas import get_schema +from .devices import * +from .data import * +import pprint + +sessions = {} +log = logging.getLogger(__name__) +netconf_db = dbConnector('netconf', provider='mongodb', config={'database': config['netconf']['database']}) +netconf_coll = netconf_db.db[config['netconf']['collection']] + +""" +netconf session (ncs) +static PyGetSetDef ncSessionGetSetters[] = { + {"id", (getter)ncSessionGetId, NULL, "NETCONF Session id.", NULL}, + {"host", (getter)ncSessionGetHost, NULL, "Host where the NETCONF Session is connected.", NULL}, + {"port", (getter)ncSessionGetPort, NULL, "Port number where the NETCONF Session is connected.", NULL}, + {"user", (getter)ncSessionGetUser, NULL, "Username of the user connected with the NETCONF Session.", NULL}, + {"transport", (getter)ncSessionGetTransport, NULL, "Transport protocol used for the NETCONF Session.", NULL}, + {"version", (getter)ncSessionGetVersion, NULL, "NETCONF Protocol version used for the NETCONF Session.", NULL}, + {"capabilities", (getter)ncSessionGetCapabilities, NULL, "Capabilities of the NETCONF Session.", NULL}, + {"context", (getter)ncSessionGetContext, NULL, "libyang context of the NETCONF Session.", NULL}, + {NULL} /* Sentinel */ +}; +""" + + +def auth_common(session_id): + global log + result = None + timeout = Timeout(60) + try: + # wait for response from the frontend + data = sio_wait(session_id) + result = data['password'] + except Timeout: + # no response received within the timeout + log.info("socketio: auth request timeout.") + except KeyError: + # no password + log.info("socketio: invalid credential data received.") + finally: + # we have the response + sio_clean(session_id) + timeout.cancel() + + return result + + +def auth_interactive(name, instruction, prompt, priv): + try: + pp = pprint.PrettyPrinter(indent=4) + pp.pprint(priv) + params = {'id': priv['id'], 'type': name, 'msg': instruction, 'prompt': prompt, 'device': priv['device']} + sio_emit('device_auth', params) + return auth_common(priv) + except Exception as e: + print(e) + + +def auth_password(username, hostname, priv): + sio_emit('device_auth', {'id': priv, 'type': 'Password Authentication', 'msg': username + '@' + hostname}) + return auth_common(priv) + + +@auth.required() +def connect_device(): + global sessions + session = auth.lookup(request.headers.get('lgui-Authorization', None)) + username = str(session['user'].username) + data = request.get_json() + + nc.setSchemaCallback(get_schema, session) + site_root = os.path.realpath(os.path.dirname(__file__)) + path = os.path.join(site_root, 'userfiles', username) + if not os.path.exists(path): + os.makedirs(path) + nc.setSearchpath(path) + if 'password' in data and data['password'] != '': + ssh = nc.SSH(data['username'], password=data['password']) + else: + ssh = nc.SSH(data['username']) + ssh.setAuthPasswordClb(auth_password, session['session_id']) + ssh.setAuthInteractiveClb(func=auth_interactive, priv={'id': session['session_id'], 'device': data}) + + ssh.setAuthHostkeyCheckClb(hostkey_check, {'session': session, 'device': data}) + + try: + ncs = nc.Session(data['hostname'], int(data['port']), ssh) + except Exception as e: + nc.setSchemaCallback(None) + return json.dumps({'success': False, 'code': 500, 'message': str(e)}) + nc.setSchemaCallback(None) + + if username not in sessions: + sessions[username] = {} + + # use key (as hostname:port:session-id) to store the created NETCONF session + key = ncs.host + ":" + str(ncs.port) + ":" + ncs.id + sessions[username][key] = {} + sessions[username][key]['session'] = ncs + + # update inventory's list of schemas + # schemas_update(session) + + return json.dumps({'success': True, 'session-key': key}) + + +def hostkey_check(hostname, state, keytype, hexa, priv): + if 'fingerprint' in priv['device']: + # check according to the stored fingerprint from previous connection + if hexa == priv['device']['fingerprint']: + return True + elif state != 2: + log.error("Incorrect host key state") + state = 2 + + # ask frontend/user for hostkey check + params = {'id': priv['session']['session_id'], 'hostname': hostname, 'state': state, 'keytype': keytype, + 'hexa': hexa, 'device': priv['device']} + sio_emit('hostcheck', params) + + result = False + timeout = Timeout(30) + try: + # wait for response from the frontend + data = sio_wait(priv['session']['session_id']) + result = data['result'] + except Timeout: + # no response received within the timeout + log.info("socketio: hostcheck timeout.") + except KeyError: + # invalid response + log.error("socketio: invalid hostcheck_result received.") + finally: + # we have the response + sio_clean(priv['session']['session_id']) + timeout.cancel() + + if result: + # store confirmed fingerprint for future connections + priv['device']['fingerprint'] = hexa + if 'id' in priv['device'].keys(): + update_hexa(priv['device']['id'], hexa, netconf_coll) + else: + update_hexa_by_device(priv['device'], hexa, netconf_coll) + return result + + +""" SESSION HANDLING """ + + +@auth.required() +def sessions_get_open(): + """ + Get all open sessions belonging to the user + :return: Array of session keys and devices belonging to sessions. Device names will not be loaded. + """ + global sessions + session = auth.lookup(request.headers.get('lgui-Authorization', None)) + username = str(session['user'].username) + + if username in sessions: + result = [] + for key in sessions[username].keys(): + ncs = sessions[username][key]['session'] + device = get_device_from_session_data(ncs.host, ncs.port, username, ncs.user, netconf_coll) + if device is not None: + result.append({'key': key, 'device': device}) + return json.dumps(result) + else: + return json.dumps([]) + + +@auth.required() +def session_alive(key): + global sessions + session = auth.lookup(request.headers.get('lgui-Authorization', None)) + username = str(session['user'].username) + + if not username in sessions: + sessions[username] = {} + + if key in sessions[username]: + return json.dumps({'success': True, 'code': 200}) + else: + return json.dumps({'success': False, 'code': 404, 'message': 'Session not found'}) + + +@auth.required() +def session_destroy(key): + global sessions + session = auth.lookup(request.headers.get('lgui-Authorization', None)) + username = str(session['user'].username) + if not username in sessions: + sessions[username] = {} + + if key in sessions[username]: + del sessions[username][key] + return json.dumps({'success': True, 'code': 200}) + else: + return json.dumps({'success': False, 'code': 404, 'message': 'Session not found'}) + + +@auth.required() +def session_destroy_all(): + global sessions + session = auth.lookup(request.headers.get('lgui-Authorization', None)) + username = str(session['user'].username) + if username in sessions: + del sessions[username] + return json.dumps({'success': True, 'code': 200}) + + +@auth.required() +def session_rpc_get(): + """ + code 500: wrong argument + code 404: session invalid -> try reconnecting + code 410: connection gone -> remove session, try reconnecting + code 418: Error in processing netconf request (nothing to do with a teapot) + """ + global sessions + session = auth.lookup(request.headers.get('lgui-Authorization', None)) + username = str(session['user'].username) + req = request.args.to_dict() + if 'key' not in req: + return json.dumps({'success': False, 'code': 500, 'message': 'Missing session key.'}) + if 'recursive' not in req: + return json.dumps({'success': False, 'code': 500, 'message': 'Missing recursive flag.'}) + + if username not in sessions: + sessions[username] = {} + + key = req['key'] + if key not in sessions[username]: + return json.dumps({'success': False, 'code': 404, 'message': 'Invalid session key.'}) + + try: + sessions[username][key]['data'] = sessions[username][key]['session'].rpcGet() + except ConnectionError as e: + del sessions[username][key] + return json.dumps({'success': False, 'code': 410, 'message': str(e)}) + except nc.ReplyError as e: + err_list = [] + for err in e.args[0]: + err_list.append(str(err)) + return json.dumps({'success': False, 'code': 418, 'message': str(e)}) + + if 'path' not in req: + return data_info_roots(sessions[username][key]['data'], True if req['recursive'] == 'true' else False) + else: + return data_info_subtree(sessions[username][key]['data'], req['path'], + True if req['recursive'] == 'true' else False) + + +@auth.required() +def session_commit(): + session = auth.lookup(request.headers.get('lgui-Authorization', None)) + user = session['user'] + + req = request.get_json(keep_order=True) + if 'key' not in req: + return json.dumps({'success': False, 'code': 500, 'message': 'Missing session key.'}) + if 'modifications' not in req: + return json.dumps({'success': False, 'code': 500, 'message': 'Missing modifications.'}) + + mods = req['modifications'] + ctx = sessions[user.username][req['key']]['session'].context + root = None + reorders = [] + for key in mods: + recursion = False + # get correct path and value if needed + path = mods[key]['data']['path'] + value = None + if mods[key]['type'] == 'change': + value = mods[key]['value'] + elif mods[key]['type'] == 'create' or mods[key]['type'] == 'replace': + if mods[key]['data']['info']['type'] == 1: + # creating/replacing container + recursion = True + elif mods[key]['data']['info']['type'] == 4: + # creating/replacing leaf + value = mods[key]['data']['value'] + elif mods[key]['data']['info']['type'] == 8: + # creating/replacing leaf-list + value = mods[key]['data']['value'][0] + path = mods[key]['data']['path'] + elif mods[key]['data']['info']['type'] == 16: + recursion = True + path = mods[key]['data']['path'] + elif mods[key]['type'] == 'reorder': + # postpone reorders + reorders.extend(mods[key]['transactions']) + continue + + # create node + # print("creating " + path) + # print("value " + str(value)) + if root: + root.new_path(ctx, path, value, 0, 0) + else: + try: + root = yang.Data_Node(ctx, path, value, 0, 0) + except Exception as e: + print(e) + return json.dumps({'success': False, 'code': 404, 'message': str(e)}) + node = root.find_path(path).data()[0] + + # set operation attribute and add additional data if any + if mods[key]['type'] == 'change': + node.insert_attr(None, 'ietf-netconf:operation', 'merge') + elif mods[key]['type'] == 'delete': + node.insert_attr(None, 'ietf-netconf:operation', 'delete') + elif mods[key]['type'] == 'create': + node.insert_attr(None, 'ietf-netconf:operation', 'create') + elif mods[key]['type'] == 'replace': + node.insert_attr(None, 'ietf-netconf:operation', 'replace') + else: + return json.dumps({'success': False, 'error-msg': 'Invalid modification ' + key}) + + if recursion and 'children' in mods[key]['data']: + for child in mods[key]['data']['children']: + if 'key' in child['info'] and child['info']['key']: + continue + _create_child(ctx, node, child) + + # finally process reorders which must be last since they may refer newly created nodes + # and they do not reflect removed nodes + for move in reorders: + try: + node = root.find_path(move['node']).data()[0]; + parent = node.parent() + node.unlink() + if parent: + parent.insert(node) + else: + root.insert_sibling(node) + except Exception as e: + if root: + root.new_path(ctx, move['node'], None, 0, 0) + else: + root = yang.Data_Node(ctx, move['node'], None, 0, 0) + node = root.find_path(move['node']).data()[0]; + node.insert_attr(None, 'yang:insert', move['insert']) + if move['insert'] == 'after' or move['insert'] == 'before': + if 'key' in move: + node.insert_attr(None, 'yang:key', move['key']) + elif 'value' in move: + node.insert_attr(None, 'yang:value', move['value']) + + # print(root.print_mem(yang.LYD_XML, yang.LYP_FORMAT)) + try: + sessions[user.username][req['key']]['session'].rpcEditConfig(nc.DATASTORE_RUNNING, root) + except nc.ReplyError as e: + reply = {'success': False, 'code': 500, 'message': '[]'} + for err in e.args[0]: + reply['message'] += str(err) + '; ' + return json.dumps(reply) + + return json.dumps({'success': True}) + + +def _create_child(ctx, parent, child_def): + at = child_def['info']['module'].find('@') + if at == -1: + module = ctx.get_module(child_def['info']['module']) + else: + module = ctx.get_module(child_def['info']['module'][:at], child_def['info']['module'][at + 1:]) + if child_def['info']['type'] == 4: + yang.Data_Node(parent, module, child_def['info']['name'], child_def['value']) + elif child_def['info']['type'] == 8: + yang.Data_Node(parent, module, child_def['info']['name'], child_def['value'][0]) + else: + child = yang.Data_Node(parent, module, child_def['info']['name']) + if 'children' in child_def: + for grandchild in child_def['children']: + _create_child(ctx, child, grandchild) diff --git a/backend/profiles.py b/backend/profiles.py new file mode 100644 index 0000000..5712f5a --- /dev/null +++ b/backend/profiles.py @@ -0,0 +1,390 @@ +""" +Saved device profile manipulation +File: profiles.py +Author: Jakub Man +""" +import json +import os +from typing import Callable, List +from flask import request + +from .devices import get_device_by_id + +""" +Profile entry format: +'profiles': [{ + 'name': 'profile name', + 'connectOnLogin': bool + 'devices': [ + { + 'id': device id, + 'subscriptions': [list of channels ](optional) + } + ] (optional) +}] +""" + +# Get path to server root +SITE_ROOT = os.path.realpath(os.path.dirname(__file__)) + +""" +File manipulation and cache +""" +file_cache = {} + +def get_user_file(username): + """ + Get a path to a file, where user data are stored + :param username: Username of a user requesting the data + :return: Full path to a file containing user's profile data + """ + return os.path.join(SITE_ROOT, 'userfiles', username + '.json') + + +def clear_profile_cache(): + """ + Clear local cache of profile data. Should be used only when deleting profile files. + :return: Does not return a value + """ + global file_cache + file_cache = {} + +def read_user_profiles(username: str) -> object: + """ + Returns all data saved in user's profile file. If data are in cache, cached data are returned. + If data for specified user are not in cache, user's profile file is opened and parsed, then added to cache. + If user's profile file does not exist, a new file is created with default values. + :param username: Username of a user requesting the data + :return: Dictionary containing these values: 'active' (string - profile name) and 'profiles' (list of dictionaries) + """ + global file_cache + if username in file_cache.keys(): + return file_cache[username] + else: + file = get_user_file(username) + with open(file, 'a+') as f: + try: + f.seek(0) + data = json.load(f) + except Exception as e: # File did not exist or was not a valid JSON + f.seek(0) + json.dump({'active': 'default', 'profiles': [{'name': 'default', 'connectOnLogin': False}]}, f) + data = {'active': 'default', 'profiles': [{'name': 'default', 'connectOnLogin': False}]} + f.truncate() + file_cache[username] = data + return data + + +def write_user_profiles(username: str, profiles: object) -> bool: + """ + Writes data to user's profile file and updates cache + :param username: Username of a user requesting the data + :param profiles: Object of data, that should be written to the file. Has to contain 'active', 'profiles' and 'connectOnLogin' keys + :return: True if data was written correctly, False otherwise. + """ + if 'active' in profiles.keys() and 'profiles' in profiles.keys(): + file = get_user_file(username) + with open(file, 'w+') as f: + try: + json.dump(profiles, f) + f.truncate() + file_cache[username] = profiles + return True + except Exception as e: + print(e.message) + return False + else: + return False + + +""" +Helper functions +""" + +def get_profile_names(username: str) -> list: + """ + Return a list of profile names that user had saved + :param username: Username of a user requesting the data + :return: List of strings, profile names + """ + data = read_user_profiles(username) + return [x['name'] for x in data['profiles']] + + +def get_profiles(username: str) -> object: + """ + Returns a list of profile information. Items of the list are dictionaries containing profile name and saved devices. + :param username: Username of a user requesting the data + :return: list of dictionaries containing keys 'name' (string, profile name) and 'devices' (list of dictionaries) + """ + data = read_user_profiles(username) + return data['profiles'] + + +def does_profile_exist(username: str, profile_name: str) -> bool: + return profile_name in get_profile_names(username) + + +""" +Toggling connection on login +""" + +def should_connect_on_login(username: str, profile_name: str) -> bool: + """ + Check whether profile should be connected when user logs in, if the profile is active + :param profile_name: Name of the profile to check + :param username: Username of a user requesting the data + :return: True if the devices in profile should be connected when user logs in, if the profile is active. + """ + profiles = get_profiles(username) + for i in range(len(profiles)): + if profiles[i]['name'] == profile_name: + return profiles[i]['connectOnLogin'] + return False + +def set_connect_on_login(username: str, profile_name: str, value: bool) -> bool: + """ + Set whether devices in the profile should be connected on login, if the profile is active + :param username: Username of a user requesting the data + :param profile_name: Name of the profile to set the value to + :param value: True if the profile devices should be connected on login, false if not + :return: True if data were written successfully, False otherwise + """ + data = read_user_profiles(username) + for i in range(len(data['profiles'])): + if data['profiles'][i]['name'] == profile_name: + data['profiles'][i]['connectOnLogin'] = value + return write_user_profiles(username, data) + return False + + +""" +Active profile manipulation +""" + +def set_active_profile(username, profile_name): + """ + Sets a profile as active when user logs in. + :param username: Username of a user requesting the data + :param profile_name: Name of the profile to set as active + :return: True if data was written successfully, False if profile did not exist or there was an error writing data. + """ + profiles = get_profiles(username) + if does_profile_exist(username, profile_name): + return write_user_profiles(username, + {'active': profile_name, 'profiles': profiles}) + else: + return False + + +def get_active_profile(username): + """ + Returns a name of the profile, that has been set as active. If no profile is active, returns empty string. + :param username: Username of a user requesting the data + :return: Name of the currently active profile or empty string if no profile was active + """ + profiles = read_user_profiles(username) + return profiles['active'] + + +def get_on_login_profile(username, db_conn): + """ + Get active profile data, including device information from the database. + :param username: Username of a user requesting the data + :param db_conn: Link to database connection, that contains saved devices + :return: Dictionary containing name of the profile and list of devices + """ + active = get_active_profile(username) + if active == '': + return {'devices': [], 'name': '', 'connectOnLogin': False} + else: + return { + 'devices': get_profile_devices(username, active, db_conn), + 'name': active, + 'connectOnLogin': should_connect_on_login(username, active) + } + + +""" +Adding / removing profiles +""" + +def add_profile(username, profile_name): + """ + Add a new profile + :param username: Username of a user requesting the data + :param profile_name: Name of the new profile + :return: True if data were written successfully, False if profile did already exist or there was an error writing data. + """ + profiles = read_user_profiles(username) + if not does_profile_exist(username, profile_name): + profiles['profiles'].append({'name': profile_name, 'connectOnLogin': False}) + return write_user_profiles(username, profiles) + else: + return False + + +def remove_profile(username, profile_name): + """ + Remove a profile from user's file. If removed profile was an active profile, active profile is set to empty string. + :param username: Username of a user requesting the change + :param profile_name: Name of the profile to be removed + :return: + """ + profiles = read_user_profiles(username) + if does_profile_exist(username, profile_name): + if profiles['active'] == profile_name: + profiles['active'] = '' + profiles['profiles'][:] = [d for d in profiles['profiles'] if d.get('name') != profile_name] + return write_user_profiles(username, profiles) + else: + return False + + +""" +Notification subscriptions +""" + +def set_subscription_channels(username, profile_name, device_id, channels): + """ + + :param username: Username of a user requesting the data + :param profile_name: + :param device_id: + :param channels: + :return: + """ + if does_profile_exist(username, profile_name): + profiles = get_profiles(username) + for i in range(len(profiles)): + if profiles[i]['name'] == profile_name and 'devices' in profiles[i].keys(): + for j in range(len(profiles[i]['devices'])): + if profiles[i]['devices'][j]['id'] == device_id: + profiles[i]['devices'][j]['subscriptions'] = channels + return write_user_profiles(username, + {'active': get_active_profile(username), 'profiles': profiles}) + return False + + +def get_subscription_channels(username, profile_name, device_id): + """ + + :param username: Username of a user requesting the data + :param profile_name: + :param device_id: + :return: + """ + if does_profile_exist(username, profile_name): + profiles = get_profiles(username) + for i in range(len(profiles)): + if profiles[i]['name'] == profile_name and 'devices' in profiles[i].keys(): + for j in range(len(profiles[i]['devices'])): + if profiles[i]['devices'][j]['id'] == device_id: + return profiles[i]['devices'][j]['subscriptions'] + return [] + + +def get_set_subscription_channels(username: str, profile_name: str, device_id, fn: Callable[[List], List]) -> bool: + """ + Finds a list of subscription channels and passes it as an argument to function fn. After function fn is completed, saves + changed channel list to user's save file + :param username: Username of a user requesting the data + :param profile_name: + :param device_id: + :param fn: Function to perform on a channel list. Should return edited list and accept one argument - current list of channels + :return: True if edit was successful, False otherwise. May return false if write failed or if profile or device was not found. + """ + if does_profile_exist(username, profile_name): + profiles = get_profiles(username) + for i in range(len(profiles)): + if profiles[i]['name'] == profile_name and 'devices' in profiles[i].keys(): + for j in range(len(profiles[i]['devices'])): + if profiles[i]['devices'][j]['id'] == device_id: + profiles[i]['devices'][j]['subscriptions'] = fn(profiles[i]['devices'][j]['subscriptions']) + return write_user_profiles(username, + {'active': get_active_profile(username), 'profiles': profiles}) + return False + + +def add_subscription_channel(username, profile_name, device_id, channel): + """ + + :param username: Username of a user requesting the data + :param profile_name: + :param device_id: + :param channel: + :return: + """ + def append_channel(subscriptions): + subscriptions.append(channel) + return subscriptions + + get_set_subscription_channels(username, profile_name, device_id, append_channel) + + +def remove_subscription_channel(username, profile_name, device_id, channel): + """ + + :param username: Username of a user requesting the data + :param profile_name: + :param device_id: + :param channel: + :return: + """ + def remove_channel(subscriptions): + subscriptions.remove(channel) + return subscriptions + + get_set_subscription_channels(username, profile_name, device_id, remove_channel) + + +""" +Profile devices +""" + +def set_profile_devices(username: str, profile_name: str, devices: list) -> bool: + """ + Set which devices are in user's profile + :param username: Username of a user requesting the data + :param profile_name: + :param devices: list of device objects. Objects HAVE TO contain id and CAN contain subscription channel list + :return: + """ + profiles = get_profiles(username) + for i in range(len(profiles)): + if profiles[i]['name'] == profile_name: + profiles[i]['devices'] = devices + return write_user_profiles(username, {'active': get_active_profile(username), 'profiles': profiles}) + return False + +def get_profile_devices_raw(username: str, profile_name: str) -> list: + """ + Returns a list of device ids, that are saved in a profile. + Used for testing purposes. + :param username: Username of a user requesting the data + :param profile_name: + :return: list of objects containing device ID and notification subscription channel list (if present) + """ + profiles = get_profiles(username) + for i in range(len(profiles)): + if profiles[i]['name'] == profile_name and 'devices' in profiles[i].keys(): + return profiles[i]['devices'] + return [] + + +def get_profile_devices(username, profile_name, db_coll): + """ + + :param username: + :param profile_name: + :param db_coll: + :return: + """ + profiles = get_profiles(username) + for i in range(len(profiles)): + if profiles[i]['name'] == profile_name and 'devices' in profiles[i].keys(): + val = [] + for device in profiles[i]['devices']: + val.append(get_device_by_id(device['id'], db_coll)) + return val + return [] diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..e69de29 diff --git a/backend/runtest.py b/backend/runtest.py new file mode 100644 index 0000000..4ce261d --- /dev/null +++ b/backend/runtest.py @@ -0,0 +1,129 @@ +#!/usr/bin/python3 + +""" +Unit tests for the devices.py and the profiles.py files +File: runtest.py +Author: Jakub Man +""" + +import pymongo +import unittest +import os +import json + +from profiles import * +from devices import * + +dbClient = pymongo.MongoClient("mongodb://localhost:27017/") +testDb = dbClient["testDb"] +testCol = testDb["tests"] + + +class TestDeviceSaving(unittest.TestCase): + """ + Test device database manipulation + """ + @staticmethod + def setUpClass(): + try: + testCol.insert_many([ + { + 'name': 'Test device', + 'hostname': 'localhost', + 'port': 830, + 'username': 'user', + 'fingerprint': 'e8fe15b374207a2e6ee99bbbadc87ecd068c17f8', + 'owner': '__test_user__' + }, + { + 'name': 'Basement router', + 'hostname': 'localhost', + 'port': 831, + 'username': 'admin', + 'fingerprint': 'e8fe15b374207a2e6ee99bbbadc87ecd068c17f8', + 'owner': '__test_user__' + }, + { + 'name': 'Example server', + 'hostname': 'example.com', + 'port': 888, + 'username': 'admin', + 'fingerprint': 'e8fe15b374207a2e6ee99bbbadc87ecd068c17f8', + 'owner': '__test_user__' + } + ]) + except Exception as e: + print("Make sure mongodb daemon is running!") + exit(1) + + @staticmethod + def tearDownClass(): + testCol.delete_many({}) + + def test_device_get_and_insert(self): + self.assertEqual(len(get_saved_devices('__test_user__', testCol)), 3) + self.assertEqual(str( + type(add_device('__test_user__', {'hostname': 'localhost', 'port': 355, 'username': 'admin'}, testCol))), + "") + self.assertFalse(add_device('__test_user__', {'hostname': 'localhost'}, testCol)) + self.assertEqual(len(get_saved_devices('__test_user__', testCol)), 4) + + +class TestProfiles(unittest.TestCase): + """ + Test manipulating profiles + """ + + @staticmethod + def setUpClass(): + clear_profile_cache() + + @staticmethod + def tearDownClass(): + os.remove('userfiles/__test_user__.json') + os.remove('userfiles/__test_user_init__.json') + clear_profile_cache() + + @staticmethod + def tearDown(): + write_user_profiles('__test_user__', {'active': 'default', + 'profiles': [{'name': 'default', + 'connectOnLogin': False}]}) # Back to initial state + + def test_data_init(self): + self.assertEqual(read_user_profiles('__test_user_init__'), + {'active': 'default', 'profiles': [{'name': 'default', 'connectOnLogin': False}]}) + + def test_data_write(self): + self.assertFalse(write_user_profiles('__test_user__', {})) + self.assertTrue(write_user_profiles('__test_user__', + {'active': 'default', 'profiles': [{'name': 'default'}, {'name': 'test'}]})) + + def test_set_remove_and_get(self): + self.assertEqual(get_profile_names('__test_user__'), ['default']) + self.assertTrue(add_profile('__test_user__', 'test_profile')) + self.assertEqual(get_profile_names('__test_user__'), ['default', 'test_profile']) + self.assertTrue(remove_profile('__test_user__', 'default')) + self.assertEqual(get_profile_names('__test_user__'), ['test_profile']) + self.assertFalse(remove_profile('__test_user__', 'default')) + + def test_active_profile(self): + self.assertEqual(get_active_profile('__test_user__'), 'default') + self.assertTrue(add_profile('__test_user__', 'test_profile')) + self.assertTrue(set_active_profile('__test_user__', 'test_profile')) + self.assertFalse(set_active_profile('__test_user__', 'nonexistent_profile')) + self.assertEqual(get_active_profile('__test_user__'), 'test_profile') + self.assertTrue(remove_profile('__test_user__', 'test_profile')) + self.assertEqual(get_active_profile('__test_user__'), '') + self.assertTrue(set_active_profile('__test_user__', 'default')) + + def test_should_connect_on_login(self): + self.assertFalse(should_connect_on_login('__test_user__', 'default')) + self.assertTrue(set_connect_on_login('__test_user__', 'default', True)) + self.assertTrue(should_connect_on_login('__test_user__', 'default')) + self.assertFalse(should_connect_on_login('__test_user__', 'nonexistent_profile')) + self.assertFalse(set_connect_on_login('__test_user__', 'nonexistent_profile', True)) + + +if __name__ == "__main__": + unittest.main() diff --git a/backend/schemas.py b/backend/schemas.py index 5f4c8ad..4d30f20 100644 --- a/backend/schemas.py +++ b/backend/schemas.py @@ -1,356 +1,121 @@ -""" -Manipulation with the YANG schemas. -File: schemas.py -Author: Radek Krejci -""" - -import json -import os -import logging -import errno -import time -from subprocess import check_output -from shutil import copy - -from liberouterapi import socketio, auth -from flask import request -from eventlet.timeout import Timeout -import yang - -from .inventory import INVENTORY, inventory_check -from .socketio import sio_send, sio_wait, sio_clean -from .error import NetopeerException - -log = logging.getLogger(__name__) - -__SCHEMAS_EMPTY = '{"timestamp":0, "schemas":{}}' - -def make_schema_key(module): - result = module.name() - if module.rev_size(): - result = result + '@' + module.rev().date() + '.yang' - return result - - -def getschema(name, revision, submod_name, submod_revision, priv): - # ask frontend/user for missing schema - params = {'id': priv['session_id'], 'name' : name, 'revision' : revision, 'submod_name' : submod_name, 'submod_revision' : submod_revision} - socketio.emit('getschema', params, callback = sio_send) - result = (None, None) - timeout = Timeout(300) - try: - # wait for response from the frontend - data = sio_wait(priv['session_id']) - if data['filename'].lower()[len(data['filename']) - 5:] == '.yang': - format = yang.LYS_IN_YANG - elif data['filename'].lower()[len(data['filename']) - 4:] == '.yin': - format = yang.LYS_IN_YIN - else: - return result - result = (format, data['data']) - except Timeout: - # no response received within the timeout - log.info("socketio: getschema timeout.") - except (KeyError, AttributeError) as e: - # invalid response - log.error(e) - log.error("socketio: invalid getschema_result received.") - finally: - # we have the response - sio_clean(priv['session_id']) - timeout.cancel() - - # store the received file - try: - with open(os.path.join(INVENTORY, priv['user'].username, data['filename']), 'w') as schema_file: - schema_file.write(data['data']) - except Exception as e: - log.error(e) - pass - - return result - - -def __schema_parse(path, format, session): - try: - ctx = yang.Context(os.path.dirname(path), yang.LY_CTX_PREFER_SEARCHDIRS) - ctx.set_module_imp_clb(getschema, session) - except Exception as e: - raise NetopeerException(str(e)) - - try: - module = ctx.parse_module_path(path, yang.LYS_IN_YANG if format == yang.LYS_IN_UNKNOWN else format) - except Exception as e: - if format != yang.LYS_IN_UNKOWN: - raise NetopeerException(str(e)) - try: - module = ctx.parse_module_path(path, ly_LYS_IN_YIN) - except Exception as e: - raise NetopeerException(str(e)) - - return module - - -def __schemas_init(path): - schemas = json.loads(__SCHEMAS_EMPTY) - try: - ctx = yang.Context() - except Exception as e: - raise NetopeerException(str(e)) - - # initialize the list with libyang's internal modules - modules = ctx.get_module_iter() - for module in modules: - name_norm = module.name() + '@' + module.rev().date() + '.yang' - schemas['schemas'][name_norm] = {'name':module.name(), 'revision':module.rev().date()} - try: - with open(os.path.join(path, name_norm), 'w') as schema_file: - schema_file.write(module.print_mem(yang.LYS_OUT_YANG, 0)) - except: - pass - try: - nc_schemas_dir = check_output("pkg-config --variable=LNC2_SCHEMAS_DIR libnetconf2", shell = True).decode() - nc_schemas_dir = nc_schemas_dir[:len(nc_schemas_dir) - 1] - for file in os.listdir(nc_schemas_dir): - if file[-5:] == '.yang' or file[-4:] == '.yin': - try: - copy(os.path.join(nc_schemas_dir, file), path) - except: - pass - else: - continue - except: - pass - - return schemas - - -def __schemas_inv_load(path): - schemainv_path = os.path.join(path, 'schemas.json') - try: - with open(schemainv_path, 'r') as schemas_file: - schemas = json.load(schemas_file) - except OSError as e: - if e.errno == errno.ENOENT: - schemas = __schemas_init(path) - else: - raise NetopeerException('Unable to use user\'s schemas inventory ' + schemainv_path + ' (' + str(e) + ').') - except ValueError: - schemas = __schemas_init(path) - - return schemas - - -def __schemas_inv_save(path, schemas): - schemainv_path = os.path.join(path, 'schemas.json') - - # update the timestamp - schemas['timestamp'] = time.time() - - #store the list - try: - with open(schemainv_path, 'w') as schema_file: - json.dump(schemas, schema_file, sort_keys = True) - except Exception: - pass - - return schemas - - -def schemas_update(session): - user = session['user'] - path = os.path.join(INVENTORY, user.username) - inventory_check(path) - - # get schemas database - schemas = __schemas_inv_load(path) - - # get the previous timestamp - timestamp = schemas['timestamp'] - - # check the current content of the storage - for file in os.listdir(path): - if file[-5:] == '.yang': - format = yang.LYS_IN_YANG - elif file[-4:] == '.yin': - format = yang.LYS_IN_YIN - else: - continue - - schemapath = os.path.join(path, file); - if os.path.getmtime(schemapath) > timestamp: - # update the list - try: - module = __schema_parse(schemapath, format, session) - if module.rev_size(): - name_norm = module.name() + '@' + module.rev().date() + '.yang' - schemas['schemas'][name_norm] = {'name': module.name(), 'revision': module.rev().date()} - else: - name_norm = module.name() + '.yang' - schemas['schemas'][name_norm] = {'name': module.name()} - if file != name_norm: - try: - with open(os.path.join(path, name_norm), 'w') as schema_file: - schema_file.write(module.print_mem(yang.LYS_OUT_YANG, 0)) - except: - pass - - try: - os.remove(schemapath) - except: - pass - except: - os.remove(schemapath) - continue - - #store the list - __schemas_inv_save(path, schemas) - - # return the up-to-date list - return schemas['schemas'] - - -@auth.required() -def schemas_list(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - - schemas = schemas_update(session) - - result = [] - for key in schemas: - if 'revision' in schemas[key]: - result.append({'key':key, 'name':schemas[key]['name'], 'revision':schemas[key]['revision']}) - else: - result.append({'key':key, 'name':schemas[key]['name']}) - - return(json.dumps(result, sort_keys = True)) - - -@auth.required() -def schema_get(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - req = request.args.to_dict() - path = os.path.join(INVENTORY, user.username) - - if not 'key' in req: - return(json.dumps({'success': False, 'error-msg': 'Missing schema key.'})) - key = req['key'] - - schemas = __schemas_inv_load(path) - if key in schemas['schemas']: - try: - if (not 'type' in req) or req['type'] == 'text': - # default (text) representation - with open(os.path.join(path, key), 'r') as schema_file: - data = schema_file.read() - else: - if req['type'] == 'tree': - # build tree representation for frontend - target = None - elif req['type'] == 'tree-identity': - target = 'identity' + req['path'] - elif req['type'] == 'tree-typedef': - target = 'typedef' + req['path'] - elif req['type'] == 'tree-grouping': - target = 'grouping' + req['path'] - elif req['type'] == 'tree-node': - target = req['path'] - elif req['type'] == 'tree-type': - target = 'type' + req['path'] - elif req['type'] == 'tree-feature': - target = 'feature' + req['path'] - else: - return(json.dumps({'success': False, 'error-msg': 'Unsupported schema format ' + req['type']})) - - try: - ctx = yang.Context(path) - module = ctx.parse_module_path(os.path.join(path, key), yang.LYS_IN_YANG) - data = json.loads(module.print_mem(yang.LYS_OUT_JSON, target, 0)) - except Exception as e: - return(json.dumps({'success': False, 'error-msg':str(e)})) - - if 'revision' in schemas['schemas'][key]: - return(json.dumps({'success': True, 'data': data, 'name':schemas['schemas'][key]['name'], - 'revision':schemas['schemas'][key]['revision']}, ensure_ascii = False)) - else: - return(json.dumps({'success': True, 'data': data, 'name':schemas['schemas'][key]['name']}, ensure_ascii = False)) - except Exception as e: - return(json.dumps({'success': False, 'error-msg':str(e)})); - return(json.dumps({'success': False, 'error-msg':'Schema ' + key + ' not found.'})) - - -@auth.required() -def schemas_add(): - if 'schema' not in request.files: - raise NetopeerException('Missing schema file in upload request.') - - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - file = request.files['schema'] - - # store the file - path = os.path.join(INVENTORY, user.username, file.filename) - file.save(path) - - # parse file - try: - if file.filename[-5:] == '.yang': - format = yang.LYS_IN_YANG - elif file.filename[-4:] == '.yin': - format = yang.LYS_IN_YIN - else: - format = yang.LYS_IN_UNKNOWN - module = __schema_parse(path, format, session) - - # normalize file name to allow removing without remembering schema path - if module.rev_size(): - name_norm = module.name() + '@' + module.rev().date() + '.yang' - else: - name_norm = module.name() + '.yang' - if file.filename != name_norm: - with open(os.path.join(INVENTORY, user.username, name_norm), 'w') as schema_file: - schema_file.write(module.print_mem(yang.LYS_OUT_YANG, 0)) - try: - os.remove(path) - except: - pass - except Exception: - try: - os.remove(path) - except: - pass - return(json.dumps({'success': False})) - - return(json.dumps({'success': True})) - - -@auth.required() -def schemas_rm(): - session = auth.lookup(request.headers.get('lgui-Authorization', None)) - user = session['user'] - path = os.path.join(INVENTORY, user.username) - - key = request.get_json() - if not key: - raise NetopeerException('Invalid schema remove request.') - - schemas = __schemas_inv_load(path) - try: - schemas['schemas'].pop(key) - except KeyError: - # schema not in inventory - return (json.dumps({'success': False})) - - # update the inventory database - __schemas_inv_save(path, schemas) - - # remove the schema file - try: - os.remove(os.path.join(path, key)) - except Exception as e: - print(e) - - # TODO: resolve dependencies ? - - return(json.dumps({'success': True})) +# coding=utf-8 +""" +YANG schema manipulation +File: devices.py + +Parts of this file was taken from the Netopeer2GUI project by Radek Krejčí +Available here: https://github.com/CESNET/Netopeer2GUI + + Copyright 2017 Radek Krejčí + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +""" + +from liberouterapi import socketio, auth +import netconf2 as nc +import json +from eventlet.timeout import Timeout +from flask import request +import logging +from .sockets import * +import os +import yang + +log = logging.getLogger(__name__) + + +def get_all_schema_names(username): + site_root = os.path.realpath(os.path.dirname(__file__)) + try: + return [ + file for file in os.listdir(os.path.join(site_root, 'userfiles', username)) + if os.path.splitext(file)[1] == '.yang' or os.path.splitext(file)[1] == '.yin' + ] + except FileNotFoundError: + return [] + + +def get_schema_detail(username, schema): + if os.path.splitext(schema)[1] == '.yang' or os.path.splitext(schema)[1] == '.yin': + site_root = os.path.realpath(os.path.dirname(__file__)) + try: + with open(os.path.join(site_root, 'userfiles', username, schema), 'r') as f: + return f.read() + except FileNotFoundError: + return "Requested schema not found" + else: + return "Only files with .yang or .yin extension can be displayed" + + +def remove_schema(username, schema): + site_root = os.path.realpath(os.path.dirname(__file__)) + path = os.path.join(site_root, 'userfiles', username, schema) + if os.path.exists(path): + try: + os.remove(path) + return True + except Exception: + return false + else: + return False + + +def get_schema(name, revision, submod_name, submod_revision, priv): + global log + # ask frontend/user for missing schema + params = {'id': priv['session_id'], 'name': name, 'revision': revision, 'submod_name': submod_name, + 'submod_revision': submod_revision} + socketio.emit('getschema', params, callback=sio_send) + result = (None, None) + timeout = Timeout(300) + data = None + try: + # wait for response from the frontend + data = sio_wait(priv['session_id']) + if data['filename'].lower()[len(data['filename']) - 5:] == '.yang': + format = yang.LYS_IN_YANG + pass + elif data['filename'].lower()[len(data['filename']) - 4:] == '.yin': + format = yang.LYS_IN_YIN + pass + else: + return result + result = (format, data['data']) + except Timeout: + # no response received within the timeout + print("socketio: getschema timeout.") + except (KeyError, AttributeError) as e: + # invalid response + print(e) + print("socketio: invalid getschema_result received.") + finally: + # we have the response + sio_clean(priv['session_id']) + timeout.cancel() + + # store the received file + try: + site_root = os.path.realpath(os.path.dirname(__file__)) + path = os.path.join(site_root, 'userfiles', priv['user'].username, data['filename']) + if not os.path.exists(os.path.dirname(path)): + try: + os.makedirs(os.path.dirname(path)) + except OSError as exc: # Guard against race condition + if exc.errno != errno.EEXIST: + raise + with open(path, 'w+') as schema_file: + schema_file.write(data['data']) + except Exception as e: + log.error(e) + print(e) + return result diff --git a/backend/socketio.py b/backend/socketio.py deleted file mode 100644 index 92f88bb..0000000 --- a/backend/socketio.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -Socket IO helper functions -File: socketio.py -Author: Radek Krejci -""" - -from eventlet import event - -from liberouterapi import socketio - -sio_data = {} - - -def sio_send(data): - try: - e = sio_data[data['id']] - e.send(data) - except KeyError: - pass - - -def sio_emit(name, params): - socketio.emit(name, params, callback = sio_send) - - -def sio_wait(id): - e = sio_data[id] = event.Event() - return e.wait() - - -def sio_clean(id): - sio_data.pop(id, None) - - -@socketio.on('device_auth_password') -@socketio.on('hostcheck_result') -@socketio.on('getschema_result') -def process_answer(data): - sio_send(data) diff --git a/backend/sockets.py b/backend/sockets.py new file mode 100644 index 0000000..f4ab822 --- /dev/null +++ b/backend/sockets.py @@ -0,0 +1,44 @@ +""" +Socket IO helper functions + +Copyright 2018 Radek Krejčí + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +""" + +from eventlet import event +from liberouterapi import socketio + + +sio_data = {} + + +def sio_send(data): + try: + e = sio_data[data['id']] + e.send(data) + except KeyError: + pass + + +def sio_emit(name, params): + socketio.emit(name, params, callback=sio_send) + + +def sio_wait(id): + e = sio_data[id] = event.Event() + return e.wait() + + +def sio_clean(id): + sio_data.pop(id, None) + + +@socketio.on('device_auth_password') +@socketio.on('hostcheck_result') +@socketio.on('getschema_result') +def process_answer(data): + sio_send(data) diff --git a/config.json b/config.json index bca6cea..a04c049 100644 --- a/config.json +++ b/config.json @@ -1,14 +1,18 @@ { "dependencies": { - "npm" : "frontend/package.json" + "ngc": "frontend/angular-shared.json", + "npm": "frontend/package-shared.json", + "pip": "backend/requirements.txt" }, "module": { - "name" : "netopeer", - "file" : "netopeer.module.ts", - "class" : "NetopeerModule", - "hooks" : "NetopeerModuleHooks", - "frontend" : "frontend", - "backend" : "backend", - "assets" : "frontend-assets" + "class": "NetconfModule", + "file": "netconf.module.ts", + "frontend": "frontend/src/app/", + "backend": "backend/", + "name" : "netconf" + }, + "assets": { + "input": "assets", + "output": "libnetconf" } } diff --git a/docker/.gitkeep b/docker/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/docs/screenshots/configuration.png b/docs/screenshots/configuration.png deleted file mode 100644 index 00855a2832763a4d09681a668a52bf8d546398b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176466 zcmagFbyU?`v^KmE=~Pl0gOCR4k~Zk>4(aZ0q>=6vkQC{TEg%ij-Q6J_@7msb&bj0J z=W`5oZ1ykKnrp^0pJ(z}R$2lBl?W9AfndCUCn^ttJYI%C;9nslf}gP8Y<7eHP;B0* z*+U?hKVg62;^{DnArK14dr=`pm$bckXAeB3`-kJne#`B3D$2L0kAGu7&NCor{1J-b zDAeBYI-&epW3sw&XJ^I{uM<^YgFY+E$1gOCfqv^jYYwI+WTi}@t%3jD%Z1NQQ1h(R z!a9e6GUfMH@$Y_~|MTcbBcvb;@!aw*%5&44YHTSudLPfl)^YJ&;$XYK&t4fS9nfNl zw6!BYk9DueoI_)(#|oypFcz#Qxany=;+Z+{hqtK|^ccM;<@`kSi}dGQ$NTtSb#>YX zGJJP(f)8zBJ{hEnYX9ez_p<0v8oROa!3U$OFVu9XsG&!QHmEoLT#ID`q}Dt?UGduN zy6OoYx`zapj42ACX7vAA;wQOGR;NBG{yZDUOZVA)qdlxe+?iqh^7;fD3@yq1`+GP7 zQpbq<|85A_qVn|>B7iVK5PVD)A7$;|m<>xZI~N`lqGk~i{zg#x&(0xtZjZct;_o7+ ziMsqpxkUTw;6>`XDl>|LYz+sNa4E1!8#lW0-9_FOnC0{vX5%XnO``m}tq?)hR!_9O z%&c~hm_?L?BHbJ0-W~In zwB!0);l&JVXT5xn-eA#W*=*Si6q&!|DLz)fb4tGT%$@i@FB>82xw|>OXterj5=B;e zK&*#lvRAllxVe{CRnjzIWU*MKhbarahe+p|n%60J2l$H%X=pdeY%)A9Nvv$#1@ReJ#15WMaJXV{D<eBAw;jVF}Xy4e@v z{lGzvvvfF=Uc1nSGt?p~q?fAkGx?lhr$x-vm<5wBtAdJQSsoF?vig;#Cq-RHA7PS8 zfBgFL&t_BQV3xPA&ZFDA zZ$)KPFX)1uO}xXq?H#bDo)8d2I|Gr2tIoZ_H>|K~1`7j=g8#G?bGx~)YuChqK5j(Ugr=}Lj z&lkSX?6%_M&eMDw!(UV>Q*5sPGaEeT|dAEvwKFPcIVs^^}T#UoJ%lh@HNFk6^wGPj;#yej$~ z`ezK~=26|<4ZaGrKi=zQhC7R|8&8q;4%$kGFh-6Dzv6_Ndg=Eb!6s9bJxS`&msoJ&~>N5RDvLhGIW&Q4!Y zlaX`Lt2T~2p;Y%QL{F1NkB_SIv+uW_61CPC8Np16Pw$Xp%bMcG)?T7(nRs4P-Cta( zjPa(6ich&-wluV?zBx-Z1upBAN+Jhvvydf=PgrA0vX*2i1Q%GD{ zI?NG{YyIcQ%Rh$_UV4A_>W92(JU{54LFij8(Gr9hJt7J1q$zDskFOJbW~V2!^%B&!OF+C z?t%gYY;XUBeniGX`&v@sr$#?fD!|A`o{Wa2XI^Jjv>GhJ0_g zFdYyWD6c8sYoarF;aNWS#*y`_k;Pxds|O5J=*IZBOv}TxF9q3x)ki~ofTO60dp`D>YVpV@UgWty=w|0MrrOvq$kS*oMwUi}WRuT8} ze!n3hp^A%2^CXLsAreJ}AWvbe?=7cqcb+`qMmKjEaxaoj|ChA4DT9MqvYYaRxW&J_ zy>X~=AB!o;D&h^us>QBKc!}*c8#sy-WPMLE<<#nKgQG>V%;fc^v?uVG-EoEG&k;vy zBK|LXq`cD!$(>4xQo7TjI>(>LzFc3tc=Ix#nwaC!k$3I9q^;?*q2?2w-BAwPK8(p9 z?nBxfdDhQgawX-gJk4-DZnapr*k0qWT@-$AO3QS6A?2l7NZTQZv@{?neW{yU@=#f4Dt3Rb6ZNaw1!-fbg_w$p?M4i>zYT~+$qCS+Pi_O`?#HZLx zL-i&Z?M>GBImC!C$3`Sg>{S?Q?Qj;n{RzGi5)DW%eU>b>gNsY}i(N%)@P^#;gP4+1 zUzevt#@j#EA?V~hNwx*){k`nwuzlHi553_2M$V~y zs-o?BN-A(~!5ApkIp?|?Q8NEMW@kn{2#d78a2e`yFuv_k>4HKP`#CjVdZPfZ^<=@q zI>h)KSyOpx}{(+gX#S?m4C)L|jO zrLi+#Ol@1y>}qtaaa&_d>b&5lPzgukGp@g}8@O1luDp>@^%^X7rn1jtc>9r%H4gacRQjcX0ZH=GM(oWxG;?e9rg6Eol#ysY5Tq z=zsir4*qc%c$8K6TJZjs4k1uXvS}@cY8D-SZ+V#{F{OV~hoLQZ8y7$EyORhHG#K;z zAnc+dcexI^F+DEt{`N4e+_rvhjC<#5kwC}x_f|~O0RCcqBBO?{o{z++TGg6_I3{tZ zUfXbcw}P^AdlCCC3;I-aO>$8Y5n|rUYHb4O4awPHe^g;fQP;8!*~A?(8cKFmRY^~S z$-^J!2hW4W+lzYdSWqsYKC#`A8^zWH3TjFb-MPmDD_>O^@a4aJQE$F4{PphX_0Q9* zCIlBgBD{Dd`rG?%sv(z%2hZNm21%_)?q+7YHe1U z7G%uL`GE@cQ8MQoE;c#4_w?CUoA$VX4vkIl*woLZ@j1N_e7GiVJl_+W#Hg|8GZeWt zmL_7GaqbT~8)&gNHr#JxMo%bJ4b*$9nE8HvYXtB^`#7? zUn_gfRGbwnkrc6p3kkNrU?Z6XC_TZmSezuSri^9_K@IZKdqq<%r65_Lkv;g0WJ8JY z(~U5fl2Y=`pIQ%Y9rZRCJe4T*l%YTDzYg&hJcrP!ltYIvJl}mHoPu^hTy~akJcCu~ z@oOw*7tTyg7FFC;2{9%3|J*brJc^4;$fiME&ZfK(pbwat;aOyfk5_t(grFyn`@93X zHC~Ct#D7<}}0Z*SjcWGv{qL$%AD9%cI&HwhP!RDhha z^1@d0r|TBcDQGg!_J^|i9lNX%!X_lX%<=JYIBYU}VMj;yV0k&YZQhC1b6xpy@k7cr z0$dL6T7LTQ`9}NH5;_Kk7ti_nRTg)4%od%rCT+$hbJ@*&3wL>_#@!ELJK=R;ej!cx zqxAq2DVwsLVL}52+N4Ssle)l>*v(2QB;TJ)LaZ81QAZaudafgaC$*|7gu1`hxMXy# zx3JzZa9Emprq%p7L3R5RF7U|{N@(Le@5DB2=REe~Bs5a$jL6hgKS+6lu6o>e9D(uS zZr7>tb&^g~_VcpsBE} zM!O>2a(X1yZVj_}Mvc*)rau!l!WW0QM*gf11?^)TbtnA+C zw1eSGjJS>$4^C-1y^#PSCKvL3mX?;z{Li%U6LT{$CnsR}y{Fo86`CAkUrR54)y$)Q=xNPB-xTzgN-j zqRt%ZTrQ-3&H6}-lZJsV_eW7^T%M?+m=GsAYFOxWM)JUTqE5%2j3CsI)ppznN44IK zfibb~LeusbVe|N2B2%|oy?)E@RJGbT{o=~NfJjA0z*j+rs4q0WHG7xGb49<0iQb}` zF+wE!g`Bor`>i#>Y3*+L`Y6*zOp7bsI6M0k6v~p^G$guEme6W<9Jm=%Y0n9Mtm!hS zRyS`|V`8{`?xNmw-;twlcX2=XYIVqDaIXCLw9y+vtBwn5ag%LObgB)4|k@T%DIOjROR04 z$8-Tnt3{vpWw9s=R$pa9e$D8w7koaS0VT4Z&$fxL~?}Za&s5u za{f6urNrB^%U!bNgf+wagyq&k`9p87tMf#6TtdR}X{b^-mmacp%PmRkZB0-zxmRzo zb<@CDkIM1&>Clox{Zvv54E}DLyA_xc0o=xSx8)DRySAhF_ZOX$x^J~g{R?zl;?2t% z{NCd*iOJ#G*?VtxP8u)0(PWtTTEEM!nK_UyBWH^OfLjEuip*oN?3$X$wDd+=hT{Yl z>wDpTW3~scv&EA=yT$f326Snhb747%)_Xl7@m|DHilMbkUCQE6 z`zDo&L(?DbwDk^C)@5m-5g7#~A3PHV_N)%tDd%P!i2)R~hB*<-eN&~JQv6Bi2Z8HF z0$hB2PVU3(g$MZH*9$fLvD2AeU6!0$5}!hxpGK-IxTG$gqNWIL$R4)0c(PX7xg7dO z)q9;NorQ${+&}*AWxzAd-8gf04~zB{-Cd3!VloCK>8Q75lz}0~X6wuV1tJsobBwjI~a2 z8a9;nR;EVh&S=&4Lh<&#)S1`9gIyFNJyLA)MuzVa>(QfIjm7$ynFby**B!OPx@ybs zM`2M+aOaQM-;ypt()KcGtB>iwz2&7ghFF^sB$qECkI`Hu9s?@*6LH`EbDt`WmaD z+tCFq*lI{_PEOHW?&G&_TN|y+?XgufG`i8sTZFv4gm!srMH&I6lI2Fh@v*&JoSGA1 z&da4cgbf`%G1xqZA06}fa!^e!mvy&*!fS@eXA~oSVo>HUo1xxf`!oCndEW4v~!sZ+#?sk=IOjO5i2{6jsydYZ#)W@l(Y-afT43l+8{ z*a`sY#0B`I%T@Vj{AQ2gzu;8NLg8rW=u9+>Ia*7#`|?X?qqg9CJ5L4nmktVpr-h~9 z9+^=HD6}^#bZ-}6>s20Ilf|nS2LYbpIbo&UY@o^a#t@H>_%OTdj=nojH__q1BDR-3PbmdVAzd|Z5d^^K-53C5li zujlodkkVJZZ~q#BekU_&Y|ZiVNm_1S0Rsa)eO^OD%1ExnXt_>n8KZUxX0<^#=0vH6 zgq|K{v)iAYgPniZxZ60h8(&}Fbh`sajO7m>J}{&EkByC$(JO~Y$ET!x5En;$_3G8x)<|w+ z@r!?U?hw||A^asa_W1NvL@w^2Y*5dhi^R~-aJbd`L7Lk;F~}w`F!1Hem%5eH4L?*V zdEy6*UruWHd#f zj(q>^+c!fK6VPb{&08J*pRLY!Fo)yUPL7WQq#2oS3Q3Zr>VQH~kdZ&xKXY_+92*~h zf{ktSYjx&_jLPm0>@px)Oiii!`TI8(y`yZ9w6S5XsHnij#r= zGrc#eC$)1M8i=$efr*y)YZr~@8ywNe1xO$TqbM%H-e$-{MCvvB)0M$sO9#yt+V`iK z4>tE#n>RJQ>C#|p2nYzb=d;#)S8K6+M{V$FjuUDDK|xOL#dVA*%c!WRA)%pWpw8-L z(VzzDWsNs{e>}6bNEavYL`acK(-2=-PFop`3Xh(Od5YjC%E%pXWjQ%HU{Mm*06Kd5 zm$bCsM!UsIN=jaGawhut_z3R#B>fXbkqjyM%XamUy1Vn)V;8=c)YPYK@K`n%^UgSU zc%2#i?lg>y;-hc;{QL;{T$njhBT6-D}>EFIeB?u3k!>a1Q@6IHwZ}>!#af(6>(>4EMHJiK%mUO`uh!kMN{7X zDfjL)s|N7`rOx#5%giM2>FJsCI2}+_QmSy=Rfh19VZpqMo<5xSpblP1sb^?t6P&5I zk`lzs%Pj>k8XAf>Z{q6e>Jpq4adD+y{4_Rh-(Phx zTA@KaLx0t_Gk`Kch3B3Xu`Bao<;H!GvTf**+pg9%W5d?-NZtdkqM{-IWsW-u>emxA zW*jigC(Hgcw+mOjWMqsS9+m|jfH`AK7*wuip|UkyNevpay7>b}+P~ETw%boq&?8B! z+SEnwhx8{e#E)(cTMal;D`xlUwHo4X4jQ9ONAsWH;D~(sL?c}g`%R(XB+C2NABo&! zcv5S8-3~ZQ`&v(I{looD{cc$!4HJ{eT%B!8YajzY8W#TH24J)P-Bkc*6PMfR}Fz8m*Y05Rh|%q}RP6oEo%galuSswq^Rzdu*z>^a@x3euuE%|?B zN(Wx8NjMh}V;~P@6%~a_khun2Ub;B#O|}1udGUho4~*(hYQVV&I_*d zJXD$mH34*>^%@$A0{2wcW#-TjGDZlY$Z2}(KPQvw1|}I+A+FnreXVh5F45_rlWBKj}>D?D3onF8=mI{E2e8 z;X+M*DUHYn38edHeq_Bs< zKIG-)air(!w0d1$U6GEhlTs;0kTU$GL;zm|qUmw7M*#Bx+Br3+d=pjgL2TiBa zAl_w_;=g=(dVO&?l*D4-vi&vD+6d-3@R#w(J*tWrr23Dg4 z2WuC-!aDW;99#h%d4nN?g>n4Ig^5l z11jXvdZNxrx%XWd9-Z>h*{DqHmoFW_YTX+Hsm}zx_#l(o?hK$z8uleHlxR1n+}?T| zG#<84ZEF57L^<6YGJ%=Ww(FUu{Q!H5b&5#*$E3Sx{3)J3y|ArQjGFh|Ct4#r8PYXgKHYl-FM;z zwZVliW3VoO3Ye8SbpTW+=j-s2fAY7eIgv1zpr9bABAFg1D8P?%^YQ||e`gL24Yg^U z2W8~i?WM7a3EQV(3J|y4+}tf{Ak)2~rVfUKN5m#34(ncRx8T6R#}CS(QB+nwnKsEh zhGGfY%v#n~=s|<5Ec?eyDK%|vSpZwRwzj5x!G12)i*15+HW1xl?2MAq2Tz3;m7iNR|>)#!BG$JBbXrx=?j3Rz|2ZMp%llY-iCAixF0<-KHr=Go-z{f3epFU!(3dkf zCUaO4f#l8V)Tq@!=;TMMkbmh{7X-2DjiU{Aj9gnYl%&Gx?CflD49&?ZdcC~7JY~TF zz!Xoz&Hyk=PD#mL)?3+spxV|4s@NXR&w9GL6!3`Xy1@T|(O8}KRK2d&39irg`_P!0 z+Nw-PRa-o`jVqr?jb0u>v0OoBxteUfM{udk1I88>5pi7(B)IGryl;nHZV<&U4xUF9 zivnq!AM`^&LqdZfn4C>arQ}faL2FxjXk5&fq0tpdL^p!o|+tayKmK{wOvox32J0X~8x-R-yXX*vD@8_O` z+d8gBa6Sd4-0+7#SOYjbC_EP5TL70Kjn0SX>~eb}xk%gF+c!H!u}Mk43gvQL&PF7@ zm6sR%`0)kAXxwKUYL4XNlhWFSobTVU6Z<-0i94E7WNWfqCv3f1nP8-Tqd$2x56x_~ z?3?{YKX-{e@TQpPXd78?doj7AiwkNRn!-M+PskV;Ut3x-Qc{SX5&tu>B3cV9Lcz-V zn;?kYYyRjkDTxr28g6K@myiD53>+RYFv zX_4A7;A>R7CWC43ff=aNY#xCZX}Ye*w;Zjt+#IYHm$y6z{Ss5_?Nc8t!Q1GZoaX>N zKI3S z7LPEFjEp=+L?o+f@zx(bzJfx9|KntQh>sxGEuE93r6Sz{#oxYVgEkLGhVS?Yivt}! zHWXTFd%P=XH@i(c=kej`U9KO>54GVp>FTw?of;=D*Ru|0T2``A2iQUlcPK|SK^i{{ z-^a2%CN};M5fY+1S*A5MF~M;ovJeA^H-OwgTj1!X_D`X__W*fk8#t-6%4*?wHl?PJ z5L`@5j0DH92b9p73J=|XJB*Xfz?I7Lx!=2R)clEc%HqP%oZsr!L7&*j4<3ILb_gph zqyb5i7NC6=mXTU*Ib47qk&%&g0TcwV#KBDqeB0C8d*TF_nDB3VFPgah9lK1=&o5S* zXZx4TZ|tA6sQGV+Q}Qccw0q1D0a9^uMQ z#U`Z{5Xh*idINfht=Zag>*gGq$4E$^+>1Loam?0QA6EHD%He`~$?tX+t^D7j33j8g z2Um|})zy1Lp1j~$aS$en1t3$c(TM?Ir=)=!?=vt@1a6|Br!V=qqX)Q!JQ5fu^S7+- zO;Y|{3P);bkBf?MNd8kCoari48~|njkbkr=VG0^*LPDC@SN~LD>~7}jW@>=C0c-?t zC@(A(n?V*gFfI-k6z<_SrT>TT2w@y6! zzt%VZ&)Qu4xf1)v=f}Y(Tl5(0f08s5Z>LhtI9SpR)>&#-{gSaiX8d;Fp8ITPyMU>k$r=sl*M^+5!x|wy}}3>y~=1 zq7+|O$0Z&?G=A`-)^gVA=cExKBEWQ?oJomhl@xyN&JrAd9C1S3r9-ZG%sjS``0Z|J zsVW1Wx2hyJrqYcr;W|*2&$RI1IpmE!7T*M=%PnIY(OAXB%_jwUYkif7z#N`D{WToSg6I_D^PX5J^QlmN#E_c^VGx=1r>AK^IP{aYQZ( zXt?U?>ZaS1J_z6ClE0R`v6q(s1mwyV&eq)ViHQ?XN53Q_h=Tx!*xK3xx3&d{^7`IH z(0)TQUpjq8Z+$S0J65S!`AXYa3C1+{t#pRL;t|ws#4MRifp9_=KhV9@Dv(?Kk8^Qp z?oO1#FO4b4>{qek-_`{-*^yRG2jskVc{mNyOvyIbT7XE8I?Ry`zkwgfja5;9FF!-Z zxZj37sHGWxH*IoUq8_NN;LmDBqAp3F0cJ#$lpaZQ#{(G9K2xkxfM}bJSHli#g7Ut8 zC1t(jjRPpn#|guUqZ< z7CvgH)IXCJOY*ADtfe6ToQdWMrvZlsPstug9DtwkfQu{J{gkqSmPw?|N#9V0gNys~ zyB?IM1TzIQwbyb@QA4hOX+j8oID4XWNs)f9v~rkpcmUg--?-YqkL&P|BO;yGS-*A` zhHml0*0T=xgYG~E0_0I1FtK-o?RF!502q|Bv$y{o5wTyS4`)-a3Dg&-57@PK>mLMe z_SklIc2Y`)1_oXMwhbJYZ6}^ebWBWpky0_w-&=_e)uA`&JH>jY#Q=U!2HdH23kZjo65LfoOrL)!~t0ZZFV8K;u0yq1&;>6D3VqXNtM zfo2&`@lT>}jEjwQj>0eKcvA9n%^4k{kOpLvDrwR;4_gCP6?mVM4H?1d9%x0iGH?^;$AorcPbW-7_MQ|n)2f%YOr?4)uF#PI9%_Brp z#P9Tikl=xUK7Oa|r5{FMiR9lJvgTB&9(dZ79&!JBEg^0LNQY zBs_ZlplyE3`&JGY^gHeC?SSKUbVIHMj0`@#YTM=UDxeQM3KGWgwVrm661L5QmPt#F ze#sI}MOAf*R%i~Ke=@r{KE$9ae7T=(2=IKENB7Tl8XRbgl}k_dN9Bl+Y%nfPz9wq# zoKYMAiW$~r0qhIH`vMyeZ`{xwG~~cdp0gSEQ-E#)kbVvy`0tSg?#>iAtQYzLXEmLF z2f)tIq>lFh;Pybr_m~2-eCvIQv5ASnKmmC5DiAzv^5SFfw!_H)=OS=XxHeD^xE^j# zSyBfqXBKop_V55i@SNkM7U>D|ch^&6R5Ud1(|)#D&$6%yb9FI*G{jU= zLP1Ag>m<-I1Z;=aJtYj5*p|#TIMTuJiZ{9QoNc;tLYY69kcDs1V>Xjz%Gvj=W4Hdu zh45}R^tyOOj|rgKw!UuHrk@Gi^&xNlnGRurKKgO zggr-Hf-xT-h|c9in<1-Sh3a?pQYj+2s_Gjv4R%d)(6Z|3>9q_GS#T(T_Rq`fUZ~wr zVhU6aw$zOp)5XKn--)8vg)J?{&SckDJ8P#^;m+hK4(SCuc(-jKcw=2b%%j=AOyw5 z#pwbfb^0UpqM>{B*iiyt=OcvkbklY}gqCveQ0%gLNEuxtT~W~tt&parB}1m?`LiXA z=B`M~>pnU_NCWyQ54YdGJt)< zkkw*}8Agu-!N7iVa2*h?7k4X{;10mGFQu55!RanExx&0t)21B(=B%q-5$MlY^Ppsp zfWU@=fw3QL@Ax&c1&e`}k&%jrCq=v2?P>z!8S5IB>mm%nGB#q55#Q9wx0>{O0&^KXG{#r-&O6WGAsT#)l&SpvJ*?{;$ZQ~TxaJ3zKuqWTVv+D z7q25cQqJ0jUrtu>YjGvK!3G`xpDHB8f}VJ}%%MJT z8a>O-X5UH)%^}ovVScSB99~{nB7kOYW7fF)U9g`$%bL)IFUx$PbNd+4Mw+v3E?NO) zIImjOJ&sG!&a8xxhcMKyd%Z(WVKB!}jwbY3@wbpRU0&lb1T9Wx#lRHQLM4W?VrQJ? z$$K}#AR*Az!*o4Bx`7XdhA#oh2nYdi=s?zKVJyVh<(UQ9G%5vx$-^D6djKgDGI?w( zcz^i<2#ev**fz2tW$pdRY>h8{;14M()1UohP_GIBbjbl|%at#h0VRIf`fwwN&!GO( zC{b%-gEdW>`eM;rklgzg4BN#6kuD8%Sjj*~ysmjzC4X2Nl@a_3m=4f)fO|xTGWcN# z3nqd9O-5|=%^=S%{etUeI=)B*kQ^9WF7;a;?%e@n#<}Rh7R7h+E_L@5D0!!Ql|x@r zQ$GU7kEN1Y0aVxWjCuJw;8h2Dvv$be;jZa!BANJdCL& ziQ9hTazdk2*{bDggX#|{x7|x(4hu*Vkk@sJs1iYn~sD9uD4zc3fx$rLqFLz zcCL`#WYyFp0Eux>@WBJJ;IfJ#9z`~gz@RbJ=**;C9KQ?=wg+)}vjdd6FajoHz>PtG zz+eZcOdM?NHeiSMZf-n~zCq)$MW`-?5jOVl29~sj z!P350$fKehw})YN^uxs^9>NA^60WFODbHrKFsrWIdRuOGzJv1zxRTpzx{UGSk>}5u zLqEz23)=)dHgI%r$__5er9%zMSt|)SAv3> zXJ-z8r=+3^0x4{v76X&tR>VDNz*q<33^Wk^YIV<9FecDBYu$?BqS2W=u;Jg3Uz3<` z3N#9!ZcWu#5*HO+m(>DV49EwF=!9=YMIV0!;F?GCHbmia?-_1C>3+8k@yC`{VL zVGO>M$THW)AY~mIlSh1$yHq%<7x0sQVQgB?U@(`2=IfDqk zQfhUbb5M5#>;04kkxE)-m(ir<+hTO_NeoG<&RPCB16|C=_WLTsaFlcRZ>4;-;%~f; zj=jd;Sfg=CAxZfjVf$d--1n7L>DTxb5Aq@!SqT!AG-;m`67)hjkVxUhSEko66 zt>*OtZLs)`AZP@PYo|kk1uEs*O~6yr><78Qzyc1?@a`@ahi2JV_P*Hi!Znz@`IFvLnXO%wVAmI=xQ!QR~Wh~Z#qE*1hfJugU9JM2Xlnz*i5dVf;j(aaa^4HsMvI5rO`fPjDjP0_h z=(SFvs-j|m9w7*)*;;-8{Gz%=^z^b1Z-ZwRu=~Fj6yOjOgI~_5vu-_Xxrqc(m;z)= zz}~okTDJ{YZ4?v~2u#)mgne1-y&E85(D3P(z;!D-#pN5nKQes1p2GBqO-inEj?*uq;a?ic_ z)5vqM-XtE!*C6QtIlo~wif`S}1b>`~2Pv5)mG zvl6LS)1pd8q1Dbt%w`L%)p_S-xSJps#3xw}N6 zvk}UNXNcB5HRT>EO6(Kn<()i6sDYewZv%P)G)7TAIb)>QHO^biH^hTskf(Tf>%_*d zI5;LIUzM`G39teH+!Xj+w|<3#3o;V+lP5xe0tU4Qq$!}5HI#vB4Zt#NxTA6YV3%rM z4v+_!H%TkkMVM&I4p0cRZGGZ<@D!KnCjc1G5H2kZsI2?%gWT_(XdB?jJ+9f!C#+50 znRQF{>)IChq8g|ApPdnUX~w)&6lE~NgL`?#(7pO&*_JLz5-}xTm&1IEXG!_H*|x(^ zXCV<}6}R1V%bCTQ{>uP~qF;LAqwTqVIz85sMLg;3=YeT?{8G(N+O>y72N`bYTI0*1 z-?2o;9nj%5r2`)&e*5!irfv0j3E*K>`j+TfLskGOj4P)v8kVi~0mVcs=q=GGjkc`q zw*Bh-U>>avxJ>=Ug1ZJk6(i$8h=~-yWP&C4V;Dl3s|UKlxyv&vm?IYMJ7eES1;A); zJwsqJV1Qd191XE+!GRigyO__BR#ymkUSAq#n}q?!THAe}ePb}a4@gFj+SrEppdEo| zF!blV=*bC!YO``k;MB3eVlJM7n>!h3c8j|xI8>MFqNKfI1X@3Zx#`&)04W{xf~UhG zSdQ-u;GoRI0FPM>63u27euw1j3Dxo67>kWzIMfDb!{by)oWC@8W(o6J2M!_`9(BJB1ez{urTX+4uvWNPf!jHPR#VTd$6o9^;k6aQ(?Cs(>$kl6^6g|tiE7agxY1=+c_8) zG*!MbJXpBU=3|a$sO;BSm%A2sdcEgWL_3^gB;wt~Rz`r1_`;Btb|LK)Uir3yT>kT8 z9!o~$yLtlcapJen?IoS%Q7$0j{8-=EfN1(eYyO?FGD6+KI7U zL?~laKSIQ0=Aj}~zg$4{(c*p~8r4}>{Zd{b z;dY!&yIH@)dOv53u9!49UBe7r@*0tK*EYkoY{y{}x#uxHo33DTN+@>(w4*`=qrOIJ zgy@J{e*iSg{%01z?Nhb-+U6$o(;L6lI=d@$b+^~VY*WQKzn?r<0^(Y>KsudO#2MAR{fQT5bG?8gK?jp{iO+D8<1eJ{0xIan0cHFF5 zwb~31XdO?8h|DgyKY+0bKLC7+H``gWXkvS^##6!^jg5^vKD`O`D+|n=Eh(W-B^6*} zW7A_z4k+mq2Axfv_e0C~z3pvUx4Fql6=c46C+!5IeIk`o_396vWI!_0Wla`U3ovR< z_>uwr4HPrqRjv_&$EbmRJDo6Y+)1{0Jc-wtF@aGlRPf;z2aKR8>jW@rHQ*v)k%!}Da7CBdj`>-{u<6NgqYhh=3u4M6eh3*A4pQ!C5yMrt!qn6VoC*`&6|Q$= z#(8|SWDx6>HhU_2>_J06$x@EVY<xn%c>o*kl^NIHLzJ(;NWg5wbFO{$Qaz1(1mX)=lJPiFPiGHU1>(d+I;&GlDT4bot z`m?;$xtPTzx?fW2zxXr#MGqb)&pn$-VOyfNWfxo(6Yz?>re{TmkN@!MjUa84K;&vb z7P0Q2vQqK*k}Daae>>$SV~@gUQnrn{p}hQ4AdfM-o~+rWN1Dlq6L;HoI4IU@TCwTs zmbbON1q?SO3roe6MV&AZh%dn?4$$GxRGF^b51Wx7M)xn;GxkK>5s;9;uxk6kKF-sp z0gvj=X&A#QjtGR`x27E|G>3r$*9EM&YO@>rnjJS7tO*2pHqK?RVJ86*4eIR zjeN3MYJ&spz3`aHnGEpf zT%)s0RaB4R({ua0CO-QMjnATw(xroeo$~VYf%gc%jz^sqjvNdiRw`CV_OlsiDrwE~ zdW!Dzs1%dw%shxg$}gsT+<(<&%{-ity#&i_{B!p;DM6OgDI4cLGYd2KmS@{X4~qCj zBy@DMNf$^0!)g8s}_v(Hat<($V$`_U|5UT@jcG8tuZ z@=!*P$9TjYRRUpIQJ%~#$XB2h($)WXtZ*LrTkV%<*F(%S&mxiB0Wsqh_Q!SZ?V~*? zR7pBaAW`pR9rTM4m%n@Y^w+vwq2g<1bTBbP6aQhkC1}$%*qN&4YZ1G#&0axENXNAy zz&r0GC4Z{uc)m(OR2i{ASjt#S)CT=MBxzS99yaqE5*B8Enf4GmR-(q1#^ZV67Rd}gwZa=PG-Z8J zPj12&2#X%;1wM=E9|)kc!S!=aXw_u+b1+W~8WkAF97z6E{xg7WxnRTu(hpY$I%eed z*&Lx~IyyRFM_`l}Z5LDsikNpxySo}Yt0djapa<%>nbOY4$cTRT65#oO;^N}10_Lgi zA0=B+ubG&bz+#F8-N1N*ShWiMq6Qd^6?W1z-K;jzteJ8nJsA75Q07$&blP3gFQh#?sQ#N9X53>ZM&@KPK92|9(|CZsy|do_J}rx5`TJl2ZmD zo>pnfd51CKwuYEU3XUrhi4gx87AwocEIXI|3vx3~K|-mtdgWC3M^9LT;B;hFEz%u}?vSoMxqa^UdB1~wuz%k=Q`S}U8gq>Ck2x2LZvzJ! zT%4(d0V_eVVNi_`lhJP&1R`p$0caZxgD?D6SO}F)CwsL2ye}4 zU%vZbQOPfDs-lK@)HPEuJP9`;GJpBf&}LwZx)?+G}?9isWZ8 zN6~NiYIB{XZ1Is>Qj+FrVCWj)0p3N)qBT~WjwS%OJ8e2VIe!nf13 zS->t<`~ehAvLw-A`&NaUbI zIT|Bk%lEvI6`pgn6FG_$03}xTKUwMLs>-m)^lN{m>u%mTv$_Q#g*feuBLmg2yUe5q z3m;#@I&?f!DhlOnKEFTgo)`FN{ej8bc%?n~5_lqI=Uo6Ztdyq)79E5x^tgWb&<DImKZRrfZQAi_#)tZgVQd;|ITA4 z`JLOQ)B!4Kz0|yrKdGhljXPB~o|zKB;QhIp(63){Fv$3yfcT|EA|xjM{3yi%_m-iS z##SdT_%}%R)5+SsKrLQacnrV@$v_bFtzBL45hOhL@MDdQjp<4+fBk%eW4+i&G$MG4 z=9bz62(VwJM&c_3?r)+Dnmq6r2jbj43e@N&K!;NbpeYFX%bOc&78cCMXrEHR#KZ(9 z9XLQF0@Jv?gM%nwtsWsPNDH-~N#f?#*y7dM0tybV>j5e7WZLh~a_P4C=;an@&bsdt z#WR8Sx59(`9Xk=|kjj8-5nQ0Qu5Ja))Liufd^P%5y{VJuxG3<%T$VxL3ERQ#qXff- zVp1@x4#__1{t4!0AUzw-l$-L}FM~dipP!hLl2T)cgw%i2jS?pW?paJ<8PpB7vYw2P zr;((*+>zDw*iu*erQg>u%y3CKx8WyWKLt{M5xuOo`C&VOT}P`J0Cl&Ync4759=$BR z$H7dHV@;ClovtRkXD512lxQDe8?~p9lIjJKz@2O|CY0oyYnz%P@bU3!w?>yjSpAH! z0%jQKD}lCzMnFJ7NofA2NF&fxD->~s(bU|$0|;Zl?w^rJzrJ$!ar5Za_pp>c2aPE2 zX*Z-e>x=HLhI4p55)DLQpUHb3+8&4KH(9*iY(ysJUSV~IjebWSRSx&R)#ZE-Wp&^5 z2HF|wZJi;U5?r8}V<-vujn+}1@ijb)DK*rh&Tgs3r0^YuH)lb3Ma7h?*OhMj%X`qv zn^w0ef|V$CnUjWa;kxbVSCuf-mw3%1s1z(wa<#0kLI>IXt^9SA;@g<6uD)xpP~b-> z1z%uD!eQl3EqiECC99Oj>`s!X1j8Z-Da{SAT@VG2DWRgEC@CpH0^1-Fk|0qiD=9r2 z4;&a6z{xIBF$wvgG~-`;g47DLu}cgVMragj`h!q>CM--2UMYTdHjo?eK$n5TC3SS} zB9~-k3K~{IK;(jGq!|}KJwARqu`B~D;eI6O9WgskF1u@^)@Y|PW9fW;<}$e zH_I^@&5(FB*ux~i>HFTD#g`re5{eDj$w9M2a(8pl1M2<2pNJ(e^J0>cK97&9J%;h0 zY2f!!YH+b}I$R_JS|H}54faSd3V7qgk}$sgxtysm9|dhoPrkVFw2%v!9KS3$!NXaM z=f)hlfz=jez+=g%-$)320Ubb3{8gmG17<*>UIRY3PvDkn1t9*JM^vTN6bA4)OqUwL zB_}68LX97F{z98f`wlvvJ;{OV?{RJdoQ;7H2qP>kES5f;YUQp10C8t`1j#WV^u(Ft zGXc94weUIwNR95q>zkX<;S_;d$4v|{$9|<70r?V$MOf7iYb{HHBOQjEV(l`m#~Y?` zu_hOvUMJL&)uw$3sNgwSS+&Jzb)doFT}!)u0@30>(A51MR&v*&vU<}D%APq zHbZs#BW)(P)X?8k1Q!Y^0o$DpwIpcvRud>QVfdozGVUqmhFbV_b#-7UG|&lA0>5E@ zdY#*)OIYZs@}W-mQcRaB21yj61H%idCPdeWI{1VtM*3*E4UShpfLc(Hl#Y%L6lBKu zZd}MRmFh}PHO{eAyRw(N1ND~^3O(QS*?|L)xpixGsvRAZ>$>CP;}KO<4^1X-)d@Ko zN#YnE$aub@VqxhLkiLtC7-}JCLpvhdG1BexLX#Wsk4~nMOp>tgo3AcEoSW?lD4`OR zT(-Y6R?6vybBb)ncxxvV&d>Ezn6#YZTJ%77gwo_C9nxDu>+;)@%tb_fdJHZ#gr9Zw zud=NnA@I6hf`sB$I^=30mq|&jWo`saF?KLQZZu1eU#`TtcGt`5v@I^yKtZf@_t$ z2Gvpv&qdz(9i%w7!hFQI>oZkN?)ea)IpA#=O`h{%VGkW^`&cdo3u!P4u6wF6{ zM(CsY>xv~TBBBe-M?hQz1ADsYr3w!d6MD=2HG@J5e=ztm0dSJPAb(_o!77{_y-m`) zVU&4!9+VVG_f%iPa1Pgc#1ZlJHMFmNNMAo8x}6eKdITb8UQ4Z3#gL`$Wf&D#6}Na2 zklPKtI$soeNhp93(r5Q-`v3#dTkAzMl_M{HbPUa%Y8EPQxkl-a#tNN!+27aauV2E# z{j%*JXVJJNS8_@U*@q~65)vz)REkwz4B-7{B}8lIMG1ovq{OzDGlDOqUEV)BOuB?M zc*&+07RX3@C;_ymzf>tnHGvh4v)x>fk`cuZA=mt<0~eqEFlFjl{NOWmFIO~1U~6=e zEJFF#(;pF2-iN%>eR~-ucl=w?bV~-~labWlOE_w6U^ZBQuh8Q%N$kOhZ2g2q? zG93O!M5X-!p?b2AQb9xefIcMYMy<7?C< zxpGrf;88p2+}v>YgZkfHsQv2A>K$Sg=@A@w)x#0}21XJ#!3oj>5!UznIvjLu}L!^}F>oe0KHP(T((%jI|8c{FnJdY&_at~p&L z4;U0b0&hQPmikt-d?T5ubnt;)3q)2s(3-%?35IbwR1A!6z+;Ay3wfwrI+=*w?}9oB z^yfTrdcfrw(}D&CEKbmb*YNW4Vs+k81LjBmMtw(T5!ZQX1)u5dZ|;Oa&^8CbckC~C zQv)S4;YW^_-4uEQ;6~DuN=)t}%ptu6Z>6p`PnWs9`Q;3lUQaIht|++iq7kE`m6ah4 z4~VA}>%}w~!h91IH8g4#aC)a72U>c)IXrG<`^P?N>&#=cDO)Cs-dQBhbU+9RY^OpP z^3?J+uE+bmgC*}xMo0yVX4p$vHF@NE?r#B5KRm><+O!Vp)`iBQrox^EgD7iFoFyO5 zC$uB9uxO}9f^x}yq?8_-cM+QuO-tH5MgAW>{1u(Nqe`QtwGwVcM9r?*c?Y<~X?S3@ z@xp1y4Iy*`5EQ>a+!?K=*2~C1wVm2*Qf6l6Y2XV%Lx2mHqy}(#s|R0dD9(iNRXb$# z9{%Hinpnv{wa>}Pq(IgLOHe!5Xjw$ntp=5T?4OTYR{h$p$WZIVWvzD=R4ah*VO2WchNG<`ts5P+M?ryw>p@)hTWx645kBZOR0Fc7 zW}JkJOZ7`Eb3TNDp85HCEW*n*|7V`r6Zo!8cribJS9tuis1p~W!?zg|WrjzniiYOg zd0f^f^|-R^9_P?<=Mw};o{{o2)fIvXxXkmEua1mz$}Twk6WmCazY!#}lK?>&)*~l1 zx`EUFvW~$~;}PEr55$nyA*uDnq$@weQ?d918fgEo$)RceABl$%E`^c<`cEVK0^kNk z?P6tu0a5XaK9&k}&aQ_^o1B{)8|{F`q>mK?RM-zCuz}k&8!fYhdSZxnu2`V`T3<4{M@39Y+7VaJI;q07b~Fg zhsuuDN7fkyg(kH%4?G+MTx~qlfg`jQ(ijcQgRGiSU|;6BU*=V19lRx{kg&5m^mP`x zJ&_dU6_d`&gj8sPmTMHO`spV}_{XYy6;&V8zcQEN!HF8{2X)`8d-vKSm5-X`AQFml zh9lPb5=rV`)3KmLKqKLw_w<2c-G+S%WDu0*rz%gu-vN6Gt6ikArS^}vSFCr8o|YEz z!f!t(Fg@ecf7n{~h8- zQ}4_EAnE{+p5`0faezC(Pa&sZZ{?paVyVypbkW$fh_>AiK|M`dkwxR6sQ$Fo{|-$PyIaO4rA_9{Z^O_>!aZ`#V3ujs4%Ur}UWe|MEA} znd1ii&uVle%Ad)~SpRiX2StC-$nHi9#UQ0Garo~AuvA`D*-o8*ic-#gHjgOFEqsjp zzs{Iv(V#Kpx#!J?$cdJ{o%?qH{yF#?2TJ>2bM!y=sxth)1|CaHnlJO&e_iNEl*~{=@fhg;czr|upOE-}yfdu-KachQeDHfyOt3p}@0e^}G&M~<5r6gj zfFx0vqZ51hf%4wL{;sOIH@pt#D3Pi4AA^35_mltotb$Mfc@=rM^2Foap{n|?xqR&k zdTzZ0mp7sQE<+?RCaL0srQ5yzeFZ_v*ndaoqlprT4HA9QaWWjKGlDpI8VqV$-_KSx z2XXZ!L8cB)(3%WqoF$#0ujVDZUdd}MU1JOI3j&p|3UckoG4c?2-kRH!h9=K@%{Mw? z=CJ5?Z0JcHKcj9a554Xb6VG2Mz@%+^ll9Vh?$018N^2}fmRKZaPNY~tul-N+4a582 zOAdQ~viiyK|GusVIuN*>7}&^Rt~BU940gkaBd4)Kqzov*Xw--<1VuONBm2L$(PBBN zRPe!wUcS?aV!-=w>EW5K{*G6lY!Y#|dat8K{@O%plOIlP7ztqP^p zbaRdRUIROv2B%R_S9xd(b=VTGctIxrr}BNn1lozz)cH`*`d}gH?ePfA_c@F`vWQ`u z@34?$HQ|KQje#xhy&)7L+P^odhzf?>r6=lyhfOL?fVL|(MXVCiCpvlY)_ z*0cE*Kkcl}w-oYX&?9XZ8LI`c42_eFn6{7f$=(m5c9&juX5I_2`%*#nLb0cj+x0$tFoE-whC^MJ-6XCpA z&QdRaqR})@Q|OZygM@WL(N>PuoWQk656R&nboetaQMgcv*z2G=t}X+VupJyAjy z?tU0q)VsnjcgIheu|8fYR{+2aK$Wsn*!COkRi8;0Ro`FyP-P{SkBY-g%ZB`C5@Sdv z+6R5}pMCR*rw5}=Ani_RMx62ihB|dWBv;Z|V%LR&Kf-;fs5;+&mhd4d0BK;lRrKW27*-#!=*vBEQMgY&m;&P5~ZWy=gZ7Z%(+KQ>G!Mj9Mu=7H7Mh55@RioE1Ir zE62*p$#x9aSqyF^!$r)t8R5;vZ~H&vFK(|!eBQlV|9pOY_MvA3&oNABV_4k)>EYpE zbD-?>RpA7;Wh}P0$!xlJ7}9vLGCH#*?HYka%=I&zGKaTi?o-OTEqY#3(+~p|>&tBu zqpNrG>T+He4B)F|;;Gv~W>1Zd&Yc2*rlisjN6L#I%Ju!6ilwEsc(ZG641MI>I*MBv z9SeI4vrhMO;hvzbqI9>viNka)6bVi8CJ85K0!8fMU>^%lnE*yuf4PmCnt@=Gd8u_c zFvtGL?Kn|{#OL}6OmkFujYl&p97-^0X6U(OLH60o`pW0;t_Mb2oqR44@DLAYTjVMk zI>ucmguxqI=e!6JAMFafBC3wy_4*&8NW~jr0(}=Ywhuo`92S!NFZXv{gV#9-ijDT> zP}5yhjP27DKHB2>w?Zg*^Kg562fGr(rb>4X7ivG;MQ-sfWPD%wTBBd)9!Z{}oi3Gw z-~Pdf$4Dn7B#n#%6^ybqxfFe@;j5_gtyy6duE5(LE-F+U|2#&g!5rqw+6+U2uq{&R z?wIoQW>=r1LtU>XlK}Oh2!7}`1xuBCGe!}y$-O5uXg%nsnjp`CxY5kXsl%o%Jwn7C zmU6_7@tWhpQ+?Vew#=4~6TyH{$He(I8{INfw&CS#iSgi?P?B*4nY9fodumFeP(}UL z5VFuBVOb&ms@A>tEHk8b7SdeF(~Yk+5BQ7`eph_3K5)IdCTrxayIf*{U@5oYUpv`E z(4bqkE%o4lopgXmeawU7aMa0XJ>%WjIkK6`g}Pj*fjq!;qX6lEH1XGn)ohvN>TqCz z8+yFzx+E31wMdXq=*Tx-n!i~&pZzhtgoYRDmNLS*zBPxu@++b3#yAY?5-IXsH3^+6 z@*gp8MlrC%9Q6Qyu5IAYG}4quBl!hyz^E6<)DR_fe1%dKiPp2X&C)R>!K8h-krDDe zjM&)I1d%H)lZpd|2pmK`~E5iBbZk;s7 zj^KhC89|Mfglad(J*q| zlut&9i^7Y~3fA(;b=c$$r~p~qJ5NUk= zwuN_%|8MJ(XTeDpizQ%zQmI*at2kQ!Y5p;YXUtWLVD00^>0g-1lYbJ{ z(-9fHLP6idiwLGrC`TFAG$us2GoD>-P^1;7jE}8lf{df&g}li`_y~&@*C@15>UM60 zg#3rW<@+a=^PYy1s8WHkc1zxl9~z*&jF+-0-QuK8-Ja>I1a3{#`DN{DUxXE0rj%crT2! z1`~L3!E6m%=#F{3_`3tO0!VUJ^TKSp$u12ZJB^OuyzbHDbpDoBvzzDPMv;(?gATL_#nsJXe^Rix;YJl zLXqds&OCP8#84Z3h!LyzJXSJ4L6qmkSWH|@L@Koz1fr{#Tx!;bm;uEkdU*Qb0~f?^ z-YcTC*>>oaoTqc?ORVU`lrS)-R$PoxboIu!=Bw$5Lnd&^qjC*UIcP9C_JSE?8o_=n zLC}3+Ct_Ds^41}V2nCy@&jGfe!2sK*MwZ#Jl=4g7#65L8t~ zzL8-DA(FCOBAk%+sR6x8W;Q-_PmDCMD>r%mmHQ9J25Gmtx3=cc_KU<=sumG5IYJcQ zG%3|I$5T$tCL_#MX1&l)(8t7^iE!b!+i}sNOVbsOEY5bzby_(k6siDSOJsofxiAs0 zEKEru^~gxebk$O&)rDIhZ-ae~buf_rhp?4)rxxs*g?!4ys6U&_=|N z|8tOue%v(}wq01Yoi-|s^z|kdMyAE2gzb^;8g>`bQB%gs1g#hFV6$yENo2fFXenCy z#MW_b2%5q6dSN~7l_;hg2fBNgPgBmx~*rt6qX!**V zKkWQ_(-DF7qPLpnz15tk^_(j7!>BW|{}+UsAm*tP~};r!yy_b)9r9lLIS*hQCI zxzkRc2#d^_A_?m0&sP}Q+4?0TSmnCA2u-NidP^7)B}}kXH0@V+7+!|5r4};O5M^{H zf@lw_@N?`>Se+La$GAeikfYhc5(%(1=IJr7^8vk&HY*(VB}J=DwkzBl$GhBKVWGyXh#rloWdl5md-|-{`C9slRnq+B6-2*KchpYd4qf``n}T z$Smgs0ix$9pust3B1Rq%9D$CNyw%3jnj#5LxEYdB&ej{Dg5MjU&sWwPNB8Dj7_i`6 zNg1)861_2+FiYn3l&G`?1yy5C%j4pdLIQ>t+&ZsU`6bWuob0ek*TZMcaR+4I!%_zj ziDtM_Cv$$98uqb}yx#qca0xNAcwo+uD;1|534^r{enfNoH;PCDDtS-XMu$E(2tr!> zD&Ddl?8EbVoxp5&#!hx?(Q z(JR+C-WLWq;tjEXG#F25$ji|7mGxcF+^eR0Pn2OAg>CtVFCeS}hd6W!zeq>5-JBlG zu7VAQeQi#9GpmZ-8XLvFNs@5ss#^Ui6-%>911$hOKvQcFCJB0n@mMkE8D13z!+yV z`@Nt7=hj=Wh<$d?d86HV^n-=HpT*3Hdz}YIS?A^pmKF#oJdoCb1-#;6h2FlgXSMYu z7WpNgp!Nc6S<@zXW>k3j@7b7TyJ>-5S}l;r{*tfueM!Gpgblo0)|Zo^AcpHYh@Yy9 z%W5Gb&DXm_GTKun`)s<++2u-+9bZ8d~eBCw!<{;>MW#?(R z5At&l3{#T)qrC6E!Y(x2%{Bis2ITZyNVG;;Zk~0YY=y^uSI7*q#z<>kx+S67I|?dt z8A)gHI<63N9}0(nq=~${NGyUYPUH0?^T!`Kl1I#V65X7_`qPfKVdU^6VMZdZYge{E z8WxhW=odandWkzTa)=yYe*yMv2kjdu1OU7OVf)A)$Nbcb-^3{~^6-QeX>*g>$L9rO zSj59k=K=Ja>v`PzIDe}y<_J6CB`^IASFyBAux{>%=9Vqp)Q#OTfJvYf|L_dmaB(gy zLK4P5ENGz15*g{s!+bq(-<;ZI{pO#}u6OK*N}xUXkIVG}*JlhLaH^I=oi9D-ei&cm z5#jo!HG82#(kHe@FR~JUZ5P^EAk*1}`P{=85surB>X4O)kZQH;UpE=UA)=aa^?kxa71WZGdCr&+{#Vz`hUG!ad zUli~yDzn@G`uW|A5q@b(#DyKU1_M%c=5_^slZIVIlc&)4?H(_d&Q5c6fU@aHg6hZ#YUL4KIpf#Zdxlr0Pmesmq}TkG zw3oUmRn0EiD=nuV%%31i-P4rgQ`~QG6(REoRK{g300YG^bvRw+JBCmNKp^q}va4!z zg7vUm{@zqA)qBoK|7Ue_C`Af(CcF8HfNWVDEX#n*gBg11zTooM)qyN4*3@uy7*Vl< zqLX^UcrRa#c0Ox7!#4di&Eane06c-Nd@aO45rhP1_K=p!3Vh{v&9KT~{N+MvqG$Qj^D$UXD)>M-;V+ObbbpWPW z|AlRd3jOl?n3%5`ATsnE3$h9JB$pj&NRemMT-8GWCe3HdMej=cV632m$EPO>m$X1}${1Ag zH7N1jCwQqhC-oy~DRT;Jjt8Tke4E(8zbX6)0LIaBU%EpE2ol=SQ>OT=K-T{-DH7`C z0+xVvtBkZ%TG=!;EGBzlH1lC3i1LBVu|*5MX+@c*`-q?Ng|&^#5LKxfVJCwf0kmrY zg_>lN&P=ufz}qlk)GK19FMGN0>d6^oaxlwg0ktHnRo_=PU$Czpr^W*|;ZwjR^RPnh z%@c{0fev7{emy{@!&6o;Y4G|^I|J}b$_RRkZX(+nJt2A)(RMn;y@W|M%{oQr8*HyIWDSGAJP*mh(15j<$?%;F2in$JHvUi_#>QT+{nN$AHCO!4%M7t zNP(}Znl*|PqG|_tUhnD?|E}nSLS7AIpUEzCD{~+6)1xf%7pS}0jQgovc&@u2JI^b~ zv_(+04SsfuDELxA&_(8oc)nwJ=JRrGBZIlBz)Yc-H;lP9$*yef`i8f9)bD$jd1x%| zgK4yB<`W%82JX@>L6-AhxLfuIC-S59Uy}NQ0PII_w)!|p#_w=nHu873$zEU4#}SF3 z@w&RxUeS5jxnFd<%QC09akHd-p)C;t1@NwQ1a+x<1l7!N&MmYQ2%|p@Rzl1;18Gjhn)2ct3wWwRh7zl`?1lDq}b>Xdi;pGmQ z7pD!bwp2*Gc4_Kwx0oweXuB_LN7&BO60o>i@TwCjzQgOR9rwXm(y z`-)J-=JI-}hqTIOJCQGA9l${)op-Bmo-;0z3Un5S>kMR*`Ye)XAymm4^O@eyq>gUk zFAQ1=uwcIR;&lFIu~0S^Z!bW%UN-X2k8}aMvuJESGJ!A0Q<1`XuvQQe2Etzx*13b; zAkl{6`Fgx0SaFFQ9UMIxp$TZ>Es`;W9tFL2zzX4Hlc7`mny{Revv(F5bR)D_qUr|acan*6SxqZ4tKcRwxRw}k11Do}#P z&cfN_(!)L7<`m&$u3a%1*x9Cgb*98xUcqba-!!#Yt)no~m zL?*ztmH`^#(tL#N`GRa9=rHT6>_Px0{9G;Ia{Xn(TmU@SfQD`RE{h0CYmK!w#coSl zMA41H@@&y_R!BhpO@{28^p6cSkduywJB<>~)*piIFj9E|HfH%4AV-bZl`dY;J?-!e z-&OT@x(YoOK5@|SKGn)K>n|Qld(3%xcRzFijChYC#ho5?onQRyqyTgWIg4Mrh?OWX z0iou_PvPDt1LdH$h^oETEASgkM4hsZtY|cV=0B&T!vlT8=K#^Wh8l_2cS?JFUc`KL zSGgO9feBk?M@}qFP>V;(f8=-QnB))Bcf7?5asgju{68LPTa5lp9kL#ybvRmc|8qF1 zpjmuy7@@w@92Fse0Tq?x&cE{f;pyb4c6w1gJEd`MV0_{|S}v2<`nyimer;TWH}9Kf zg@aup|H*;S2L#$-ebF$QGe`p5N?PL?iieX$WM&QvSP7D;A=%H2efclKb+_a_V!j=J@iUCANT2$v<`IO!E2M9 zQ$&cX$Pfc|>sPjx_>)VI4EYL#M}}JX&g=!m5kGa&@JYw3-Y?6%$cee^PG$?Z2S)+uRz`}etOaokuf3w9@;D4h8iC5Fcj6-*7FOj3|#b3 zGtgq5HtR%G0B$sAj5;@o#h9N{DhgwWZ95A_`prP=%2$G*yXTByK;IGv#a*{K&JV~3 ziGgN;znpbE9yS-sjt^0VCEm)C)1gp?|HY%dN`+^0nr5{7L>KtPReLzYJiLdV+Yu) z`iF1=>>p1wdLqJRI{3^;$4-%_k+b%4JLyplni46h*{z2-zB-QG^u)Vyb5Zaq<5_=X zRgy&Sx90Xo$JGIEnChE-nP-Q|UVgmK;;U2SYj^*FF+~8+sEQoEP7GvIGtEQeC_F$x zS8Kl8iX{Ljfk*ffVabPG>l^&`>fSq!j@(?(ZW_)ezu=}Q_&8Nde`P$Q%~?qB8L}ib zCN3TbhefP=y9@T+fgYdM@4H#up0@KN45;O}8OB$=k(d+8H9{0d|_kmWu!D@`8Hw5r;U$p4&)+S=BR zGwBF$8_~%p>2jNYd$qNe+TW*`w2*xKgNiT zHhN^)b_X6-ZeqW)9X3o5a(D{^mH-%v>YXhR%&Sl!tj@!(Tf)}-i{EQ>c_-@zcz$_L zJ2_EslL<*S27jwWgKUsA(3zwL%F%a~$9^w83Kg;6Sap7$BlrqT)I!Y~GLS`KL45eI z+5F1V`#HgDszP^ig35Zn5C5pD+0s0R+5*i=z#F-OptyBu4zuk|UaQoYKDMdtpS^MH z1p#g;z!hc>=?8$G7COA3HvgtMs!3|ZcrP6OV@qOCHo8?9yOmdy5UYoU-4?o}+|`y& z;bJKX4|(b-P|3V1?cvW!g(H@Cn%$ZW%tti=$pNakdlD@8qJZ_R`x7wytG}zB2pEj! z3}mePJ`o(%#r>Vj|dr#FWz^vBs=!x;u;7FTK9IWyY)fP~RcJ|R*W zD=ZN*$n4sx*)TaR&di$RgYuGtFlt}JY|i^NJP0bY+xs0spc=v`uiUH>hD#RSS`kPp zrbRX01{l{cj7-($_YDqrUAp3bw1jG{x|7TL%velu-ItmA<|Rgh-!Q!N>N_+gw|Z~p zRgYG-SsYh86cO~U;5c|XAsYh%*!VI_?&Ie`hhp`(_9Cs!Y}WBG!=P!r!E+(~=sbP( z*R*lPQ}7|t-tUUW8<6E<8YAh8WcJU`VHLV#y-ZX%dMN;4f%t(&*1msLa>K_1zxmdO zN!WcCkCzUQ@K>gg&z&Qp6F;02>nng^=8|}a&ED2?4-t#Cm-D(_g{XTcixEKWpd-E* zhMg7v^o~IHW$F)sx|2WXG*nId^?|pMAu)EH3ljOYvsjRI?E%@4^Cx_-7L08zK8>41 zUJO7{cLEOkRn7U3{k_rC{U3My;#uFIfbgyLnLC%?SrWj=)N$fK+Zlra%oYtw1`wz1 zeC|;bXX>~wUPQgyT>B?^SoKRcT=4m9u%`koQHa0t)lFQ4Qi%(a;CwQ$@sYoKw=!GQ zFzwEYj~JE4a%{%WAwa;QaE11$f&va}Wq$=BrOmJ5;&*hkgj#GPin7M<1P}J+8p#K-T-C$==ekEsD&7)N_%`C5CHE~ z#ZX&)QldBAc=IxKdlDbib!9N*w#AkJz)8!Fw9m-$l$t!eDQLfq1A}bldxrWr-j6Dx zS;Q`7>lDtg0{y%7HOezln#fN5&T8+Tm;_xuJyFz3ejv_r`RKLaGzrv*RdgHW60Knp zRN**zzTzJw!YHJ6C=aTEs72?sb-Lc(T|LA2KD{B8Y_bYPa3o zr4_?HSBN03S(kIQ?=s_(!?c0kVrEE)Kv2BcJ}@RsKyC#DJ&6hfIK$!}T=yx#8aE@U z=h*eG){$4TQ_Fzj4{PEUp}@SogZ6-UArtQ&32CzkDyc!#@VR5g{Xhf+_{>hal(BA% z?qy-Jvb`Gl%lAVXkkwto*3=mbdPE0VF*2QV+!zZmmw@=Rtzkoc#M`E}VcgE2=Wdl8p4`VpG4xoppx#UWt^*mk2 zXXjvjjt1A9Ook6{Fc*_hLFYdBWg{cbr1a>4LjEj#3+Jp!wSnG2c(96x<#&}DbG*MP zp_AnpuHa`1M<0KDl)AbGDnL2W4J{nCTf%2*MC^1OfX#mcx zSS4k8fg0W3tq0qmd8gQ7ogtRH-4 zStLPhYWsL0Y!He1)=tX?2WVhGV8w1`QB`k(wQ?cimBOYV{ zD)M(`9W!r&f!k-a${Y8m%BNC;X2~#vhk0eK4w}FI8o}UvT~{?({wA0QoeKG0n$r_| zCYLz?$Aa@Dn3Be&?q=IEdR}1T2i~}J0`csJT5r)g3$fDa#aV!yC0V8*5d07_pGNEi z8%r-KaQ8d~ZySiDs5m_R*|vsH2D6Uq5vWx{J&%EC>AO#gYDyF>lA4ZGL!y z_;3*OuNOdDVp0lt9$vS-kmYkHzOA+7$c`X^ja7;4a@6m6MBYGhajUOO2he9n$odcH zEzwyTkMk@Z*2WP5RA3xvUFv}oVeuk)Ye&<*pdL}TR4AtHfq#%K*eZppVL17XfX%j( z<0Dc@a23hL>PCvEy>h`Xz$^SY_>J-*5!csxhULld=l&^+nD04lQ3i5720EC=oBo<> z8wBaL7SBS^w?1z?H3EFnV_TTvAu)HJ`s%d%>{o>(+u`(FETkERWiOo$W%I zZN7^!#~Uq;@+Q~W4?Sfe0Up_p6dE>?Vk#*5zNXK-n&xHa&lm5|2Cr9XJN4?7MKk|( zsaE((U`0aR7!B?)XSwX25SZs+*W5wV;FR*dxvgL6gAFG@F3zwi|8P?Je(Gs~_u;}w z>!*tN(en3qp+nE|Gl3up#!#g%lkqda?QOuLNR7~)uDVOJHJ#4}mb7-Tg30vQTY274 zdNr)t6?lNP+#H0gCI=Un7CSG)i6#+ELe5}DPQ~CtJ@d9T>p$QO8#L3+j&wR`UPAd_ zuCZ5wj-9Q;1G>KH2`d=njdPd#-3&ejfi&0K z+ux;VRlT~`wfjQ2B?wCeZ=V+{?5+p;t4tlo$#xFc*%G0>XN-(=gpxx5GroAC+aJ1F zdish{j%H`^(c2CJF3&CQy(!wDs+!in*5Gg=;f^1)m}p0BNiQm%eU(v8pD=3Ox{ysK zAJ37sY81JGrz9zURUkfiv<;*N0oQAfI%psr3l)0?^YcRY$)di_mHBlNH{W~3S_3&( zRe+?Ly?h0ULxNHKnNo)R%nedZC!VTjsTuZir2GPNyisUAI)|=xvBSLd+9)n@BB4>J z^kmo7h%@n*W6)Jy_$S+t%^PP)zcd1NcE>X3L$JwYW68MfPot`Uqt)~S5V7#c1614k z#M}ph0XCkB-!xB$0Fq`Ao`M@?A{Nb4dj=xwCMuCa(>F+n0ccDyrAS9- zu&2J~2LjC-yHU_fhB+i6$#5*ss;8cDnm;TLwQPcC$2GXLGqoFDYLDOkkeDbeVzWY( zcrF<|Nl#V2c^GA1_dMn`73bk5)PW+3chhU+%By6p`vQuF^YN2=Jt-$;WS!&DI|)lU zw9AFY?}j&plZj{*o8<5aI9O5{bj;_~TD{-c;K2G6K`-3bO7<23`||Sg`ox~PZ)$() zQpD3D_pK!xCe5=+fFEdj{48?6PYIG8ThCQi9%Yfw5Ms&Ohx-!k<~iy8AoXUp@<#ou zR$r4aUti5zGS$CFyng*dr- zx#NazNgW+I0>nEkW^B+Xe;9qL=Wb|1ZyBTr%lm}vFG|VjND*wKVWlxd6p@w1hj~je z>fSnq%kV9V$ix%Q{_I*_nEczV{H6Xx(+%b}w>3&hX~g$`Z?rKOT*chjSS$oBPBY;< z4jGOK?-{4^6f998BO3?T3wCxC9695git^6>{s6-QR`G^#qC!Y%Wu^4hcjG__#M z-V~IUB4w6uZ4rufw10vL2oz`I;(EdRJe<(@V`L=F%je&Eb91N569}m?Gmua);GaF` zB>gCVZ#rl=pZ4#~OIyAfdp=(zaAC3JNt)1ku#1mP9OC#X!0YrX2Qq)T$t)z2rqD;F zAa|e91GPGU3Ok`ZEc!~%=^Mb5O-V{hIxIarO}SQpe4Sp?Re{nAkj8Q|o&CdVxVx)e%(C9j$UEIQj_YV#Y^~DU~`$>sXLNql6nNU%q zAjUX$7vzKnBsizWzA-V%ER_|kJRE-r@W@icT&Yi7cwJ8n|7VE49Q=Hb&8!e*UIp`7 zL?OCMP!%8VZ0Aiy0-;K!$iG*N32JnB!&@@IbNSAG4>@}!%Dl6I?Yu%ct0PUd}8l(Drl*}d?zMi zwc*=`xrE{KqtUacyD;G{SXs+`)0i=d{oCEHS($s^6x!he%~yD&}!Sdv0bV^ynH{)O8<@7)`G)SO)=!$I-Uv|L3~7cC;UE!%KLG^ zdVRlx@yUDn-9{tQHdTr;NANwFOoo=0HtS}A{>Ro#_a!EDC3V zL2y#+lIaPi6_KC=<(yz-j&w_(k)6ps9jMJR zjJc!kwP^F*?bwr&o26^L%I&MHQLCQj${SCgF-H;)o=w=djjX!<-KxDWW-Q#|kKNag#%Qbe<3mX@*cBI237a#*E8 zC1Fdo4`wUltQuU$nfh zcZ6wZ}8%q2m=ubKD;A2*J-!iw*QteB)GZ%nuKB9!^A4=vlt` zDm9?^@Em4uY3|nSZ=Nq8(*2JA^a*+Dp?PRhNJ`~r%Q!X;+}q;2j##S)`<36$8;n{b zeH@EU78Ire$1MQbfRf<TFFi?@hiX?^sf0}mH9tuguc&vj)WT$tMa4+t?HRuk!NDR- zHf-7dKEcKqs&{v1aeuMP+CN){c4{hgQ&2V; zwQ2;;`_9WSJn$b21@MOG;@d^qGQC+M=c(HY%j01^NAnV+bze#8?M%5wk?W#GQT6K8t;vySc-nBjYgYxQR zt@UuSW$Nes_h?t^*H-kaieBxH2+ww?Xkd#RnF>)FavEWJ6dwGNH5 z#5#MXgME^dsjdQ2A2a-Ufi9Hjg~bqf1|HSJrjuF?2cw1_woIQ%o3r#cO_sGa4}N^I zlP#=~v03n@i*)S-OU#_~4>yx7UM*`p#vk2RlH&6&^xeBLu0K`_wLGGZZ}b{|U1K4m zo@;W$H@Y1r`*IsBOTCEB^w8*zRFhPFFD?^0&{?eRl{m`s%yQ*L6h&~QZnAK=AJ7*+ zI3oIGafod8SNXmK;F^-ss1`FNAT}00u%RYPKjP#Gd}z7DCMAB+qL`DDT=Kr^KrtNc z*6)1bx)0Niy9eISxZBj1s$g|o9{PH0mK1+`lM6dUVh5js@h0@CIba7gAh;(u!;z7( zL{=+4zKXf7tHf_2iV7j;mQk{K?N6Q{oSt?!F&fmseZ1RCW*tmfs-{TK)8T5qbfHwZ z`Y_t)<2-voWOq53#A^k=pETLc=8B<^*3g-d7j}$^^dwzudlh7G|9OlVUWW~;i(3jK zQ=?&muLN1MHze_>@x`heDFiq@#p=3*0!P$4l_c+8>ae;aNhx}kEjt)DcvtXy&2M-Y zGBQn<-zX-_;v09I!`)ur_+*Fg^riSxu$tbFAm1yvWo(AZzu(b_K+}jL6>yB{bA0P? zDEexr1?Dkpec9l|QTUDioiWj&NF}5Vy1~AE6I zZ#L!s6;f%tCex5zMI^LN>w%Ug8EIXOw!5&Bbyqxdi#XH}fv^nqUpl%g2b=V=Rx-Q@ zTgzEWnE6A&@m)nC<+4#xDpNB>7I*E`4xiO`MiTf(-xTGWqB~D8G!7i}lx2nJ^6l4N z@zNa?0uj61UC|ml$0n25$x=ToQN$*F?xU6<8j{)0=0U>uM55UmE8V~p#Q#IuTSsNN zeeJ@JVgjN9N`p#@G)PIPAc%m7pmcYMbcd)QEueHrcXxw;ba!`mH=KEI_wPOLINv$n zALls6-eYeBp8H;Ft~sxH&AI0Fy3?R%f24f>`?IxdJF4CDrK^@J{9o(+a@iJGLYL3+ z+m9NF0g@Tk-WnhRo{ob+C9DS!3X9!W{MfhRfM5S-tDapk83s#Q193mGky zzMp7F#<=A6C40Z);ZlFv#&iDaYPA;mlSd?>{r82rBPtx$+5*PTzDSM&-P`}X!t>EXwEshn_VNV}+y-xmbCb9I z1YZc_5Zn=mwnq$y{^a+e-@d&}I5~JUCUZV%<%=VtoMC%(a>sGh@mq7hu}S;+?I=gS zuvR-Clld`$K4X3{Yr#u(7+inONO*nj)A6`Kih_5f-@U+#6}2-p-+EkZvdwTlym1v= zPIrZfxByY6D93@xE_=pEQJsH&X%^%Gue#!0z2S}$)4gwc8n$L_!$CFFZ3IhVVq!_) z>1*~I*FIAxzpcQPn|g`)Vc7168J+{dNbD+xMd01+fcVePp9c`DwBHOfRXsJVS#~py zY-0&!F@F3wwTNkGh z%T!9=LPQ9N|H_5<|Em^}RFi~#87+|li2%D^Z#iU)<+&L-5!W53kfpM(M9V&_#|zY` z-wm0WlfS^qDn->MU)@VoIAFJc%YS-O+9_7n&_GiWQHs8v>bU91E*5sqO5J8_b~Hk1 zX-&*(Ur^GU_S9OCLZ$tX43BYKb$hJ_wsWd?tc-$%^>Mrqr4HB?gWUP2&K$KHdnB7P zPRmv%jr+#hjLPk;oY>tG6g#DV8aqEZeHfjFerv^I#{l>p< zscGrKbz8AyT-~>Mfx(51O{gs^k3M0s$gMVc8+KqgEAx%uOt)r7n*;SiXY%!8Gwtbe zk2Y(ik~aRr_4tm`tr*AzF702-ZS)UWv6SPo+YF7S<9UFc+3bjGJNNOk&i*<2^&9mg zEtnW)tg%`dCMGREBfydgDQiKQulm8}{;k87V?2D^=Wy2se;}Xha7(kkrNv8(AZjNey^h9N`H z?(%5=gXD@~4nDglzu6=@;D;osbUGqSV*BXK$4&ED&)EE!n#6KgxdsppXXnjs8Fk`SSF@lg4AobcYzsEkGL&lkR zNXSDht`)B)qg?p_@-X_y`KY!Qbl-0?F6|cR{ALSJHEX-qzp8&#$C0XJz}KOH38~W+ zPEQfD`}*~AJq(xlOC* z32*yJ3`cNVxdX&k*Sd2ofJcHOAZ>1LuY}s5X|O(_j{0_-AQz`K3~eC89t3)uQYn{w48AEQ0q*V z2g@$!ctV7ImFLGyFp>n%tj1A|5W!I>dT$Y}e`qxj;gLIm`Y`J7bS-?3@kf6u zX{q9VMuRPS3nH; zO&+5h9HObMANpYbD5Z>{KGND|v+G9e7We~Z4vy*lS&97{Y#gky6$W*j0UyU?P7f@G z9j{mz*JS8uKRi92xDOW1Ionz%mzg@^bn9uNBM$0dZ(D-dPWy0kJCeBNRuo-dHub7@ z+mHLzcJ}_?S*oqy%hXQKbZt9vBqVH}(>+^hSB0PQZi-x=wqSb9JUJPA4~z8N)763& zaecy{s>3;##RsiC35O{6`EVZbJYexzH^u>Pn8oC@dlnn3@$GeW)O@YSH!n8(Ojp;h zX7eiNnob#lFY0gM)X!U*DxS|{(UleS3PTgSGroN%x8pwa(*l7H)s}i9o$_Dd@ z-_2wL@OhJH%a!uZy8rvPYnbShW1mr5oSKlDDAg>3k;RaXM2#1nE$xPBw*B~Y(We+w z3&2=?Q7h~ws%1>7m4|1U#zCYd+%AXfSJ9u}$ME|&R7?b z{6em$abZ5)9A2&B_}+`xx#ef=Bp!Fn?bqhH&Z7E%VB>tAwA+PD`8w5vi@@_nRV}@p zkgXM+T5qSdH#te0I!~WRab4FNj=Rf1iIIE0AP1qs~EyE%ko0lR9y(Qk`QMb_T9Ec56K- zqyAwg+O(TxytE{>2VR@-vQWlMdsx7*3Gu|{7xBIp&bcp)uz?W{J;DY?nz zt8oawR#JW0ZYk8ica-%I=(mZtDNMj{HLlzF))uFkE)J2{4<$1{rsa~VV#bR-a(ZcP zeW`S>zI=XQx6(NGyn&#C_~14qyDkB-XgF>bu}=MgjCKlAt!ElKzyQa`h?*3v9J02t zi@(M|U@tmkVNGV#SXKZ7-fn;#3d~f8N-*)@FU!wVq0L?HcBl3CO0h+QL6Y zk1D7~aFIviWw1=7l1=gG-cJUG@IZZu#ns$cBqAlA>#(2FCt{PmMYH&v={tdEUw6Kd z!w`E)buD%xYK~zBSOi|8Ve`A$`f8(oASB zlWlBzWh+0-E2P4Ol!T}&)r>sj)WPlcI79WZewWVua;zKr?`IbDGC6gaSNW{{k23BY z+H{X`W}X@yUyv_5CrxN?kuL$%IpQXk&|Xg;%v-^K_wF2mzZUs3L_RX6LWZy~($$(| zc(&z@)MlzriV1i=kfO%vGQ4j1Y@->n@%jq)trT+5N^e+TE3*fxS`%? zY<{0txX5DPF=tH;OaQWOW+QV(I{Mbbw(m_zTLlTz8y`_<2TE4;Gu z!MS$3=C0!5?UMoX-JC243>NWFdQ|CP6Kl;=DV`OPE{;(JJd4YxTlX-(p&oo%sAsJC zDeptO<@!jTiSaYPQFAX5hYHt)efEYQogVSsSEO>gN@v>CgqK}=A1cM%v%|8fI8ncC z6RQacZLeAVn^JuO2(qyb-9tYfzWWk!>|gPNJsonzKQ0diJ~BvtKd~V>C^M#pOoeN= z#gGemBEQ-WQ)xer5wC0q>jRqL_U=aic-WM?X=C8bM;d~jJmL6o*1SOQXk+t~I$Z$A zj{+V2y4G0E(73qyhI~{ z3uoTJo?v5^__>toVL5^n;uzso{oBfJG)s1u?vxP!t?W@e*5d+J`|qCyr||!!zJWY4 z^2bj);lEe^{%^`C+j&?|DT=W&qJH+>f64v6{Ka`5)-xp1L9BZa`u|>v`TL;%yGQMc z0G|npfKOqNpp-)z%xaySn5cpYr=S~GS6%%n=7nd%QPC!sGi=;uG^6#_v3 z+`prvL$E(nsWdS3v4KCM3LowJw1zm5fNK~StUW4a)_!xXVFB>vS3wM|KORbbb9Wcn zJO;^giA}zL3$JejU_sAsBg4JmgFvXHUe0NMO^Mrbr2$095Ro6iCYocQZ3k29-BZT1 zHLf}w?M%X`R_WxoUqQx4yDhvCv_CPPzI=I&CFG zOUD0tbE*zervz;SwbP?r6lmw%`6k{4L;5>mvNFs*{Ns9q2ql}P`YdNkslbo`=HAwV zl*tB2qH4gv=f+nnhetFQeoB zdi9eQB;4E<7IXzpVSsBg3`suRnvDgaEZ0kS5M3I*j$ao*0W1+Fq1&JC_6zm@(dtW+ zgSn}oQ$YZechzVrLH1&8Z4LL~+b~vO3G)in{*CiVv%15L&>F6q}@SQ4fQ5Z zR}#iZUwR4?Mdh;9FT?EJSnJIxP)5df20^)t`0Ab>9vAPyZ+1^1gL%CmB@qj1p+c)H znhmHb6{pk7Pk++BL(#lX!-ro7GAwQl4GovZedmiyOS@szEe|iRcM~rU&&I|^Rd@IH z*OD&>M@Mgy-%`@POVKosNK8zO=1C7KnrjT97q7?rXF>dWv?BX1e2dG6N!XnU;zYlH z|4x!l#)hG{FfcFj+qY{lldu7VI}Z=0eJ>=viM|MWJMk)&j+~sF6AKG3;SI9$^5Q_* z07lMxfM^uf)vH%wK=w2-BPfGLIUc#g)OWL!0~6PqWUpaJeRg4CB3Sjo!NHpt!RyZj z1dwIm_%Jd7qlBx6hl#ALtX5W64>xLV4uXmlh+9xA6c`qjmga)k)ye7U;z%)T{Hvc+ zFq|01X2Vod`i$)gK^nYV7y>27d}E@hbfIjL}7xv|AZT0trcJW7AYwNB`R1< zd=|}X0&ZA!{ry33j97Krh(TGc%H=W!%veUmO3j!1yg{Q8xbNl zlP>=g1`c;b3tWZC_fz7(wHm&E0*xQP#|H0*3XDA6+^)h_P}0$1l97?6$Yi#`c>ilR zZzh62v9`AUc(kLJp;Rga={Bf9A<9`W^4RAF5xc69Q7gdaA#UPdNr;e7Ej`kORa=C&yQc2EMq zZ030+orHP{x`79v1PH*luBYb*xv&p1`7uMW__?(;=Z5)vSw%W}`bIDe6c!ei>z+)8 z;sx~pabOH&<>V%pmOKgzIT9tJ5 zR@PkWX{N{GLrwc2a{4C(H&re-LDICXrUp$$reAP(acb%}>}ZlwDZ4Kz??rW;RTu?~ zfrl4FQ5S>_ewIl~x}9@*&WW{Qp*`YQqW0KheEHfxxtpNiTanPU>-`xbMvmb;UjVmd z>n<@N`8WW4xVSLY?c?3e!X_e|mX?N^7L)`fTGZXUcTJQvK78;=PJZZyMG^xi9wge3 zQ)YCVV9s$zk%>lu;h=xg*-c_j zxH=k0pPicUAUUp4QLDKMRIRgs_AY+e<{z&w6@sNlar0j&HJ#MGwo4P4_mF)lWd*gdwRLd<9Lq?h6B$r)Ihu`IT}Kd{-^L2vsIhiBKji=c zBh9vO0s{ksSAleT)=u{>Sx&VZEEi z+{62DdG`==semX>?%#Hk^9z{{T>9^q#q5t?+-!P+H(h9Sb)&>S;^^@srme8cUJKoR zEbF*7qxVI)_ZJhRa?BUsCWwXnK07_Wk!XWO%7YJY20=m&;x}mEA+yrqd9gtT6l5N* zV_=}EHu_U47Mp(MwNnpzL#=f)j~e7kB;2tn5tn1J)B|YZB6vMSID1sft05M|)*V^ynN5Jf*BZ$gvPBMVeb z^j(pB!$FpNmi&eH1zhndrvL}}WM(qLZD6&SqpkgY4(>0At3$c+PQf~ZLW$$*@o!#q z^vPPeb-bo&+P|$neucvZ5!YoPj~CVU`qlE}MeuHS<`-c>7D%{(bZN^{COMcp{s{$~ z%T={Km!!J$6lkdyg)8h25kV{%YfQ}VNDK>$1Z_ z9S#l-LXHoHx>g4pY9I@VruykapC7KQEQaZl21P*aY7>Gy#6i6ti3uPYWwQ<7vX<|ZTfNl>T;y(>s8iGiS&+k|^IlH_p3SWXCDIas}HF-U&t2sB9$MFubpeLJjQLy3uuh=^Eg!5oA!jMTVt?GpfWI2YbSdOyU?h;QPYj5sM+OsSS3sO#DlS5sy zC4%kybR^#4LaqpILr|FH=@Xm{ns3mve^J#q?6MoN<<6lxRlLU?RjBOrq$~RnVDy`= z{-Nhv9r+@OR??BtFN3n@+R$LpX?j|yCY9Z)-&%A(YGeJ>Ep5Dj|AqQp5nqs&^GHn8 z@z*Y;q^O`!cpG4xJUh2)hZ(^X1tS^aEolCt1%Gs9QS3FKmsg&cx*FN}Zq5GkZ3wQW zt=?0T@1OUrNhDz3yb3Y%7BP0vqHhf^6V5hRJ3E;bEB0<05f+<{%@aP^C%LLRI79;CK9?Rn!dNlN zd7Ee}$G5=ZVs}$r!bK5iy!HMJC{;8(%F53d&%QJ={Cm2+-|6X>zs6cdnn`(m-l5lb z636M6RI@FkconZ?w7CgTBljC`#%mnLoByO8Z3))_40hfga5hi#6=i z(gJ7}z33c_?-l5O#qG-^*)81zGhJQ7w@jaZQr4k!!GZdniSdVEskNo0Xr1hPT+x5J zaAzu)^P_x@(!lPn_(olQI=ZB#*Im^2Xy0bJ%>ik_qJ{oSCVLXn+al7^d6MNJ$=4Au z6imIodd>G+oK&T|kXF0zznR^G2a7VHR7i6zr%fM`v-($JmF8gR!V-Yu4KuLz6iu&! zXj`CX1Ihs+rcVEpNsWzPuH%V-OS`wkgM$8=)V&bM{d0A6|=Cg5Y+a*)Ozy)oNduQF;1!O{!sG2 z8QJYa3A>*mA3NJyALi!f>s>gw@aZYjt&3kS+-0dY=&i)ze^%;2GTrFvb!z{& z;ApY)jTO{~|LqiQa0=4?KX#1<#(I>+Ls9_%E*fO(^hgi}7XCCSOhZ(3|DXWD8ka~$ zgi~Zck|I}mPW+{%jkPrsh`0QcU@9pp;y>2M1q39zapdgmEaV`%PyWssRz=^cFn*bP;s85={k7K+aPKvXK^m*=@FfM27P81ah@oA)&ueP*7k} z07!-yWL?Oan3$?J!FFXU9UaPcANEST0%Q~e_>q{$`a6%!R@{8@D@l; zs3fU?1ULW51{z4CzWls^P&tAWk56SH4FHHfhg=$9rDXW-;%TuEJY6BAlQf4Hqsm03K+?t&L^mWQB>{5uCS^cU z0b(}nl4K_jd)rf?8Q_6vAf5f*piVM(Ti7q)5^x!ndD3e@OBkpp+=Thi9f8EyS0!_h zJOH-B*)=sW5edKtDNZt-LzwRldRw~T7LcEcXGs7wK;)zWjCnT|7>`HB)effaOfN3F z$H!CRF)Gi1)I=<>B`E2nH`Tg>s~~(1ng1pAAVYb1c^1O~CiJ^>4WNCFd3pjl778JZ zK;f$^PfyCw(2z!mmyIp;iOjSn*(Z#Gh zJ2G%_BKzlH`I{$iDh32Qt*=8~2D=Qf`Z*}=0g_1sbup7afTuo&au~OPNUjTP4kRo( zaEu{|3qo{So;-Pid?u)vVfG_95$3Uje)U~=LKW*s>p`m|%DLPBsJ(^M@ntPpo2kY+`9S2RIxT z^3}!w>ReFo6ZEy2X}JA9Ls6vC@pLLJipz|Ogxg#dP%vcwg!yJxR@6*P-$AE|RjUaX zzAa=z7MPRj_I6*R;R0rdBXdM&8Duks!SV-zJNSxzCkArbrz_{GK+JqY_#eP^;2wSh zO1#nh89q`RWYZCp2O3p~NwFCX_2|m&zX&(E7@4yFBs08slIU-z7 zT64q`4q#`gfoejYdhkzoHx7^hm+F%gi&?-INT@`=TAsTfCLWQuL~Sf0#V=bogD+$%E8+nj{tC7orvR zP08r7)tVxbl|Wp&umC(El40Ki5{H=2et=0M9d;Gu0YgEe^*f_V#ib|%6x=2O_VKIQ zZYO*$^1NigAYzz+{#o7dUg>&8tVX?$`O3g;XXKzj3JZzrORy%KQ@%=(A728@oBR4e z3MovGtW8xzBcSOv;ij4uGE zeFel#f+5BAW7ZG?uJSiTuIreX6ciL+AZNpOh94qy+`Irklm+^Ks2Y*n_DI7pPy)In z@yk0iJu#6Q$lU>u!&<8O{X46$(6^BBpQvq9uDqv+GhVq5%OeIUmUo84LNQgv5x8E0 zCKjDGF_2Web?k-2OQ0~FeSL4jkMY>iHSTUZcVNOKVx(OsC-)6*bt;E zqhn#sL4s|vx6A$p@m-LU1B$@uWiPh-4LKXdp|cCM!GsEX0R4TFIwDfiHW14K(#3th z1k817zP;VJ@-%QIdt4fRd2ndxA3MVK+++M1keC_^`L+o)lXw6H=Bq8p<@OO)M!<*zSgRJ4b{=5^LT<33gA z$qGy&6a%V}05G2)!EK=q`ge^UkGUexH`@FuJv&!2e<-f2#J#)?X3GT_XT5A23k3@( zw3|5v0RduvKs(=Y3lk9|4Nb!azgV3o-aLRYp?)vI#~wg9P0Y;fywc!L6?Dgjl2Ir? z1;T`yt5>e58yQ8YYy5?8Qkloa+7O8V_o%9=U5HyT^Mk<$DxK>1Y^TR&@M7-zh{t8)x^DqoIsDh3q?XQ3KY#__AIUK2_as$= z163)a;sdq;%oUq}pmBfP$yj>7kvgi3$&NOEaCkV^c$^OcmH@CdG*SteK+MDeB@L32 zh<-ONQ7Y84deRkwK(vYp;t9yiVjd^NUlJBZ*vDY-1rRqufn0oLAp7%8{*znZPF08j znIKdT^7(L1C7QQ*3zm&|cBse&FYEzD`MR$f zGcyH{3liIC=ezU^U~Eeif7Epxs*XZqm8L-YW>95^N{qzE^}@KEf&y&- z+?d3i-vP4%8WIMoN)Kv)9^QXbJBjkP`A|B!oQ-D2O62FEs3HohkPHjyA}Spa1MDXz z0m~OSg=$(_F8~Apoy)P37};Sa{)!gBGD6LzW>!osXI8RPTpI7YL|nD)X)TWGuFw2$ z+)U;p1`%PT9ILH?2XzJznJh26pWXaCiZ_{sifS%?d7`|mtN}>$oV_o01;((}Q1965 zlC%4_0%5}N!rL<{imdWm1sPeCpizaffk7CRsALq06D*M7K-MQ<%gVlUnwy%c!;xS!=%W)k<>uz@N|Gc8 zv>fa|S&?E>`NeE`~3v6mW?!sgAm48A*s0`6#^L=Ht#k)!{WmW&_=PP3B@FuR8Ibf(NHj!H16Gfj+7*<+YrTk!8iNWXK2*8jgtkz;S6 zg0}*Q=ilrHK2)$H@}vJ6q^=bD?FCRXuW;4Ho|~Mk1~Jo(ogFq>D|jzZ2S)a#dKvBF zMeN5u(6=s^qbaiM_)qpIDARYB;` zgA`cajp84h6p@BX2h@kYuQ;_Mg?{kR+W<37*G9O291Zz>yMhm@cJ@b$i6@)&WJuIA zt~jJh7dVoD9tgw(oeNS=phzJ__UNQA1eZOece~)$KpQO^@>*$py! zyA#1JdPkZlqruXS=H%zkLNUw`%JGt`-THmq0O6*@ssKsdgqQ$C{nqniC|lN+vgHG? z2G{}unRQ@$-b=JH87;u)H^Li=PQOZa9HRnfDHg`=4KX5di4$Nluz2Mr|6B$Ac7g|y zfp@T9xzy4dWY6J&#Upua-ZG`+nQTtISn5mnOieXN@rl(5mo=WL#w<1)$~7FiN6U#f z`+4Zjf!>x5G~NXDsWm!%ha?2z!|R^rx;jd6b>Q6X!)Kx7ISJ{tN#6|;ZnkQ^(UB2+ zHr-ng$=GR!p_t&0t&=&_4m}YK0n|4=@6yLW1!1NoBmkBdh-eMnT(kMtfM?vw%R!mF zXA%tO>B`%w%NTbzz-Ow1j=L;j>HjCk?FfQ;Bp_CVHo>Kn{SHM#D%wDW!VhYCdX13q z0)oSUq|s;F5i)gQ5F&-9i>pYg3Zl1yLP8Zg$`{elAcNP0|3`ivq9#(3hn>^qQrxizH%iM`=ap2%@&hR*W9fb5S~l-I9c2MmM`A&~vUND|32nOtpg+r5>L z%r&?6X{2red`XftEhuQ#?k@M|YeDhM4ZJ$kEFgc)vDwx}0oqyUPP_@RP%v3K2b6tL zV9~D7H~>{nHp7AMz%$J0nL+nRPqLI7BxhS^$Lj_`lC-peV2n9>-Bd_H=WTM&-b2!# z0Rc5oSxT0Sy#h}PoYp)+yi7+q3djg%)hZO&>vQmw1R%;>ZoAtR*{{ncov9oF28>&p zf!Axsh0Q=tjx#J{bTFQX_VfawIMzOy<_`#C#H7k%F3e@u`od1 zwzTvKwM3*~^qY=s4PmHpbAcB4=H}+X;UNV1Iw&upd(T2Ca~@7&+1`)=(0QKl`xeWB zz>GfbF1-VKq8{o%i{OucK9ZRO%)+pvObU4I7DRT0ra>7F7kEbtxLw=;CEUrC6|sE% z-dEB=f2YnosC0=;mk8&qh9mS5f@jCCXZAat!uUi)W)oExW%K+-gtd=gxu0Ekt> zZ~-V>L5f0LakTUZ%)K7y2)CdhJdC?^6Hxx#S?>1*k9M1s6t3G}0%Sza%zRr)N-9I8 z(g!RB(jkzH4jy+r_Wp!+Ro%eAGdGtNAknnb`7s&LYtis#Vo`h~R#y8wrwuOZT<{i% zf^}1q2XHu$^aQT+0nU(xP8K4L54BLqzD+JPF+VRXEiE0r-}UPm+C7eH0&MK(5COPA z;1w+60WU8J9DTs`wV>DyMa4&!N{lHiqQ4!u^PZ%5+!?Ui!R;(PCu!AC=ygrFvFslZ zARt>SA)Tfw)bG=lr?*K}|2ks2>nD-coty(-$<*F5sJ7V#$s|id15EnBYFu30M<`#a zs{nf?EGFjFW(L_15N@D@Ff*~Tl9nq5xr?8GheDq2GfPW$$ld5H?Ilu41q1|utbp4J ziGb?pWV4*117{jKU4X=a-LI~%zv>LmJ6pe(79m~1>X=zres^?y2d)5hi;xgnBnsJ+ z*){%P`ambw^XC^qV_Q>8>o)ui1lAjbY)FR&*ovq^MV2gSff~@p&}?Nf23eMlZhr;| zVC+~(7LWwT%WH)37J6wA;F=4!aB<^K_jk6o)B%>lt3h(}%-oy}+&yK=zmsF46`r;C z0Wyk%AVGtR4sHWLAZqCRF)M2aUnLZosN^73>#5x6d1JR=|_Ip~3y)>S_wcTfTOABG#8L1}dQ_z#eE| z1&(KjI%7`f4l%K@Hqe3xtFHqKQJ1p(Vpl9NwxrPblhHe(mgcanie&{(j$~m4>Z_E| zo&}byt`hX)M=eC*?K0qewn;=^zNE1nr4*kbAS6`(@FC;09D004O08}-h*M<9=c7Y6 z6?|WILBSjxtjj*iVlQ7J4G%-(chE17JDu}Fq^4$I@PYNyKTo=Vg#NfV3M2nK*x*7) z1%YJA&rFrcWce_{2@OQGPu9z7Apc5IC}ePjAUr!eHg-H- zS18JsEuWOdgPv6ELZwfF-JiJQv{H z_t4NLH!{bh{c@fmM#Q*BN0mw$?7-T9(4a)Nq($iWjUC6Jv&i+2{PYp296dwR;$vww zQ;XzDD)oWKdW&D|OFzF0v+OSQe6*gg=aHgrgLwn<6*0yeZIJoD&1XQ{DK@#z*lyYB^#l znKA+b0^okW0&RRTvs;%95K%U?BEbYHw!`CN){hfaJoV^97e}BP{`GnEb~v0nAt4+7 zt(@Fk2pXL}?;rUTj@dqHw>5+24+KE68x6s*idG;l>Y-^=w%j&VhO6`Qi4oZ`#{Nm*S-^vGwr2}pMdNvuEPZ#V{(||Q zSyy-WuE(qitaFNV@^j#Yp@)$F0D$Wu1X#WC3SKBYXaV}ItH5iB*o0?)3Ng3_sx2Y_ zSMugP6#6|ELMSKGq>GKiq4=0@_{hMQh!FoxyrTo)CFDcj(*u*CHrpBOhL#9%CY^v7IO2oj4sA1J0!DwB`luHBZ1fBW-@fk~nX ziMAG#=;~@}(Pq4yK(-@|I?xXW>~g=25!7}>%lJmR-)AcGPEAiID->qz4FI^xC#&^6 zXU-`soQKTG#z#Du=@a;^PH^>LQH?DvwXpookZY@APs>K z2x5Vgg%(B}Y-|@dH{t00w;ddk%F4<}lgf`DxT_q3FUlFeI;2wmJpc`c555$&fVC1+Fu0WIB*CMS#i6MOGMN(#ay&n zk7p*QaQSX*^^tm)FYs<%v*TEKkWiv!t9AMN{6t4at@Nau7osb{(i2`sr1Xo9-!_vN z20CY(BvrYb8`_KGpf-^AVN^cTfYj97TobBmm}GoB<6KbwfOxxwX~7^0P+S`*JOuUw z_yNBCE_mwvCtoVInjY2G)ol(NSNes7xI>2!_;VdN{|MCsjJFGztRzTp1CVro9<2%( zIGoQRG%1M&Nl~CDCGu4o)VfzjiUS}8GlOPIbqx(J`-3dY(dwAB7kH4Gq`XgWf_}U_ zDM?ZJ|AH+sk?HAaX#=HJj1Vp*;>*D()PN*}W+1TWDWqHabZ>ZQR35&m$YS|!snz-% zAgGMLlu7z5q9Fo@q zWZ?up5q>@nygLo9$Ak43c;w{dP)Go_z%25{`m49dIr91v#!_-~FF!T<4UP5p$i^aq zM@2vV!$`&sorIa$-Y~6^GZOZtHvVRWX5De-GPm}7|EziPo z!f^<#V4bTer6H>0Bp|%!PV=ap9>l(S5dO3;JZAb}6t-DcX3RxwmoRXS^?)&7K3%C+ znG66lUFRQ6iKdzw^7b+tXXt63oSRF?Edw|U?VfabZNNlNudip0W3lc5v_1zpK>`46V$5>b4RFm(YC1{VPJGb%Q=AJDD`J;u)f zOAcmhxb1}{16d7H;<{sHTnL>6nKvA6{(NiL2m+{;x3#q)wLBm)f$;Pw3;JC_zrD3J zRZr#=2W@1w<%}%Yum6s~JH698k5tzk9UYOLA7CtbP3!=p-{a;E1yh`!nfU^x9>}SG z!ONkFii(gL4G`);x+Map5Pb218LECjGDEv1IR%B_lUM_&bS3rbgRS_;rzZdoJOMWh zMcm2cof{Cfg|xM)AhsdC0dhZserm=gW%Mp+@dBS0p%d`czi&6j#{T6`myu4BD^Gie zmwxa(LUSZMavF+~AQ{fIBDdpc={XDEn5VqrRKnDLn8F@tc%WUjw;wD(9n8t0xPC;o zzxgXeI$g7FWL80zcV1(TZnUK>czi4UdVhW_D=)up&CbM#;NZdq(vi1`*tlhpuQHPc zvNmvB?F+u=Hp(J0tacv?Tzq&ilF=3ZB8a1djC z53>W8-5Gkf3kRyW@g=Jij!VCwhMIDu`x&oXz8=T0Be%3FoeG1jr&)k)%L(XrSdwWs z-@JOTyhPtc`oqw1e_Pke`b|jw>5xI@og&oSG%+!8UTMSAwGyKj-mkoTed~vYN(2pl z^U4>>r)xt_VuNi`g7l_C^Iv(QjB<&&JLD_ss;X64YBe5rV*j0>d2RE7h^Q!9L!p=a=a{?li}pLUM>q+UrXMr7 z{wUplS#0N9w`|Emz9Dc{sEPBQ)@&%xI^ct2cTsW$#?x9Km4%KJW@H&((iL}K%+1LS zDK*3xBy5$kF&50ItrdiJ4G%iNoUh85Yr22EO@DU|7#-Bm}f zBey;4%ekh~`PtBYx8}9o9Pudq>8I#V7k;MEy=-r2k&+lCd?zB>-a$2S&&sHD$BRz? zeWut5e`Bt2gm{HZbo7Ov%GtjXjP8J}y#bzAcO(ZJ(}d+KeZOp!E*qD>^CQak<3E_b zTX5w9TD1{J6x-I>nJq|!!9#JK^FQwvv%{M^Dmm_$`pMFE^a(wQiQXC2L#uT)BRNTh zgg~V`hAR2@$;kued@{R#Wzf3{xdzjCGt*5z--P|UlsVW&ajvX*bgW&m4OTyIxb>5# z9>lz>V_f7SH9|rLbPJR-e%py5rJb8}mts;;hcvb+Bu+#WzjnP^GM+35Q8~wduwZz=jIyL3VGKt)~ z%L7~PQFzBb;Zs|^3PapicUNB04>z&pWj1zbsjHdtGlZB(nM4zZBSlJdV z!$dyWE-H4c&5H_=8%*;);y<#f_-tb%^}K&=CiVNvi}s@-946NW32&V5FJHf#(NwB1 z+xTT$j9}C)yKleR#$6mrVSLOHptd)Kct@D-1NU3 z)Lpm|+mD;So$?@7SW_QPV_nH0Dz}Z`jlyGu1yNxrS=h&@iBTcUS3?=u_H{ zWG~UWK8fAK=s4N#Qa)7N+gk3kz9S%j_P}aw-mSczMn_$YelYwgj}9*S3qMAO<~!!; z|Mfa&L5X)P@_pB0jG`xloZ-!ACR6C}dXgHC+J@;IWN`^7?jHzfGLHX zP_6dcZCjPULYDB1e}A_=u$#cNEW9fK0tWK+gdgNxMo`0|Q!L7AFa>TM1(e4E&-%(r z3skBHp=EB|VLzgc1(+mFsDjwmTSCbKo}dZn)P}Y;1m%i_vWa9Gz@04{XeA$nMxo4# zBYnSFRu&d~xax-VKLIHQ6eryAOR!3#)Y8xp(AA{@Xc8A6kK`bbs0!-q(?W>V1{w(R z(Lh_`znV7JB(WKvk3V8(4}^y`Io#4pOHV%!aLAlDwUWLcc^Q1N)kUlcpd{n*#j9bc zi#gTA^XJdask-35^BOso;0g-#vDdV=(vKGdM{$dQAbHqG0Nq9foHzf;J*)QSOVDK=)bAI;vg2PDv^Hm*O^w?>eD=jSzG8HTlkKlec zzgbko$)Hk^wymhDsv5mqW3kY20XUH9x@pUY$HmeVi zBxq`CW~tYqV`8GW?S_SgvFi8Gln0^sqXAld|{0;SuVaz{-~4QOqG__x6K@*t&K=p91=ur|$aFIjkK&5}TMK~G0?j3OM&rqB$I4Jus%~w)@$=OSXupD2Eoj?6 zs2tk&_xm^%9~d6q@)ZMbhjw{l;?0EX)vu7AJ)oygALxfZBWxU;*lk6yF6afpfD_O8 z0z9k>bFZZ--YMGsn5p>CK6S&02^uMCj77;qdc*T-7n9tqOTi=0y+ zcL5)p!JR2OI=Y4aOtK&bC3R@T)ny|@?tVZ%4DC|yBH5v;0k>k>%; zO1T19PNY5X*wS%S9%p$9G()IFvQea;Y#{2Wtn_ZbI{J@$B0}TYVFE1hv z9{{(&;p~?90$Bl9-9AGi1-;~#u3W*sd-uJ*1LN1{&!9?b0^M*`pU~i5?)3b;+s~hO zAWduN{^OLtPAS5<+4c5+q3H!zaUau)2LY3F$9fI;nlyz%A82s6o7x5pDpJFp4~A3^ zt{k?RwNzE1?Cg#&E+>OGsn9^ms$dhe?|Djgpbr$1TC|PbeiaP^15vnm2E7M04GrJY z(&%WVlfJKWgI|Fw&d?&J2|b-iHwo}3D98{u_xAc6v)Z9K4_N*H;7wn}KY%O~D3z&+ z2~-u>$45&`ZD=(Bo;tQl*6DB-?=GWqONGO6e;LGobNaJeBSTZcs?KNS$*)( zp}`6Yhv0l!WNYzq3zY@>*cuP3W3^$GG2$XMl=qfy+qP}Y#5H^tyR%!>&t7of;PQC9 zf#4S5YWF%}s4_3NqM(iW|N zn?gP`SV_qPd=s?A`AzY4R@L+4I>WmP8S-nPlI%Ks zS~nh@mv8&KckmD0Z(5+D89(Do@@;^-W|2Xuz!03Hp;dKYb&-fxF-yh2eCdl!>s?;n z4B#+vo5jbgM)gS#x*o<=5s`#2PEAwu(e>_z+qX~A*Vmu&e%!=~FGPY^;`*={{f~~5 zCrxtm_I|)+erQBn*^(VD`}aRVyS*`?lXY+`Y>q$gOeXueQ^>Eitj#(bGGT&#*frVu zV{em_=a=QhcPuO@SnIUa%4)ck@$KClDj!cxS&yF+gcNXM4Xa>ESn1oSiJTfQqC!uc z=z$1oCRmpgU)dZWrDopK9 z<~$(bxaVc={E^ox=G7*&H;5+FZ9YFXdmYrzcz-CkBRJue%sUh(QtB~f=4M_K+k2lr zyR*Dn6FR+ynjJl(vf=4ZJm}QNRddYG} zuFK)x>esGat0>*@iD-hdSuvyeFoTeBiV%g#Rlwobp_$?2DzB6bJTf<^z6RCDhp@PY zvye;MjeApEz-BAkJfzgum?pF&h|6lnLR+}H)y)=GH9n_CB~Ln4M9Mj9!|(*D2vsyALx z_=xisL*!iuT?BCt9zJxGSIR8&iF^)cMAVFcvE zlS`MQqIUSUbNo(s{r2rNty5ee32A8y*4SgmMC!J5?P;D%Qf{tkRP92DOmNec$ojS? z-PrtoE~*!|VNI$td5prl4GER_{JDPFlqM{^-JYIZ0P6CeXsHM`db_N8m{DW`%svIw zdCngp-r{~$0!tII1DS!%gfbkWMM#vvj>kZtBUt?SJhV4;i5a3FnAOo+J}v@w-7>Th zTrH7v@&_+A(zfJy)oq&ewlS&~ey`87Yx&T@91cP^2PWbP>4YZfG;V{VeJ0OjJzXn6Q$|B%oY#r!eI%zGpZunw(}xuDp7 z1k-@V32WFvBq8BDsyAW#G*(5_uG++R3Semo5`?QdymNvS5jB0&p^ii$WXkp0T?C*awI&z!XxSbr}9bNbw4 z{T6T$L)@L^Yq!|s-M3GlM^trdF`D?l=MYYxcx}<|Cj4veb?Rf*5M@ML%9x+Df9r^8n5r*>B8U84Q=Y_x8^`@`R_nHrdi{<3x=HyH*=-@hP z?UAO&FxO&*b2uyLEC1;S23E3M4^rIx2`8arAM1VmcuP0SlnuY}%@5&)75{S&E;l&u zzQ#z{O*r;JsUf--i&n}ADLs!|&@;jYN1%9qEL;Y0^qrgIO8)h?+`m3>)`~x$ zMf}af&AB!H{SnT3J=~%@aPLB56p$=XA!Gg;QDXJ?4;+v=IfTbmw&GgIa9X2`0Vl6@ z>(b>OFVFSJku;k(5Z1JdS&-~A!{QKnnUwNdpxZTK`u%+_`St@TJhiWfhYysMofCGA zV; zh)J-+5@ziF5`cWz73;$1Q7>8hRIa1=0^U&xtZSzArai(VmXelMSZJ%S*E`Pk*=H zv165mg&KFuR8o>`u5g7?zM;A|HZ#%+@`o}h8UO5uMK)m`oX$v1WHY|>kpsc6c2Xm^ZrwVwB&OT%2U&Nk>(l=B7jDV@VGlbo()*caI)RmjBb? z40p?K)5u&ivvXBTsIqWRY)`5>_nk6(m8E6awjGi{?!D-*iM^#rsE$*P@5PGb5wWq*OA z6}ZbaytVYz=1))MN+Wms-}`RAPX*3))22pGKPe(K`%fgGbX+EX zS7*v}eq^z{H@#(1@s2+bNa-|s5I=5;wPC0UVygO)z#{@iZfvHtZ3)?^E8mR;w~~%^ zO78o=*vFpP|H3{V{CKfF){A`sC_3e)#oVY{e#=c?ch~Tq98#TidrM)j9UUKheS2lk zn}w0fx(B-Y954+1K%e;{Dq3BV&m}MEvH0PCO3e)3jm|-lAZU1NYiqj4=Szoz%F(}d zeKnU}oM&>L;_1QBuyLQ7ocN!bapyO-Z|GX%fmtRYv!k%qL zTz9CkCfH=MeZ>%Im)(e2^FMt`K?raFjxr;oBaZ`zmRqohxd7Yz)~7AxFif&8{p#LE zYx6SSVRY#YnnUr#mB789KgEPGy8}5C2OI$!xq%yv^lG05?=}_$Ee3{Uug1a z+Qp5)cE+Z_*YPZ?->EyJdOPTHyLRnF_!e?YbYYxnT84&Pn7`lT@YzO2eFVxdaNsWC zJRFV8kH5A>{QoRu#KF8PBQG&AQT1*{IUrdA@ld!ar9_D*U}w%xoXMlEshmy4;Y@PX z-NeLwpuvK7Z`0=P)2CfIPU!EpJcs=}0gwv(ixuIR=*UY-+Ny$MBUXHM?iC?#kQI~o zLx@w{y}jq~Z_t?l$~dzm$KoY$P`jN}Uy-UP6sf$jVn?TppfxA=+LUE_Xw~mnwbpHF z+X=&l?Qb?u%l*WbHYEnS5$j*}fa`vwxuA8Acdm{jmkrG@4tcA#=s+-q)|iaSxCG^} z^+`*YEa|#qOvC=h1>MGbgpR(GbL{Zpc6fqka-r;cVKJ^3*+bcAe_dbi{72qfz4khp zFkJpEj@w#UEytOu^)v_N-kzC(szHy>JYM@TCnl<@$ zwx~2*(!bmxg@N{2ICL^L#u=GrjA-*BBCo_@N`7whH+w4EB|1bN2-@7{l~UlPpdYIZ zrN&<}X!0)RW?G~}>CnLSm9Jy859Cu-Xn7s@sc7|Y^rN8WeYqQoez3J+z?z5?OQLUr zU;ol=hfiORj!&yjR+UdH>(=TZ{#q8}W$FL4Q@Ub&Bx z6hGsP+V-b@7pa3(csLsqLI#K+w?30bXM}@Wbo<%o$}y_7Yh(c^C-qx!bK0lJw%O?K z5-9-FVsBXdTM`eu&K@G`#np)_Ijq!rSs1gZ|h^<)k!XC6<@jUG~-vJU+hz0yKS3O z-t{kcG*3-hTpOA;iyA5z6k5axaNrg7u9&(x|9;aFn=M<=@O!Xxc+~zjMBdaitX0igbF@ukZNkAN^f-H)Nub71BDk&*U+8F_QQk1u(4DG7`gtIf%+X}18jO1C^tsvUgnrm5S0 zzswn%a+8n?0!PKE3D{f%l$4aT0zUjV z_(bG4P$e&oSnF=Gd0Lsj8eD1WvTVIer;4(VjhVOQ__S>eO0Ex`zHSfwq`IkT*{rha zA1lA4WOdMqHsfxBxO);+hZ{8@^+->DFTA6~TH1TK|L>qnl-9pN7p?JC!6N}og=UR7 z2zvVj7V!;Na^vPvBi=({IuGH8@6>IZ{MY|m04MVF9&CD@oqd8&KN=K>n})}@2Du?u zVJ9gvLZ;UgbU|%(mrw_qbpfn)oc`lX_C`r?aF;%7-)|$NbhK0cA16l(2-a^xd)5K2 zyJYV59@sg^e@J-pWUQ&vxic0QkDXMuS0avc{JI+_GgKP;;AxI|ejwJmP?~E(R0*7W z*NH(DDFF!1Y2pRiBec=t^2W^022JE9`S|ksFcKxqksoq1>_aa;+UA2M{;xCFPoq-~ zM?WpX23S#&X`5EBu1eUHUd}Gun46wEFvjns{_>ir5c{I0Q4v=0nVHU?H!Nsk;MLw` z=D?C?G4a%X#4lv}ZhSE(*Rr|EY>=5%R1kBHN^imT257VW86fgT&@F;99>m8xW8j>2 zWRZq9m^x&81PLG%9ZEo2r4!yjpj4LS1_*n^rcLQ!RTa^u^rR6RUw7yIU>UG43B7gj z?M_-K8Zx0u13Si>ezxxfirjSWZeeESSmsY0hvD&AdvG1RS|mqrfMZop^w+{4AmM3pp^LVVH=7Q${|%&v2$I$JFiB@zCVIII0-kD@IsIds8@NX5%>HFp${xA zJ%S_@0FE;IePN*s*I8g-Al>p9Oy0m~k0`hz)b9RIiocQ#!+86+Kni*njK(SNaQ%u& z*JBw0+EOhWqkqXF9xjZ2UF-SJ_zL6fE%L9Ie3(4p-TS4dH0P%nJm(dby?B&xc4f{; ztC;%O5!UJ#W1lQG4bwXvA2=;MY*p%aKe@ddv(+lU?0HoYqns1C?N${sp~*j9%dOtO z>D|Ilj)vpc&(FNQYeRjW%$unZ1>byAC)s`OSoibJ`lpCoW@p;;NZ* z)cJ|5oLsR>j}6F^NY@2u6hGw)03fVI);MnJT z0Wx9bNxo*$Q*H$A-?40HgJlc3ZQ5=6yz<<9Z~K@P`d?;NtUf>Vg!kCHmUTv>>K*$Y z+m@Rc^#1i>zndp^RA>D#yWNp7=H`_?imUbcuWOc%%7_0OsWM(=D?8xO`#JODV_IYM z+yk1-nhfH5h?GpH#+?n-agE-#YyYApm15gkSQHOG(zx-H&){LV1CFQHDb}|!x#4~P zoCeayk9j%AZ}s`?`ljE#R(%auo~_&F!{oq@{^}#RL@$_y=D)KHzU}aRsL!^(1I8*G zYE>NB_Dps0^Ih-smetgo4U%em+;ZiEH(Do@hqZIQe0js_QHJxXRND4&k2$0{o|J2Y%PIN8(sg5M7eQv52`6&jrAnt80v;99B3Cr#S7 zZ+BtC>8YpnJw1aK#5dVc-yrkq)~1xi%!l{;95%0RSmki5Bwoi=ul3i@TRuH4j`Tk$ zO@gS4kB`C9{eO@yyIp!07VSEG`0%w3?)K)CUul*4uFw#%G; zwD9TP!R}7v=*t1E_9Ui#NLSgYd9usgm01#HTceoGey_IH$c&7$s_FH%rB*_uS~J7g z??VH}CUy$1Z)|N6c_Z2GFHi`cm>T%w^(XK6o5rn>9Tu3){AXLg*EJENTOB>se1LV5 zNleNbbMtR6awlFem{>OI`1eoG-_6+G(#bS#PTD8E@{*EtiNcGeQMMCfSFN@#`Z6tN z{gcB_cUZ8M_Zuk0CGanAgf06twZ)f5pXzrh9Q|H$wXD32SO%GOCD-@TgefkfS@|)(|1mmd9ewMfD_RdSXWq+eW!RYy_bs^#IozoZOzB@Mdp+lq7 z{_mUCmp%{Z@pXm4Q@M~+Q#>^{MqO-Img~Zwn!Rvghw7|;nNjO^SdW|RQ2nIIMS~lG z9yer*8t+KQpIo4#birWQmAAS!@&jFuZan$qu0(G7;N4qpuBlxo8?CZ7)ho=v=G#{3 zk$y1`T~c3E9yRz4(TkT`S3S*hNS}BQ%eeQv&x!?$q~5O?QTQl8rtOIJ5~ZR;WBO~~ zyQx$^&r$F4;;DXHKhFtz80a%^>V`{t`DN>GExlzs@zTWl*74u{)+K5#y+1#9Q|0&V zKCeGTiN(o^Y_{C^X$DZj=+D`DQbf z0vvDXmf1Zxq!G9XNteH2{(XTP~h52 zr&sSWE6hyAiauUe{q?O@E44}67Wdu84)o~it6x6^>~4rsea4; zG5UWI7hiX`l0rnx0!}#l8`L&%WqI?NX*l4NN&`82Wr_ zlU7z#mfDBUZ$OWABfj~YAXH;igjY>${qd6Et`$rXVuVN7rz(%Gp%kUiQ!lH?h$<*B zL*|1}q(wY&`#{d#>dR>MXkgZvV)Pc-1Lw}4ZyMP~51{i%Z>`wk1>C(LcKH-LT1J0d zC1)$UR==D!cyKdRIC$O<1IfI78{;+jQLX{Ha)R>QK;m==c?XT4pjsJ{wD_cuYgvTo z%KswRlnVa;aPDJGOX@&Rm)zMRhdk!hDuPsuP_qL`ckQWz6ZX)J9qaGyYu|Iqmf`%@ zliHKl3WSMbMeuMzM+1pnHjOhW`$-tGD^?dNU?GQ!hr^6w9em;5jt|e-O<>g#k^)zj zr7Qe?$aZ&x01l}brQc)w*xMOjFxrYBV3dlBBCQLRYVxP?%_zRFSr@9)5(p#@BL;#> za{gmEa6eRtn!5V-i>1)5NarpD z8wUT878EOdxn2vhNb;2gic!)-?=HBnUc0(z32;=5NZ=$1 z6oK5!sBK{;I8}_F=N&(YYUXs(teG>VH8W+04J&a_0TvO?FdnwT)fl*o{DK1AwVD{1 zGmm!FSg>FY#&zgQ{N=mVC1>dwjN*10Pc@nhzD3bd7_tp{19xSqcFHCj_p&HK(Q1aZ(H>lWNl2xKE(Vi;V z^8ZoLNjs|ejk7p=q-L{a%y)hNkYqZIx$Fw3IMgg8mc@g*(ldy_xeXgP?y9@@0EyrU zdM^4=ge8LWJ=$;D#ZV-l-3<&3Xmx0bm(yIjB#!*GzV3hf$e*XeC+>a$=b{J}dinC@ zt8XsT!sZe648+eLg3=eBEY-Yv|NYXR_6WEGie*zyw5xWA8JoUl<<82N^(&UqV-%%L z%sq!47(?BhTBF>HdJ5p85%q46t0Ei-pWrU1HC4*dMbP;= z;V8Ww^Dg%B^1wZLV#|tlobvU3$aDI(!ENp8)%#`!(!*Wt(P)?<12Ji0NNWk1Xhm!r-w%ZlAlA4r%#_Y-gVCo28}SEWgs7SU%p(r#usrKU5jVY2}D##C+FNW z_UM>~MZHs>K6QvdZC-8pSH(UjovoTL*1fuWz`+aIJ62BYd{yDRa<QB6PhKQrY zk4_J@(|btx1ZEJh&_!!aBcIJl&o)|3buMe-gUg?Tz>I|`g4#J7+GC7IGkx2saXLXJ z1IYtGP*VB*dmCx#m4x?+PE@q&^zdB5MBnL4`*-W!rAsqsU^DF^)out)20>8K{31k3 zHCnz3eE=CIomq{L>S+Kq<=?(FTaINBzj)r4FG6Pl5*W;8<#xDewDF(jGdl6Vd#f$V z-`!0%Qxe8Mgg7+S(3!p<+CHyL!DtI`ZYHLs9RYQkqJ4aILxDp?jNo8GNI!sYG!!9Q zI&9pyQHX3KHX^SQG)l8(dkpH*Vw?uG9;Um*IlV)MMp10DdcPD zUwO~lH#K{Wpd=@GP+Q*9Io7*WyS`JrknEhja^+}j?DTc()~)4SHl4t3nhI3zlXDV; ze93mdW;J&c;3CfiesyYWj_7=8uc4nHL+Im)Gu)?}BxCAuSICJc5nv&ldBn0wafINL zZXzBWB!v*ksxs>agW@Ybf0k|pcct{vd{F!RNWRuyCG zP@v!gY`Gk^T%?i;Q3xQ_x%u@>W>|?9F*`e(gU5LFbE6d^Dl;i*Ki@<|p-MsLJfMm( z${!=V^W2_3S43hC%suM}Rx6M5Is)M^Tw|>M4MR8M{Jz(MBGhh^m9WV)to{=B9wFY_g}bS!)5KQ26tuF zZ5FAIQ0joTGW;3s^M)|v;e|+1BOPlepvv>O35@aW-Q8xzML0m!X1T(aiU}Y5D|zcQ zbCjp58X9d0mbF;6)V6B}{gUEhca(u}&Od+tM7rq>+?dHVf~4~v6=&)*HL=fsZS|2O zMrig@U%H$fkGHeO@R+#iz-v@*`>9?L2|92Tialj(Yg=4%{#=oNmj8@{I^~+p-f@6P zB<3M6p0S2_ONc2(T_52LFvW!^roG^KuvihpTaiq@`t0dbK~1^^JX~#Qso0|3K&Ou- zR3#dH-*&_2&wU3gSHC8&xeZ)3>06e-;juq zKkEJh5e-GK4VRb|EcVK=!(04%md*2KoeK$By1Mc9xrRGOk9J@i0M-eixd=)_vh}sH zQn&bx?6f^ygUgjSAO(Jq-qCmoFR9$AO>gtX!@E*=pItQkoLP(E^$jdw8T*g`KR*o< z6aOs@J}iK-5R~k}2N3zX>t65I{I!HBNP!eD>JrhD7j*27Oc6ti+;d)aWmaeqpfPP^ z7QFQ!xj6LM8X>mZ?d`)iy`8e~)TF?OP-@pcldPm*Feh$na;EZFw9%*}SVqJr5^o28 z6(^H*a}DjqWd}{nAuQW|*MbELyszCsy(^sJ_-dM~Hx8N#?MirnXZN$i>snM*+~{_S zGUatvxn6SI%>>g}%)Jj@y)u-n4>5|ormepsPf-P3Gvh^OSXo^icWT1asmmnWO}qE% zl|t2b0#zGu^=kBz0q-Qe#jjIAhR+I?gsQ5lZ^lXUX?vpU-Yoi2C(Cor0>RkXm+u1J8=B<^(%p=h;}ztr zIFNOM*zHVU;4ai;2m^KH`Fb0KPnqoi;*3c_BV)B7AKtv_6KS-NI34$IWVrSsZS8rO zX_$7@^eroGbpsRB)z#1P)e)#%tSo*UlvKN^Vp-nDj|cYb*^_k>8OYD7QbEofZ2k^` z(TPc$SGs;jZgPy?M83s4X%@~{qRsKx=W4!hRN+EPXKWBZu&XYzy+H60aw1qYBZ8Y|tbB@VE7w?y%&_gT=p(p5}Ru>zTfRnqoP* znjqPmi?d_}WrcuBHKhJKG}zDuC-*}5;Oyc&IYX5*F5<=z-lRA`Pn@o zgyIMtkl8zY$sB^bdeUTyev5^3_4;)&mhQ6Qjf3bAVzO=sMJ)v7 z{NlHYjeUi=3C#{^bZN}@OMu(hcV~M|+!PLg2P_036%g^3h*w4A3!f-PJL>NN=qRuZ z%uj*nTSQU-dEfJcrmB~ORYTOkHX|k&A?Dmr4`(wM~qU_vuLVru-735Z=vQb|yGDiDYj2U0KW_e64V#)%ZXTqrpPdaB9-# zrfeA@SEbAn^|UblU>f-&9qzirAJz2NA758-2?#N*B!hU;bJ|l?W-F?=Uv%$(LZ{U_ zWes)xlop>S=O=A@HY%`bq}|%@JEp}QJErApUSMtSUil6om(rdoG}Y&MG-1(J39m25 z-M(`SiV^AA!E;Ss5Zs1N+3RGJR&J+GUDiHB%UtSRB-bS;l(j9XDJA-eE1>{xvn*V1 z_kh;F{x|v}?FXPS4Y7phToyICOm{|Ne(J2%8aktG-SQ>7^z;h$)$i&tpxgXbO3s=C zdM7vO+SoX_uiOU~V)Vh-(X&=?Z4)!+;pH_XwAV5tscS=A3=+FGOhi+cNs_DJo#4di z1&a_{@61j6Q}#EX@#Eux0jCDEo^wENl}l6Vrb4Rw0yabt%S4kn8B&j{94Bi0Ig6X; z1r6S9#fP5hico{={b}u{eSf}1Ys&)^$YjHmMfL3FvE;<>3-a%O<|w(h8P+=N!t$?- zD-JQd8EqT4u-Z)BGllm7D`%&<$H z-DzQ`z1z~Mj49^h%2xk=A>uz1rVbWQR~b&#`-5`Ho5*id*QPa&;{O$470Z{O$=V8X zA(YF^D~~LR#=XUv=%lltYmNvwr%Gt%yk}1{xTdnmISEN0DR?;8R*}kZd-MC8Z8m>T zL~p)E;LNd%z(Alx!xHmIi%K|mn~jP(_|+d~xNDpECb+zmnCU2D(6zNaQohffH%}BA z$kdm8nZQIyQ!F3hZ;~7@AVZ%a>hjwZl3)>oCrqe1eX5p|91on&ZPUO-Zl_PDQSnHe zLuLkwBs9@wBK5isi-r!Pdf}_u^LF{&bjp zG^9Wx>0X@mbkU(k8`n`9Qy&_He5N$Y%*w*la@(lL&Qu&>6i*inZ(LL_q&Hj&auk{2 zNhwa=h>~wRU(J@PEFsrIMvLw~e}1Tx7;OglSo!&-C&u7|B6)FJnF;cwl($E>ZG>Gz zo1ypfB~8ADM(VblqbMbIVy1c_FTfb)ADVm!=hmY4aU;0Ut2Vnr3^+r}wGz`Cac0Nf zyfLx}V54l`zTL9Y;r9{Hs6q8K4}3`djcHENUh%*&bmAL{$5>N?3M*GvM{fd8jZ5NX ztm9P5Oh%9FB|j+t^sV;`{<*iG+=zW7ad-0u3l zMaz~Va#JE@w2PYRTR>x7E0>vzS4Rna0V#xYUEW^qru$$V)Y}B^j29KWiAg^?=JVV( zsyj3DI2xN*T#t{f`OurbRhanbi?yGpL)a$=2kbn^cE@KDZTEFIwWt!W3!V8~`VkCy z?*Rf3`t+iS6EiZ=paehNiid;=XS>|pJ2Rj(M0=)6`ve)X9&B*uN_OZ@a+xYC z>q5M4OOhh#SQ0@JW^e%Lj$#r769L4q1MhU>Gc<|9GDQdO;o*TaFptRr3N||*AXeqW zp5tr7cQ2=wsdr%1E;ULD;}f#M9MFP!S0OJKk(P)j(@;7up=bho&uX9t&ZFWJ@^3JC z;f)_PYT>H@&JUnx5i|)rAx4VQL0dSn0K_^6#}J|EoMz&-6*wH?H!$+9#{7SCBDth^Nai+gGJBypc_cbgfu{DT!dHT9&}&n$oOyU^;2+rGFLGi4ciG8)aA z*kF9MV*kj<$Z&81fT{buSB;TzfPa`uch%`OA^^a_E6p1|Lfwc$)!A7}&eIkJ3fPj& z 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 #>O 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%0D?nk+pX+q)7;|N`&1skqfRgr- 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 diff --git a/docs/screenshots/devices.png b/docs/screenshots/devices.png deleted file mode 100644 index f5858a860bec2939e8b7053078cc043814016acb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84321 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%0AK#mAtwn%lqT&)14(o3iLs{Z7Yfm`5N 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 S;1fyS(APe&FZFW^zrO>5iUyVd diff --git a/docs/screenshots/yang.png b/docs/screenshots/yang.png deleted file mode 100644 index aab6ee70ffe69779a9322a7b1d60a89c3e43c48b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98414 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 LUdoZb{_Fn((*;^U diff --git a/frontend-assets/icons/add.svg b/frontend-assets/icons/add.svg deleted file mode 100644 index 1675388..0000000 --- a/frontend-assets/icons/add.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/add_active.svg b/frontend-assets/icons/add_active.svg deleted file mode 100644 index a2f485f..0000000 --- a/frontend-assets/icons/add_active.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/back.svg b/frontend-assets/icons/back.svg deleted file mode 100644 index 6e06a85..0000000 --- a/frontend-assets/icons/back.svg +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/close.svg b/frontend-assets/icons/close.svg deleted file mode 100644 index 74514c3..0000000 --- a/frontend-assets/icons/close.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/close_active.svg b/frontend-assets/icons/close_active.svg deleted file mode 100644 index ffe8618..0000000 --- a/frontend-assets/icons/close_active.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/collapse.svg b/frontend-assets/icons/collapse.svg deleted file mode 100644 index 06323e1..0000000 --- a/frontend-assets/icons/collapse.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/collapse_active.svg b/frontend-assets/icons/collapse_active.svg deleted file mode 100644 index b1840e6..0000000 --- a/frontend-assets/icons/collapse_active.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/confirm.svg b/frontend-assets/icons/confirm.svg deleted file mode 100644 index 685c053..0000000 --- a/frontend-assets/icons/confirm.svg +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/confirm_active.svg b/frontend-assets/icons/confirm_active.svg deleted file mode 100644 index 58a6a1e..0000000 --- a/frontend-assets/icons/confirm_active.svg +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/container.svg b/frontend-assets/icons/container.svg deleted file mode 100644 index 07d678c..0000000 --- a/frontend-assets/icons/container.svg +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/edit.svg b/frontend-assets/icons/edit.svg deleted file mode 100644 index 68c8e06..0000000 --- a/frontend-assets/icons/edit.svg +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/edit_active.svg b/frontend-assets/icons/edit_active.svg deleted file mode 100644 index 2e90821..0000000 --- a/frontend-assets/icons/edit_active.svg +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/info.svg b/frontend-assets/icons/info.svg deleted file mode 100644 index 055c329..0000000 --- a/frontend-assets/icons/info.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - i - diff --git a/frontend-assets/icons/info_active.svg b/frontend-assets/icons/info_active.svg deleted file mode 100644 index 73992c5..0000000 --- a/frontend-assets/icons/info_active.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - i - diff --git a/frontend-assets/icons/key.svg b/frontend-assets/icons/key.svg deleted file mode 100644 index 82b6672..0000000 --- a/frontend-assets/icons/key.svg +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/leaf.svg b/frontend-assets/icons/leaf.svg deleted file mode 100644 index 4077cae..0000000 --- a/frontend-assets/icons/leaf.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/frontend-assets/icons/leaflist.svg b/frontend-assets/icons/leaflist.svg deleted file mode 100644 index 469c795..0000000 --- a/frontend-assets/icons/leaflist.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/menu.svg b/frontend-assets/icons/menu.svg deleted file mode 100644 index af317f9..0000000 --- a/frontend-assets/icons/menu.svg +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/frontend-assets/icons/menu_active.svg b/frontend-assets/icons/menu_active.svg deleted file mode 100644 index 5c2a926..0000000 --- a/frontend-assets/icons/menu_active.svg +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/frontend-assets/icons/module.svg b/frontend-assets/icons/module.svg deleted file mode 100644 index f0d49de..0000000 --- a/frontend-assets/icons/module.svg +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/reload.svg b/frontend-assets/icons/reload.svg deleted file mode 100644 index c571248..0000000 --- a/frontend-assets/icons/reload.svg +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/reload_active.svg b/frontend-assets/icons/reload_active.svg deleted file mode 100644 index 14e20be..0000000 --- a/frontend-assets/icons/reload_active.svg +++ /dev/null @@ -1,419 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend-assets/icons/show.svg b/frontend-assets/icons/show.svg deleted file mode 100644 index 367bc94..0000000 --- a/frontend-assets/icons/show.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/frontend-assets/icons/show_active.svg b/frontend-assets/icons/show_active.svg deleted file mode 100644 index 36d5eaa..0000000 --- a/frontend-assets/icons/show_active.svg +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/frontend-assets/icons/show_all.svg b/frontend-assets/icons/show_all.svg deleted file mode 100644 index 48487ea..0000000 --- a/frontend-assets/icons/show_all.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/show_all_active.svg b/frontend-assets/icons/show_all_active.svg deleted file mode 100644 index 121918a..0000000 --- a/frontend-assets/icons/show_all_active.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/show_children.svg b/frontend-assets/icons/show_children.svg deleted file mode 100644 index 7cf39ce..0000000 --- a/frontend-assets/icons/show_children.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/frontend-assets/icons/show_children_active.svg b/frontend-assets/icons/show_children_active.svg deleted file mode 100644 index 4d236e3..0000000 --- a/frontend-assets/icons/show_children_active.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/frontend-assets/icons/tree_branch.svg b/frontend-assets/icons/tree_branch.svg deleted file mode 100644 index 7c55d05..0000000 --- a/frontend-assets/icons/tree_branch.svg +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/frontend-assets/icons/tree_cont.svg b/frontend-assets/icons/tree_cont.svg deleted file mode 100644 index 917ca7e..0000000 --- a/frontend-assets/icons/tree_cont.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/tree_empty.svg b/frontend-assets/icons/tree_empty.svg deleted file mode 100644 index 1ba8e2c..0000000 --- a/frontend-assets/icons/tree_empty.svg +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/frontend-assets/icons/tree_last_branch.svg b/frontend-assets/icons/tree_last_branch.svg deleted file mode 100644 index 0b3f751..0000000 --- a/frontend-assets/icons/tree_last_branch.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/tree_root.svg b/frontend-assets/icons/tree_root.svg deleted file mode 100644 index 9d9dbc9..0000000 --- a/frontend-assets/icons/tree_root.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - diff --git a/frontend-assets/icons/yangfile.svg b/frontend-assets/icons/yangfile.svg deleted file mode 100644 index 69b3b5b..0000000 --- a/frontend-assets/icons/yangfile.svg +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend-assets/logo.png b/frontend-assets/logo.png deleted file mode 100644 index 26c0f9af589f756cc2ca6746e95e04a6378391ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33137 zcmeFY_g7Qf_C8Eev4Yr@rVu~{0jbiDfA_+Z|gCI!g#DH`x zhyeluCLth2iC`cYX+ipT;W^&VegA^@mzyydke$8eTJxFhnRADSH%;^p?LV`hgM;G` z)Ij$(2gjau4i0Xey?elw*t$Xo@M~AVHR#>F;1#jgB_6!r=WAdY0Dc$k{BS;v)u;h~ zoDRHh5qQT39vJNC@5&Jz94zDRjRcI${~_={1pbG>{~rjn_qrEyw;wOXZDMlN)H?rc!4cT#{&ShhxW-6y zNkVT;tchnuOF-b>Uxz~`I*DM+VLXznRsE_bn6prCvXwd_@UU_vF3D(NtX~!RVbcmB zD=-ao$ zzpk`<++@bOtDYt1C-QRsx>CNULn|{c97aaz$NjUY*c2>c&|pD?{&T;sM7!Ssi`1?V z75;OJF}P(m1{TEpEjJKs{X(+@$1C{H0XZ@yfZRGAv_{as3OZyTTX$GXs=^iiM~Xg> zQYEh1fMW{??fSJ<=7|n1i$hf7g}49N`xY~nJfDec9Q@B#=h?4jhAt5=zz8ef&i-1~ zt_ZGqG(gdv$^WWl6ze2Xo;O~O8%g^2Nvj1G&m{%wy^kMi za_V12hOTsI4dvwBg{k~jZRpg_6<|XTSSa7GMbXFMe~TzrsY6yfe#^Gqkux%g`#&Q# z0aGZ~qc9p(xZ&S^)_aG^opfVi;`gdtunIza_+J6mdyC19rbk00e`C)S?9g&31L^}S z{9ksMGT*05{YA zTihIo&eiocsFsr2+dV>Pdg*VNN5DP-6f1RYq8R$)H)(;u2$+!OZ*i+Y9H$k+=Z62< zH$j1q=o}l^dJ^xi8pqe^oA4KC!x3Ysy;;3@!w^C12DwhD^Q}u zqx#dCv63*d@o#?y3e)mZ=$nN)o*(SM`7W|Ve%V8AD7~N4LBYMk_AZRiaA6Em*1R$* zG%$kJ3J*LyQ41qqg;u7~*U>f#L^4M3r)^cm3g^1d;$}TMr=GN8Z?cf))f#z@7$u>q zPIR+IoRnT;aaG@fkq5>P@EQ7lW3HD$8fKV;DD>t4tB;+D%7>g3UmaE+&sPukLYZz< zLGn!(vLN|B6)3-bQ9>4txM4K?2ZV}6wS=K#-KxqUG&gqP$k?5neEMsz*6l9ks(=6@ zVX*LXdW7>UT1amZ^B%ein@0!nAm!zo^)8J7|1Y^aR_-uToUUOUYYZHfO@|m&E6PUEnMvJMWUmyEm~;$ z8-_~t9%l5jGMrRNo8*|{CTbqeU_Fczrv>cmY&%Qr#6&o;mz|+nsdTXlf{z!g@AciD zJ$P?ytNjW;gZlBa<&U3NVW`VQ{T+l-AR?X>DDRZczq;?hz|p%QD)}wm>GVd%(V1Z` zK2#*ktA$r9Ju+&ul`>p%GQ>!^0jCDp)M#^EYly@{s8H?klcArgrqKbLg$?wG?Hvs#QA7 zCQlag*|lf`*e+ENwgm0TSKIquE z)jE5~pu7y%=!kYkZ}_f-bZhJnH>Wcx!ymQWEc_m!jKC<7m7YaW{19GU~?)fl;;5+9Q~uR5x>dk8(`VCAK&erl~@lKhT3eI4#i-ikM^eUoE~? zlbrY*XDzw<5Tc#edc*aR)LrG70O;05V)x*IC~RbOC9e1VPgu6f`z5mg&oXqgUtoOh zl6eI|TR_Mujbz3e72iC!F~*o?sI8f;^(-r(n?Iq*{v@+r?OpU@b(EL^92a?tb_B#ra8 zVAIchn53{!IAX4*P^bJUPEC}^jrpYgSma)2_Txe8X(96US5|0GEaN8E$PH9-+` z&OkBBtFdtL)vu71_hBZY!<1>v#&z_`I!gMoPuE-0FkTZv>~metZwY=|KVY7ipT1RI z$mli?P7K*VTa$g}mD{Xl;I_dG5BFFCldNEm8+!l*nG zH(Z5_R3&zzo7Gx^M&Kb^ZE*BabVM~y%L2w%g@YkT?*;FY^YGzw^~Lr)$$eAjm&A#} zjIz)6S@b)w@0TUCtc)87?AGL0}IrQMk*#|HCpIW^glmV9VtY zH_1@PFvM}RCPw2dF%CCFfCXjr$3%YxUVN7fWw0Jcp*#9S?ZnM*EPQ~lN^vV@WbU%A zu{4`X+;9mlQj^$LVsAP-yoS^lOreJ|jy~G*rMyd3GKZO0;UtSpi^Cnmq`r|pk!OaX zd3ljS8?VX(jv$`mcuR4TlB<17&};P~g6=N_Aghy*{0iK71+FZC_r>d8``4G*HXmgx zaRTP#ZcMWnNSu}D#{On7O~<;wc-7rbORclBS7dXHe_l}~wn0>72J@JXt|9?| zgB=Bh@%CEc3NHL6jMl_gcMBF=iEA_Ufv)@wF>_(QEW|Xo;Y`YKq@gZ8%5B)_Gu&7v zojYqw=jSn7^_JyDOW5*r+^}=t*>^ach^fd&waY}MJ)K##ni#=+`Xnsq224mz?XZA~ zHEpRAs+B^|sEvL#sf4!=GaNL%OBO5hSm}=$@`DA*u_IlrI1kuz0K>~uB!zq`xJFjx*WvrE!mpy+1ah5uO>jHSL3BUdi(!{X z_kw=Etk$=G$t8uuA}C#b#w9^ zbcABdlY;m40hL+w7Z4T>H13-oq|%XrO0voU_g++scqww}QI z<{4>>C6Z_NG1BH3L1l&qv*8TejD%V4Zbo6o@jmR(AKxG>lkIw2C3|6^=w(3lj}BO^ zCqqn60Zbzca7n^KTm5qx{sI`N1eZ(8C!8&90++>%aVMckadU3thmRR^; zc@?hFFN_-PR(!H-=p{lt^cHN>7-kzBcuK||W~)sUKsTQ!I>t_xV@3y7j%|ZDa11=v zh--8YQ@KCgA)LDSLY(MRtbJz;8JM{by96xWs2AoIdsJm1d=I`hxdD)8#%dviB`D++ zYlX&?bx9j4|3$M?6)|q>|G3{{o^7%nwK;>cdZsK??S7X`8aQyIM6zLc;tH0S4r$A# z+v8^P3g5`t!-|?HJU}=hOAX9n^`;92<&nYM9a>W+HGC4q1f(BYUt)D? zr=1yHN_^tz1tZ76mOm|>c7^{bJAN4olC3`IV*>Hyh)&5+pMy6Omr&5HI$Rz?yOyjn zQpUIrHF-#mcwA?Sb`uZP*$JJ4P?)VG(HgCx*}LsJgr@VMn{l{Gd9@z+9hl0E@o*;8 za+G|d%%uv_2jccQZc{%lE7P@{Il@rRgDopSx6aMh48v-E!MD$&0(FHrs0VtFqqwdf zXAsXq8Lj5;=L_+k{&C`=i_CHEQ}>k5t`{$DP9A)pL>u=2k$hTraN80rk}53Za;?|;^<|_7 zUl%UyHabJ1VZiB&G-!}^Vs~(v4%t=%UEy3h{UfgSp(3IX$1cMSqMJ2{Wc}%L&{`jK z28=wZ&l5w!;l8J7oeih&K!NTZ00)quH7O07iJce_Y^oG0vahs%(6NoqYo2G zAFErO)^|Gx^}iWrJ(7P$$VCW7ULKGP+UWTv4FUb!n9`KK9#2*@^u>J6oXA=^L{eI- z_cn?^sGFH=F?#Y!E)%q+O_&@-wN62eR-Ctj+AdFBn5KM7Mb{-gH^(MW=-uHHZ@%nw zhhtCZ+eLiw3Mf8;;nOWm6s86j#0cu&=Ax#sXA zlpHGAaDlax;L;&|RX9yOo|s%13~=Yvze`O?T5onr^%69HJ=CC6f# zWr#3+x6krm(Q#N%TmRKPR(b+`b4gV_5;oe%eX4pt7rt?nOU63L`Bf0ABv+sHt4>YC zmyg$mQ*2;D*<*U|b>?P59ncuKmv*!&4p)e7mLw+XyE$eEp<7?G^!0fP%5a+lJdp%{ zY+WpRqXOa9ikmUVG)q5h87uLshe(=}b@X{GUGd7K67kEY!-nf1q5Ynsui=V;JGozy zh|hT9cuZ>DVlNmXa8?kgC4CFFL8dqy7K|&@pW;B1ISP&R4LpIQ%|r9F)OM9)aB9je zXB}BMa=j1Qd}rjzLu10%&x5Iea3Q{0hi&Mu2OEtFd=hjMW(r-LXoUvUphb_z zQVB-J&6p03C}N+yJcBe{n1%(d08mcVxq-vT5f9XkW@>rUkX4L6RiBw`9)b2Jc`IL|g9*0Arb539K zGbd3vC-Q}aT+(17AfYHUH*jO`JQz${ z8JwjS7iNS$SzNE^)WQUv%o`3mnq&r2_Ip=(}%%2YzTnwbHh#HwloF zJ*{~ebZdORsvJshMGIP)qjlczCzD{(cl#1C|1P=S3L%-yi$8srEXev9Aw?gR>L*|X=_782t zTHbZRNQF(CZO=8gcFM};BF5&*dRE2ssxaeHa=M-knEn0pU4Ru6e~Y!%$Yt^A+fIUSO_-)ynf>$NQ`K2M%J`Ku!M!+ptVq`4U<}vFGr6wwSb*;ts%s+K+Yy8MX|Y(m6Vz` z1i3~4rIG^7zy!8wX11;KLl_zpDP+ds!tSEo z5_@Y7Y$*`6i%$L=qgbuKZRY!6)pWk)UP!6TZhXv$80M2|OSE5oIVDf5NnG_AuGgz# zbNQPbf_Z_l^6JilHkgsnf-v;_DNSGPb*5%GJ8Xoqt%dLlUW5cg+q{#yW-3C4Rfq^T zDXlH9z|2w{F5gspyX5xE5M+^McHv?zA%6p?NegP913fVx`)hH0CR)`1Cq%R@|#+hptoV` z;;UN_?R0wP(wFg6Aq-t*=h4d(@hjRW*M+B^O|`7x0ZC5d{^`N-l0H+`UVq0h$tR0w zo7C1*&MP!3qWC0%51M~4F!aT|%ejLd@}aOGU-b5wTxTB5N&@@EbrBc#9~)CkJYQf) zZ#1@^(hI0Z9&YCS687uw5!R_voN!93WnL!H@6blq*tNnh-u5|O6d1|dI{Pl$n$BgzZqI2bFRKu89qnr?Fp33 zH4o!oTY^-1RiGSw^H|Suv&APjg;VX0Wj%e2`P2m3V*u;lxbGPH@vQHtj~$Go8YZSu z+uH*Z8soQMDh9I8HLsw=M~~U2(!WuL!J`|?BAl9J3ySfy8Ne}#UwN4f$EHQbMqJ(u zm>6vcG>^^oc2}E)`{qLGjqYUQ*P&|9ta$oBWz$X9G~KgsGw;CMZ1B^gF99HE`@rxyA}~`*KAf`A0a-B|KN@gj zOPyF@g_s6R1W?!%`drpj%cdK;`7F`Bf)FK=^L0OrEHv1+GPz*8-elZ9jsE1HD;a#3 zEQuc?BYiw8gaAQwGwO_89FQz%zR)7@{5s{QwtV!7oFj%v?npM>Jro>pJ2cRI%XB)g&Cu!4=bdlYaPbch!wAj z+=l(JGZlmYYeY#s1q?Woz?`oY?SkXI;SYxy`}yYCF0Mg>-77XfFl}-I3uK{Ii18fT zNo~y7@Lb=3d7cT)7QbdK(?eov(#ctN1*}0RC`Y-J;YqWC4;c_(0|G@jeN5u}Lq;t5 zj^9l*Mn4XCcx4_PwsZGUhSb+es#W;wi^tZ`MFe&)WjJ=AZ>6NT${_y{LVR_w|J(`Y z>)qR1nr@h@k;qq_G)f0_EQNj&EjVD+6or_hyAme6D^TE}FxOvNCpx;cB>K8qyUk(N zJ3PrNJ*a2*>TNWZKr#C|9@@>)DmpC`qdQo4} zr(kv?9L?%pg71|b2(Uu5DXQr@xsIQ)E=@z>IcY19hR@%mGbT46C6LfC#GFFmn;sq5 zs3>YYW8Jk8V``T{&!h}@6vj$-Wmhqq0NclGL?Y(6f8A!QK->ov&g%Fs{^AxNsNSHb zFu*Ir-5{&;{g!p}3`koBeF>I%-v2tB`i2Dw4Jlq!T>u1nQ9sV24mYex6i}!juZx&! zkK1doP!{^nac|HY-fI`DOQjted=PWT3w5Ng!CGXAb0^-P zmWHKIjtv_?_gdb#|MdE!{g#i8Ef*eoRtpht5-mU*JVvI8yGmYqT7I3Kn{~Noetoi8 z!nsFdQFM)bzA~#M8@ZV|Ih!?WS2=s7Z?Z^(uiVdUT&$fx)r|w?C*r6q<;}L7 zZJ?>Vfa|_}_G0?+=Dl3e3(g~veGN3KH-F73*FEcxYw=4T5>vN}4Wp&7+v}8m!E#~# z$G6Q)T8~-$Rh#K>e8N)Ga7381T#~V|bk>`_T-K|&o~=+DX{37ed1CJ#BqlHb`DFe> zf}8f4p|k4Uo`PrH$C-yGpCw~a=G;vNYj<`&jVMt+{PXNwMBU}n7CHm@_*j>R@unPc zF4Omnifv?h49~DeFOsjneU!TUGQ!o3Q@BWaszpiNz?k2U<3|=#Fi}6ckK2AOu9)2; z`sH~0!vr5OkC)${8ezXR`Q`EZopU{NJ;S&l$G9QCXaxTzGqJv|{7*UjEp*^<-ww)Lc&O9^N~#Mfdc! zD)#223cA6$T95M^!g*>`*Hpg-;oFLsJXPw*e$F5zB; z=!fnavKt69Rw%E6hCR(ve4)JB$5ZFsYrqO8DdJe10h0QmPvjfi6rd{NZl{CM!Wl2L zf9#n^r(aQ5J|MVeY>q_*b66V;Umb`7h9uMB`IaJ2md?9I7`wQgE}XutSC+YKqwBec znUd>#jO*vV>eeC{B=>sAY%#S^MVmrOoC8NF>BKC6L4Q(@-KU z6u$5(J|qAc-_^<`jmi0ZW`cljP0J}%gJ#@DYHnUu?MmVAU!K%^FnNB0Mm$})%S_;f zm>LJfmZSN^dyNdF%*1oJbfmWX2v_#!pPa64v!=DNnXcdJRnFmK#2Ge!i+H;rlj0BI zbu6OXc^9-&ka^ScsZ!BF;$G(%D>O&=^#KB!{kO&k)l7M{a>Ud#7Zm~BaSppDLQZ?k zxvS8DX2>U==vMtui*Q?H`swDZ+V-B|uig%ma20#%$?e34MN-jJj<&8|d5n+pW2rT} z0NHvS{{$9Cnc*eG4OVPm+omX~SSl?!Q_bQU&-vwRJ zw{;0sTBTmA3Ua^7I@$>avvjk#ExEr`9{`xs%kxY%&8{WP4kdY^WHsU^i| zK?|GoeAo}(k8pH~zZ+5!oiZ%f_7-*WoA~*5?_hNDjp52Hw&I6u>c)xG@NMb*!_&)Q3k|a+`TSMXhI&;dxVWx?30xKQ5AmkbT6VrW{RZYO2+l zp-ZLg5cMbi>7frgV}!(o^6s{!L5z2g@#Lf*bKJd#P(hr`My+rO-01q$;Ym3Y`L}BY zRU@HMO1)EVZcs2j_o8U;uDYJy%X)*+RKqSUH;1>PU&!sxXsQp~XCw1wMfkh#=)ET8 z=enNy)BnxO{Gv|$o26^`#&v=ArdoVLyS4b{OJslimA~Xo6bHL6xXIPQINV&~P8HzA zb9028%tXJqIE*j_Q^BJ~LytR?H3ZQw`1Wa#sBVwRcIxOhA9;CEy>oBw9?uck@zd|_ z=z3mrPcZ4}<=RM-$GyCC=zZS9__PaEg$cHol5g4ZMGmP8kX~T!!~{#Gw((f#-NyD7 z2w~za4!yjeV|*-`i}hq_@&0h`2WF-E(IM%Aji~6a;+p9Qoy4Qe{1^pPQ2|&s;Sf>f_gil~jULDIxo> zN{F&OB9XMp1^R{OjfBQxJFDDuxY73EJ) z^3T^Xx3^^C8$>u>dF+OgoXhbb$qFKpRSQL?&kuR^uk zK4%``pLN?#=oxNkgrQ5pA$3t{(uWE|trrmA2lP&a&wWkt#zRg_M$l$rU@YsQ7 zwE}MrbtRUYG7nnfPH%DR<$?_@Qtff^k=#%Lr^_$mC_br8?&oNp)Sm zh>N0TBwokSBm4*M=sDGmx;Wf{Y7=?o#~`)_?yY0#z!|l2h1xv@Q5^T)OwZ`Ag{Hg- z!2}BacnCa=2t7pcsK_)MN5?a~c5NN(!gCJba$U$rUd#@7KUPM=DffG12UrSM2k zZ3E4XQUcjseRR3)?aJ`3iMQt!sH6w83hlRP=cXq7y0RW}|@k-JLm)Z~jaE^`$2F5lghmZj&+__A>wcK$lXugy@u*8`pcnALBWpnFXf>wimlx zRg&Ue0mQ+493x?`V`$7B6t{V~Wx9F$xp{Qo-k_Z;Kg#BwBJy75;kmJ9hK!d+Z(Tn< zsi36ZeOMWBrW1}jCwk&++e6d^SABfnnc0*n$4=$;>kltWaD|IgSi!-ZSi?qbbpvfs zhkZT$6Xw?czSXMqb)z@Cn3IKgw@4d`IQV>XtoF{=u$Cpx8Pnt}u4e1oR7qvRtGMUt zs~+ACosX9HywZn^<_NtmC+$?K01`Jr=-!IX^5@KxR|-sdRqOl)6z`Ac?mVjEV`7Cw ztrc1oo95+G8@{pM?8RrHPQBN#oDw=g}Tda3)+v2dXaz!@ULg7tJbF;Urq>=>yhU7Z_dl z8&M_hM}#aIm~0Zk*?Gk|f6z_YE%KhXGGGmd1haDsdF=FiXIznWK_$Yvha^fl1^xP|r-`oNqS0hwOVb6n#IL2_>Y zi=dJ|d<>~pCv&-7xgCFGRz#d}^5HVipGEm8>gm4J_{>a;wsD&W*fW!rs*@2bZ}%R! zrN@oD^{(=53q&*TX1$Nn>c3fxauZ{xYYCdA5Eb6jaXE#RzNsCjQ?dU!>gtaYpzu#G=9=dX&@ppYDR;UT3O zwo>~TI0`8*HCOg@dQr}}tMkfU*CT&WJAVXUQ#iqV@piAs%k(N52CCapWtdY~f>!TX5Cr6i!w`r-8aa_A}9NO^%e6I6jB zzQ+9>hfqE+pE5^XH?QLyKmTJ+7OD60eV+4t4qg;q9&Zp10zQx8djfiU-a$kud&~?k zY99}&>SL7Y54cRA+MS{N^1%knm}DqU72eZzYIqw$wi6C|@8KAHkNUkZ4>fJQj?b}tCb zIQ_Q+ATX7X&zNhTWnc!BF7&h_JNG~wpkayo+D`y$zdO5FJ~9chO|ghNtE9ashUsbp z*&B)*m6hRa%@T6@V9=QS32&?(AQKvp=Qr11D5*Sn)^j65^H+O4_ z&{OVK&QD+;<*_tS5fnw894EY>Us)wvr~hCVaYr{{Ji^yr4>7+gWcwSa3H=1M%2?Ft zVbQSIvR+riJA%g5@RNTnC&KFoiN_6FRYfK4maAA<-^|neD8Kt>SVtIlY1aK8xsSxh zzZBln`$~sjPRcrj*>S1osw&KNnrfH>K0YKIx!17%+>bw*hjo577eQ&~hAU4m2HPN$ zXcm2i8Wn|Oygm7M*AJj;vyHh;2R2h5*gu#Pb;>Imwq4>Bqi#(Cp#Qupx=>4lItA=gq&uu)A z);@kQ-E(<)?AkQ6QBD26CG{oEP5JL^GFzmtx1ZZ^LiR0pSpz3xG1Q||dAgq_XRyZO z>k6c9YaYW)f>zHhHa+C}s|M+ZH)rzvZvU;@TNl;Fd+ab9J zH!iB{^LYyJV?kSe%$n;cUZ>~XvF0)##nucV2j#JkDFN4eibryCSZgZWZjg@z%O^|D z6SDiBsjP%g#cRa$-SapERlzKxblc(kg7lvvTkl+?D*SZsu&R0(zxyIZ;DSACljU|C zQ6a?N_uQhYTjJJA%lmR400CT`o6l{>3ZhOa%)@4*)_CrNpLx*VdwBb=YWMNV2|VU1 zbBmJ`h$+7=r+*_%qqL4Rd~2W5$v09%`d_4>DuAe!T#+vIMqp9=mrn+DelXtCTW-c90U&cS{`fx6 zb|oouZ45{(c?SeDg@$-@4;_C-O&F#Al)(-gEU1Ka;H%I#gP0)_dZr&Z(JU&aqM4H!7hJh{K zHl|J)UDAG{Sn8z74cQ$uK06ZDQctp^arQKJk+c-JuW-GT1B8w#$nWL7W#QwszXuCK z_4}UQKHmQ8q(kP`=T7AKV6_J;vWg;48o3G(JENd+o#m@?FRIuOI)?3 znnuBt!adfPrz&QZ!5&}3*hS;!<;&TR2zsxn>l4pupS)+6$0Y8|%b4SD1>pO7o+us~ zO38`+77lHnzm&i3(}IU0qt9&&IWylCRghW<5qr{t-U^^+gtP8ar7#ao7`8<1NW2WVde|H##v~qw;$F(I(b&U2i8BpRR#yve~_@!Sq9m>R8V;+ zwkV2wS|YXgl;nu`ogY~)72=G26HWV`Q4OD~7J;$TkH$yhvQHEnoHWC6+Z=p%aRgmm zY3ou-wXW_QYopC;%tyLYJErp@Im}U4+OpKloczhslM)P$f-R$KmhE+D`eGRjnln7n7<@|KFp*Xtkl1+I-8Q-Ukd$HN1)(o?9CBfD)p1!m8 zEU$$tzV18jzGLmYYXcqaw|0`T_ymS_&ht~V7J$CDoA*Ny=@d3W!T&*_msBzdp6-`u zH_e|nC&@rgJneEdzxSE6pzTt`ij+C zi(%UtMRj8<2hmqs$42NEp&-uXX63;Yz|%}?-=`-+PkFS2_=QtG`>y9sTfC--j9=V{0w*(XJOWa`)SqH54a~X-9`kQ6nsY8RtttAZd_7<_#}q*vgBh zgANL5R{Y(v+T5(%6>pATz0CLH&qvD-78bgeBU3u!do_a#3EFpHss}HWWbdpzdId z7iS2sIh%iKPW8)+?3?BD@_zAAW2k9dGZoZRuh5@xW&ALo%c~|#<8$Po)9(DBHAV9q z*{MRW_2^&jXM3%-)?DkbTH)NTwCIED47~Y+)S=N0{53V3x=uoSu};)l)*iK=&>YT+H)eML<@KGD)zIHISE&0k}TjMut+ z8GtQ+<|6z}ik}ypiL9w99et6B_4f)}d5!r5VdXtO-{kA@Je>#f_66L<1VIp_ER10g3E4z6eD0~_Ny**O~177VVJAElv zJ1S*)`}cPN=J{`}YlzL}x<;>p4AgEdCwiif*HQUEUzLr|5nt!8*~)sP_thi7#{1bN z3qve#+~zbTJ?@pE8&7pi^<8B2gR0=Nf=eK7KII6tmy7I_XS_l=+>{H4`JQ_}p<5zG13^dV&DKoA(trI)IO(fltN@#&fp9uoWbejbbGG^> zl2>3a1CY|utp7+Bbw5)rCa0=y$R{YwZ&yP#-U`6iSpY6VOUSmJ?W?e%9D4k{vD9Bv zWj!x2qbROcXXyFIv7l-PT^EtUAD$5#kIDTHrs7yi73s=0pj*)g%}3+}JU{CYwrDn* zdj}td80Vc;Au4Hvj)0wP>B8^e^flX?9Yi%wo7JrHZ&6;HEpC$EV%B2$BF}mer1|*+ zB;9^2dlPvCY_gzZ48KC!Af?EITvdSve8i^7RJfQzpgLcm99q8_ace1>m?!aU_ zZ~I54w5G3-?#~!h{ZAnHud3?^teeEgKzvn`H_pcA;S^JLvA0#G=|TYKZ5ns3Kqc)LK zQ7!evR6vt9Ujs5Da2$$>=Hp7qea4fN6n`C4 zYv(*Z!|m&hf%Y+7%kcDh+Rpg`UjHlcA&5H7FTm1?*+l^{NAbYY1ML|*;(i{eA%Mp+ z6y-jH=Zxa(!LEwyCqQA=iyRHKp36mnv49Fbq3?u%&7vfAW!YQF71Ti>$TE4y*PVgq zB6fUT91J0O9Ruj(bjpdydtP1&=L(8DLy#F*ROm({qi(n=_hH&BsfWZ@=AK7iYaOd7 zX3n-41KKdlzvC@N5KRsy8gR#55n`gX`d^1WL~z5sKIejC5ynMCFiRF+vnlGBX!kTk zBh5U-&A$GS6<*f)+`~ha%-r(d;v!5PDPrF2ELtX1P2h^ce^?RxlIX6U+}t8+)yM1LT& zc$dYFmwVk_7rfv*__SL-8?_}U`>!FG)I_X^vOz=(Hp{YPrwVBf=4{s<{o#vD7ycQj zTb?cSIuF9w=U{~d-{;zqvS4t{SmjbwBa;ZYvio-RMvOlJ|Fnj&aVK*7An+8jMq(EJw5Qb%KO;|ARrh+;MYj&M?LCN>{Uk7<{OFL zS}xL%%iUl8vwl_;IvAbHNVc{3XS&CXl7IIxD=X-#9^Qv>Kbs;T3w%88`CnkYQhXJb zxdvBS4O3CTn=D!?z?Eeno8qFpoLafLt_f4m5*BTm+?}i{*Q1|-fl(GAv53e&FBjB@ zu_|`DG+XiY$ghy28V7?KHTCx#vx$4C#ori_T!xvYwvPF5ZB^~O>js?Ha@!ANu6Ki+ z?IY1?_}GO0*=XD7Lhw95KRPSx(C4=H{l{k;-1}_-Q@ax#caiE@mN4o_5jah19XaaJ z`>nTYId5OixeFJmO0jFybuM(|&4%KvtmVte^NM&sG57t|+#mSVzwkbcPY{R*zsTAz zr+{t2N>Kv_pEh|!m8>R?Hj(NQ~1>Y->ayw1TZ+R}A$%PV%u`sHG7JAOK8GN9Am z3m7;3N4$la`df}N)S@e#A`aTK`aoTcGJj)%Ch`%FG4xG535@a`#E$Ym=IS<=u@0|i zGe1UdHm*AUmo%8c+U_4MOhL`+y}p6ScuoqRx-O~bUHAA=kIKB8gYV#^``J{9kDdx` z-i>aD{$^j0bE?WK@Vh zoU_EmjRE@kFA-1z-w)wHsvA#cY(R`X=+r$VTzTZMDZmf?xT~*q)OuS58h}ZzwgQV8 zj-%?{xAGUp9_pJt;!*cC=#F}4fasT1v_}6M`H!t*_JaJ6Z!}i<+bSr`>VOPs2}7GC z#s_m@UBT08@fe+$6<}uw`g?NxNX)ZZe9yZIG;c4jBb<9q_M;aYIOioPuE%DTp>aik zX?r$xM4#l`?%{O`IKdx~f`6>)thiXdfvH7Ae1D{5-Z{B`Nq;W)8<*XojpBcH6rOa4 zpGI;EcL72$a{cWT?cAOZN;J*~KhQgh|B$J$@$tLCO>A_WyPs_i`N;f}0BU1(OOC&H zuyHW7vB95YiB`;7J9Ic%`Nc8x_kzem+758b_kq8f;c8p-g82QublLXiHu*{Rz5**bvCjz9O;#Gn2r0e}HUPp#nY zjdLK2N*{{2p#C;`)ev;=(z`TN)bD2J$U2 zfwYg|b6OqMcy6lmB7cqN*KGJ8xpj>CC|>*`RZ#)21->1S^=xN4z@M1|3OVv&{GnQ% zgHMLVX7sw8EqbIAi{fJ1U@}c%x*-KR>t6efjGm9w6<@dR;qwH8lm{pHyE&_j&X3ly znldCmeo`zbKK-$6Ye10YAwftbb8ZaS;oPJK1oY*bt$@S) zFnBF9BwsM44H*T4Y$^G7I>YaQH|BB3fM;f@hNW!=0r;-vp5k>exe9+{dlnq74Bv5- zI$2Khox=AudJ_aM7xYeyw%hcn*Rvq6(c0A|0X;u)=>-4Ln8c$usNNdEBsl-&bAa<) zm~5H52wjoU3^HYQwHVbeOV88SmfYJ4S)V9B;!92~6 z0FTiQpLF9n_4*>I!2k}o?By;tt88#o_})A0j_7KrC2YzRz%!(i1in@r=a=0>xp97! zBC)y($i)FL#5Be;JnUHqQt+4|kbQP4ce=@dcsu`2n=Uh9;n2@K%RTXl$)S_U;fWS{ z-LnUf-z&DM$g^haMTXZL>z*)ahvq^ zI_Az}ci<5j0)*HyKTAq<3e4n>qrLxMd*2z=)Yi32kD`FF0aDZuiU$-0q!@}wD50uI zRf-^R=solRq7tP^h#*}B;ehl2DmCYTC`jNKlwKk&ClVlZ2<@)u`;Bq`ecz8e#vS*L zvwvkX*n90Y*IaYW^~`6^#Zh4@GoSk4{84Bx=Xm-pP3I7ID{o+60j2YfcBdH;hFB=>?;WEHU7gBv;o31ik{gTv4|QSYw6nEvrhdwFak!|7afzV zrucGJR${XJV6b=p`pX>2+anH=b{W^-zL|yW$s-=@_9_z(9s6PWa+lPSf1_ur%w4l9 zBGblOxbmZ}OfRy#yIZfD_3{&_4IF?#8fFwIvj7vfRsrF3faUjgXNbLUHkEQyUw;X` zWOmIiTN~N*Kmn%Fb`BNX=#_%CmO`|@NWeZO3gWuyYS}3+{Sh_D`>e zhedYW6cIhF4$yTa0I&r&`oI_;=tnyAW6O%>LU2Elzq%j1EX|P*!~+B+j}6(#%p8*W zsa0!dDSPxI{o#P%bP;k}zrBWq=eT>IW9~9CH6%9X3mdkX-I?mpYW^zSn_ClxOtYKw z6(b$y?90gZqti(VO(_a6!l52EakD=fosn`G*9Uk;+^3CEgBq}OL)K`B%>si|hb!El zBnW%;?6KVe6s!X)91g%d2SYD8Aa{O)je{LWuSqBW#lyWM{=c=0IR)Tf?Kn1XT^oxP zgmUns68)|@%~u?AIb2Z_cleJefG_h(qkjBFy@*@jz+_$z7pHuB&;Y>kG2edCp<26%k0Q%L3|VT;m5KwP5@kHjYz8hY;KL zII$O=aE-%}vL!ot&}zM#^V; z?no|G6QqIjY2zoYD|RsTjiJjP}K zTXh_INo%I5DN*qPJLVj%p>VihO_7pbIP8#ul}z&xD0HnJ8y`|Ty36(sQL+x*6SuHJ ziXMX^T&WioMfg~*`#1RRvCT*{zo$HEp9jMV^Y#}hm3VPw#q&mxCimB_P`a>#g#m?_ zfrqXWZ)!M$QVZu|^QE6TxJdkr7YC|g44wPX`wli}@ zOwQ2`E~As=W3{YGA7eLeEI0#?%RFm#^QyZZJr8$l55(@lXXaoBb89|ti$MLokloq2 zo!wq=mcTBk9)AZmuyw-&Ags{#Cv>TXe#8z6J8U$Z%Vm%QLh)Jtf@=G@(>GuG93ib z>+DTu5myCKObI_9rw6`z?E#P1wr!DR+>yUs`pcPk7TkT)gjU}`V=;h8c%$P_w`AM> zYk@)9R0F2Gp9gp(^z7KC`$?-@-641N0xPx*{dUVW^BMOd_`O_|EM=PAyT%d<{mkjc zSoQCDV=mRzRE_yfk&w#L`YYPx{MbrYY8Bc;94DHW>nvnhPb@|*oaN^4#1`1xA@&RRU(8 zCssItY>ya4KZJ6HJ3~L8o_lXMUH=`=Kc7t=vcQc$@eDkt+#LbJR!Nx9H*?) zkF+uNu$!&)Bi>(k?j+w0nlMX$p>$MJ#Zf>koK`_+Yg?VgTEh`YAYm~-jMIZ>F^bJ? z??bZUN8LDkO%pG1tI7aE!fl~VU8K4^!k`s<;D*$JCS|oQH%XVvUE$Y&oi#fqQO1@t zxRYrspp?YO2izb&UE(-?qgb*-!}^dx!{N;+rw17;U#m-%^`O;9URO8&CA#;8Hn44D z@9602%`$7jdVv?$FI<(@9~<1nDLo!lEYX`JYKufE;<3*Wuw*uVSFeKF*;jJBo59F? znwtxy6(E%bI;e?2#z);B?fs&{HnAQzRPA|EIfu7NNv&%DK8DYEIdPtE2M#;g%}f4oklZsYvWaL>j z9S1CyTPA5fH7BG=&CdqeT_Wt`n$B8y=Z>SOH!LT!NL@?BXyCK8-64j6#c)Ww=CZ(r zUN-dHci%?MnU`(h8ao;gZ7ZO~blTY60twnt%68|a`XWSv;xPRH<$R~`!e7zpb!CRa z*(wg`rxy~i8>ta3GePnv6edP?uezH(5zclM{V_xgFW4M#;JP!Kqv-3}{~OB{6pYI8Q3@(kK&8dXyHJIS z!epq7CKZH1I@X$f^VmgklU^zt71_S0dHZfCT;qUoSI;G5BhE&!^{X35K<2ZU7iNqXU==h6f1ET^()XN427#hS@(q?27WHEa5;2PFjO6(gQREX zyi9XdE%22)WH8I!auPamDn|EU{@Li^zqO%De@-9HJq|bwt#^ZxT4+)n(#UqGea!E! z-jneTuKj8xPMWehr3THE8dDqb_n{PG2QMKEyrE0{6a|XQl(nmmqZWk4(O67Mcpw@d^dfuxJm!~K*2<1Fx-wkQX0VnfJ?9J zoC0&0lQ2bqn5DryA5uW~uxrq71v|%|j%6;K=GFBaN+^D+^vq{|GgD+!51FHWK%hy& z={r`HUscTd-OVAD8y(>lb|v;1!6id)&oH7Yi^S^W$;l6)x7k_&lg}06-Z*Qkm4wc* z+2X2-E2QVD$9cF=1fWYeK(;#qjo{S(l1x1fQ95*i`K5)Z(J9O&I-i=?b_^=dd4bE4 zw&dIV+sqw;N%+ooedjo_ty6fmC?{^`@w8~}5$GHCXfDeiOTN2TC{M7VIw{c(iUg=< zTZWw?;mfetJFsP{ODPPLiT4iatS2sRhrPxin^J3z-79{uY-EmU$;V>pOLpF9u)~7d z9^3RlV=v&89@d;vi#U9O*nqcVYsPGnRkEs++&F!Ed&rv&g`dIZ#q_o4gi!?ZcO#Qx5^TGO6BYoD?ZxGftiwkcgtl@#B`St;A5t0t-W5B>#q>h6q5~G z$`9;dOa7^w(CS;rNWsk$RbEc`gZM8GwS0O!s){|^Oe<5F*O8+A9RtQl<4-*okE2?- zfhYYX^qil2U{N~h49xO%qQ9AXba=VLbZe)IE2V>=dz?obe> zF~|lB0O?jHa0EWSA6=DzWB$&Ga|at^u>I+G#{q2c3L+kiNA!&ruMpBJyrN4_5?0VH zUN`~!yj3`NO@J~62;^15eiq2pA7zg)7B0lL)Cp+POg=Zkc95aM`M z&BiEqE%TS%lOyQ1qwxfnbTB@lqJx%Xi6L!zG*{$b}*sV_{dUdxZmw4eerzZRF38X)CT z#a!W8QWHM-vC|NCZ}o(^EqrxeM6JKR^{Wcy?H5XT`6O&Gfdkoohh$x*#Tn00t`%=i z=EOrR`fvr^zu)f4pRom|7ugQxuQz2Rao=z?bu*_h0RZK4&5xG-mNep+@B5n|i+nrj zOCsNtPg!w5?#2J1Oa6vO@p>;gQOuxA-|1&;U{2QpD@INb-{73oPpitqhW!@2dX@4Y z>$?Fec^7_ecNesx)M&L)V5}Redo%GwjF$2Sx2x+nmTLpZl~N7w<34xT5E?=w91YRw zH?jmax%_mHkrir$k~)}ECw5cL@0cGKBWDyDs3gF+Oi9H4?yRGr1Mqe>*_-GOdE(G- z;;y>w%OstL(KkDsnrkiR?Vko+U_1lq6E@IyXJ9R2P$QT4l5?oI+u_*taNSbuA>Obdx&QFnH{glJK_ZMyNApfs?!Z}{zeaK zzE6(HRZ;6fQXXIjCDimQqj=w4LbM+)GBZ?tJ-?CCd=e_cZe?ENc`twH{TW6xcJpcg zzoH1p(aE%F-8|(2e>`Mvz!YJ0(nXzXk5tL~c_MR;Kr1`>mFyHN{0gv}nvBzw6(X*) zTF=7>m>cW!2m@u*27Aao>OZkG=fs{AtblGixp{{qF}Ve;4nsy>hV7XSeQ3~P{AJ%? zLN_OJ1Lg_Lux-u(S{>b*k2(pJPs9>p2{A4;E8Wv*$`}cDN+dfscKhS|jw|@yy2`a} zC$Of$VaYFy1FR(wy>fK9k_77aWR&8#pNL}sIz7|t;GKa;mFEaVcjy!B3~cfi<<1Ke z(tdW#;=TBPBvAsKi?0(Ke9|^J29&9PZmg|LU_(*J9BsA98A&kJ{P_G_(FYVoL^;*Q z+ZtZmgoRk4lkX1elm7%Lf(7CJmO_`0m`Gl^WRw=7J=C+qW|u3}2%z%~9I9fQC550i zn}m}+WsPVF0A;s5NlcnGMATHDef1G&Pt-w*;cCM~Z6P)gg z5&hLTG>Jd;988mgx1KB<2$ktpd?g7OjgN zFCU?-&iRGTiN$_6r?S@jxkrJ&0)o*S8VfHeoQv4XRuOpRz+J{)X6C+HM>||%zpcs8 zMgb4I^9VG*fDW&#p1Va5I0GBMYI9<&9wMdK@R;1BdV^fhX`^=@md8hDr}Nf^b@x}` zl1coR@{VRj4XCVnB=0om2UL6=kPJpcLXh2NVSh9Vy0Girw&QBjzBz)f2PILsL)dqY zs2Y%6hVFK}ve{(bplH-qc0y*{cKK0Jjh{<~&WH0?*$3ca zRHsGh7!%3e-w>ayfi>vY_>~*yCh>)?+HgPMVjXFSsI(2z2hLMMYF8e;$XIwy4`_zI zd%YEWjB$X$=91ANLDG`#(wPlAH>HxnmR^)75eaoU+?62Iw0L;nhPXixQ!f;77Ii2p zLuyPUH7kk@x^$QFi7wjaC-^$dzot;6rtPp5vgydCDuaFaeVVUcZqpRvmL$a?hSW zM|(4LwgXVQ2n+5jPk?IyO;eJDq1pD>R@c-HD+k~%Bw}-8eF22+mcZ@{C~y9~klD}t zsnce}Tgw7F)>(RcTCA^8gN90f-(`WuiECYUr=HznvGH;8Wf6w#MeOOmKvfL?>==|IQ`gbIE#QIZqj z%x?U$0Y`1WZ(Y>R4ZvN^p}A*4>nkDkMRX63l^zBy`Sb%; zF5QTPlMzLIxbcNPQHm%9^*`vx>(@|-2z1u43$$Npz$;#TJK34K?Txn9Qet+OWiy#E zmWm?ABvGbwO`tUbb>(q5b=q3RgmYYiHc3At4AMJp3Gc$Dpmr z*k+JgLoz5o4y`su(uJU{>B*E}a-ilF6UA3a@;>C2m-}3qi`57T|jzLFM zsFc@_v0y);3|+DVy7Zur)#eY{X%n(~DOwL#*AFHicip`}XiVm9IwQdb;>i z=^S08Rz4Y&8M3_}50Ue9r3%Nsk4?&QU=z@5=f1`@n*L9WP1o=qoo`rRy%!53S)gt#5`uDLaJ)V^5CE5JaM_r;WJhk4gV zas8n0un+2yj}2*iqy+)!$iU|M7w%&*N!boiXmmj&PYxtU%f4|B<^=7k+vBCw5wGAM z%Gj-XI&Lp*mMJNURM16u6$$=d)YZ2xQbc?rvS!b&BV^nH%TjYc+Rj*`96I^GaJ0Ul zt5&o3N2dGm?&Q_*`MyXN^n4@s3XF)rua^3h`sF)ApK$MEUJ)79c4_JHdkN3Yw+{bHF$+rIKSSjFom zbj9l&ZuJ$<*_PQTXQmDD&~xRx}rSM%^FfZqUWdtGx? zz>23;4E7ylQ+j62&u(R7<9g4>mddTUT~gG?9sEH19lZZ`LN8-L@Vcf>`fH`N^w-&Z zi4Fybd`O5H zBk0t&zbA^}iyrY^L~ZD|XUhm&vd_sa)<5~WOg!2f{WSeO&!7QWV@R9l@3Z(t*kTXA z!h}j4n?xypIPeLZXPKV$7`CWB5W<_}@VE}eUS~H2? zlV%wyZ^v+?%DP9)c%Iepea@|_=WJ>AXfkl#=8dffnAY9fBpqX|Fa-{^i%Dxi95sM@8F1pq(L_zas)C%Y2wm2 z=Z-S?OTy=Khx8Xnz<0(K-8?lyb#trs_h)CgvX;F|ikvLevG?+uKCSfJwqYXxb%*0` zz?Gk0;2Nh@%bKn1(%JgOaX!UORt>^mqI=xSiRb6I~K$A}Fk(OkB&5iKTtX#+26kT&W zCBDt)g&I4%o!!GMwzCNQ92RuxjapzHz`zOvKSEsdKm?OShyQ2 za5GE4pKpNE)9}h=1eVVPpplnj=V}N-Y*uWZ1`P@zhY7dJ1r}Z?3jVSBd)NUmjRb4r zf=mb!^k$GbO&F{iJLL5n%@a(m?nf*l5nrO~+P7rlG#Gv#QpK~7?;=&0AQ@2m#hefq z^eKbAvcKL2w`yXjGuZ+9p|8bbFF|`kKclRU^C@g8`@wJ4B>n z>qmk?l5OrYvBEcSleATTM-g@1g84n;t-a}`H?Ay~FLUT>YS4KQM-lDED2~NwWaWPB zp!++jpz;}m&r;pRmGkp}PQP&%Z{}hA-iXfPqFgr(RKM#KGm zY(G+0%^k%kMbk3Mo?3-UntSPDg{KXe;xjq@BcQW#xrUioKOOWDMZ$L$rHki_c8oq_ zuu4hA(et~Vtljz%pd1B2K7-Q!eIt+lR)Q;Yqj|(p$VHHd!`6+hhMoS&i{u0GS|-lE7r0@db0S+T$2)avbVl2{k)`r*7kl%%cLK>y4NL1jU`KANMq?DBHm zh$ifsoMn=<(?fU5RI&yJ9ucDngw<-cWFE`3pkVZKZ7CW%YLRC=UNH4uBbT)<`8zJM zXj1iQkYJVC>z6+WPXl)!*Ie&P(C97;{P_iN+D!@rh+7P|z%zc|m)J0UyekYg;0mD~ zgK%IN?tyUHDM~Q0cu7r37{l3gjVzeWZQ8F7&lM;;ym|KC;@AN%IIT^5WJnxmS|kTs z8hW;7!n6KbPW1f+gmJ6qNfR;trjv}VhBXb|$om0$b8AC)K|rsKrP%iX^ex%*$or8< z)n#^-r^9nlN))a>ZTcBS1Ln@lz)-5EW%}81MTX3y4234yhV*^5Mck^M7Jl9rw~$e* z2+WlmI!}|K>L*DcNSWmZA6tL6G zPB)4H7eORT>W$>n)lkBxAPb7yP#ANtHTErP*qCg>5(UfsRTTLhhY`rZ=e9NIli{cc z&dLsF%V9@_DuJrxklI9f)W^vsf8}eq9#Ah~`-q=@Kn~{8!Oh>QnhH6`{tz<8Eu_~< z%y@m*a;4Iqio}E%+B%RO2yKH5RD%t9B=&MlLe0u*s(wsd>{c5@yndOj0EIntw9Ob1Oy8pfzSk?x& zGZvnIe_p&&>!f*X0a(7)Q&+E|&qOr1wlh44{P-1J@1UaVCk@Y!+*xdiRw1 zk7f(N3~0=P490WFzodsQ%amW)Gg51G5kp}>Dy4B05v>HyEMNqNAomrl!Wi~slObNt4lxRdP zn^Kb9PiEyEC?oE_4XLcovI`db7#(fWiFWgq|3BC|O^Wdd1cL zRLFZe_f)&eqjtd#A<3i8_gi9OVz`#Lh3e{WRIeA^@p6A}YUF>NchL0iqhW=<3l3!( zd6uc~a|722>wA$nX}56HM(ez0#?XXY`7=<^vQ9CjwsXN?!enxX=4I)7k@KVpopW%R z2^W9iPX;w5OT*onL%b@z8ol?`@zc4emI&K#P9x7UO#}ui3WaJCyCZ33GwdWg)Hn{q^X;L?X$X9{%5b{w+O1Z(|K@$jluFGc%?x=SNBvRC3ZFB zZ0q|{pX>;sWKdS?IlT4h^ad_RZACSkvhn7J6?i15yzZk^m_JUocz}DwwAPzndW*Um zZw_R6+cnRv&ek(SYHPr*Ve~`xQUBYXRLL+GTt3R-gu?JjY#YkQKuc>q%3|$dCiQL` zDEocB(c34C`#Lk(-(>ce*P+qOz$Dqe=>4$%reofX^3w0GbVAbZ z*jYGahvj_$r$aoS-m!c4HMX=y;;2{L7tC|FhwYl^+n)0_D9ya-rNG{rL+vfXKm_U2 zRNPJg6G0EFm49718)js&`>~tg#{ue3J(~_m+qu`@oc3VwEvK!gAUv#7!k$V(e7O{H zMnlFfWAEZRsMxQ%XaJu}ic0xv8{xt97?!9EoX!1bzfL9U?SocSfQiLWP4Y2?=G19! z6ecvhS*DXl;1Awemwd0O5x#GZyIpo~GTXg8H+}jcZG)LoII*3Q9sI{sh*kZ<#vE?c zbxoOA@Hom#y*fp$wtxKTJ-&VU4=uuV{iY^bw|47L7`aaO6;q`*IXvCx*O$yQ$&X)Mv(VgM{#?88_d#%hzvJJ$s(ZucjoTi&g!CU zZ>Q@{Bt}&uXd-=joi;_XsPpYF5dw`Tu2#JULA~4Oux=AtYv*l+YG0k&{&o0P$*ST>jLh5tiSwWycbFA!NqJIT(|l3`XBQBezb`+pC|2H(KBnN=1SLx_Pz4qB3(&Ss3$(W)BPM$@Jj z;QQ&*D}8en@ciTO4%oWb*eYR(dx)76j>aA8>(z+}U{b#>RZL?pMveU0*rye}kYgWG zSUJdW%&-B{MNRy*@Cq(iTnUfXV{YIA`xdv;l49fgCe8%-GO2CUzSc_m=l+chvj_=M zgg5ibe%b1$-JI2k9buXSH9r&6n(uX39gk^UG>h(GjpbStN;BhL<+d259s6@M-`DnE zKrMgI*=!?1u~8y_)U9u>&Rbw$yNM4?#ti3>>Q7rpe>+HpwXOvByMzzyq)3MaGj}zH z(KZuZt+k`O9*EamG)r?-_fQy~GG%d)eV7`%D`|2!?Kv-+OXI7tAr*U>S0-RiMdO~X# z6oP*Dc0$cL@g8%C_GuRrF1{<(LLj$xoIV)rkdN8D4)l|=QRO_5`Kv!_b^RDbrwBFA z8S*$v#3x*TNfLFzOe_1x2bus`&tFC(Ykz8$`Sh7792_U`7-gR>UhjZwxpog8Pk!sV z(+Ibce*Z;H?V?mQIPynm>{R^$PE}!F!{sON-rO*L%hFPD!{ut)8l(?FmGAB!x|Q)d z|83PlK!n4YNx#1wCDJBPoL}j;UuIsNTKeM+YFwk4Y#X7+JXxPnoS(Te>Q&A=#1&GM z-@N_>ei{`3>PY8=z*)!1R0~jUmzF|qds<0u#ar`{c>X9&pCpyhm)=0*n!o>$rsQcQg?^~Dw; ztFe=-wp${xv68tpOD$i>*A#zl4@naRwXY|p7r8C}QqBWy{?o1rnzl5egJY-kHlDwS zu=)=!)5O95{ERyaPF7`Ij@O-j9k#=E*pT(_;EK_H9QE@D+eI1H7_lxM$#wRhKZq}W zz8m}&!vFiSe`N+#BlyQJ7sJ$OxfJL)PxKA2GDjTfFJP5~7wpmacw_XsMgCCdA+QAF zr@L~SI+QoPEbLm-1fMU&e-2qbHR2d;(d@f$mZe~hsCG>~#sj!-b_CYh&-rL|%GfFy z9<91@M1RQ$g;rXZRMX1dzdY&v^EWsl$9L?zXHJ%svNWJ`#<*0~{G2TR-OZ6-9}0XF(BMcY z>tHV;FPL#ZKkI*T^J~JEJ!SRGQN)b(0oG^1L{0y*i#6^4+Z*kl^E~DRFaeIjUQ-8I z&;06+_0UiA@Za5F|95eCtFsJ)t5g%THtUf9B@Ub&K=& zf4#4#Bv63uBjqI=__~uqkGDJEzdhE7G)u(koSIg1~RO+-ZXdOY-(}u!wRg zu1qEEk8b|BaAzvkYcD!pex4k>?n-EV8-17caKs(l3V3*gl3aS!jU@n8_sbh>#A?s- zDCN$Fz|lTl`KI*k;xsoX#caHs#nSmuPYb)t8%L^?%j*_R0_H{oMdLIq>O?Myf~R91 z5`Kw+?O!tt#PNS+wfV2{i@=#v^QL54EG-1+tnqV`REv_XtmfN$Q_A11!BuABIgf{% zWkn=AGoF=t1Pc6G7r|Hmd;Kece;KK(RW0p_$Qrr3HXT-% QVf6r|Yl^J6=6L^q0Vnh9NdN!< diff --git a/frontend-assets/starthere.svg b/frontend-assets/starthere.svg deleted file mode 100644 index 530a385..0000000 --- a/frontend-assets/starthere.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - diff --git a/frontend/.editorconfig b/frontend/.editorconfig new file mode 100644 index 0000000..6e87a00 --- /dev/null +++ b/frontend/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..ee5c9d8 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,39 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..c28fd87 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,27 @@ +# NetconfToolDevkit + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.2.9. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/frontend/_netopeer-common.scss b/frontend/_netopeer-common.scss deleted file mode 100644 index 99e75bd..0000000 --- a/frontend/_netopeer-common.scss +++ /dev/null @@ -1,134 +0,0 @@ -@import "./colors"; - -$colorSuccess: #def2de; -$colorSuccessBorder: green; -$colorFailure: #f2dede; -$colorFailureBorder: red; - -a:not([href]) { - cursor: pointer; - text-decoration: underline; - font-weight: bold; -} - -.netopeer-content { - display: block; - padding: 0.7em 1em 1em 2em; - background-color: $colorBackground; - color: $black; -} - -.msg-rounded { - border-radius: 5px; -} - -.msg-close { - padding-right: 10px; - padding-left: 10px; - font-weight: bold; - font-family: monospace; - font-size: large; - cursor: pointer; - height: 1em; -} - -.msg-success { - background-color: $colorSuccess; - color: $colorSuccessBorder; - padding: 5px 1em 5px 0em; - - .msg-close { - color: $colorSuccessBorder; - } -} - -.msg-failure { - background-color: $colorFailure; - color: $colorFailureBorder; - padding: 5px 1em 5px 0em; - - .msg-close { - color: $colorFailureBorder; - } -} - -.tab-add, -.tab-reload, -.tab-close { - cursor: pointer; - font-weight: bold; - font-family: monospace; - font-size: large; -} -.tab-action-first { - padding-left: 0.3em; -} -.tab-action-last { - padding-right: 0.5em; -} - -.tab-icon { - vertical-align: middle; - height: 1em; -} - -.tab-add { - filter: invert(100%); - - &:hover { - color: $green; - } -} - -.keyword { - font-weight: bold; -} - -.modal-header, .modal-footer { - background-color: $colorMain; - color: $colorTextInverse; -} -.modal-header { - border-radius: 3px 3px 0 0; -} -.modal-footer { - border-radius: 0 0 3px 3px; -} -.modal-title { - color: $colorTextInverse; -} - -.tab-close:hover { - color: $colorFailureBorder; -} -.tab-reload:hover { - color: blue; -} - -#subnav { - position: fixed; - width: 100%; - background-color: $colorMain; - padding-left: 1em; - - a { - cursor: pointer; - text-decoration: none; - display: inline-block; - padding: 0.2em 0 0.1em 1em; - color: $colorTextInverse; - - &:visited, - &:link { - color: inherit; - } - &:hover, - &.active { - background-color: $colorBackground; - color: $colorText; - } - &active:hover { - cursor: default; - } - } -} \ No newline at end of file diff --git a/frontend/angular-shared.json b/frontend/angular-shared.json new file mode 100644 index 0000000..e29fa72 --- /dev/null +++ b/frontend/angular-shared.json @@ -0,0 +1,18 @@ +{ + "projects": { + "liberouter-gui": { + "architect": { + "build": { + "options": { + "scripts": [ + + "node_modules/systemjs/dist/s.js", + "node_modules/systemjs/dist/extras/named-register.js", + "node_modules/systemjs/dist/extras/amd.js" + ] + } + } + } + } + } +} diff --git a/frontend/angular.json b/frontend/angular.json new file mode 100644 index 0000000..570e83a --- /dev/null +++ b/frontend/angular.json @@ -0,0 +1,214 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "netconf-tool-devkit": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "nc", + "schematics": {}, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/netconf-tool-devkit", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "styles": [ + "src/styles.css" + ], + "scripts": [ + "node_modules/systemjs/dist/s.js", + "node_modules/systemjs/dist/extras/named-register.js", + "node_modules/systemjs/dist/extras/amd.js" + ] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "netconf-tool-devkit:build" + }, + "configurations": { + "production": { + "browserTarget": "netconf-tool-devkit:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "netconf-tool-devkit:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "src/karma.conf.js", + "styles": [ + "src/styles.css" + ], + "scripts": [], + "assets": [ + "src/favicon.ico", + "src/assets" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "netconf-tool-devkit-e2e": { + "root": "e2e/", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "netconf-tool-devkit:serve" + }, + "configurations": { + "production": { + "devServerTarget": "netconf-tool-devkit:serve:production" + } + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "netconf-lib": { + "root": "projects/netconf-lib", + "sourceRoot": "projects/netconf-lib/src", + "projectType": "library", + "prefix": "nclib", + "architect": { + "build": { + "builder": "@angular-devkit/build-ng-packagr:build", + "options": { + "tsConfig": "projects/netconf-lib/tsconfig.lib.json", + "project": "projects/netconf-lib/ng-package.json" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/netconf-lib/src/test.ts", + "tsConfig": "projects/netconf-lib/tsconfig.spec.json", + "karmaConfig": "projects/netconf-lib/karma.conf.js" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/netconf-lib/tsconfig.lib.json", + "projects/netconf-lib/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "tools": { + "root": "projects/tools/", + "sourceRoot": "projects/tools/src", + "projectType": "application", + "prefix": "app", + "schematics": {}, + "architect": { + "build": { + "builder": "./builders:plugin", + "options": { + "outputPath": "dist/tools", + "index": "projects/tools/src/index.html", + "main": "projects/tools/src/main.ts", + "polyfills": "projects/tools/src/polyfills.ts", + "tsConfig": "projects/tools/tsconfig.app.json", + "assets": [], + "styles": [], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [], + "optimization": true, + "outputHashing": "none", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true + } + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/tools/tsconfig.app.json", + "projects/tools/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "netconf-tool-devkit" +} diff --git a/frontend/builders/builders.json b/frontend/builders/builders.json new file mode 100644 index 0000000..8ec3ad4 --- /dev/null +++ b/frontend/builders/builders.json @@ -0,0 +1,9 @@ +{ + "builders": { + "plugin": { + "class": "./plugin-builder", + "schema": "./plugin-builder/schema.json", + "description": "Plugin Builder" + } + } +} diff --git a/frontend/builders/package.json b/frontend/builders/package.json new file mode 100644 index 0000000..f0b4a5b --- /dev/null +++ b/frontend/builders/package.json @@ -0,0 +1,3 @@ +{ + "builders": "builders.json" +} diff --git a/frontend/builders/plugin-builder/index.js b/frontend/builders/plugin-builder/index.js new file mode 100644 index 0000000..3285a69 --- /dev/null +++ b/frontend/builders/plugin-builder/index.js @@ -0,0 +1,106 @@ +"use strict"; +/** + MIT License + + Copyright (c) 2018 Alexey Zuev + + Available from https://github.com/alexzuza/angular-plugin-architecture/ + + 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. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const build_angular_1 = require("@angular-devkit/build-angular"); +const fs = require("fs"); +const operators_1 = require("rxjs/operators"); +class PluginBuilder extends build_angular_1.BrowserBuilder { + patchEntryPoint(contents) { + fs.writeFileSync(this.entryPointPath, contents); + } + buildWebpackConfig(root, projectRoot, host, options) { + const { pluginName, sharedLibs } = this.options; + if (!this.options.modulePath) { + throw Error('Please define modulePath!'); + } + if (!pluginName) { + throw Error('Please provide pluginName!'); + } + const config = super.buildWebpackConfig(root, projectRoot, host, options); + // Make sure we are producing a single bundle + delete config.entry.polyfills; + delete config.optimization.runtimeChunk; + delete config.optimization.splitChunks; + delete config.entry.styles; + config.externals = { + rxjs: 'rxjs', + '@angular/common/http': 'ng.http', + '@angular/core': 'ng.core', + '@angular/common': 'ng.common', + '@angular/forms': 'ng.forms', + '@angular/router': 'ng.router', + tslib: 'tslib', + 'socket.io-client': 'socket.io-client', + }; + if (sharedLibs) { + config.externals = [config.externals]; + const sharedLibsArr = sharedLibs.split(','); + sharedLibsArr.forEach(sharedLibName => { + const factoryRegexp = new RegExp(`${sharedLibName}.ngfactory$`); + config.externals[0][sharedLibName] = sharedLibName; // define external for code + config.externals.push((context, request, callback) => { + if (factoryRegexp.test(request)) { + return callback(null, sharedLibName); // define external for factory + } + callback(); + }); + }); + } + const ngCompilerPluginInstance = config.plugins.find(x => x.constructor && x.constructor.name === 'AngularCompilerPlugin'); + if (ngCompilerPluginInstance) { + ngCompilerPluginInstance._entryModule = this.options.modulePath; + } + // preserve path to entry point + // so that we can clear use it within `run` method to clear that file + this.entryPointPath = config.entry.main[0]; + const [modulePath, moduleName] = this.options.modulePath.split('#'); + const factoryPath = `${modulePath.includes('.') ? modulePath : `${modulePath}/${modulePath}`}.ngfactory`; + const entryPointContents = ` + export * from '${modulePath}'; + export * from '${factoryPath}'; + import { ${moduleName}NgFactory } from '${factoryPath}'; + export default ${moduleName}NgFactory; + `; + this.patchEntryPoint(entryPointContents); + config.output.filename = `${pluginName}.js`; + config.output.library = pluginName; + config.output.libraryTarget = 'umd'; + // workaround to support bundle on nodejs + config.output.globalObject = `(typeof self !== 'undefined' ? self : this)`; + return config; + } + run(builderConfig) { + this.options = builderConfig.options; + // I don't want to write it in my scripts every time so I keep it here + builderConfig.options.deleteOutputPath = false; + return super.run(builderConfig).pipe(operators_1.tap(() => { + // clear entry point so our main.ts is always empty + this.patchEntryPoint(''); + })); + } +} +exports.default = PluginBuilder; diff --git a/frontend/builders/plugin-builder/index.ts b/frontend/builders/plugin-builder/index.ts new file mode 100644 index 0000000..1483821 --- /dev/null +++ b/frontend/builders/plugin-builder/index.ts @@ -0,0 +1,162 @@ +/** + MIT License + + Copyright (c) 2018 Alexey Zuev + + Available from https://github.com/alexzuza/angular-plugin-architecture/ + + 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. + */ + +import { + BrowserBuilder, + NormalizedBrowserBuilderSchema +} from '@angular-devkit/build-angular'; +import { Path, virtualFs } from '@angular-devkit/core'; +import * as fs from 'fs'; +import { Observable } from 'rxjs'; + +import { BuilderConfiguration, BuildEvent } from '@angular-devkit/architect'; +import { tap } from 'rxjs/operators'; + +interface PluginBuilderSchema extends NormalizedBrowserBuilderSchema { + /** + * A string of the form `path/to/file#exportName` that acts as a path to include to bundle + */ + modulePath: string; + + /** + * A name of compiled bundle + */ + pluginName: string; + + /** + * A comma-delimited list of shared lib names used by current plugin + */ + sharedLibs: string; +} +export default class PluginBuilder extends BrowserBuilder { + private options: PluginBuilderSchema; + + private entryPointPath: string; + + patchEntryPoint(contents: string) { + fs.writeFileSync(this.entryPointPath, contents); + } + + buildWebpackConfig( + root: Path, + projectRoot: Path, + host: virtualFs.Host, + options: PluginBuilderSchema + ) { + const { pluginName, sharedLibs } = this.options; + + if (!this.options.modulePath) { + throw Error('Please define modulePath!'); + } + + if (!pluginName) { + throw Error('Please provide pluginName!'); + } + + const config = super.buildWebpackConfig(root, projectRoot, host, options); + + // Make sure we are producing a single bundle + delete config.entry.polyfills; + delete config.optimization.runtimeChunk; + delete config.optimization.splitChunks; + delete config.entry.styles; + + config.externals = { + rxjs: 'rxjs', + '@angular/common/http': 'ng.http', + '@angular/core': 'ng.core', + '@angular/common': 'ng.common', + '@angular/forms': 'ng.forms', + '@angular/router': 'ng.router', + tslib: 'tslib', + 'socket.io-client': 'socket.io-client', + // socketService: 'socketService' + // put here other common dependencies + }; + + if (sharedLibs) { + config.externals = [config.externals]; + const sharedLibsArr = sharedLibs.split(','); + sharedLibsArr.forEach(sharedLibName => { + const factoryRegexp = new RegExp(`${sharedLibName}.ngfactory$`); + config.externals[0][sharedLibName] = sharedLibName; // define external for code + config.externals.push((context, request, callback) => { + if (factoryRegexp.test(request)) { + return callback(null, sharedLibName); // define external for factory + } + callback(); + }); + }); + } + + const ngCompilerPluginInstance = config.plugins.find( + x => x.constructor && x.constructor.name === 'AngularCompilerPlugin' + ); + if (ngCompilerPluginInstance) { + ngCompilerPluginInstance._entryModule = this.options.modulePath; + } + + // preserve path to entry point + // so that we can clear use it within `run` method to clear that file + this.entryPointPath = config.entry.main[0]; + + const [modulePath, moduleName] = this.options.modulePath.split('#'); + + const factoryPath = `${ + modulePath.includes('.') ? modulePath : `${modulePath}/${modulePath}` + }.ngfactory`; + const entryPointContents = ` + export * from '${modulePath}'; + export * from '${factoryPath}'; + import { ${moduleName}NgFactory } from '${factoryPath}'; + export default ${moduleName}NgFactory; + `; + this.patchEntryPoint(entryPointContents); + + config.output.filename = `${pluginName}.js`; + config.output.library = pluginName; + config.output.libraryTarget = 'umd'; + // workaround to support bundle on nodejs + config.output.globalObject = `(typeof self !== 'undefined' ? self : this)`; + + return config; + } + + run( + builderConfig: BuilderConfiguration + ): Observable { + this.options = builderConfig.options; + // I don't want to write it in my scripts every time so I keep it here + builderConfig.options.deleteOutputPath = false; + + return super.run(builderConfig).pipe( + tap(() => { + // clear entry point so our main.ts is always empty + this.patchEntryPoint(''); + }) + ); + } +} diff --git a/frontend/builders/plugin-builder/schema.json b/frontend/builders/plugin-builder/schema.json new file mode 100644 index 0000000..c9bdc72 --- /dev/null +++ b/frontend/builders/plugin-builder/schema.json @@ -0,0 +1,466 @@ +{ + "$schema": "http://json-schema.org/schema", + "title": "Webpack browser schema for Build Facade.", + "description": "Browser target options", + "type": "object", + "properties": { + "modulePath": { + "type": "string", + "description": "Path to module like loadChildren", + "default": "" + }, + "pluginName": { + "type": "string", + "description": "Name of bundled plugin", + "default": "" + }, + "sharedLibs": { + "type": "string", + "description": "A comma-delimited list of shared lib names used by current plugin", + "default": "" + }, + "assets": { + "type": "array", + "description": "List of static application assets.", + "default": [], + "items": { + "$ref": "#/definitions/assetPattern" + } + }, + "main": { + "type": "string", + "description": "The full path for the main entry point to the app, relative to the current workspace.", + "$valueDescription": "fileName" + }, + "polyfills": { + "type": "string", + "description": "The full path for the polyfills file, relative to the current workspace." + }, + "tsConfig": { + "type": "string", + "description": "The full path for the TypeScript configuration file, relative to the current workspace." + }, + "scripts": { + "description": "Global scripts to be included in the build.", + "type": "array", + "default": [], + "items": { + "$ref": "#/definitions/extraEntryPoint" + } + }, + "styles": { + "description": "Global styles to be included in the build.", + "type": "array", + "default": [], + "items": { + "$ref": "#/definitions/extraEntryPoint" + } + }, + "stylePreprocessorOptions": { + "description": "Options to pass to style preprocessors.", + "type": "object", + "properties": { + "includePaths": { + "description": "Paths to include. Paths will be resolved to project root.", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + } + }, + "additionalProperties": false + }, + "optimization": { + "description": "Enables optimization of the build output.", + "oneOf": [ + { + "type": "object", + "properties": { + "scripts": { + "type": "boolean", + "description": "Enables optimization of the scripts output.", + "default": true + }, + "styles": { + "type": "boolean", + "description": "Enables optimization of the styles output.", + "default": true + } + }, + "additionalProperties": false + }, + { + "type": "boolean" + } + ] + }, + "fileReplacements": { + "description": "Replace files with other files in the build.", + "type": "array", + "items": { + "$ref": "#/definitions/fileReplacement" + }, + "default": [] + }, + "outputPath": { + "type": "string", + "description": "The full path for the new output directory, relative to the current workspace.\n\nBy default, writes output to a folder named dist/ in the current project." + }, + "resourcesOutputPath": { + "type": "string", + "description": "The path where style resources will be placed, relative to outputPath.", + "default": "" + }, + "aot": { + "type": "boolean", + "description": "Build using Ahead of Time compilation.", + "default": false + }, + "sourceMap": { + "description": "Output sourcemaps.", + "default": true, + "oneOf": [ + { + "type": "object", + "properties": { + "scripts": { + "type": "boolean", + "description": "Output sourcemaps for all scripts.", + "default": true + }, + "styles": { + "type": "boolean", + "description": "Output sourcemaps for all styles.", + "default": true + }, + "hidden": { + "type": "boolean", + "description": "Output sourcemaps used for error reporting tools.", + "default": false + }, + "vendor": { + "type": "boolean", + "description": "Resolve vendor packages sourcemaps.", + "default": false + } + }, + "additionalProperties": false + }, + { + "type": "boolean" + } + ] + }, + "vendorSourceMap": { + "type": "boolean", + "description": "Resolve vendor packages sourcemaps.", + "x-deprecated": true, + "default": false + }, + "evalSourceMap": { + "type": "boolean", + "description": "Output in-file eval sourcemaps.", + "default": false, + "x-deprecated": true + }, + "vendorChunk": { + "type": "boolean", + "description": "Use a separate bundle containing only vendor libraries.", + "default": true + }, + "commonChunk": { + "type": "boolean", + "description": "Use a separate bundle containing code used across multiple bundles.", + "default": true + }, + "baseHref": { + "type": "string", + "description": "Base url for the application being built." + }, + "deployUrl": { + "type": "string", + "description": "URL where files will be deployed." + }, + "verbose": { + "type": "boolean", + "description": "Adds more details to output logging.", + "default": false + }, + "progress": { + "type": "boolean", + "description": "Log progress to the console while building." + }, + "i18nFile": { + "type": "string", + "description": "Localization file to use for i18n." + }, + "i18nFormat": { + "type": "string", + "description": "Format of the localization file specified with --i18n-file." + }, + "i18nLocale": { + "type": "string", + "description": "Locale to use for i18n." + }, + "i18nMissingTranslation": { + "type": "string", + "description": "How to handle missing translations for i18n." + }, + "extractCss": { + "type": "boolean", + "description": "Extract css from global styles into css files instead of js ones.", + "default": false + }, + "watch": { + "type": "boolean", + "description": "Run build when files change.", + "default": false + }, + "outputHashing": { + "type": "string", + "description": "Define the output filename cache-busting hashing mode.", + "default": "none", + "enum": ["none", "all", "media", "bundles"] + }, + "poll": { + "type": "number", + "description": "Enable and define the file watching poll time period in milliseconds." + }, + "deleteOutputPath": { + "type": "boolean", + "description": "Delete the output path before building.", + "default": true + }, + "preserveSymlinks": { + "type": "boolean", + "description": "Do not use the real path when resolving modules.", + "default": false + }, + "extractLicenses": { + "type": "boolean", + "description": "Extract all licenses in a separate file.", + "default": false + }, + "showCircularDependencies": { + "type": "boolean", + "description": "Show circular dependency warnings on builds.", + "default": true + }, + "buildOptimizer": { + "type": "boolean", + "description": "Enables '@angular-devkit/build-optimizer' optimizations when using the 'aot' option.", + "default": false + }, + "namedChunks": { + "type": "boolean", + "description": "Use file name for lazy loaded chunks.", + "default": true + }, + "subresourceIntegrity": { + "type": "boolean", + "description": "Enables the use of subresource integrity validation.", + "default": false + }, + "serviceWorker": { + "type": "boolean", + "description": "Generates a service worker config for production builds.", + "default": false + }, + "ngswConfigPath": { + "type": "string", + "description": "Path to ngsw-config.json." + }, + "skipAppShell": { + "type": "boolean", + "description": "Flag to prevent building an app shell.", + "default": false, + "x-deprecated": true + }, + "index": { + "type": "string", + "description": "The name of the index HTML file." + }, + "statsJson": { + "type": "boolean", + "description": "Generates a 'stats.json' file which can be analyzed using tools such as 'webpack-bundle-analyzer'.", + "default": false + }, + "forkTypeChecker": { + "type": "boolean", + "description": "Run the TypeScript type checker in a forked process.", + "default": true + }, + "lazyModules": { + "description": "List of additional NgModule files that will be lazy loaded. Lazy router modules will be discovered automatically.", + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }, + "budgets": { + "description": "Budget thresholds to ensure parts of your application stay within boundaries which you set.", + "type": "array", + "items": { + "$ref": "#/definitions/budget" + }, + "default": [] + }, + "profile": { + "type": "boolean", + "description": "Output profile events for Chrome profiler.", + "default": false + }, + "es5BrowserSupport": { + "description": "Enables conditionally loaded ES2015 polyfills.", + "type": "boolean", + "default": false + }, + "rebaseRootRelativeCssUrls": { + "description": "Change root relative URLs in stylesheets to include base HREF and deploy URL. Use only for compatibility and transition. The behavior of this option is non-standard and will be removed in the next major release.", + "type": "boolean", + "default": false, + "x-deprecated": true + } + }, + "additionalProperties": false, + "required": ["outputPath", "index", "main", "tsConfig"], + "definitions": { + "assetPattern": { + "oneOf": [ + { + "type": "object", + "properties": { + "glob": { + "type": "string", + "description": "The pattern to match." + }, + "input": { + "type": "string", + "description": "The input directory path in which to apply 'glob'. Defaults to the project root." + }, + "ignore": { + "description": "An array of globs to ignore.", + "type": "array", + "items": { + "type": "string" + } + }, + "output": { + "type": "string", + "description": "Absolute path within the output." + } + }, + "additionalProperties": false, + "required": ["glob", "input", "output"] + }, + { + "type": "string" + } + ] + }, + "fileReplacement": { + "oneOf": [ + { + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "replaceWith": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["src", "replaceWith"] + }, + { + "type": "object", + "properties": { + "replace": { + "type": "string" + }, + "with": { + "type": "string" + } + }, + "additionalProperties": false, + "required": ["replace", "with"] + } + ] + }, + "extraEntryPoint": { + "oneOf": [ + { + "type": "object", + "properties": { + "input": { + "type": "string", + "description": "The file to include." + }, + "bundleName": { + "type": "string", + "description": "The bundle name for this extra entry point." + }, + "lazy": { + "type": "boolean", + "description": "If the bundle will be lazy loaded.", + "default": false + } + }, + "additionalProperties": false, + "required": ["input"] + }, + { + "type": "string", + "description": "The file to include." + } + ] + }, + "budget": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The type of budget.", + "enum": ["all", "allScript", "any", "anyScript", "bundle", "initial"] + }, + "name": { + "type": "string", + "description": "The name of the bundle." + }, + "baseline": { + "type": "string", + "description": "The baseline size for comparison." + }, + "maximumWarning": { + "type": "string", + "description": "The maximum threshold for warning relative to the baseline." + }, + "maximumError": { + "type": "string", + "description": "The maximum threshold for error relative to the baseline." + }, + "minimumWarning": { + "type": "string", + "description": "The minimum threshold for warning relative to the baseline." + }, + "minimumError": { + "type": "string", + "description": "The minimum threshold for error relative to the baseline." + }, + "warning": { + "type": "string", + "description": "The threshold for warning relative to the baseline (min & max)." + }, + "error": { + "type": "string", + "description": "The threshold for error relative to the baseline (min & max)." + } + }, + "additionalProperties": false, + "required": ["type"] + } + } +} diff --git a/frontend/builders/tsconfig.builders.json b/frontend/builders/tsconfig.builders.json new file mode 100644 index 0000000..1088f22 --- /dev/null +++ b/frontend/builders/tsconfig.builders.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "outDir": "./plugin-builder", + "importHelpers": false, + "sourceMap": false, + "target": "es6" + }, + "files": [ + "./plugin-builder/index.ts" + ] +} diff --git a/frontend/common/loading/loading.component.html b/frontend/common/loading/loading.component.html deleted file mode 100644 index 8c928fc..0000000 --- a/frontend/common/loading/loading.component.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/frontend/common/loading/loading.component.scss b/frontend/common/loading/loading.component.scss deleted file mode 100644 index 4f442f6..0000000 --- a/frontend/common/loading/loading.component.scss +++ /dev/null @@ -1,15 +0,0 @@ -@import '../../netopeer-common'; - -.mat-spinner circle { - stroke:$colorMain; -} - -.mat-progress-bar-background { - background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23B2EBF2%27%2F%3E%3C%2Fsvg%3E") -} -.mat-progress-bar-buffer{ - background-color:$lightGrey; -} -.mat-progress-bar-fill::after{ - background-color:$colorMain; -} diff --git a/frontend/common/loading/loading.component.ts b/frontend/common/loading/loading.component.ts deleted file mode 100644 index b0981a6..0000000 --- a/frontend/common/loading/loading.component.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Component, ViewEncapsulation, Input} from '@angular/core'; - -@Component({ - selector : 'netopeer-loading', - templateUrl : './loading.component.html', - styleUrls : ['./loading.component.scss'], - encapsulation: ViewEncapsulation.None -}) - -export class LoadingComponent { - @Input() spinner = false; - @Input() diameter = 50; - @Input() strokeWidth = 7; -} diff --git a/frontend/common/pipes.ts b/frontend/common/pipes.ts deleted file mode 100644 index 7e7c710..0000000 --- a/frontend/common/pipes.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; - -@Pipe({name: 'noPrefix'}) -export class NoPrefixPipe implements PipeTransform { - transform(value: string): string { - return value.slice(value.indexOf(':') + 1); - } -} - -@Pipe({name: 'prefixOnly'}) -export class PrefixOnlyPipe implements PipeTransform { - transform(value: string): string { - return value.slice(0, value.indexOf(':')); - } -} - -@Pipe({name: 'patternHighlight'}) -export class PatternHighlightPipe implements PipeTransform { - constructor(private _sanitizer:DomSanitizer) {} - - transform(value: string): SafeHtml { - let result = ''; - for(let i = 0; i < value.length; i++) { - if (value[i] == '(' || value[i] == '[' || value[i] == '{') { - result = result.concat(`` + value[i] + ``); - } else if (value[i] == ')' || value[i] == ']' || value[i] == '}') { - let data = value[i]; - if (i + 1 < value.length && (value[i+1] == '?' || value[i+1] == '+' || value[i+1] == '*')) { - i; - data = value.slice(i, i + 2); - i++; - } - result = result.concat(`` + data + ``); - } else { - result = result.concat(value[i]); - } - } - return this._sanitizer.bypassSecurityTrustHtml(result); - } -} \ No newline at end of file diff --git a/frontend/config/config.component.html b/frontend/config/config.component.html deleted file mode 100644 index 3c6d0fe..0000000 --- a/frontend/config/config.component.html +++ /dev/null @@ -1,80 +0,0 @@ -

- -
-Start here with that + sign. -
-

x{{err_msg}}

- - - - - - - - - - - - - -
- v - x - Capability / ModuleVersion
 {{parseCapabilityName(cap)}}{{parseCapabilityRevision(cap)}}
- - - - - - -
 Data
-
- Retrieving data ... -
-
- -
-
- hide status data - show status data -
- - -
-
  -
-
Configuration data were changed. Do you wish to - / - - all changes? -
- -
x{{err['message']}}
-
-
-
-
-
- -
\ No newline at end of file diff --git a/frontend/config/config.component.scss b/frontend/config/config.component.scss deleted file mode 100644 index 5912e12..0000000 --- a/frontend/config/config.component.scss +++ /dev/null @@ -1,49 +0,0 @@ -@import '../netopeer-common'; -@import '../inventory/inventory.component'; -@import './tree.component'; - -#config-data { - cursor: default; - width: 100%; -} - -.item_action_expand, -.item_action_collapse { - height: 1em; -} - -.item_action_collapse:hover { - color: $red; -} - -.item_action_expand:hover { - color: $green; -} - -.modifications-status { - margin-bottom: 2em; - margin-right: 2em; - padding: 0.5em 1em; - - >div { - position: fixed; - bottom: 2em; - right: 2em; - background-color: $colorChanged; - border: 2px solid $colorChangedBorder; - padding: 0 1em; - div { - padding: 0.5em 0; - } - } -} - -.loading { - text-align: center; - margin: auto; - width: 10em; - div { - margin: auto; - width: 50px; - } -} diff --git a/frontend/config/config.component.ts b/frontend/config/config.component.ts deleted file mode 100644 index e8e13d0..0000000 --- a/frontend/config/config.component.ts +++ /dev/null @@ -1,218 +0,0 @@ -import {Component, OnInit} from '@angular/core'; -import { Router } from '@angular/router'; -import { Observable } from 'rxjs/Observable'; - -import {TreeService} from './tree.service'; -import {ModificationsService} from './modifications.service'; -import {SessionsService} from './sessions.service'; -import {Session} from './session'; - -@Component({ - selector: 'netopeer-config', - templateUrl: './config.component.html', - styleUrls: ['./config.component.scss'], - providers: [ModificationsService] -}) - -export class ConfigComponent implements OnInit { - title = 'Configuration'; - activeSession: Session; - err_msg = ""; - commit_error = []; - - constructor(public sessionsService: SessionsService, - public modsService: ModificationsService, - public treeService: TreeService, - private router: Router) {} - - addSession() { - this.router.navigateByUrl('/netopeer/inventory/devices'); - } - - reloadData() { - switch (this.activeSession.dataPresence) { - case 'root': - this.activeSession.data = null; - this.sessionsService.rpcGet(this.activeSession, false); - break; - case 'all': - this.activeSession.data = null; - this.sessionsService.rpcGet(this.activeSession, true); - break; - case 'mixed': - this.sessionsService.rpcGetSubtree(this.activeSession.key, false).subscribe(result => { - let root = this.activeSession.data; - if (result['success']) { - for (let newRoot of result['data']) { - let matchIndex = -1; - for (let i in root['children']) { - if (newRoot['path'] == root['children'][i]['path']) { - matchIndex = Number(i); - break; - } - } - if (matchIndex == -1) { - /* add new subtree */ - root['children'].push(newRoot); - } else { - let subtree = root['children'][matchIndex]; - let filterIndex = this.activeSession.treeFilters.indexOf(subtree['path']); - if (filterIndex != -1) { - /* reloading currently present but not visible subtrees is postponed to the point they are displayed */ - subtree['subtreeRoot'] = true; - delete subtree['children']; - this.activeSession.treeFilters.splice(filterIndex, 1); - this.activeSession.dataPresence = 'root'; - for (let root of this.activeSession.data['children']) { - if (!('subtreeRoot' in root)) { - this.activeSession.dataPresence = 'mixed'; - break; - } - } - } else if (!('subtreeRoot' in subtree)) { - /* reload currently present and visible subtrees */ - subtree['loading'] = true; - this.sessionsService.rpcGetSubtree(this.activeSession.key, true, subtree['path']).subscribe(result => { - subtree['loading'] = false; - if (result['success']) { - for (let iter of result['data']['children']) { - this.treeService.setDirty(this.activeSession, iter); - } - subtree['children'] = result['data']['children']; - this.treeService.updateHiddenFlags(this.activeSession); - this.sessionsService.storeSessions(); - } - }); - } - } - } - } - this.sessionsService.storeSessions(); - }); - } - } - - disconnect(key: string) { - this.sessionsService.close(key).subscribe(result => { - if (result['success']) { - if (!this.sessionsService.activeSession) { - this.router.navigateByUrl('/netopeer/inventory/devices'); - } - this.activeSession = this.sessionsService.getSession(); - } else { - this.err_msg = result['error-msg']; - } - }); - } - - setCpbltsVisibility(value: boolean) { - this.activeSession.cpbltsVisibility = value; - this.sessionsService.storeSessions(); - } - - invertStatus() { - this.activeSession.statusVisibility = !this.activeSession.statusVisibility; - this.sessionsService.storeSessions(); - } - - getCapabilities(key: string) { - if (this.activeSession.cpblts) { - this.activeSession.cpbltsVisibility = true; - this.sessionsService.storeSessions(); - return; - } - this.sessionsService.getCpblts(key).subscribe(result => { - if (result['success']) { - this.activeSession.cpblts = result['capabilities']; - this.activeSession.cpbltsVisibility = true; - } else { - this.activeSession.cpbltsVisibility = false; - this.err_msg = result['error-msg']; - } - this.sessionsService.storeSessions(); - }); - } - - parseCapabilityName(cpblt: string): string { - let name = cpblt; - let pos = cpblt.search('module='); - if (pos != -1) { - /* schema */ - pos += 7; - name = cpblt.slice(pos); - let end = name.search('&'); - if (end != -1) { - name = name.slice(0, end); - } - } else { - /* capability */ - pos = 0; - if (cpblt.match('urn:ietf:params:netconf:capability:*')) { - pos = 34; - } else if (cpblt.match('urn:ietf:params:netconf:*')) { - pos = 23; - } - name = cpblt.slice(pos); - - let end = name.search('\\?'); - if (end != -1) { - name = name.slice(0, end); - } - pos = name.lastIndexOf(':') - name = name.slice(0, pos); - } - return name; - } - - parseCapabilityRevision(cpblt: string): string { - let version = ""; - let pos = cpblt.search('revision='); - if (pos != -1) { - pos += 9; - version = cpblt.slice(pos); - let end = version.search('&'); - if (end != -1) { - version = version.slice(0, end); - } - return version; - } else if (cpblt.match('urn:ietf:params:netconf:*')) { - let end = cpblt.search('\\?'); - if (end != -1) { - cpblt = cpblt.slice(0, end); - } - pos = cpblt.lastIndexOf(':') - version = cpblt.slice(pos + 1); - } - return version; - } - - cancelChanges() { - //console.log(JSON.stringify(this.activeSession.modifications)) - this.modsService.cancelModification(this.activeSession); - this.commit_error = []; - this.sessionsService.storeSessions(); - //console.log(JSON.stringify(this.activeSession.modifications)) - } - - applyChanges() { - //console.log(JSON.stringify(this.activeSession.modifications)) - this.modsService.applyModification(this.activeSession).subscribe(result => { - if (result['success']) { - this.reloadData(); - this.commit_error = []; - } - else { - this.commit_error = result['error']; - } - }); - } - - ngOnInit(): void { - this.sessionsService.checkSessions(); - this.activeSession = this.sessionsService.getSession(); - if (this.activeSession && !this.activeSession.data) { - this.sessionsService.rpcGet(this.activeSession, false); - this.activeSession.dataPresence = 'root'; - } - } -} diff --git a/frontend/config/modifications.service.ts b/frontend/config/modifications.service.ts deleted file mode 100644 index dcf82c0..0000000 --- a/frontend/config/modifications.service.ts +++ /dev/null @@ -1,911 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; -import { Observable } from 'rxjs/Observable'; -import { tap } from 'rxjs/operators'; -import { of } from 'rxjs'; - -import { Session, Node, NodeSchema } from './session'; -import { SessionsService } from './sessions.service'; -import { TreeService } from './tree.service'; - -/** - * Enumeration of the ModificationRecord types. - */ -export const enum ModificationType { - /** Creating a new node */ - Create = "create", - /** Changing value of a current leaf node */ - Change = "change", - /** Delete a current node */ - Delete = "delete", - /** Replacing a current node */ - Replace = "replace", - /** Reordering user-ordered lists or leaf-lists */ - Reorder = "reorder" -} - -/** - * Record of a particular modification on configuration data. - */ -export class ModificationRecord {} - -/** - * Service to handle modification records stored in the Session. The class does not - * provide any storage, it just implements functions to manipulate with the records - * stored in particular Session. - */ -@Injectable() -export class ModificationsService { - - /** - * Initiate services handlers. - * @param sessionsService Handler to get data from the current activeSession. - * @param treeService Handler to control data tree. - * @param router Handler to redirect to other pages. - */ - constructor(private sessionsService: SessionsService, - private treeService: TreeService, - private router: Router) {} - - /** - * Get the Modification record for the given path, if the record does not - * exist, a new one is created and returned to fill. If there are no records - * so far, the Modifications list is created as dictionary. - * @param activeSession Session to work with. - * @param path Identifier of the modified node. - * @returns Modification record for the given path. - */ - createModificationsRecord(activeSession: Session, path: string): ModificationRecord { - if (!activeSession.modifications) { - activeSession.modifications = {}; - } - - if (!(path in activeSession.modifications)) { - activeSession.modifications[path] = new ModificationRecord(); - } - return activeSession.modifications[path]; - } - - /** - * Get the Modification record for the given path, if the record - * exist in the provided activeSession. - * @param activeSession Session to work with. - * @param path Identifier of the modified node. - * @returns Modification record for the specified path or null - * if there is no record for the given path. - */ - getModificationsRecord(activeSession: Session, path: string): ModificationRecord { - if (!activeSession.modifications) { - return null; - } - - if (!(path in activeSession.modifications)) { - return null; - } - return activeSession.modifications[path]; - } - - /** - * Remove the Modification record from the given activeSession. If it - * is the last record, the Modifications list is removed. - * @param activeSession Session to work with. - * @param path Identifier of the modified node. - */ - removeModificationsRecord(activeSession: Session, path: string = null): void { - if (!activeSession.modifications) { - return; - } - - if (path && (path in activeSession.modifications)) { - delete activeSession.modifications[path]; - } - - if (!Object.keys(activeSession.modifications).length) { - delete activeSession.modifications; - } - } - - /** - * Change the key of a particular record in the Modifications list of the - * given activeSession. - * @param activeSession Session to work with. - * @param oldPath The current Identifier of the modified node used as a key. - * @param newPath New value of the key for the Modification record so far - * identified by oldPath. - */ - renameModificationsRecord(activeSession: Session, oldPath: string, newPath: string): void { - let record = this.getModificationsRecord(activeSession, oldPath); - if (record) { - activeSession.modifications[newPath] = record; - delete activeSession.modifications[oldPath]; - } - } - - /** - * Set edit flag of the node to the given set value. - * @param activeSession Session to work with. - * @param node Node to work with. - * @param set True to set, False to unset. - */ - setEdit(activeSession: Session, node: Node, set: boolean = true): void { - let waiting = false; - if (set && node['info']['datatypebase'] == 'empty') { - node['value'] = ''; - return; - } - if (set && !('values' in node['info'])) { - switch (node['info']['datatypebase']) { - case 'bits': - case 'enumeration': - waiting = true; - this.sessionsService.schemaValues(activeSession.key, node).subscribe(result => { - if (result['success']) { - node['info']['values'] = result['data']; - } - node['edit'] = set; - }); - break; - case 'boolean': - node['info']['values'] = ['true', 'false']; - break; - } - /* TODO instance identifiers, leafrefs */ - } - if (!waiting) { - node['edit'] = set; - } - } - - /** - * Checker function to get know if the node was marked as deleted. - * @param node Node to be checked. - * @param value Flag for leaf-lists, true if the specific instance node is - * supposed to be checked, false in case any of the instances counts. - * @returns true if the node was marked as deleted, false otherwise. - */ - isDeleted(node: Node, value: boolean = false): boolean { - if ('deleted' in node) { - return node['deleted']; - } else if (!value && node['info']['type'] == 8) { - for (let item of this.treeService.nodesToShow(this.sessionsService.getSession(), node)) { - if (item['deleted']) { - return true; - } - } - } - return false; - } - - /** - * Checker function to get know if some instance of the list or leaf-list - * was moved (reordered). - * @param activeSession Session to work with. - * @param node Node to be checked. - * @returns true if there is a moved instance of the given list or leaf-list. - */ - isMoved(activeSession: Session, node: Node): boolean { - let path = this.treeService.pathCutPredicate(node['path']); - let record = this.getModificationsRecord(activeSession, path); - if (record && record['type'] == ModificationType.Reorder) { - return true; - } - return false; - } - - /** - * Physically remove the specific node from the parent's child list - * @param activeSession Session to work with - * @param parent Parent to be modified. - * @param childArray Name of the children array: 'children' or 'newChildren' - * @param node Node to be removed. - */ - private deleteChild(activeSession: Session, parent: Node, childArray: string, node: Node): void { - for (let i in parent[childArray]) { - if (parent[childArray][i]['path'] == node['path']) { - parent[childArray].splice(i, 1); - break; - } - } - if (childArray != 'children' && !parent[childArray].length) { - delete parent[childArray]; - } - } - - /** - * Delete the given node from the configuration data. If the node exists - * only in frontend's data (created but not committed), it is physically - * removed. Otherwise, it is marked as deleted (checkable via isDeleted()) - * and Modification record is created. - * @param activeSession Session to work with. - * @param node Node to delete. - */ - delete(activeSession: Session, node: Node): void { - if ('new' in node) { - if (node['info']['ordered']) { - let path = this.treeService.pathCutPredicate(node['path']); - let record = this.getModificationsRecord(activeSession, path); - let siblings = this.treeService.nodesToShow(activeSession, node); - for (let item of siblings) { - if (record && ('reorder' in record)) { - let orig_order = record['reorder'][item['order']]; - if (orig_order > record['reorder'][node['order']]) { - record['reorder'].splice(item['order'], 1, orig_order - 1); - } - } - if (item['order'] > node['order']) { - item['order'] = item['order'] - 1; - } - } - if (record && ('reorder' in record)) { - record['reorder'].splice(node['order'], 1); - let same = true; - for (let item of siblings) { - if (item['order'] != record['reorder'][item['order']]) { - same = false; - break; - } - } - if (same) { - this.removeModificationsRecord(activeSession, this.treeService.pathCutPredicate(node['path'])); - } - } - } - /* removing newly created subtree */ - let parent = this.treeService.nodeParent(activeSession, node); - if ('new' in parent) { - /* removing just a subtree of the created tree */ - this.deleteChild(activeSession, parent, 'children', node); - } else { - this.removeModificationsRecord(activeSession, node['path']); - this.deleteChild(activeSession, parent, 'newChildren', node); - } - } else { - let record = this.createModificationsRecord(activeSession, node['path']); - node['deleted'] = true; - if (!('type' in record)) { - /* new record */ - record['type'] = ModificationType.Delete; - record['original'] = node; - node['dirty'] = true; - } else if (record['type'] == ModificationType.Change) { - record['type'] = ModificationType.Delete; - node['value'] = record['original']; - delete record['original']; - delete record['value']; - } - } - } - - /** - * Change value of the given leaf Node. If the Node exists only in - * frontend's data (created but not committed), the changed value will be - * reflected in the create modification record. Otherwise, new record is - * created. - * @param activeSession Session to work with. - * @param node Leaf node to be changed. - * @param leafValue New value of the leaf node - */ - change(activeSession: Session, node: Node, leafValue: string) { - let record = null; - if (!('new' in node)) { - record = this.createModificationsRecord(activeSession, node['path']); - if (!('type' in record)) { - /* new record */ - if (node['value'] == leafValue) { - /* no change to the original value */ - this.setEdit(activeSession, node, false); - this.removeModificationsRecord(activeSession); - return; - } - record['type'] = ModificationType.Change; - record['original'] = node['value']; - record['value'] = leafValue; - node['dirty'] = true; - } else if (record['type'] == ModificationType.Change && record['original'] == leafValue) { - /* change back to the original value, remove the change record */ - this.removeModificationsRecord(activeSession, node['path']); - node['dirty'] = false; - } else { - /* another change of existing change record */ - record['value'] = leafValue; - node['dirty'] = true; - } - } else if (node['info']['type'] == 8) { - record = this.getModificationsRecord(activeSession, node['path']); - let newPath = node['path'].slice(0, node['path'].lastIndexOf('[')) + '[.=\'' + leafValue + '\']'; - this.renameModificationsRecord(activeSession, node['path'], newPath); - node['path'] = newPath - } else if (node['info']['key']) { - let parent = this.treeService.nodeParent(activeSession, node); - parent['keys'].splice(parent['info']['keys'].indexOf(node['info']['name']),1, leafValue); - - /* hack to render changed keys of list - go to some other page and then come back */ - this.router.navigateByUrl('/netopeer').then(() => {this.router.navigateByUrl('/netopeer/config');}); - } - - node['value'] = leafValue; - this.setEdit(activeSession, node, false); - } - - /** - * Open creating dialogue by setting necessary flags on given parent node. - * @param activeSession Session to work with. - * @param schemas List of available schema nodes for the node's children. - * @param node Parent node where a new children is supposed to be created. - */ - createOpen(activeSession: Session, schemas: NodeSchema[], node: Node): void { - //console.trace(); - node['schemaChildren'] = schemas; - node['creatingChild'] = {}; - - if (schemas.length) { - let children = this.treeService.childrenToShow(node); - if (children.length) { - let last = children[children.length - 1]; - if (last['info']['type'] == 16) { - let instances = this.treeService.getInstances(activeSession, last); - last = instances[instances.length - 1]; - } - delete last['last']; - if (last['info']['type'] == 8) { - for (let sibling of this.treeService.getInstances(activeSession, last)) { - if ('last' in sibling) { - continue; - } - delete sibling["lastLeafList"]; - } - } - } - } - } - - /** - * Set the 'last' flag to the correct child node, does not remove the flag - * on wrong children. Correctly goes thogh both, 'children' as well as - * 'newChildren' lists. - * @param activeSession Session to work with. - * @param parent Parent node to be processed. - */ - private maintainLast(activeSession: Session, parent: Node): void { - if ('schemaChildren' in parent) { - return; - } - let children = this.treeService.childrenToShow(parent); - if (children.length) { - let last = children[children.length - 1]; - if (last['info']['type'] == 16) { - let instances = this.treeService.getInstances(activeSession, last); - last = instances[instances.length - 1]; - } - last['last'] = true; - if (last['info']['type'] == 8) { - for (let sibling of this.treeService.getInstances(activeSession, last)) { - if ('last' in sibling) { - continue; - } - sibling["lastLeafList"] = true; - } - } - } - } - - /** - * Close creating dialogue by removing flags from the given parent node. - * @param activeSession Session to work with. - * @param node Parent node where the creating dialogue was opened - * @param abort Flag if the dialogue is closed due to abort or as success close. - */ - createClose(activeSession: Session, node: Node, abort:boolean = true): void { - //console.trace(); - if (abort && node['schemaChildren'].length) { - this.maintainLast(activeSession, node); - } - delete node['creatingChild']; - delete node['schemaChildren']; - } - - /** - * Get free position number for the list instance. Taken as a successor of the - * highest id of the sibling list instances. - * @param parent Parent node where a new list instance will be inserted. - * @param path Path of the list to identify instances of the specific list - * @return free position for the new instance (starts by 1) - */ - private list_nextpos(parent: Node, path: string): number { - let search; - if ('new' in parent) { - search = parent['children']; - } else { - search = parent['newChildren']; - } - let pos = 1; - if (search.length) { - for (let sibling of search) { - if (sibling['path'].substr(0, path.length + 1) == path + '[') { - let n = parseInt(sibling['path'].substring(path.length + 1)); - if (n >= pos) { - pos = n + 1; - } - } - } - } - return pos; - } - - /** - * Generate correct name for the schema node (so prefixed if needed) - * @param parent Schema node of the parent. - * @param child Schema node of the node to be processed. - */ - schemaName(parent: NodeSchema, node: NodeSchema): string { - if (parent['module'] != node['module']) { - return node['module'] + ':' + node['name']; - } else { - return node['name']; - } - } - - /** - * Create new node in given parent. If the parent Node exists only in - * frontend's data (created but not committed), the child is inserted into - * the 'children' list and no new Modification record is created - the node - * will be created as part of creating the parent's subtree. Otherwise, the - * child is inserted in 'newChildren' list and new record is created. In - * case of creating list, all its keys are also created. - * @param activeSession Session to work with. - * @param parent Parent node where a new child is supposed to be created. - * @param index Index in the 'schemaChildren' list specifying which node is supposed to be created. - */ - create(activeSession: Session, parent: Node, index: number): void { - //console.trace(); - let newNode = {}; - newNode['new'] = true; - newNode['info'] = parent['schemaChildren'][index]; - if (parent['path'] == '/') { - newNode['path'] = '/' + this.schemaName(parent['info'], newNode['info']); - } else { - newNode['path'] = parent['path'] + '/' + this.schemaName(parent['info'], newNode['info']); - } - newNode['dirty'] = true; - - if ('new' in parent) { - if (!('children' in parent)) { - parent['children'] = []; - } - parent['children'].push(newNode); - } else { - if (!('newChildren' in parent)) { - parent['newChildren'] = []; - } - parent['newChildren'].push(newNode); - } - - switch(newNode['info']['type']) { - case 1: /* container */ - parent['schemaChildren'].splice(index, 1); - - newNode['children'] = []; - /* open creation dialog for nodes inside the created container */ - this.sessionsService.childrenSchemas(activeSession.key, newNode).subscribe(result => { - this.createOpen(activeSession, result, newNode); - }); - break; - case 4: /* leaf */ - parent['schemaChildren'].splice(index, 1); - - if ('default' in newNode['info']) { - newNode['value'] = newNode['info']['default']; - } - this.setEdit(activeSession, newNode, true); - break; - case 8: /* leaf-list */ - /* check number of instances, if first, mark this as the first leaf-list instance */ - newNode['first'] = true; /* make nodesToShow working */ - let siblings = this.treeService.nodesToShow(activeSession, newNode); - if (siblings.length != 1) { - delete newNode['first']; - } - if (newNode['info']['ordered']) { - newNode['order'] = siblings.length - 1; - } - if (newNode['info']['ordered']) { - let record = this.getModificationsRecord(activeSession, newNode['path']); - if (record && ('reorder' in record)) { - record['reorder'].push(record['reorder'].length); - } - } - - newNode['path'] = newNode['path'] + '[' + this.list_nextpos(parent, newNode['path']) + ']'; - this.setEdit(activeSession, newNode, true) - break; - case 16: /* list */ - if (newNode['info']['ordered']) { - let siblings = this.treeService.nodesToShow(activeSession, newNode); - newNode['order'] = siblings.length - 1; - } - if (newNode['info']['ordered']) { - let record = this.getModificationsRecord(activeSession, newNode['path']); - if (record && ('reorder' in record)) { - record['reorder'].push(record['reorder'].length); - } - } - newNode['path'] = newNode['path'] + '[' + this.list_nextpos(parent, newNode['path']) + ']'; - newNode['keys'] = []; - for (let key of newNode['info']['keys']) { - newNode['keys'].push(""); - } - newNode['children'] = []; - /* open creation dialog for nodes inside the created list */ - this.sessionsService.childrenSchemas(activeSession.key, newNode).subscribe(result => { - if (result && result.length) { - this.createOpen(activeSession, result, newNode); - } - - for (let key of newNode['info']['keys']) { - for (let i in newNode['schemaChildren']) { - if (newNode['schemaChildren'][i]['name'] == key && newNode['schemaChildren'][i]['module'] == newNode['info']['module']) { - let newKey = {}; - newKey['new'] = true; - newKey['info'] = newNode['schemaChildren'][i]; - newKey['path'] = newNode['path'] + '/' + this.schemaName(newNode['info'], newKey['info']); - newKey['dirty'] = true; - this.setEdit(activeSession, newKey, true) - newNode['children'].push(newKey) - newNode['schemaChildren'].splice(i, 1); - if (!newNode['schemaChildren'].length) { - newKey['last'] = true; - this.createClose(activeSession, newNode, false); - } - } - } - } - }); - - break; - } - - if (!parent['schemaChildren'].length) { - newNode['last'] = true; - this.createClose(activeSession, parent, false); - } - - if (!('new' in parent)) { - /* store the record about the newly created data */ - let record = this.createModificationsRecord(activeSession, newNode['path']); - if (('type' in record) && record['type'] == ModificationType.Delete) { - record['type'] = ModificationType.Replace; - delete record['original']['deleted']; - for (let i in parent['children']) { - if (parent['children'][i] == record['original']) { - parent['children'].splice(i, 1); - break; - } - } - } else { - record['type'] = ModificationType.Create; - } - record['data'] = newNode; - } - //console.log(node) - } - - /** - * Cancel modification record connected with the given node. - * @param activeSession Session to work with. - * @param node Node element whose modification record will be removed. - * @param recursion Flag to recursively process the node's subtree - * @param reorder Boolean flag to remove also the reorder modification - * connected with all the instances of the given node's schema node. - * @param firstcall Flag for top level call to control recursion, do not - * use outside the function itself - */ - cancelModification(activeSession: Session, node: Node = activeSession.data, - recursion: boolean = true, reorder: boolean = true, firstcall: boolean = true): void { - if ('creatingChild' in node) { - delete node['creatingChild']; - } - if ('deleted' in node) { - delete node['dirty']; - delete node['deleted']; - } - - let parent = this.treeService.nodeParent(activeSession, node); - if ('new' in node) { - if (node['info']['type'] == 1 || node['info']['type'] == 4) { - /* fix the list of nodes to create in parent */ - let schemas; - if (!('schemaChildren' in parent)) { - schemas = []; - } else { - schemas = parent['schemaChildren']; - } - schemas.push(node['info']); - this.createOpen(activeSession, schemas, parent) - } - - /* removing newly created subtree */ - this.delete(activeSession, node); - } else if (activeSession.modifications) { - let record = this.getModificationsRecord(activeSession, node['path']); - if (record) { - delete node['dirty']; - if (record['type'] == ModificationType.Change) { - node['value'] = record['original']; - } - this.removeModificationsRecord(activeSession, node['path']); - if (!activeSession.modifications) { - return; - } - } - if (reorder) { - let path = this.treeService.pathCutPredicate(node['path']); - let record = this.getModificationsRecord(activeSession, path); - if (record) { - for (let item of this.treeService.getInstances(activeSession, node)) { - item['order'] = record['reorder'][item['order']]; - delete item['last']; - } - this.removeModificationsRecord(activeSession, path); - } - } - } - - /* recursion */ - if (recursion && 'children' in node) { - if ('newChildren' in node) { - for (let child of node['newChildren']) { - let record = this.getModificationsRecord(activeSession, child['path']); - if (record['type'] == ModificationType.Change) { - node['children'].push(record['original']) - } - this.removeModificationsRecord(activeSession, child['path']); - if (child['info']['ordered']) { - let path = this.treeService.pathCutPredicate(child['path']); - this.removeModificationsRecord(activeSession, path); - } - } - delete node['newChildren']; - } - for (let child of node['children']) { - delete child['last']; - delete child['moved']; - this.cancelModification(activeSession, child, true, reorder, false); - if (child['info']['ordered']) { - /* revert order change */ - let path = this.treeService.pathCutPredicate(child['path']); - let record = this.getModificationsRecord(activeSession, path); - if (record) { - let nodes = this.treeService.nodesToShow(activeSession, child); - for (let i in nodes) { - nodes[i]['order'] = record['reorder'][i]; - } - this.removeModificationsRecord(activeSession, path); - } - } - } - this.maintainLast(activeSession, node); - } - if (firstcall) { - this.maintainLast(activeSession, parent); - } - } - - /** - * Check presence of the necessary keys in lists and update its predicate if safe. - * @param node Root node where to start checking - * @param top internal recursion flag, do not use - * @return null in case of success, error message in case of error. - */ - private resolveKeys(node: Node, top: boolean = true): string { - if (node['info']['type'] == 16) { - if (!('children' in node) || !node['children'].length) { - return 'no key in ' + node['path']; - } - let count = node['info']['keys'].length; - if (node['children'].length != count || !node['children'][count - 1]['info']['key']) { - return 'invalid number (expected ' + count + ') of keys in ' + node['path']; - } - } - - /* recursion */ - if (node['info']['type'] == 16 || node['info']['type'] == 1) { - for (let i in node['children']) {; - if (node['children'][i]['info']['type'] == 4) { - /* leaf */ - if (!('value' in node['children'][i])) { - if (node['children'][i]['info']['key']) { - return 'not confirmed value of the ' + node['children'][i]['path'] + ' key.'; - } - console.log('not confirmed node ' + node['children'][i]['path'] + ', removing it'); - node['children'].splice(i, 1); - } - } else if (node['children'][i]['info']['type'] == 8) { - /* leaf-list */ - if (!('value' in node['children'][i])) { - console.log('not confirmed node ' + node['children'][i]['path'] + ', removing it'); - node['children'].splice(i, 1); - } - } else { - /* recursion */ - let msg = this.resolveKeys(node['children'][i], false); - if (msg) { - return msg; - } - } - } - } - - /* update predicate in path */ - if (node['info']['type'] == 16 && top) { - node['path'] = node['path'].slice(0, node['path'].lastIndexOf('[')) - for (let i in node['info']['keys']) { - node['path'] = node['path'] + '[' + node['info']['keys'][i] + '=\'' + node['children'][i]['value'] + '\']' - } - } else if (node['info']['type'] == 8 && top) { - node['path'] = node['path'].slice(0, node['path'].lastIndexOf('[') + 1) + '.=\'' + node['value'][0] + '\']' - } - return null; - } - - /** - * Find the position of the highest absolute distance of the moved nodes. - * @param nodes Array of user-ordered lists or leaf-lists with counted - * distance information - * @return Index in the given array of a node with the highest absolute - * distance value - */ - private getHighestDistIndex(nodes: Node[]): number { - let val = 0; - let pos = -1; - for (let i in nodes) { - let x = Math.abs(nodes[i]['dist']) - if (x > val) { - val = x; - pos = Number(i); - } - } - return pos; - } - - /** - * Create complete list predicate with all its keys - * @param list Node to process - * @return Predicate string. - */ - private listPredicates(list: Node): string { - let result = ""; - for (let key of list['children']) { - if (!('key' in key['info'])) { - break; - } - result.concat('[' + this.treeService.moduleName(key) + ':' + key['info']['name'] + '=\'' + key['value'] + '\']'); - } - return result; - } - - /** - * Apply all the modification records of the given session by sending them to the backend. - * @param activeSession Session whose Modification records will be applied - * @return Received backend's result message - */ - applyModification(activeSession: Session) { - for (let mod in activeSession.modifications) { - //console.log(JSON.stringify(mod)); - if (!('data' in activeSession.modifications[mod])) { - continue; - } - /* remove not confirmed leaf/leaf-lists */ - if (activeSession.modifications[mod]['data']['info']['type'] == 4 || activeSession.modifications[mod]['data']['info']['type'] == 8) { - if (!('value' in activeSession.modifications[mod]['data'])) { - console.log('not confirmed node ' + activeSession.modifications[mod]['data']['path'] + ', removing it'); - this.cancelModification(activeSession, mod['data'], false, false); - } - } - /* remove deleted nodes from the reorder data */ - if (activeSession.modifications[mod]['data']['info']['ordered'] && activeSession.modifications[mod]['type'] == ModificationType.Delete) { - let record = this.getModificationsRecord(activeSession, this.treeService.pathCutPredicate(activeSession.modifications[mod]['data']['path'])); - if (record) { - record['reorder'].splice(activeSession.modifications[mod]['data']['order'], 1); - } - } - let err = this.resolveKeys(activeSession.modifications[mod]['data']); - if (err) { - console.log(err); - return of({'success': false, 'error': [{'message': err}]}); - } - } - - /* transform reorder records to move transactions */ - for (let mod in activeSession.modifications) { - if (activeSession.modifications[mod]['type'] != ModificationType.Reorder) { - continue; - } - let record = activeSession.modifications[mod]; - let node = this.treeService.pathNode(activeSession, mod); - let nodes = this.treeService.nodesToShow(activeSession, node); - /* prepare distances of the moved nodes */ - for (let i in nodes) { - /* nodes are ordered, but contains also deleted nodes */ - if ('deleted' in nodes[i]) { - nodes.splice(Number(i), 1); - continue; - } - let pos_new = nodes[i]['order']; - let pos_orig = record['reorder'][pos_new]; - nodes[i]['dist'] = pos_new - pos_orig; - } - /* eat distances to generate transactions */ - record['transactions'] = []; - let pos = this.getHighestDistIndex(nodes); - while (pos != -1) { - if (nodes[pos]['dist'] < 0) { - /* moved to the left */ - let offset = 1; - for (; nodes[pos]['dist'] != 0; nodes[pos]['dist']++, offset++) { - nodes[pos + offset]['dist']--; - } - offset--; - let transaction = {}; - transaction['node'] = nodes[pos]['path']; - if (pos == 0) { - //console.log("moving " + nodes[pos]['path'] + " first") - transaction['insert'] = 'first'; - } else { - //console.log("moving " + nodes[pos]['path'] + " before " + nodes[pos + 1]['path']) - transaction['insert'] = 'before'; - if (nodes[pos + 1]['info']['type'] == 8) { - transaction['value'] = nodes[pos + 1]['value']; - } else { /* 16 - list */ - transaction['key'] = this.listPredicates(nodes[pos + 1]); - } - } - record['transactions'].splice(0, 0, transaction); - let move = nodes[pos]; - nodes.splice(pos, 1); - nodes.splice(pos + offset, 0, move); - } else { - /* moved to the right */ - let offset = 1 - for (; nodes[pos]['dist'] != 0; nodes[pos]['dist']--, offset++) { - nodes[pos - offset]['dist']++; - } - offset--; - let transaction = {}; - transaction['node'] = nodes[pos]['path']; - if (pos == nodes.length - 1) { - //console.log("moving " + nodes[pos]['path'] + " last") - transaction['insert'] = 'last'; - } else { - //console.log("moving " + nodes[pos]['path'] + " after " + nodes[pos - 1]['path']) - transaction['insert'] = 'after'; - if (nodes[pos - 1]['info']['type'] == 8) { - transaction['value'] = nodes[pos - 1]['value']; - } else { /* 16 - list */ - transaction['key'] = this.listPredicates(nodes[pos - 1]); - } - } - record['transactions'].splice(0, 0, transaction) - let move = nodes[pos]; - nodes.splice(pos, 1); - nodes.splice(pos - offset, 0, move); - } - pos = this.getHighestDistIndex(nodes); - } - for (let item of nodes) { - delete item['dist']; - } - } - - //console.log(JSON.stringify(activeSession.modifications)); - return this.sessionsService.commit(activeSession).pipe( - tap(result => { - if (result['success']) { - delete activeSession.modifications; - } else { - console.log(result); - } - return result; - }) - ) - } -} diff --git a/frontend/config/ordering.directive.ts b/frontend/config/ordering.directive.ts deleted file mode 100644 index a87dcbe..0000000 --- a/frontend/config/ordering.directive.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { Directive, ElementRef, HostListener, Input, AfterContentChecked } from '@angular/core'; - -import { ModificationsService, ModificationRecord, ModificationType } from './modifications.service'; -import { SessionsService } from './sessions.service'; -import { TreeService } from './tree.service'; - -@Directive( { - selector: '[orderingLists]' -} ) -export class OrderingDirective implements AfterContentChecked { - private _draggingElement: HTMLElement; - private _droppedElement: HTMLElement; - private _dropSucceded: boolean; - private _isInsideContainer: boolean; - @Input() node; - @Input() activeSession; - - constructor(private element: ElementRef, - private modsService: ModificationsService, - private sessionsService: SessionsService, - private treeService: TreeService) { } - - ngAfterContentChecked() { - this.markDraggable(); - //console.log(this.element) - } - - @HostListener( 'dragstart', ['$event'] ) - dragStart( event ) { - //console.log("dragStart"); - this.savePositions( 'dragIndex' ); - this._draggingElement = this.getDraggableElement( event ); - event.dataTransfer.setDragImage(this._draggingElement.firstElementChild, event.offsetX, event.offsetY); - this._dropSucceded = false; - this._isInsideContainer = true; - - /* Firefox hack */ - event.dataTransfer.setData('text', 'bad firefox'); - } - - @HostListener( 'dragend', ['$event'] ) - dragEnd( event: MouseEvent ) { - //console.log("dragEnd"); - if ( !this._dropSucceded ) { - this.cancelDragging(); - } - event.preventDefault(); - } - - @HostListener( 'dragover', ['$event'] ) - dragOver( event: MouseEvent ) { - //console.log("dragOver"); - // Required to receive "drop"" event - event.preventDefault(); - } - - @HostListener( 'drag', ['$event'] ) - drag( event ) { - //console.log("drag"); - // Check if mouse is outside container or not - const divCoords = this.element.nativeElement.getBoundingClientRect(); - const inside = ( event.clientX >= divCoords.left && event.clientX <= divCoords.right && event.clientY >= divCoords.top && event.clientY <= divCoords.bottom ); - // Check if mouse mouves outisde container - if ( this._isInsideContainer && !inside ) { - this.cancelDragging(); - } - - this._isInsideContainer = inside; - } - - @HostListener( 'dragenter', ['$event'] ) - dragEnter( event: MouseEvent ) { - //console.log("dragEnter"); - const element: HTMLElement = this.getDraggableElement( event ); - if ( element && element.attributes ) { - const draggingIndex = this._draggingElement.dataset['index']; - const dropIndex = element.dataset['index']; - - if ( draggingIndex !== dropIndex ) { - // Move dragging ghost element at its new position - if ( draggingIndex > dropIndex ) { - this.element.nativeElement.insertBefore( this._draggingElement, element ); - } else { - this.element.nativeElement.insertBefore( this._draggingElement, element.nextSibling ); - } - this.markDraggable(); - } - } - - event.preventDefault(); - } - - @HostListener( 'drop', ['$event'] ) - drop( event: MouseEvent ) { - //console.log("drop"); - this._dropSucceded = true; - //console.log("moving " + this._draggingElement.dataset.dragIndex + " instead of " + this._draggingElement.dataset.index); - let lastIndex = -1; - let hasLast = false; - let maintainLast = (this.node['info']['type'] == 16); - let nodes = this.treeService.nodesToShow(this.activeSession, this.node); - for ( let i = 0; i < this.element.nativeElement.childElementCount; i++ ) { - let element = this.element.nativeElement.children[i]; - if (i == element.dataset.dragIndex) { - /* no change */ - continue; - } - nodes[element.dataset.dragIndex]['order'] = i; - if (maintainLast) { - /* maintain last flag in lists, it is not important to maintain it in leaflist, - * since it is enough to have it just present in one of them */ - if ('last' in nodes[element.dataset.dragIndex]) { - hasLast = true; - delete nodes[element.dataset.dragIndex]['last']; - } else if (i == this.element.nativeElement.childElementCount - 1) { - lastIndex = element.dataset.dragIndex; - } - } - } - if (hasLast) { - nodes[lastIndex]['last'] = true; - } - - let parent = this.treeService.nodeParent(this.activeSession, this.node); - if (!('new' in parent)) { - let path = this.treeService.pathCutPredicate(this.node['path']) - let record = this.modsService.createModificationsRecord(this.activeSession, path); - if (!('type' in record)) { - /* new record */ - record['type'] = ModificationType.Reorder; - record['reorder'] = []; - for (let i in nodes) { - record['reorder'].push(Number(i)); - } - } - let move = record['reorder'][this._draggingElement.dataset.dragIndex]; - record['reorder'].splice(this._draggingElement.dataset.dragIndex, 1); - record['reorder'].splice(this._draggingElement.dataset.index, 0, move); - - //console.log(record['reorder']); - - let same = true; - for (let item of nodes) { - if (item['order'] != record['reorder'][item['order']]) { - same = false; - break; - } - } - if (same) { - this.modsService.removeModificationsRecord(this.activeSession, path); - } - } - this.sessionsService.storeSessions(); - event.preventDefault(); - } - - private markDraggable() { - for ( let i = 0; i < this.element.nativeElement.childElementCount; i++ ) { - let element = this.element.nativeElement.children[i]; - element.draggable = true; - element.dataset.index = i; - } - } - - private savePositions( attribute ) { - for ( let i = 0; i < this.element.nativeElement.childElementCount; i++ ) { - let element = this.element.nativeElement.children[i]; - element.dataset[attribute] = i; - } - } - - private getElementAt( attribute, index ) { - for ( let i = 0; i < this.element.nativeElement.childElementCount; i++ ) { - let element = this.element.nativeElement.children[i]; - if ( parseInt( element.dataset[attribute], 10 ) === index ) { - return element; - } - } - return null; - } - - private cancelDragging() { - let index = this.element.nativeElement.childElementCount - 1; - // Get last element - let beforeElement = this.getElementAt( 'dragIndex', index ); - - while ( index > 0 ) { - const element = this.getElementAt( 'dragIndex', index - 1 ); - this.element.nativeElement.insertBefore( element, beforeElement ); - - beforeElement = element; - index--; - } - } - - private getDraggableElement( event ): HTMLElement { - let element: HTMLElement = event.target; - while ( element && element.attributes && !element.attributes['draggable'] ) { - element = element.parentNode; - } - return element; - } -} diff --git a/frontend/config/session.ts b/frontend/config/session.ts deleted file mode 100644 index be89a5b..0000000 --- a/frontend/config/session.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Device } from '../inventory/device'; - -import { SessionsService } from './sessions.service'; - -export enum NodeType { - container = 1, - leaf = 4, - leaflist = 8, - list = 16 -} - -export class Session { - constructor ( - public key: string, - public device: Device, - public loading = false, - public data: Node = null, - public treeFilters = [], - public modifications = null, - public cpblts: string = "", - public dataPresence: string = 'none', - public statusVisibility: boolean = true, - public cpbltsVisibility: boolean = false, - ) {} -} - -export class NodeSchema { -/* - * type: NodeType; - * path: string; - */ -} - -export class Node { -/* - * path: string; - * info: NodeSchema; - * - * === container === - * children: Node[] - * newChildren: Node[] - * - * === leaf === - * value: string; - * - * === leaf-list === - * value: string; - * - * === list === - * children: Node[] - * newChildren: Node[] - */ -} diff --git a/frontend/config/sessions.service.ts b/frontend/config/sessions.service.ts deleted file mode 100644 index 4f2a146..0000000 --- a/frontend/config/sessions.service.ts +++ /dev/null @@ -1,550 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpParams } from '@angular/common/http'; -import { Observable } from 'rxjs/Observable'; -import { catchError, tap, map } from 'rxjs/operators'; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/do'; - -import { TreeService } from './tree.service'; -import { Device } from '../inventory/device'; -import { Session, Node, NodeSchema } from './session'; - -/** - * Service to control NETCONF sessions. - * - * The class maintain list of sessions by using localStorage. - */ -@Injectable() -export class SessionsService { - /** List of opened NETCONF sessions. */ - public sessions: Session[]; - /** Identifier of the currently active session. */ - public activeSession: string; - - /** - * Initiate internal data. - * @param http Handler to communicate with the backend. - * @param treeService Handler to control data tree. - */ - constructor(private http: HttpClient, private treeService: TreeService) { - this.activeSession = localStorage.getItem('activeSession'); - if (!this.activeSession) { - this.activeSession = ""; - } - this.checkSessions(); - } - - /** - * Store the sessions list into localStorage for later use / reload. Does - * not store activeSession identifier, which is handled separately because - * of its possible more frequent change. - */ - storeSessions(): void { - localStorage.setItem('sessions', JSON.stringify(this.sessions)); - } - - /** - * Load the sessions list from localStorage. - */ - loadSessions(): void { - this.sessions = JSON.parse(localStorage.getItem('sessions')); - if (!this.sessions) { - this.sessions = []; - } - for (let session of this.sessions) { - /* fix links in modifications data to link the currently reloaded objects */ - for (let mod in session.modifications) { - if ('data' in session.modifications[mod]) { - session.modifications[mod]['data'] = this.treeService.pathNode(session, mod); - } - } - } - } - - /** - * Get Session according to the specified key. If no key is specified, the - * current activeSession is returned. - * @param key Identifier of the session. - * @returns The session corresponding to the given key or null in case no - * such session exists. - */ - getSession(key: string = this.activeSession): Session { - if (key) { - for (let i = this.sessions.length; i > 0; i--) { - if (this.sessions[i - 1].key == key) { - return this.sessions[i - 1]; - } - } - } - return null; - } - - /** - * Change the current activeSession. - * @param key Identifier of the session supposed to became activeSession - * @returns The new activeSession object. - */ - changeActiveSession(key: string): Session { - let result = this.getSession(key); - if (result) { - this.activeSession = key; - localStorage.setItem('activeSession', this.activeSession); - } - return result; - } - - /** - * Check with backend that session on the specific index in the sessions - * list is still alive. - * @param i Index of the session to check in the sessions list. - */ - private checkSessionIndex(i: number): void { - this.alive(this.sessions[i].key).subscribe(resp => { - if (!resp['success']) { - if (this.activeSession && this.sessions[i].key == this.activeSession) { - /* active session is not alive - select new active session - * as the one on the left from the current one, if there - * is no one, choose the one on the right */ - if (i > 0) { - this.activeSession = this.sessions[i - 1].key; - } else if (i + 1 < this.sessions.length) { - this.activeSession = this.sessions[i + 1].key; - } else { - this.activeSession = ""; - } - localStorage.setItem('activeSession', this.activeSession); - } - this.sessions.splice(i, 1); - this.storeSessions(); - } - }); - } - - /** - * Check with backend that the session with the given key is still alive. - * @param key Identifier of the session to check. - */ - private checkSession(key: string): void { - for (let i in this.sessions) { - if (this.sessions[i].key == key) { - this.checkSessionIndex(Number(i)); - break; - } - } - } - - /** - * Check all the sessions if they are still alive. If not, the session is - * removed from the list and if it was activeSession, the new one is - * selected. - */ - checkSessions(): void { - this.loadSessions(); - /* verify that the sessions are still active */ - for (let i = this.sessions.length; i > 0; i--) { - this.checkSessionIndex(i - 1); - } - } - - /** - * Hide a data subtree from view. Hiding is done via set of filters taken - * into account in tree-node template. - * @param activeSession Session to work with. - * @param node Root of the subtree to hide, this node is the last visible node. - */ - collapse(activeSession: Session, node: Node = null ): void { - if (node) { - for (let i = activeSession.treeFilters.length; i > 0; i--) { - if (activeSession.treeFilters[Number(i) - 1].startsWith(node['path'])) { - activeSession.treeFilters.splice(Number(i) - 1, 1); - } - } - activeSession.treeFilters.push(node['path']); - activeSession.dataPresence = 'mixed'; - } else { - activeSession.treeFilters = []; - if (activeSession.data) { - for (let root of activeSession.data['children']) { - if ('subtreeRoot' in root) { - continue; - } - activeSession.treeFilters.push(root['path']); - } - } - activeSession.dataPresence = 'root'; - } - this.treeService.updateHiddenFlags( activeSession ); - this.storeSessions(); - } - - /** - * Show currently not visited data subtree. - * There are 2 situations why a subtree is not visible. a) It was previously - * collapsed and now it is filtered out via filters. b) It was not loaded - * yet - at the beginning, only the data roots are loaded from backend and - * it is up to user to select subtrees to work with. At that moment the - * complete subtree is loaded from backend even in case the user expanded - * only one level of children (so in such a case standard collapse filters - * are set). - * @param activeSession Session to work with. - * @param node Node to expand, null in case of root node. - * @param all Flag if all levels of children should be expanded or just one. - */ - expand(activeSession: Session, node: Node = null, all: boolean = true): void { - if (!node) { - /* root */ - let backup = activeSession.data; - activeSession.data = null; - delete backup['children']; - activeSession.loading = true; - this.rpcGetSubtree(activeSession.key, true).subscribe((result: object) => { - if (result['success']) { - for (let iter of result['data']) { - this.treeService.setDirty( activeSession, iter ); - } - activeSession.data = backup; - activeSession.data['children'] = result['data']; - activeSession.loading = false; - activeSession.dataPresence = 'all'; - activeSession.treeFilters = []; - this.storeSessions(); - } - }); - } else if ('subtreeRoot' in node) { - node['loading'] = true; - this.rpcGetSubtree(activeSession.key, true, node['path']).subscribe(result => { - delete node['loading']; - if (result['success']) { - for (let iter of result['data']['children']){ - this.treeService.setDirty(activeSession, iter); - if (!all) { - activeSession.treeFilters.push(iter['path']); - } - } - node['children'] = result['data']['children']; - this.treeService.updateHiddenFlags(activeSession); - delete node['subtreeRoot']; - activeSession.dataPresence = 'all'; - //console.log(activeSession); - for (let root of activeSession.data['children']) { - if ('subtreeRoot' in root) { - activeSession.dataPresence = 'mixed'; - break; - } - } - this.storeSessions(); - } - } ); - } else { - let index = activeSession.treeFilters.indexOf(node['path']); - if (index != -1) { - activeSession.treeFilters.splice(index, 1); - } else { - for (let i = activeSession.treeFilters.length; i > 0; i--) { - if (activeSession.treeFilters[Number(i) - 1].startsWith(node['path'])) { - activeSession.treeFilters.splice(Number(i) - 1, 1); - } - } - } - if (!all && ('children' in node)) { - for (let child of node['children']) { - activeSession.treeFilters.push(child['path']) - } - } - this.treeService.updateHiddenFlags(activeSession); - this.storeSessions(); - } - } - - /** - * Backend request to check validity of the value for the specified node. - * - * Accesses backend REST API GET:/netopeer/session/schema/checkvalue - * - * TODO check keys, uniques - * - * @param sessionKey Session identifier. - * @param path Schema path of the node to check - * @param value Value of the node to be checked - * @returns Observable - */ - checkValue(sessionKey: string, path: string, value: string): Observable { - let params = new HttpParams() - .set('key', sessionKey) - .set('path', path) - .set('value', value); - //let options = new RequestOptions(); - return this.http.get('/netopeer/session/schema/checkvalue', { params: params }) - .pipe( - catchError(err => Observable.throw(err)) - ); - } - - /** - * Filter given schemas list by the information about the node's children. - * Only the schemas which can be instantiated as child of node are kept - * in the list. - * - * TODO check max-instances - * - * @param parent Parent node to fit the children schemas list. - * @param schemas Schemas list to be reduced. - */ - private filterSchemas(parent: Node, schemas: NodeSchema[]): void { - for (let index = schemas.length - 1; index >= 0; index--) { - if (schemas[index]['type'] & 0x18) { - /* schema nodes that can be instantiated multiple times - * - lists and leaf-lists */ - continue; - } - if (!schemas[index]['config']) { - /* read-only nodes cannot be instantiated */ - schemas.splice(index, 1); - continue - } - /* try to find existing instance */ - let children; - if (('children' in parent) && 'newChildren' in parent) { - children = parent['children'].concat(parent['newChildren']); - } else if ('children' in parent) { - children = parent['children']; - } else { - children = parent['newChildren']; - } - for (let item of children) { - if (parent['deleted']) { - continue; - } - if (schemas[index]['name'] == item['info']['name'] && schemas[index]['module'] == item['info']['module']) { - /* node is already instantiated */ - schemas.splice(index, 1); - break; - } - } - } - } - - /** - * Backend request to get list of children schemas for the given node. The - * list is further filtered to remove nodes that cannot be created in the - * given node (e.g. because instance is already present). - * - * Accesses backend REST API GET:/netopeer/session/schema - * - * @param sessionKey Session identifier. - * @param node Node, whose children schema should be obtained. - * @returns Observable - */ - childrenSchemas(sessionKey: string, node: Node): Observable { - let params = new HttpParams() - .set('key', sessionKey) - .set('path', node['info']['path']) - .set('relative', 'children'); - return this.http.get('/netopeer/session/schema', { params: params }) - .pipe( - map((resp : NodeSchema[]) => resp['data']), - tap((resp: NodeSchema[]) => this.filterSchemas(node, resp)) - ); - /* - * map((resp: Response) => { - let result = resp.json(); - //console.log(result) - if (result['success']) { - this.filterSchemas(node, result['data']); - return result['data']; - } else { - return []; - } - }).toPromise(); - * */ - } - - /** - * Backend request to get list of values for the specific schema node. - * - * TODO in case of leaf-list check values of siblings - * - * Accesses backend REST API GET:/netopeer/session/schema/values - * - * @param sessionKey Session identifier. - * @param node Node, whose possible values should be obtained. - * @returns Observable - */ - schemaValues(sessionKey: string, node: Node): Observable { - let params = new HttpParams() - .set('key', sessionKey) - .set('path', node['info']['path']); - return this.http.get('/netopeer/session/schema/values', { params: params }); - } - - /** - * Backend request to check if the session is still alive. - * - * Accesses backend REST API GET:/netopeer/session/alive - * - * @param sessionKey Session identifier. - * @returns Observable - */ - alive(sessionKey: string): Observable { - let params = new HttpParams() - .set('key', sessionKey); - return this.http.get('/netopeer/session/alive', { params: params }); - } - - /** - * Backend request to get the list of NETCONF capabilities of the session. - * - * Accesses backend REST API GET:/netopeer/session/capabilities - * - * @param sessionKey Session identifier. - * @returns Observable - */ - getCpblts(sessionKey: string): Observable { - let params = new HttpParams() - .set('key', sessionKey); - return this.http.get('/netopeer/session/capabilities', { params: params }) - .pipe( - catchError((err: any) => Observable.throw(err)) - ); - } - - /** - * Backend request to get running data. - * - * Accesses backend REST API GET:/netopeer/session/rpcGet - * - * @param sessionKey Session identifier. - * @param all Flag to get whole subtree or only one level of children - * @param path Optional path to get the selected subtree of data. - * @returns Observable - */ - rpcGetSubtree(sessionKey: string, all: boolean, path: string = ""): Observable { // - let params = new HttpParams() - .set('key', sessionKey) - .set('recursive', all.toString()); - if (path !== "") { - params = params.append('path', path); - } - - return this.http.get('/netopeer/session/rpcGet', { params: params }) - .pipe( - map( (response: object) => { - if( !response['success'] ) { - this.checkSession( sessionKey ); - } - return response; - }), - catchError((err: any) => Observable.throw(err)) - ); - } - - /** - * Backend request to get complete running data. The returned data are - * connected with the provided session. - * - * Accesses backend REST API GET:/netopeer/session/rpcGet via rpcGetSubtree() - * - * @param session Session to work with. - * @param all Flag to get whole subtree or only one level of children - */ - rpcGet(session: Session, all: boolean): void { - session.loading = true; - delete session.data; - this.rpcGetSubtree( session.key, all ).subscribe( result => { - if ( result['success'] ) { - for ( let iter of result['data'] ) { - this.treeService.setDirty( session, iter ); - } - session.data = {}; - session.data['path'] = '/'; - session.data['info'] = {}; - session.data['info']['config'] = true; - session.data['info']['path'] = '/'; - session.data['children'] = result['data']; - } - session.loading = false; - this.storeSessions(); - } ); - } - - /** - * Backend request to apply configuration changes. - * - * Accesses backend REST API POST:/netopeer/session/commit - * - * @param session Session to work with. - * @returns Backend's response as json in Promise. - */ - commit(session: Session): Observable { - return this.http.post('/netopeer/session/commit', {'key': session.key, 'modifications': session.modifications}) - .pipe( - catchError((err: any) => Observable.throw(err)) - ); - - } - - /** - * Backend request to close NETCONF session. Internally handles maintenance - * of the sessions list and selects activeSession if necessary. - * - * Accesses backend REST API DELETE:/netopeer/session - * - * @param key Session identifier. - * @returns Backend's response as JSON in Observable. - */ - close(key: string) { - let params = new HttpParams() - .set('key', key); - // We need to use generic request, HttpClient.delete does not support sending params. - return this.http.request('DELETE', '/netopeer/session', { params: params }) - .pipe( - tap(resp => { - if (resp['success']) { - let index = this.sessions.findIndex((s: Session) => s.key == key); - this.sessions.splice(index, 1); - if (key == this.activeSession) { - if (index > 0) { - this.activeSession = this.sessions[index - 1].key; - } else if (this.sessions.length) { - this.activeSession = this.sessions[0].key; - } else { - this.activeSession = "" - } - } - } - }), - catchError((err: any) => Observable.throw(err)) - ) - } - - /** - * Backend request to create NETCONF session to the specified device. - * Internally handles maintenance of the sessions list and activeSession value. - * - * Accesses backend REST API POST:/netopeer/session - * - * @param dev NETCONF device to connect to. - */ - connect(dev: Device) { - - let body = {}; - if (dev.id) { - body = {'id': dev.id}; - } else { - body = {'name': dev.name, 'hostname': dev.hostname, 'port': dev.port, 'username': dev.username, 'password': dev.password}; - //options = new RequestOptions({body: JSON.stringify({'device': {'name': dev.name, 'hostname': dev.hostname, 'port': dev.port, 'username': dev.username, 'password': dev.password}})}); - } - return this.http.post('/netopeer/session', body) - .pipe( - tap(resp => { - if (resp['success']) { - this.sessions.push(new Session(resp['session-key'], dev)); - this.activeSession = resp['session-key']; - this.storeSessions(); - localStorage.setItem('activeSession', this.activeSession); - } - }), - catchError((err: any) => Observable.throw(err)) - ); - } -} diff --git a/frontend/config/tree-create.html b/frontend/config/tree-create.html deleted file mode 100644 index a0ed34d..0000000 --- a/frontend/config/tree-create.html +++ /dev/null @@ -1,20 +0,0 @@ - -
- - - - - - -
- xThere is no element to create at {{node['path']}}. -
-
-
\ No newline at end of file diff --git a/frontend/config/tree-edit.html b/frontend/config/tree-edit.html deleted file mode 100644 index 9c919e3..0000000 --- a/frontend/config/tree-edit.html +++ /dev/null @@ -1,27 +0,0 @@ - -
- - cancel - done - - -
diff --git a/frontend/config/tree-indent.html b/frontend/config/tree-indent.html deleted file mode 100644 index 7cb5009..0000000 --- a/frontend/config/tree-indent.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
-
- - cancel reordering -
-
- - delete -
-
- - create sibling -
-
- - create children -
-
-
-
-
- - - - - - - - - - - - - - diff --git a/frontend/config/tree-node.html b/frontend/config/tree-node.html deleted file mode 100644 index e5051eb..0000000 --- a/frontend/config/tree-node.html +++ /dev/null @@ -1,90 +0,0 @@ -
- - info - - - - - - key - - - edit - edit - - - - - - show-all - show-children - collapse - - -
{{node['info']['name']}} - - * [{{node['keys']}}] - - - : - - - - {{node['value']}} - info - {{node['info']['datatype']}} - ({{node['info']['datatypebase']}}) - - - - {{node['info']['datatype']}} - ({{node['info']['datatypebase']}}) - - -
- - -
{{treeService.moduleName(node)}}
-
- - - - - - - -
- -
-
- - - -
- - - diff --git a/frontend/config/tree.component.html b/frontend/config/tree.component.html deleted file mode 100644 index 373e1c1..0000000 --- a/frontend/config/tree.component.html +++ /dev/null @@ -1,55 +0,0 @@ - - -
- -
- - w - x -
-
- - - -
- - - -
-
- -
-
-
- -
-
- - - - -
-
- -
-
-
-
- - - - - - - -
diff --git a/frontend/config/tree.component.scss b/frontend/config/tree.component.scss deleted file mode 100644 index 69efbda..0000000 --- a/frontend/config/tree.component.scss +++ /dev/null @@ -1,202 +0,0 @@ -@import '../netopeer-common'; - -$colorChanged: #fafad2; -$colorChangedBorder: #e4e4a4; -$colorLineHover: #e1e1e1; - -.subtree { - display: flex; - flex-direction: column; - width: 100%; - - .indentation{ - height: 100%; - } -} - -.node { - width: 100%; - overflow: hidden; - - &:hover { - background-color: $colorLineHover; - } - - > div { - display: inline-block; - } -} - -.node_edit { - display: flex; - width: 100%; - overflow: hidden; - - img, - input { - display: inline-table; - margin-right: 0.25em; - } - input { - height: 2em; - padding-left: 0.3em; - background-color: $colorSuccess; - - &.invalid { - background-color: $colorFailure; - } - } - - &.indentation { - height:2.1em; - } - - > .msg-failure { - margin: 0.5em 0; - } - -} -.node_edit.dialog { - background-color: $colorChanged;; -} - -.editable { - cursor: pointer; -} - -.status, -.keys { - color: grey; -} - -.dirty { - background-color: $colorChanged; -} - -.moved { - background-color: #d8e8f8; -} - -.deleted { - background-color: $colorFailure; - color: $colorFailureBorder; -} - -.icon, -.icon_action { - font-size: xx-small; - height: 2em; -} - -.icon_action { - cursor: pointer; -} - -.icon_hidden { - visibility: hidden; -} - -.module_name { - cursor: pointer; - float: right; - text-align: right; - max-width: 25em; - word-wrap: break-word; -} - -.children { - padding-left: 0; -} - -.node_info { - display: inline-block; - word-wrap: break-word; - margin-left: 3px; - flex-grow: 1; - - .node_name { - cursor: pointer; - text-decoration: none; - font-weight: normal; - } -} - -.value_inline { - margin-left: 1.5em; -} - -.indentation.value { - width: 0.8em; - height: 100%; -} - -.indentation { - width: 1.7em; - height: 100%; -} - - -.editmenu { - visibility: hidden; - background-color: $colorBackground; - border: 1px solid $black; - - position: fixed; - z-index: 1; -} - -.button_action { - cursor: pointer; - padding: 0.3em 1em 0.3em 0.5em; - - &:hover { - background-color: $colorHighlight; - color: $colorTextInverse; - } -} - -.loading { - margin-top: 0.5em; -} - -.yang-leaflist { - display: flex; - align-items: center; - flex-direction: row; -} - -.yang-leaflist-value { - display: flex; -} - -.yang-container, -.yang-list { - display:flex; - align-items: center; -} - -.yang-leaf { - display: flex; - align-items: center; -} - - -.value_standalone { - flex-grow:1; - word-break: break-all; -} - -.ordered { - cursor: move; -} - -tree-indent { - - display: inline-flex; - align-items: stretch; - flex-direction: row; - - img{ - display: inline-block; - } -} \ No newline at end of file diff --git a/frontend/config/tree.component.ts b/frontend/config/tree.component.ts deleted file mode 100644 index 52731ae..0000000 --- a/frontend/config/tree.component.ts +++ /dev/null @@ -1,386 +0,0 @@ -import {Component, Directive, ElementRef, EventEmitter, Input, Output, OnInit, ChangeDetectorRef} from '@angular/core'; -import {Router} from '@angular/router'; - -import {Session} from './session'; -import {Schema} from '../inventory/schema'; -import {ModificationsService} from './modifications.service'; -import {SessionsService} from './sessions.service'; -import {TreeService} from './tree.service'; -import {SchemasService} from '../yang/schemas.service'; - -@Directive({ - selector: '[treeScrollTo]' -}) -export class TreeScrollTo { - @Input() node; - - constructor(private elRef:ElementRef) {} - ngAfterContentInit() { - if (!('new' in this.node)) { - let middle = this.elRef.nativeElement.getBoundingClientRect().top + window.pageYOffset - (window.innerHeight / 2); - window.scrollTo(0, middle); - } - } -} - -@Directive({ - selector: '[checkLeafValue]' -}) -export class CheckLeafValue { - @Input() node; - @Input() trusted = false; - @Output() onCheckValue = new EventEmitter(); - - constructor(private elRef:ElementRef) {} - - ngAfterContentInit() { - let node = this.node; - let trusted = this.trusted; - let element = this.elRef.nativeElement; - element.value = node['value']; - this.onCheckValue.emit({node, element, trusted}); - } -} - -@Component({ - selector: 'tree-create', - templateUrl: 'tree-create.html', - styleUrls: ['./tree.component.scss'] -}) -export class TreeCreate { - @Input() node; - @Input() indentation; - @Input() activeSession: Session; - - constructor(public modsService: ModificationsService, public sessionsService: SessionsService) {} - - closeCreatingDialog(node, abort:boolean = true) { - this.modsService.createClose(this.activeSession, node, abort); - } - - creatingDialogSelect(node, index, source) { - this.modsService.create(this.activeSession, node, index); - this.sessionsService.storeSessions(); - if (('schemaChildren' in node) && node['schemaChildren'].length) { - source.selectedIndex = 0; - } - } -} - -@Component({ - selector: 'tree-edit', - templateUrl: 'tree-edit.html', - styleUrls: ['./tree.component.scss'] -}) -export class TreeEdit { - @Input() node; - @Input() indentation; - @Input() activeSession: Session; - - constructor(public treeService: TreeService, - public modsService: ModificationsService, - public sessionsService: SessionsService) {} - - changeValueCancel(node) { - if ('value' in node) { - this.modsService.setEdit(this.activeSession, node, false); - } else { - this.modsService.cancelModification(this.activeSession, node, false); - } - this.sessionsService.storeSessions(); - } - - changeValue(node, target) { - let input; - if (target.classList.contains('value_inline')) { - if (target.classList.contains('invalid')) { - return; - } - input = target; - } else { - input = target.nextElementSibling; - } - - if (node['info']['type'] == 8) { - this.modsService.change(this.activeSession, node, input.value); - } else { - this.modsService.change(this.activeSession, node, input.value); - } - this.sessionsService.storeSessions(); - } - - checkValue(node, target, trusted = false) { - let confirm = target.previousElementSibling; - let cancel = confirm.previousElementSibling; - - if (trusted) { - /* value is selected from valid options */ - target.classList.remove("invalid"); - confirm.style.visibility = "visible"; - if ('value' in node) { - cancel.style.visibility = "visible"; - } - return; - } - - let path: string; - if ('creatingChild' in node) { - path = node['creatingChild']['path']; - } else { - path = node['info']['path']; - } - this.sessionsService.checkValue(this.activeSession.key, path, target.value).subscribe(result => { - if (result['success']) { - target.classList.remove("invalid"); - confirm.style.visibility = "visible"; - if ('value' in node) { - cancel.style.visibility = "visible"; - } - } else { - target.classList.add("invalid"); - confirm.style.visibility = "hidden"; - if (!('value' in node)) { - cancel.style.visibility = "hidden"; - } - } - }); - } - - nodeValue(node, index:number = 0): string { - if ('value' in node) { - if (node['info']['type'] == 4) { - return node['value']; - } else if (node['info']['type'] == 8 && node['value'].length > index) { - return node['value'][index]; - } - } - return null; - } -} - -@Component({ - selector: 'tree-indent', - templateUrl: 'tree-indent.html', - styleUrls: ['./tree.component.scss'] -}) -export class TreeIndent implements OnInit { - @Input() node; - @Input() indentation; - @Input() type; - activeSession: Session; - private timeout; - - constructor(public treeService: TreeService, - public modsService: ModificationsService, - public sessionsService: SessionsService) {} - - ngOnInit(): void { - this.activeSession = this.sessionsService.getSession(); - } - - getType():string { - if (this.type) { - return this.type; - } else { - if (this.node && ('new' in this.node)) { - return "new"; - } else if (this.node && this.modsService.isDeleted(this.node)) { - return "deleted"; - } else { - return "current"; - } - } - } - - showEditMenu(event) { - this.timeout = setTimeout(() => { - let menu = event.target.lastElementChild; - menu.style.visibility = "visible"; - menu.style.top = event.target.getBoundingClientRect().top + 'px'; - menu.style.left = event.target.getBoundingClientRect().left + (event.target.getBoundingClientRect().width / 2) + 'px'; - }, 300); - } - - hideEditMenu(menu) { - clearTimeout(this.timeout); - menu.style.visibility = "hidden"; - } - - deleteSubtree(node) { - let rmlist = []; - if (node['info']['type'] == 8) { - rmlist = this.treeService.nodesToShow(this.activeSession, node); - } else { - rmlist.push(node); - } - for (let item of rmlist) { - this.modsService.delete(this.activeSession, item); - } - this.sessionsService.storeSessions(); - } - - deleteInstance(node) { - this.modsService.delete(this.activeSession, node); - this.sessionsService.storeSessions(); - } - - openCreatingDialog(element, node, parent = false) { - if (parent) { - node = this.treeService.nodeParent(this.activeSession, node); - } - if (!('creatingChild' in node)) { - this.sessionsService.childrenSchemas(this.activeSession.key, node).subscribe(result => { - this.modsService.createOpen(this.activeSession, result, node); - }); - } else if (element){ - /* scroll to the existing element */ - element.ownerDocument.getElementById(node['path'] + '_createChildDialog').scrollIntoView(false); - } - } - - closeCreatingDialog(node, abort:boolean = true) { - this.modsService.createClose(this.activeSession, node, abort); - } - - cancelModification(node, value = false) { - if (node['info']['type'] == 8 && !value) { - for (let item of this.treeService.nodesToShow(this.activeSession, node)) { - this.modsService.cancelModification(this.activeSession, item, false, true); - } - } else if (value) { - this.modsService.cancelModification(this.activeSession, node, false, false); - } else { - this.modsService.cancelModification(this.activeSession, node, false, true); - } - this.sessionsService.storeSessions(); - } -} - -@Component({ - selector: 'tree-leaflist-value', - template: ` -
- -
{{node['value']}}
-
- `, - styleUrls: ['./tree.component.scss'] -}) - -export class TreeLeaflistValue { - @Input() node; - @Input() activeSession: Session; - @Input() indentation; - - constructor(public modsService: ModificationsService, - public treeService: TreeService) {} -} - -@Component({ - selector: 'tree-node', - templateUrl: './tree-node.html', - styleUrls: ['./tree.component.scss'] -}) - -export class TreeNode { - @Input() node; - @Input() indentation; - @Input() activeSession: Session; - - constructor(public modsService: ModificationsService, - public sessionsService: SessionsService, - public treeService: TreeService, - public schemasService: SchemasService, - private changeDetector: ChangeDetectorRef, - private router: Router) {} - - inheritIndentation(node) { - let newIndent; - if (node['last']) { - newIndent = [true]; - } else { - newIndent = [false]; - } - - if (!this.indentation) { - return newIndent; - } else { - return this.indentation.concat(newIndent); - } - } - - isEditable(node) { - if (!node['info']['config'] || (node['info']['key'] && !node['new']) || node['deleted']) { - return false; - } - return true; - } - - startEditing(node, target) { - if (!this.isEditable(node)) { - return; - } - - let container = target.parentElement.parentElement; - - this.modsService.setEdit(this.activeSession, node, true); - this.changeDetector.detectChanges(); - - container.nextElementSibling.lastElementChild.focus(); - } - - link(key:string, type:string, path:string = null) { - this.schemasService.show(key, type, path) - .subscribe((result: object) => { - console.log(result); - if (result['success']) { - this.router.navigateByUrl( '/netopeer/yang' ); - } - }); - } - - linkSchema(node) { - this.link(node['info']['module'] + '.yang', 'tree'); - } - - linkNode(node) { - console.log(node); - this.link(node['info']['module'] + '.yang', 'tree-node', node['info']['path']); - } - - linkIdentity(node) { - let name = node['value'].slice(node['value'].lastIndexOf(':') + 1); - - this.link(node['info']['refmodule'], 'tree-identity', '/' + name); - } - - newChildrenToShow(node) { - if ('newChildren' in node) { - return node['newChildren']; - } else { - return []; - } - } - -} - -@Component({ - selector: 'tree-view', - templateUrl: './tree.component.html', - styleUrls: ['./tree.component.scss'] -}) - -export class TreeView implements OnInit { - @Input() node; - @Input() indentation; - activeSession: Session; - - constructor(public modsService: ModificationsService, - public sessionsService: SessionsService, - public treeService: TreeService) {} - - ngOnInit(): void { - this.activeSession = this.sessionsService.getSession(); - } -} - diff --git a/frontend/config/tree.service.ts b/frontend/config/tree.service.ts deleted file mode 100644 index e64bd6c..0000000 --- a/frontend/config/tree.service.ts +++ /dev/null @@ -1,393 +0,0 @@ -import {Injectable} from '@angular/core'; - -import {Session} from './session'; - -@Injectable() -export class TreeService { - - constructor() {} - - expandable(node): boolean { - if (node['info']['type'] == 1 || /* container */ - node['info']['type'] == 16) { /* list */ - return true; - } - return false; - } - - pathNode(activeSession: Session, path: string, type: string = 'node') { - let node = null; - let parent = null; - let children = activeSession.data['children']; - let newChildren = activeSession.data['newChildren']; - - if (path == '/') { - node = activeSession.data; - return; - } - - let match = false; - while (children || newChildren) { - match = false; - - if (children) { - for (let iter of children) { - let pathCompare; - if (path[path.length - 1] == ']') { - /* compare with predicate */ - pathCompare = iter['path']; - } else { - /* ignore predicate, so in case of list/leaflist specified - * without predicate, return the first instance */ - pathCompare = this.pathCutPredicate(iter['path']); - } - if (path == pathCompare) { - node = iter; - match = true; - children = null; - newChildren = null; - break; - } else if (path.startsWith(iter['path'] + '/')) { - match = true; - parent = iter; - children = iter['children']; - if ('newChildren' in iter) { - newChildren = iter['newChildren']; - } else { - newChildren = null; - } - break; - } - } - if (!match) { - children = null; - } - } - if (match) { - continue; - } - if (newChildren) { - for (let iter of newChildren) { - let pathCompare; - if (path[path.length - 1] == ']') { - /* compare with predicate */ - pathCompare = iter['path']; - } else { - /* ignore predicate, so in case of list/leaflist specified - * without predicate, return the first instance */ - pathCompare = this.pathCutPredicate(iter['path']); - } - if (path == pathCompare) { - node = iter; - match = true; - children = null; - newChildren = null; - break; - } else if (path.startsWith(iter['path'] + '/')) { - match = true; - parent = iter; - children = iter['children']; - if ('newChildren' in iter) { - newChildren = iter['newChildren']; - } else { - newChildren = null; - } - break; - } - } - if (!match) { - children = null; - } - } - } - - if (type == 'parent') { - return parent; - } else { - return node; - } - } - - nodeParent(activeSession: Session, node) { - let parent = this.pathNode(activeSession, node['path'], 'parent') - if (!parent) { - parent = activeSession.data; - } - return parent; - } - - inheritIndentation(indentation, node) { - let newIndent; - if (node['last'] || ('lastLeafList' in node)) { - newIndent = [true]; - } else { - newIndent = [false]; - } - - if (!indentation) { - return newIndent; - } else { - return indentation.concat(newIndent); - } - } - - private minOrder(list, startIndex: number): number { - let result: number = list[startIndex]['order']; - for (let i = startIndex + 1; i < list.length; i++) { - if (list[i]['info']['name'] != list[startIndex]['info']['name'] || list[i]['info']['module'] != list[startIndex]['info']['module']) { - continue; - } - if (list[i]['order'] < result) { - result = list[i]['order']; - } - } - return result; - } - - sortInstances(list, startFromZero = true) { - let processed = []; - for (let l in list) { - if (!list[l]['info']['ordered'] || (list[l]['info']['module']+':'+list[l]['info']['name'] in processed)) { - continue; - } - let id = list[l]['info']['module']+':'+list[l]['info']['name']; - processed.push(id) - let index; - if (startFromZero) { - index = 0; - } else { - index = this.minOrder(list, Number(l)); - } - for (let i = Number(l); i < list.length; i++) { - if (id != list[i]['info']['module']+':'+list[i]['info']['name']) { - continue; - } - if (list[i]['order'] != index) { - for (let j = Number(i) + 1; j < list.length; j++) { - if (list[j]['order'] == index && id == list[j]['info']['module']+':'+list[j]['info']['name']) { - let move = list[j]; - console.log('moving ' + list[i]['path']) - console.log('moving ' + move['path']) - if (move['last']) { - delete move['last']; - list[i]['last'] = true; - } - if (move['lastLeafList'] && !('lastLeafList' in list[i])) { - delete move['lastLeafList']; - list[i]['lastLeafList'] = true; - } - if (list[i]['last']) { - delete list[i]['last']; - move['last'] = true; - } - if (list[i]['first']) { - list[i]['first'] = false; - move['first'] = true; - } - list.splice(j, 1, list[i]); - list.splice(i, 1, move); - } - } - } - index++; - } - } - } - - childrenToShow(node) { - let result = []; - let nc_dup = []; - if ('newChildren' in node) { - nc_dup = node['newChildren'].slice(); - } - if ('children' in node) { - let lastList = null; - if ('new' in node) { - /* sort lists/leaf-lists in newly created containers/lists */ - this.sortInstances(node['children']); - } - for (let child of node['children']) { - if (lastList) { - if (lastList['name'] == child['info']['name'] && lastList['module'] == child['info']['module']) { - continue; - } else { - lastList = null; - } - } - if (child['info']['type'] == 16 || child['info']['type'] == 8) { - lastList = child['info']; - for (let i = nc_dup.length - 1; i >= 0; i--) { - if (lastList['name'] == nc_dup[i]['info']['name'] && lastList['module'] == nc_dup[i]['info']['module']) { - nc_dup.splice(Number(i), 1); - } - } - } - result.push(child); - } - } - if (nc_dup.length) { - let lastList = null; - for (let child of nc_dup) { - if (lastList) { - if (lastList['name'] == child['info']['name'] && lastList['module'] == child['info']['module']) { - continue; - } else { - lastList = null; - } - } - if (child['info']['type'] == 16 || child['info']['type'] == 8) { - lastList = child['info']; - } - result.push(child); - } - } - if (node['path'] == '/test:test') {console.log(result)} - return result; - } - - private getInstancesInsert(node, child, result) { - if (node['info']['name'] == child['info']['name'] && node['info']['module'] == child['info']['module']) { - if ('order' in child) { - for (let i in result) { - if (result[i]['order'] > child['order']) { - result.splice(Number(i), 0, child); - return Number(i); - } - } - } - result.push(child); - } - } - - getInstances(activeSession, node, result = []) { - let parent = this.nodeParent(activeSession, node); - if ('children' in parent) { - for (let child of parent['children']) { - this.getInstancesInsert(node, child, result); - } - } - if ('newChildren' in parent) { - for (let child of parent['newChildren']) { - this.getInstancesInsert(node, child, result); - } - } - return result; - } - - nodesToShow(activeSession, node) { - let result = []; - if (node['info']['type'] == 16) { - this.getInstances(activeSession, node, result); - } else if (node['info']['type'] == 8) { - if (node['first']) { - this.getInstances(activeSession, node, result); - } - } else { - result.push(node); - } - return result; - } - - setDirty(activeSession, node) { - if (!activeSession.modifications) { - return; - } - - if (node['path'] in activeSession.modifications) { - node['dirty'] = true; - if (activeSession.modifications[node['path']]['type'] == 'change') { - activeSession.modifications[node['path']]['original'] = node['value']; - } - node['value'] = activeSession.modifications[node['path']]['value']; - } - /* recursion */ - if ('children' in node) { - for (let child of node['children']) { - this.setDirty(activeSession, child); - } - } - } - - isHidden(activeSession: Session, node: Node): boolean { - if (node['path'] == '/') { - /* in case of root, the 'is hidden' question actually changes to - * 'all children hidden' */ - for (let root of node['children']) { - if (!('subtreeRoot' in root) && activeSession.treeFilters.indexOf(root['path']) == -1) { - return false; - } - } - return true; - } else if (('subtreeRoot' in node) || activeSession.treeFilters.indexOf(node['path']) != -1) { - return true; - } else { - return false; - } - } - - hasHiddenChild(activeSession: Session, node, clean=false): boolean { - if (!clean && 'hasHiddenChild' in node) { - return node['hasHiddenChild']; - } - - if (!this.expandable(node)) { - /* terminal node (leaf or leaf-list) */ - node['hasHiddenChild'] = false; - } else if (this.isHidden(activeSession, node)) { - /* listed in tree filters */ - node['hasHiddenChild'] = true; - } else { - node['hasHiddenChild'] = false; - /* go recursively */ - if ('children' in node) { - for (let child of node['children']) { - if (this.hasHiddenChild(activeSession, child, clean)) { - node['hasHiddenChild'] = true; - if (!clean) { - break; - } - } - } - } - } - return node['hasHiddenChild']; - } - - updateHiddenFlags(activeSession: Session) { - let mixed = false; - let rootsonly = true; - for (let root of activeSession.data['children']) { - if (this.hasHiddenChild(activeSession, root, true)) { - mixed = true; - } - if (!('subtreeRoot' in root)){ - rootsonly = false; - } - } - if (mixed) { - if (rootsonly) { - activeSession.dataPresence = 'root'; - } else { - activeSession.dataPresence = 'mixed'; - } - } - } - - pathCutPredicate(path: string) { - if (path[path.length - 1] == ']') { - return path.slice(0, path.lastIndexOf('[')) - } else { - path = path; - } - return path; - } - - moduleName(node): string { - let at = node['info']['module'].indexOf('@'); - if (at == -1) { - return node['info']['module']; - } else { - return node['info']['module'].substring(0, at); - } - } -} diff --git a/frontend/dashboard.component.html b/frontend/dashboard.component.html deleted file mode 100644 index cfab95d..0000000 --- a/frontend/dashboard.component.html +++ /dev/null @@ -1,19 +0,0 @@ -
- - - - - - - - - - - -
 Currently connected devicesautoconnect
- x - {{session.device.name}}
-
diff --git a/frontend/dashboard.component.ts b/frontend/dashboard.component.ts deleted file mode 100644 index 3735ad3..0000000 --- a/frontend/dashboard.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import {Router} from '@angular/router'; - -import {SessionsService} from './config/sessions.service'; - -@Component({ - selector : 'netopeer-dashboard', - templateUrl : './dashboard.component.html', - styleUrls : ['./netopeer.scss', 'inventory/inventory.component.scss'] -}) - -export class DashboardComponent implements OnInit { - - constructor(public sessionsService: SessionsService, - private router: Router) {} - - gotoConfig(session) { - this.sessionsService.changeActiveSession(session.key); - this.router.navigateByUrl('/netopeer/config'); - } - - ngOnInit(): void { - this.sessionsService.checkSessions(); - } -} diff --git a/frontend/e2e/protractor.conf.js b/frontend/e2e/protractor.conf.js new file mode 100644 index 0000000..86776a3 --- /dev/null +++ b/frontend/e2e/protractor.conf.js @@ -0,0 +1,28 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.e2e.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/frontend/e2e/src/app.e2e-spec.ts b/frontend/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000..c1dd85c --- /dev/null +++ b/frontend/e2e/src/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { AppPage } from './app.po'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('Welcome to netconf-tool-devkit!'); + }); +}); diff --git a/frontend/e2e/src/app.po.ts b/frontend/e2e/src/app.po.ts new file mode 100644 index 0000000..82ea75b --- /dev/null +++ b/frontend/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get('/'); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/frontend/e2e/tsconfig.e2e.json b/frontend/e2e/tsconfig.e2e.json new file mode 100644 index 0000000..a6dd622 --- /dev/null +++ b/frontend/e2e/tsconfig.e2e.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} \ No newline at end of file diff --git a/frontend/inventory/device.ts b/frontend/inventory/device.ts deleted file mode 100644 index 00ec464..0000000 --- a/frontend/inventory/device.ts +++ /dev/null @@ -1,21 +0,0 @@ -export class Device { - constructor ( - public id: number, - public name:string = '', - public hostname: string = '', - public port: number = 830, - public autoconnect: boolean = false, - public username: string = '', - public password: string = '', - public fingerprint: string = '', - ) {} -} -/* -export class Device { - id: number; - hostname: string; - port: number = 830; - username: string; - password: string; -} -*/ diff --git a/frontend/inventory/devices.component.html b/frontend/inventory/devices.component.html deleted file mode 100644 index 787e617..0000000 --- a/frontend/inventory/devices.component.html +++ /dev/null @@ -1,88 +0,0 @@ -
-
- - -
-
-
-
- - -
-
- - -
Hostname or IP address is required
-
-
- - -
Port must be in range 1 - 65535
-
-
- - -
User login is required to connect to the device.
-
-
- - -
User password must be specified to connect to the device.
-
-
- - -
-
- - -
- -
- - - xfailed. - xsuccessfully added. - -
-
-
-
-
- -

x{{err_msg}}

- - - - - - - - - - - - - - - - - -
 namehostname : portfingerprintusernameautoconnect
- x - {{device.name}}{{device.hostname}} : {{device.port}}{{device.fingerprint}}{{device.username}}
- -
diff --git a/frontend/inventory/devices.component.ts b/frontend/inventory/devices.component.ts deleted file mode 100644 index c714187..0000000 --- a/frontend/inventory/devices.component.ts +++ /dev/null @@ -1,245 +0,0 @@ -/* - * NETCONF servers Inventory - */ -import {Component, OnInit, Input} from '@angular/core'; -import {Router} from '@angular/router'; -import { NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { ViewChild } from '@angular/core'; - -import {DialogueSchema} from './inventory.component'; -import {Device} from './device'; -import {DevicesService} from './devices.service' -import {SessionsService} from '../config/sessions.service' - -import {SocketService} from 'app/services/socket.service'; - -enum ssh_hostcheck_status { - SSH_SERVER_KNOWN_CHANGED = 2, - SSH_SERVER_FOUND_OTHER = 3, - SSH_SERVER_FILE_NOT_FOUND = 4, - SSH_SERVER_NOT_KNOWN = 0 -} - -@Component({ - selector: 'inventoryDevices', - templateUrl: './devices.component.html', - styleUrls: ['./inventory.component.scss'], - providers: [DevicesService] -}) - -export class InventoryDevicesComponent implements OnInit { - devices: Device[]; - addingDeviceLabel = "Add"; - addingDevice = false; - addingResult = -1; - validAddForm = 1; /* 1 - port (has default value), 2 - password, 4 - username, 8 - hostname */ - newDevice: Device; - namePlaceholder: string = ""; - id: number; - err_msg = ""; - - constructor( - private devicesService: DevicesService, - private sessionsService: SessionsService, - public socketService: SocketService, - public modalService: NgbModal, - private router: Router) {} - - getDevices(): void { - this.devicesService.getDevices().subscribe(devices => { - this.devices = devices; - if (devices.length) { - this.id = devices[devices.length - 1].id + 1; - } else { - this.id = 1; - } - }); - } - - showAddDevice(): void { - if (!this.addingDevice) { - this.newDevice = new Device(this.id); - this.checkString(this.newDevice.hostname, 8); - this.checkString(this.newDevice.username, 4); - this.checkString(this.newDevice.password, 2); - this.checkPort(this.newDevice.port); - this.addingDeviceLabel = "Cancel"; - } else { - this.newDevice = null; - this.addingDeviceLabel = "Add"; - } - - this.addingDevice = !this.addingDevice; - this.addingResult = -1; - } - - addDevice(action: string) { - if (!this.newDevice.name) { - this.newDevice.name = this.namePlaceholder; - } - if (action == 'store' || action == 'store_connect') { - this.devicesService.addDevice(this.newDevice).subscribe( - result => {this.addingResult = result['success'] ? 1 : 0; - this.getDevices(); - if (action == 'store_connect') { - this.connect(this.newDevice); - } - }); - } else { /* connect only */ - this.newDevice.id = 0; - this.connect(this.newDevice); - this.newDevice.id = this.id; - } - } - - rmDevice(device: Device) { - this.devicesService.rmDevice(device.id).subscribe( - result => {if (result['success']) {this.getDevices()} }); - } - - namePlaceholderUpdate() { - this.namePlaceholder = this.newDevice.hostname + ':' + this.newDevice.port; - } - - checkString(host: string, item: number) { - if (!host || !host.trim().length) { - this.validAddForm &= ~item; - } else { - this.validAddForm |= item; - } - } - - checkPort(port: number): void { - if (!port || port == 0 || port > 65535) { - this.validAddForm &= ~1; - } else { - this.validAddForm |= 1; - } - this.namePlaceholderUpdate(); - } - - bitStatus(bit: number): boolean { - if (this.validAddForm & bit) { - return true; - } else { - return false; - } - } - - socketAnswer(event: string, id:string, item: string, value: any, item2: string = null, value2: any = null) { - let data = {'id': id}; - data[item] = value; - if (item2) { - data[item2] = value2 - } - this.socketService.send(event, data); - } - - connect(device: Device) { - /* for backward compatibility */ - if (!device.name) { - device.name = device.hostname + ":" + device.port; - } - - this.socketService.subscribe('hostcheck').subscribe((message: any) => { - switch(message['state']) { - case ssh_hostcheck_status.SSH_SERVER_KNOWN_CHANGED: - message['msg'] = "Server has changed."; - break; - case ssh_hostcheck_status.SSH_SERVER_NOT_KNOWN: - message['msg'] = "Server not known."; - break; - } - let modalRef = this.modalService.open(DialogueHostcheck, {centered: true, backdrop: 'static', keyboard: false}); - modalRef.componentInstance.hostcheck = message; - modalRef.result.then((result) => { - this.socketAnswer('hostcheck_result', message['id'], 'result', result); - }, (reason) => { - this.socketAnswer('hostcheck_result', message['id'], 'result', false); - }); - }); - - this.socketService.subscribe('device_auth').subscribe((message: any) => { - let modalRef = this.modalService.open(DialoguePassword, {centered: true, backdrop: 'static', keyboard: false}); - modalRef.componentInstance.info = message; - modalRef.result.then((result) => { - this.socketAnswer('device_auth_password', message['id'], 'password', result); - }, (reason) => { - this.socketAnswer('device_auth_password', message['id'], 'password', ''); - }); - }); - - this.socketService.subscribe('getschema').subscribe((message: any) => { - let modalRef = this.modalService.open(DialogueSchema, {centered: true, backdrop: 'static', keyboard: false}); - modalRef.componentInstance.info = message; - modalRef.result.then((result) => { - this.socketAnswer('getschema_result', message['id'], 'filename', result['filename'], 'data', result['data']); - }, (reason) => { - this.socketAnswer('getschema_result', message['id'], 'filename', '', 'data', ''); - }); - }); - - this.sessionsService.connect(device).subscribe(result => { - if (result['success']) { - this.router.navigateByUrl('/netopeer/config'); - } else { - this.err_msg = result['error-msg'] - } - this.socketService.unsubscribe('hostcheck'); - this.socketService.unsubscribe('device_auth'); - this.socketService.unsubscribe('getschema'); - }); - } - - ngOnInit(): void { - this.getDevices(); - } -} - -@Component({ - selector: 'ngbd-modal-content', - styleUrls: ['../netopeer.scss'], - template: ` - - ` -}) -export class DialogueHostcheck { - @Input() hostcheck; - constructor(public activeModal: NgbActiveModal) { } -} - -@Component({ - selector: 'ngbd-modal-content', - styleUrls: ['../netopeer.scss'], - template: ` - - ` -}) -export class DialoguePassword implements OnInit { - @Input() info; - password = ''; - - constructor(public activeModal: NgbActiveModal) { } - - ngOnInit(): void { - document.getElementById('device_password').focus(); - } -} - diff --git a/frontend/inventory/devices.service.ts b/frontend/inventory/devices.service.ts deleted file mode 100644 index 590c754..0000000 --- a/frontend/inventory/devices.service.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; -import { Observable } from 'rxjs/Observable'; -import { catchError } from 'rxjs/operators'; - -import { Device } from './device'; - -@Injectable() -export class DevicesService { - constructor(private http: HttpClient) {} - - getDevices(): Observable { - return this.http.get('/netopeer/inventory/devices/list') - .pipe( - catchError(err => Observable.throw(err)) - ); - } - - addDevice(device: Device) { - // let options = new HttpOptions({ body: JSON.stringify(device) }); - return this.http.post('/netopeer/inventory/devices', device) - .pipe( - catchError(err => Observable.throw(err)) - ); - } - - rmDevice(device_id: number) { - // We need to use generic HTTP request, because HttpClient does not support body in DELETE requests. - return this.http.request('DELETE', '/netopeer/inventory/devices', { body: JSON.stringify({'id':device_id}) }) - .pipe( - catchError(err => Observable.throw(err)) - ); - } -} diff --git a/frontend/inventory/inventory.component.html b/frontend/inventory/inventory.component.html deleted file mode 100644 index d75963a..0000000 --- a/frontend/inventory/inventory.component.html +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/frontend/inventory/inventory.component.scss b/frontend/inventory/inventory.component.scss deleted file mode 100644 index dc7e441..0000000 --- a/frontend/inventory/inventory.component.scss +++ /dev/null @@ -1,139 +0,0 @@ -@import '../netopeer-common'; - -nav { - background-color: $colorMain; - padding-left: 1em; - - a { - text-decoration: none; - display: inline-block; - padding: 0.2em 1em 0.1em 1em; - color: $colorTextInverse; - - &:visited, - &:link { - color: $colorTextInverse; - } - - &:hover, - &.active { - background-color: $colorBackground; - color: $colorText; - } - &.active:hover { - cursor: default; - } - } -} - -.items { - width: 100%; - border-radius: 3px; - margin-bottom: 0.5em; -} - -.item { - cursor: pointer; - margin-right: 0.5em; - padding: 0.3em 1em 0.3em 0.7em; - left: 0.5em; - top: 0.5em; - color: black; - - &:hover, - &.selected { - td { - background-color: $colorMain; - } - color: $colorTextInverse; - } - &.selected:hover { - cursor: default; - } -} - -.item_header { - color: $colorTextInverse; - th { - background-color: $colorMain; - } -} - -.item_left { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} - -.item_right { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -.item_actions { - cursor: pointer; - width: 2em; - padding-right: 10px; - padding-left: 10px; - font-weight: bold; - font-family: monospace; - font-size: large; - color: $grey; -} - -.item_action_delete { - height: 1.3em; - vertical-align: middle; - - &:hover { - color: $red; - } -} - -.schema-revision { - font-family: monospace; - font-size: x-small; -} - -.device-login { -} - -.input_line { - display: table-row; - - label, .input_label { - display: table-cell; - padding-right: 1em; - } - - input, select, .input_data { - display: table-cell; - padding-left: 0.5em; - margin-right: 0.5em; - } -} - -.input_line_alert { - display: inline-block; - background-color: $colorFailure; - color: $red; -} - -.input_control { - padding-top: 1em; -} - -form { - input, - select { - border-left: 5px solid $colorSuccessBorder; - &.invalid { - border-left: 5px solid $colorSuccessBorder; - } - } -} - -.input_switch { - display: inline-block; - text-align: center; - margin-right: 1.5em; -} \ No newline at end of file diff --git a/frontend/inventory/inventory.component.ts b/frontend/inventory/inventory.component.ts deleted file mode 100644 index 2f7fd26..0000000 --- a/frontend/inventory/inventory.component.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Component, OnInit, Input } from '@angular/core'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - selector : 'netopeer-inventory', - templateUrl : './inventory.component.html', - styleUrls : ['./inventory.component.scss'] -}) - -export class InventoryComponent { - title = 'Inventory'; - inventoryComponents = [ - 'devices', - 'schemas' - ]; - - constructor() { } -} - -@Component({ - selector: 'ngbd-modal-content', - styleUrls: ['../netopeer.scss'], - template: ` - - ` -}) -export class DialogueSchema implements OnInit { - @Input() info; - password = ''; - - constructor(public activeModal: NgbActiveModal) { } - - upload(schema: File) { - let reader = new FileReader(); - - console.log(schema); - reader.onloadend = () => { - //console.log(reader.result); - this.activeModal.close({'filename': schema.name, 'data': reader.result}); - }; - reader.readAsText(schema); - } - - ngOnInit(): void { - document.getElementById('uploadSchema').focus(); - } -} \ No newline at end of file diff --git a/frontend/inventory/schema.ts b/frontend/inventory/schema.ts deleted file mode 100644 index d420d7d..0000000 --- a/frontend/inventory/schema.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class Schema { - constructor ( - public key: string, - public name: string = '', - public revision: string = '', - public type: string = '', - public path: string = '', - public data: any = null, - public sections: string[] = [] - ) {} -} diff --git a/frontend/inventory/schemas.component.html b/frontend/inventory/schemas.component.html deleted file mode 100644 index f163a1c..0000000 --- a/frontend/inventory/schemas.component.html +++ /dev/null @@ -1,37 +0,0 @@ -
- -
- - -
-
-
- - - xParsing {{uploadSchema.value.replace("C:\\fakepath\\","")}} failed. - xSchema {{uploadSchema.value.replace("C:\\fakepath\\","")}} successfully added. - -
-
-
-
- - - - - - - - - - - - -
 namerevision
- x - {{schema.name}}{{schema.revision}}
- -
diff --git a/frontend/inventory/schemas.component.ts b/frontend/inventory/schemas.component.ts deleted file mode 100644 index af84752..0000000 --- a/frontend/inventory/schemas.component.ts +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Schemas Inventory - */ -import { Component, Input, OnInit } from '@angular/core'; -import { Router } from '@angular/router'; -import { Schema } from './schema'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; - -import {DialogueSchema} from './inventory.component'; - -import { SchemasService } from '../yang/schemas.service' -import {SocketService} from 'app/services/socket.service'; - -@Component( { - selector: 'inventorySchemas', - templateUrl: './schemas.component.html', - styleUrls: ['./inventory.component.scss'] -} ) - -export class InventorySchemasComponent implements OnInit { - schemas; - addingSchema = false; - addingResult = -1; - constructor(private schemasService: SchemasService, - private socketService: SocketService, - private modalService: NgbModal, - private router: Router ) { - this.schemas = []; - } - - getSchemas(): void { - this.schemasService.getSchemas().subscribe( result => {this.schemas = result;}); - } - - showAddSchema() { - this.addingSchema = !this.addingSchema; - this.addingResult = -1; - } - - socketAnswer(event: string, id:string, item: string, value: any, item2: string, value2: any) { - let data = {'id': id}; - data[item] = value; - data[item2] = value2 - this.socketService.send(event, data); - } - - upload(schema: File) { - if (!schema) { - /* do nothing */ - return; - } - - this.socketService.subscribe('getschema').subscribe((message: any) => { - let modalRef = this.modalService.open(DialogueSchema, {centered: true, backdrop: 'static', keyboard: false}); - modalRef.componentInstance.info = message; - modalRef.result.then((result) => { - this.socketAnswer('getschema_result', message['id'], 'filename', result['filename'], 'data', result['data']); - }, (reason) => { - this.socketAnswer('getschema_result', message['id'], 'filename', '', 'data', ''); - }); - }); - - /* upload the schema file to the server, if success the schema list is refreshed */ - this.schemasService.addSchema(schema).subscribe(result => { - this.socketService.unsubscribe('getschema'); - this.addingResult = result['success'] ? 1 : 0; - this.getSchemas(); - }); - } - - remove(key: string) { - this.schemasService.rmSchema(key).subscribe( - result => { if ( result['success'] ) { this.getSchemas() } } ); - } - - ngOnInit(): void { - this.getSchemas(); - } - - onSelect(key: string): void { - this.schemasService.show(key) - .subscribe((result: object) => { - if (result['success']) { - this.router.navigateByUrl( '/netopeer/yang' ); - } - }); - } -} diff --git a/frontend/monitoring/monitoring.component.html b/frontend/monitoring/monitoring.component.html deleted file mode 100644 index bf910f4..0000000 --- a/frontend/monitoring/monitoring.component.html +++ /dev/null @@ -1,11 +0,0 @@ -
- -

Monitoring (TBD)

-

Work with NETCONF notifications from the connected devices.

-
    -
  • subscribing for notifications
  • -
  • setting up time windows, filters, search in the received data
  • -
  • background monitoring (receiving notifications) with alerts sent via email
  • -
- -
\ No newline at end of file diff --git a/frontend/monitoring/monitoring.component.scss b/frontend/monitoring/monitoring.component.scss deleted file mode 100644 index 12dd39c..0000000 --- a/frontend/monitoring/monitoring.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../netopeer-common'; \ No newline at end of file diff --git a/frontend/monitoring/monitoring.component.ts b/frontend/monitoring/monitoring.component.ts deleted file mode 100644 index 719930b..0000000 --- a/frontend/monitoring/monitoring.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector : 'netopeer-config', - templateUrl : './monitoring.component.html', - styleUrls : ['./monitoring.component.scss'] -}) - -export class MonitoringComponent { - title = 'Monitoring'; -} diff --git a/frontend/netopeer.component.html b/frontend/netopeer.component.html deleted file mode 100644 index c3e6206..0000000 --- a/frontend/netopeer.component.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Netopeer {{componentTitle}}

- - - -
-
- - -
diff --git a/frontend/netopeer.component.ts b/frontend/netopeer.component.ts deleted file mode 100644 index 38cd324..0000000 --- a/frontend/netopeer.component.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -import { SessionsService } from './config/sessions.service'; -import { DevicesService } from './inventory/devices.service'; -import { Device } from './inventory/device'; - -class NComponent { - route: string; - name: string; -} - -const NCOMPONENTS: NComponent[] = [ - { route : 'inventory', name: 'Inventory' }, - { route : 'config', name: 'Configuration' }, - { route : 'yang', name: 'YANG Explorer' }, - { route : 'monitoring', name: 'Monitoring' }, - { route : 'plugins', name: 'Plugins' } -]; - -@Component({ - selector : 'netopeer', - templateUrl : './netopeer.component.html', - styleUrls : ['./netopeer.scss'], -}) - -export class NetopeerComponent implements OnInit { - componentTitle = ''; - netopeerComponents = NCOMPONENTS; - - constructor(private sessionsService: SessionsService, - private devicesService: DevicesService) { } - - ngOnInit() { - /* autoconnect selected devices if needed */ - if (localStorage.getItem('netopeer-autoconnect') == 'enabled') { - let ac_sessions: number[] = []; /* currently connected autoconnect devices' ids */ - for (let session of this.sessionsService.sessions) { - if (session.device.autoconnect) { - ac_sessions.push(session.device.id); - } - } - let ac_devices: Device[] = []; /* devices with enabled autoconnect */ - this.devicesService.getDevices().subscribe(devices => { - for (let device of devices) { - if (!device['autoconnect']) { - continue; - } - let i = ac_sessions.indexOf(device.id); - if (i != -1) { - ac_sessions.splice(i, 1); - continue; - } - /* we have not connected autoconnect device */ - ac_devices.push(device); - } - for (let device of ac_devices) { - this.sessionsService.connect(device).subscribe(); - } - localStorage.setItem('netopeer-autoconnect', 'done'); - }); - } - } - - onActivate(componentRef) { - this.componentTitle = componentRef.title; - } - onDeactivate(componentRef) { - this.componentTitle = ''; - } -} diff --git a/frontend/netopeer.module.ts b/frontend/netopeer.module.ts deleted file mode 100644 index 1b381ab..0000000 --- a/frontend/netopeer.module.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { NgModule, OnInit } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Routes, RouterModule } from '@angular/router'; -import { FormsModule } from '@angular/forms'; -import { ReactiveFormsModule } from '@angular/forms'; -import { HttpClientModule } from '@angular/common/http'; - -import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; - -import { AuthGuard } from 'app/utils/auth.guard'; - -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {MatProgressBarModule} from '@angular/material/progress-bar'; - -import { LoadingComponent } from './common/loading/loading.component'; -import { OrderingDirective } from './config/ordering.directive'; - -import { NetopeerComponent } from './netopeer.component'; -import { DashboardComponent } from './dashboard.component'; -import { InventoryComponent, DialogueSchema } from './inventory/inventory.component'; -import { InventorySchemasComponent } from './inventory/schemas.component'; -import { InventoryDevicesComponent, DialogueHostcheck, DialoguePassword } from './inventory/devices.component'; -import { ConfigComponent } from './config/config.component'; -import { TreeView, TreeNode, TreeLeaflistValue, TreeIndent, TreeCreate, TreeEdit, TreeScrollTo, CheckLeafValue } from './config/tree.component'; -import { YANGComponent, YANGModule, YANGIdentity, YANGFeature, YANGTypedef, YANGType, YANGRestriction, YANGNode, YANGIffeature } from './yang/yang.component'; -import { MonitoringComponent } from './monitoring/monitoring.component'; -import { PluginsComponent } from './plugins/plugins.component'; - -import { SessionsService } from './config/sessions.service'; -import { SchemasService } from './yang/schemas.service'; -import { DevicesService } from './inventory/devices.service'; -import { TreeService } from './config/tree.service'; - -import { NoPrefixPipe, PrefixOnlyPipe, PatternHighlightPipe } from './common/pipes'; - -const routes: Routes = [ - { path : 'netopeer', component : NetopeerComponent, canActivate : [AuthGuard], - data : { role : 10, name : 'Netopeer', description : 'Network Management Center', icon : 'fa-gears' }, - children: [{ - path : 'dashboard', - component : DashboardComponent, - canActivate : [AuthGuard], - data : { role : 10, name : 'Netopeer Dashboard'} - }, { - path : 'inventory', - component : InventoryComponent, - canActivate : [AuthGuard], - data : { role : 10, name : 'Netopeer Items Inventories'}, - children : [{ - path : '', - redirectTo: 'devices', - pathMatch: 'full', - }, { - path : 'devices', - component : InventoryDevicesComponent, - canActivate : [AuthGuard], - data : { role : 10, name : 'NETCONF Devices Inventory'} - }, { - path : 'schemas', - component : InventorySchemasComponent, - canActivate : [AuthGuard], - data : { role : 10, name : 'YANG Schemas Inventory'} - }] - }, { - path : 'config', - component : ConfigComponent, - canActivate : [AuthGuard], - data : { role : 10, name : 'Netopeer Device Configuration'}, - }, { - path : 'yang', - component : YANGComponent, - canActivate : [AuthGuard], - data : { role : 10, name : 'Netopeer YANG Explorer'}, - }, { - path : 'monitoring', - component : MonitoringComponent, - canActivate : [AuthGuard], - data : { role : 10, name : 'Netopeer Device Monitoring'}, - }, { - path : 'plugins', - component : PluginsComponent, - canActivate : [AuthGuard], - data : { role : 10, name : 'Netopeer Plugins'}, - }] - } -] - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - ReactiveFormsModule, - HttpClientModule, - NgbModule.forRoot(), - RouterModule.forChild(routes), - MatProgressSpinnerModule, - MatProgressBarModule, - ], - declarations: [ - NetopeerComponent, - DashboardComponent, - InventoryComponent, - InventorySchemasComponent, - InventoryDevicesComponent, - ConfigComponent, - LoadingComponent, - OrderingDirective, - CheckLeafValue, - TreeScrollTo, - TreeIndent, - TreeEdit, - TreeCreate, - TreeLeaflistValue, - TreeNode, - TreeView, - YANGComponent, - YANGModule, - YANGIdentity, - YANGFeature, - YANGTypedef, - YANGType, - YANGRestriction, - YANGNode, - YANGIffeature, - MonitoringComponent, - PluginsComponent, - DialogueHostcheck, - DialoguePassword, - DialogueSchema, - NoPrefixPipe, - PrefixOnlyPipe, - PatternHighlightPipe - ], - providers: [ - SessionsService, - SchemasService, - DevicesService, - TreeService - ], - entryComponents : [ - NetopeerComponent, - DialogueHostcheck, - DialoguePassword, - DialogueSchema - ] -}) -export class NetopeerModule { } - -export class NetopeerModuleHooks { - constructor () { } - - login() { - localStorage.setItem('netopeer-autoconnect', 'enabled'); - } - - logout() { - localStorage.removeItem('netopeer-autoconnect'); - } -} diff --git a/frontend/netopeer.scss b/frontend/netopeer.scss deleted file mode 100644 index 7a749b7..0000000 --- a/frontend/netopeer.scss +++ /dev/null @@ -1,51 +0,0 @@ -@import 'netopeer-common'; - -#netopeer-header { - position: fixed; - width: 100%; - margin: -0.5em -1em 0em -1em; - padding-top: 1em; - background-color: $colorMain; - color: $colorTextInverse; - display: block; -} - -#netopeer-header h1 { - margin-left: 1em; - color: $colorTextInverse; -} - -#netopeer-component { - margin: 0em -1em 0em -1em; -} - -#mainnav { - with: 100%; - padding-left: 1em; -} - -#mainnav a:visited, -#mainnav a:link { - color: inherit; -} - -#mainnav a:hover { - border-top-color: $colorHighlight; - background-color: $colorHighlight; -} - -#mainnav a.active { - border-top-color: $colorSelected2; - background-color: $colorSelected; -} -#mainnav a.active:hover { - cursor: default; -} - -#mainnav a { - text-decoration: none; - display: inline-block; - padding: 0.5em 1em 0.5em 0.5em; - color: $colorTextInverse; - border-top: 0.2em solid $colorMain; -} diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..661c0ec --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,12556 @@ +{ + "name": "netconf-tool-devkit", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.8.9.tgz", + "integrity": "sha512-2tiGPkvJyFY/G3a27uC8r6Jj3H5m8SxjMqhjNUQ5AtNumweTBPt3YIYMNAvHUmxG0nA9upDolVXFmoQGK9AhKQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.8.9", + "rxjs": "6.2.2" + } + }, + "@angular-devkit/build-angular": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.8.9.tgz", + "integrity": "sha512-J6o0MwIG1cJT29p87c7uUn7NY3QLEoQOVw4VXWM9cqG9bv99VK7f7eOSDhHJbXn7Snm4XYrye0zRa3RFXhMG+A==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.8.9", + "@angular-devkit/build-optimizer": "0.8.9", + "@angular-devkit/build-webpack": "0.8.9", + "@angular-devkit/core": "0.8.9", + "@ngtools/webpack": "6.2.9", + "ajv": "6.4.0", + "autoprefixer": "8.6.5", + "circular-dependency-plugin": "5.0.2", + "clean-css": "4.2.1", + "copy-webpack-plugin": "4.5.2", + "file-loader": "1.1.11", + "glob": "7.1.3", + "html-webpack-plugin": "3.2.0", + "istanbul": "0.4.5", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.3.0", + "less": "3.8.1", + "less-loader": "4.1.0", + "license-webpack-plugin": "1.5.0", + "loader-utils": "1.1.0", + "mini-css-extract-plugin": "0.4.4", + "minimatch": "3.0.4", + "node-sass": "^4.9.3", + "opn": "5.4.0", + "parse5": "4.0.0", + "portfinder": "1.0.19", + "postcss": "6.0.23", + "postcss-import": "11.1.0", + "postcss-loader": "2.1.6", + "postcss-url": "7.3.2", + "raw-loader": "0.5.1", + "rxjs": "6.2.2", + "sass-loader": "7.1.0", + "semver": "5.6.0", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.9", + "stats-webpack-plugin": "0.6.2", + "style-loader": "0.21.0", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "tree-kill": "1.2.1", + "uglifyjs-webpack-plugin": "1.3.0", + "url-loader": "1.1.2", + "webpack": "4.16.4", + "webpack-dev-middleware": "3.4.0", + "webpack-dev-server": "3.1.14", + "webpack-merge": "4.1.4", + "webpack-sources": "1.3.0", + "webpack-subresource-integrity": "1.1.0-rc.4" + } + }, + "@angular-devkit/build-ng-packagr": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-ng-packagr/-/build-ng-packagr-0.8.9.tgz", + "integrity": "sha512-RzzSzDM9xdnSfRf1m2FgOIMvs9B1uqufNIBlJPNlW5td076+KegTxsTTnmdn/kMlsgpSnYrCKsFmXS6ZbLHcyA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.8.9", + "@angular-devkit/core": "0.8.9", + "rxjs": "6.2.2", + "semver": "5.6.0" + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.8.9.tgz", + "integrity": "sha512-h8u5iAhSmt0TsLDZXZCmOkXZDMgP2itLkgZvOIsGInyMAESJuWK4P1qegMSv2R5ELOsinJiuhe218M4K2enEdA==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "source-map": "0.5.7", + "typescript": "2.9.2", + "webpack-sources": "1.3.0" + }, + "dependencies": { + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.8.9.tgz", + "integrity": "sha512-2csJ6utodPSLABTXfBLymYLrndJURF3xVqVjEDzUFl9zLqK1YOkKH4XPr12vfH8SfAtvzIutNLRxBtAuWJmDlw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.8.9", + "@angular-devkit/core": "0.8.9", + "rxjs": "6.2.2" + } + }, + "@angular-devkit/core": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.9.tgz", + "integrity": "sha512-Umax3YKBPTQy360TeoSNaIIOJOKoXvN/S2WNTV8wDjSWWNiWLTIlckWMb9DVsafAifjUi0mtOLRFuM4YatKgTw==", + "dev": true, + "requires": { + "ajv": "6.4.0", + "chokidar": "2.0.4", + "rxjs": "6.2.2", + "source-map": "0.5.7" + } + }, + "@angular-devkit/schematics": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.8.9.tgz", + "integrity": "sha512-JZiK1aHJUFV6xDtUMBLoH3cLgi7EtR1bXjNqqa11MAjnHMqzm2GBazPvzGkMwVbCxC1sdYgswwGX9GS2tpHawA==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.8.9", + "rxjs": "6.2.2" + } + }, + "@angular/animations": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-6.1.10.tgz", + "integrity": "sha512-dd/lq7kw3uwfHPICan8psu2nthuUpp7PvMLuNIm0XxObZ4oNs0ls6uxKEDPnEkRKoGdiJpvmsyzZZN9ACMPEAA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cli": { + "version": "6.2.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-6.2.9.tgz", + "integrity": "sha512-4xuTbmMKGx1bMi0KA3Xmtx/emy10wlSwTXoUijlhd2tcWmlI2wRjAYjR7efSbFo8dVskiq0CyAVFWr1IanYQZw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.8.9", + "@angular-devkit/core": "0.8.9", + "@angular-devkit/schematics": "0.8.9", + "@schematics/angular": "0.8.9", + "@schematics/update": "0.8.9", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "json-schema-traverse": "0.4.1", + "npm-package-arg": "6.1.0", + "opn": "5.4.0", + "pacote": "9.2.3", + "rxjs": "6.2.2", + "semver": "5.6.0", + "symbol-observable": "1.2.0", + "yargs-parser": "10.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "@angular/common": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-6.1.10.tgz", + "integrity": "sha512-73xxTSYJNKfiJ7C1Ajg+sz5l8y+blb/vNgHYg7O3yem5zLBnfPpidJ1UGg4W4d2Y+jwUVJbZKh8SKJarqAJVUQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-6.1.10.tgz", + "integrity": "sha512-FPIb2j3zfoBwb6vo/u0gQeu70h8InGlSisBr3xMACs/35/pwB6kbQR+JQiUr0D7k6QApg7AuMkvq8aFNelg0aw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-6.1.10.tgz", + "integrity": "sha512-GCWdyeNQSnF4RfzO4A0+WHsNEgxKpl5arg4ldLSWMNkj/DrhMD4TnmxhR+IVY+7ieMkUBwpcuWRnjdOdnbmV+w==", + "dev": true, + "requires": { + "chokidar": "^1.4.2", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "tsickle": "^0.32.1" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "tsickle": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.32.1.tgz", + "integrity": "sha512-JW9j+W0SaMSZGejIFZBk0AiPfnhljK3oLx5SaqxrJhjlvzFyPml5zqG1/PuScUj6yTe1muEqwk5CnDK0cOZmKw==", + "dev": true, + "requires": { + "jasmine-diff": "^0.1.3", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0", + "source-map-support": "^0.5.0" + } + } + } + }, + "@angular/core": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-6.1.10.tgz", + "integrity": "sha512-61l3rIQTVdT45eOf6/fBJIeVmV10mcrxqS4N/1OWkuDT29YSJTZSxGcv8QjAyyutuhcqWWpO6gVRkN07rWmkPg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/forms": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-6.1.10.tgz", + "integrity": "sha512-zAPx2kMV1/FbP5DrY472Sd/ze1m+GS6T5ullZCtP392r62p2RkwzDCXieR51YiRJjZj3M6c3AcRND7PWBdXT7A==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-6.1.10.tgz", + "integrity": "sha512-nN29Ovomg21eL8acwOSUFAYwWFI1TuFwUgUu37ZssfVQrYdaV+BFx3yv3P0nKU90h3Hp+oIkWHd8U34UYrvBCg==", + "dev": true + }, + "@angular/platform-browser": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-6.1.10.tgz", + "integrity": "sha512-CB7pqMwtgb7KjdHDAJlsXcs0rrU+2xQVaoOaqEfJtUrKhtGMLaZh8Qoic5l92SoGattkOw7SYarAOsWlAsVfvw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.1.10.tgz", + "integrity": "sha512-DmBSUyFPoyKqkmBXyJ2CrP1oXDioeoBlPA8lmWUDUv2yBuoHIzIkdY/OkTZbdyu/QYa1hK2Jl9OlfoeoenKddg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-6.1.10.tgz", + "integrity": "sha512-tekI3dkdvd65oMoxjjgRA+16uDgPUBWHhYxids6pgO8vobZNtCo8VaVlcDyLUhdmtS5kONELx0iL5E2M0Y2Bag==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/generator": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", + "dev": true + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } + } + }, + "@ngtools/json-schema": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.1.0.tgz", + "integrity": "sha1-w6DFRNYjkqzCgTpCyKDcb1j4aSI=", + "dev": true + }, + "@ngtools/webpack": { + "version": "6.2.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-6.2.9.tgz", + "integrity": "sha512-wZ9ROI4FdA9gnx21ULtA8u6Gmtig3BbT6EfUh2uYisjyL4P9k2p22sfY/Txwu/InnF4LDHOs5xZutOnGvC87vw==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.8.9", + "rxjs": "6.2.2", + "tree-kill": "1.2.1", + "webpack-sources": "1.3.0" + } + }, + "@schematics/angular": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.8.9.tgz", + "integrity": "sha512-QTCcvBr+HLk8oJuPvonc8myYVU4ko5qsIhTon0gyWQg8McQnjCf8dTpnLM/VSzrmR71wOQ9fqvl+qS+eujrtnA==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.8.9", + "@angular-devkit/schematics": "0.8.9", + "typescript": ">=2.6.2 <2.10" + }, + "dependencies": { + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + } + } + }, + "@schematics/update": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.8.9.tgz", + "integrity": "sha512-duefusf5YdKGcNfNlHM/eMpkuvR2o4rqLDX0wo59Pu1KKXoDEUy5lj0mOA+hXbzjHtrtOxpffxKU0+AzovEMPA==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.8.9", + "@angular-devkit/schematics": "0.8.9", + "npm-registry-client": "8.6.0", + "rxjs": "6.2.2", + "semver": "5.6.0", + "semver-intersect": "1.4.0" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/jasmine": { + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.16.tgz", + "integrity": "sha512-056oRlBBp7MDzr+HoU5su099s/s7wjZ3KcHxLfv+Byqb9MwdLUvsfLgw1VS97hsh3ddxSPyQu+olHMnoVTUY6g==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/node": { + "version": "8.10.61", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.61.tgz", + "integrity": "sha512-l+zSbvT8TPRaCxL1l9cwHCb0tSqGAGcjPJFItGGYat5oCTiq1uQQKYg5m7AF1mgnEBzFXGLJ2LRmNjtreRX76Q==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/resolve": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", + "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "dev": true + }, + "@types/socket.io-client": { + "version": "1.4.33", + "resolved": "https://registry.npmjs.org/@types/socket.io-client/-/socket.io-client-1.4.33.tgz", + "integrity": "sha512-m4LnxkljsI9fMsjwpW5QhRpMixo2BeeLpFmg0AE+sS4H1pzAd/cs/ftTiL60FLZgfFa8PFRPx5KsHu8O0bADKQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", + "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "debug": "^3.1.0", + "mamacro": "^0.0.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", + "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", + "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", + "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", + "dev": true, + "requires": { + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", + "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.5.13" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", + "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", + "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "mamacro": "^0.0.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", + "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", + "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/ieee754": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", + "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", + "dev": true, + "requires": { + "ieee754": "^1.1.11" + } + }, + "@webassemblyjs/leb128": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", + "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", + "dev": true, + "requires": { + "long": "4.0.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + } + } + }, + "@webassemblyjs/utf8": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", + "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", + "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/helper-wasm-section": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "@webassemblyjs/wast-printer": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", + "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", + "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", + "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", + "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/floating-point-hex-parser": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-code-frame": "1.5.13", + "@webassemblyjs/helper-fsm": "1.5.13", + "long": "^3.2.0", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", + "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "long": "^3.2.0" + } + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "^5.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + } + } + }, + "adm-zip": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^3.0.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "8.6.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.5.tgz", + "integrity": "sha512-PLWJN3Xo/rycNkx+mp8iBDMTm3FeWe4VmYaZDSqL5QQB9sLsQkG5k8n+LNDFnhh9kdq2K+egL/icpctOmDHwig==", + "dev": true, + "requires": { + "browserslist": "^3.2.8", + "caniuse-lite": "^1.0.30000864", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.23", + "postcss-value-parser": "^3.2.3" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "browserstack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", + "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001048", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz", + "integrity": "sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz", + "integrity": "sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==", + "dev": true + }, + "circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codelyzer": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.3.0.tgz", + "integrity": "sha512-RLMrtLwrBS0dfo2/KTP+2NHofCpzcuh0bEp/A/naqvQonbUL4AW/qWQdbpn8dMNudtpmzEx9eS8KEpGdVPg1BA==", + "dev": true, + "requires": { + "app-root-path": "^2.0.1", + "css-selector-tokenizer": "^0.7.0", + "cssauron": "^1.4.0", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.0.3" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "^4.5.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-zmC33E8FFSq3AbflTvqvPvBo621H36Afsxlui91d+QyZxPIuXghfnTsa1CuqiAaCPgJoSUWfTFbKJnadZpKEbQ==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + } + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", + "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2", + "regexpu-core": "^4.6.0" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-gateway": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "dev": true, + "requires": { + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.427", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz", + "integrity": "sha512-/rG5G7Opcw68/Yrb4qYkz07h3bESVRJjUl4X/FrKLXzoUJleKm6D7K7rTTz8V5LUWnd+BbTOyxJX2XprRqHD8A==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "engine.io-client": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.1.tgz", + "integrity": "sha512-RJNmA+A9Js+8Aoq815xpGAsgWH1VoSYM//2VgIiu9lNOaHFfLpTjH4tOzktBpjIs5lvOfiNY1dwf+NuU6D38Mw==", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~6.1.0", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", + "dev": true, + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "globule": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.1.tgz", + "integrity": "sha512-OVyWOHgw29yosRHCHo7NncwR1hW5ew0W/UrvtwvjefVJeQ26q4/8r8FmPsSF1hJ93IgWkyv16pCTz6WblMzm/g==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.12", + "minimatch": "~3.0.2" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dev": true, + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "injection-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.3.0.tgz", + "integrity": "sha512-rhS6E5jv603kbaO72ylOt0hGF1LT03oqQ4GU5KOO0qSaRbIWmdUCHjXq+VT79jL6/NmXtw9ccfK6dh/CzjoYjA==", + "dev": true + }, + "internal-ip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "dev": true, + "requires": { + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-api": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.6.tgz", + "integrity": "sha512-x0Eicp6KsShG1k1rMgBAi/1GgY7kFGEBwQpw3PXGEmu+rBcBNhqU8g2DgY9mlepAsLPzrzrbqSgCGANnki4POA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, + "requires": { + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", + "dev": true + }, + "jasmine-diff": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/jasmine-diff/-/jasmine-diff-0.1.3.tgz", + "integrity": "sha1-k8zC3MQQKMXd1GBlWAdIOfLe6qg=", + "dev": true, + "requires": { + "diff": "^3.2.0" + } + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "js-base64": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz", + "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.4.0.tgz", + "integrity": "sha512-gZAOYuPl4EhPTXT0GjhI3o+ZAz3su6EhLrKUoAivcKqyqC7laS5JEv4XWZND9BgcDcF83vI85yGbDmDR6UhrIg==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-3.0.0.tgz", + "integrity": "sha512-ZTjyuDXVXhXsvJ1E4CnZzbCjSxD6sEdzEsFYogLuZM0yqvg/mgz+O+R1jb0J7uAQeuzdY8kJgx6hSNXLwFuHIQ==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.4", + "log4js": "^3.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.1.1", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.2.1" + }, + "dependencies": { + "mime": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", + "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.6.tgz", + "integrity": "sha512-WFh77RI8bMIKdOvI/1/IBmgnM+Q7NOLhnwG91QJrM8lW+CIXCjTzhhUsT/svLvAkLmR10uWY4RyYbHMLkTglvg==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "dev": true, + "requires": { + "karma-jasmine": "^1.0.2" + } + }, + "karma-source-map-support": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", + "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "less": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.8.1.tgz", + "integrity": "sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + } + }, + "less-plugin-npm-import": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/less-plugin-npm-import/-/less-plugin-npm-import-2.1.0.tgz", + "integrity": "sha1-gj5phskzGKmBccqFiEi2vq1Vvz4=", + "dev": true, + "requires": { + "promise": "~7.0.1", + "resolve": "~1.1.6" + }, + "dependencies": { + "promise": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.0.4.tgz", + "integrity": "sha1-Nj6EpMNsg1a4kP7WLJHOhdAu1Tk=", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + } + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "license-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-Of/H79rZqm2aeg4RnP9SMSh19qkKemoLT5VaJV58uH5AxeYWEcBgGFs753JEJ/Hm6BPvQVfIlrrjoBwYj8p7Tw==", + "dev": true, + "requires": { + "ejs": "^2.5.7" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "log4js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", + "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", + "dev": true, + "requires": { + "circular-json": "^0.5.5", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "rfdc": "^1.1.2", + "streamroller": "0.7.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "loglevel": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", + "dev": true + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-fetch-happen": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.2.tgz", + "integrity": "sha512-YMJrAjHSb/BordlsDEcVcPyTbiJKkzqMf48N8dAJZT9Zjctrkb6Yg4TY9Sq2AwSIQJFn5qBBKVTYt3vP5FMIHA==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.3.3", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz", + "integrity": "sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "ng-packagr": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-4.7.1.tgz", + "integrity": "sha512-MIPKxyrnV22fS3wSfst2XjwWOonFKujVVEnIehYJhiu8GOg37bCdbbr9plsE1jRDmDAUz6M1MvdKibUrJyRp6Q==", + "dev": true, + "requires": { + "@ngtools/json-schema": "^1.1.0", + "autoprefixer": "^9.0.0", + "browserslist": "^4.0.0", + "chalk": "^2.3.1", + "chokidar": "^2.0.3", + "clean-css": "^4.1.11", + "commander": "^2.12.0", + "fs-extra": "^7.0.0", + "glob": "^7.1.2", + "injection-js": "^2.2.1", + "less": "^3.8.0", + "less-plugin-npm-import": "^2.1.0", + "node-sass": "^4.9.3", + "node-sass-tilde-importer": "^1.0.0", + "opencollective-postinstall": "^2.0.1", + "postcss": "^7.0.0", + "postcss-url": "^8.0.0", + "read-pkg-up": "^4.0.0", + "rimraf": "^2.6.1", + "rollup": "^0.67.0", + "rollup-plugin-commonjs": "^9.1.3", + "rollup-plugin-json": "^3.1.0", + "rollup-plugin-node-resolve": "^4.0.0", + "rollup-plugin-sourcemaps": "^0.4.2", + "rxjs": "^6.0.0", + "stylus": "^0.54.5", + "uglify-js": "^3.0.7", + "update-notifier": "^2.3.0" + }, + "dependencies": { + "autoprefixer": { + "version": "9.7.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.6.tgz", + "integrity": "sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==", + "dev": true, + "requires": { + "browserslist": "^4.11.1", + "caniuse-lite": "^1.0.30001039", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" + } + }, + "browserslist": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mime": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", + "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-8.0.0.tgz", + "integrity": "sha512-E2cbOQ5aii2zNHh8F6fk1cxls7QVFZjLPSrqvmiza8OuXLzIpErij8BDS5Y3STPfJgpIMNCPEr8JlKQWEoozUw==", + "dev": true, + "requires": { + "mime": "^2.3.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^7.0.2", + "xxhashjs": "^0.2.1" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true + }, + "node-sass": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.0.tgz", + "integrity": "sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "node-sass-tilde-importer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-sass-tilde-importer/-/node-sass-tilde-importer-1.0.2.tgz", + "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", + "dev": true, + "requires": { + "find-parent-dir": "^0.3.0" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-registry-client": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", + "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" + } + }, + "npm-registry-fetch": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.1.tgz", + "integrity": "sha512-VQCEZlydXw4AwLROAXWUR7QDfe2Y8Id/vpAgp6TI1/H78a4SiQ1kQrKZALm5/zxM5n4HIi+aYb+idUAV/RuY0Q==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.2", + "npm-package-arg": "^6.1.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, + "opn": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pacote": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.2.3.tgz", + "integrity": "sha512-Y3+yY3nBRAxMlZWvr62XLJxOwCmG9UmkGZkFurWHoCjqF0cZL72cTOCRJTvWw8T4OhJS2RTg13x4oYYriauvEw==", + "dev": true, + "requires": { + "bluebird": "^3.5.2", + "cacache": "^11.2.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.6", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + } + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "portfinder": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.19.tgz", + "integrity": "sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-import": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", + "dev": true, + "requires": { + "postcss": "^6.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", + "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^6.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^0.4.0" + } + }, + "postcss-url": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz", + "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==", + "dev": true, + "requires": { + "mime": "^1.4.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.0", + "postcss": "^6.0.1", + "xxhashjs": "^0.2.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "protractor": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", + "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", + "dev": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "dev": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rollup": { + "version": "0.67.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.67.4.tgz", + "integrity": "sha512-AVuP73mkb4BBMUmksQ3Jw0jTrBTU1i7rLiUYjFxLZGb3xiFmtVEg40oByphkZAsiL0bJC3hRAJUQos/e5EBd+w==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "@types/node": "*" + } + }, + "rollup-plugin-commonjs": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.3.4.tgz", + "integrity": "sha512-DTZOvRoiVIHHLFBCL4pFxOaJt8pagxsVldEXBOn6wl3/V21wVaj17HFfyzTsQUuou3sZL3lEJZVWKPFblJfI6w==", + "dev": true, + "requires": { + "estree-walker": "^0.6.0", + "magic-string": "^0.25.2", + "resolve": "^1.10.0", + "rollup-pluginutils": "^2.6.0" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "rollup-plugin-json": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-3.1.0.tgz", + "integrity": "sha512-BlYk5VspvGpjz7lAwArVzBXR60JK+4EKtPkCHouAWg39obk9S61hZYJDBfMK+oitPdoe11i69TlxKlMQNFC/Uw==", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.3.1" + } + }, + "rollup-plugin-node-resolve": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-4.2.4.tgz", + "integrity": "sha512-t/64I6l7fZ9BxqD3XlX4ZeO6+5RLKyfpwE2CiPNUKa+GocPlQhf/C208ou8y3AwtNsc6bjSk/8/6y/YAyxCIvw==", + "dev": true, + "requires": { + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.10.0" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "rollup-plugin-sourcemaps": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-sourcemaps/-/rollup-plugin-sourcemaps-0.4.2.tgz", + "integrity": "sha1-YhJaqUCHqt97g+9N+vYptHMTXoc=", + "dev": true, + "requires": { + "rollup-pluginutils": "^2.0.1", + "source-map-resolve": "^0.5.0" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", + "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + } + }, + "sass-loader": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "dev": true, + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + } + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.1.1", + "socket.io-parser": "~3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.2.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", + "has-binary2": "~1.0.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + } + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stats-webpack-plugin": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.6.2.tgz", + "integrity": "sha1-LFlJtTHgf4eojm6k3PrFOqjHWis=", + "dev": true, + "requires": { + "lodash": "^4.17.4" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "streamroller": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "dev": true, + "requires": { + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", + "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5" + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "systemjs": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.3.1.tgz", + "integrity": "sha512-pYAQxEK2a3Xj6cRVXrXgogSfKc3oFTzEWejK8KfHcZxwT31yT2xL43WXjUNcjOk5P048Z1zLRIlfrB3Mq4W+PQ==" + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "^7.1.2" + } + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "tsickle": { + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.37.1.tgz", + "integrity": "sha512-0GwgOJEnsmRsrONXCvcbAWY0CvdqF3UugPVoupUpA8Ul0qCPTuqqq0ou/hLqtKZOyyulzCP6MYRjb9/J1g9bJg==", + "dev": true + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, + "tslint": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", + "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + } + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", + "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", + "dev": true, + "requires": { + "chokidar": "^2.1.8", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.4.tgz", + "integrity": "sha512-RqUfwp4qMqv3oFwBQQOoK69C2tdu2FHJEqPABPqgjGDvOIOLqkTOhmmdJjpiRabzNAAH1ahmkA3z4xowlHN+VA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/wasm-edit": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.2.4", + "watchpack": "^1.5.0", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", + "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz", + "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.18.0", + "import-local": "^2.0.0", + "internal-ip": "^3.0.1", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", + "selfsigned": "^1.9.1", + "semver": "^5.6.0", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "3.4.0", + "webpack-log": "^2.0.0", + "yargs": "12.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", + "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.4", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.4.tgz", + "integrity": "sha1-xcTj1pD50vZKlVDgeodn+Xlqpdg=", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "^0.2.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.8.29", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz", + "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==" + } + } +} diff --git a/frontend/package-shared.json b/frontend/package-shared.json new file mode 100644 index 0000000..575ff80 --- /dev/null +++ b/frontend/package-shared.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "systemjs": "3.0.2" + }, + "devDependencies": { + } +} diff --git a/frontend/package.json b/frontend/package.json index e651b9f..67411aa 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,20 +1,64 @@ { - "name": "Netopeer2GUI", - "version": "0.1.0", - "description": "NETCONF management center", - "main": "index.html", - "repository": { - "type": "git", - "url": "git+https://github.com/CESNET/Netopeer2GUI.git" + "name": "netconf-tool-devkit", + "version": "1.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e", + "postinstall": "tsc -p builders/tsconfig.builders.json", + "build:tools": "npm run build:lib && npm run build:example && npm run build:yang-explorer && npm run build:yang-configure && npm run build:color-picker", + "build:lib": "ng build netconf-lib && rm -rf src/app/netconf-lib && cp -rf dist/netconf-lib src/app/netconf-lib && ng build --project tools --prod --modulePath=netconf-lib#NetconfLibModule --pluginName=netconf-lib --outputPath=../assets/tools", + "build:example": "ng build --project tools --prod --modulePath=./example/example.module#ExampleModule --pluginName=example --sharedLibs=netconf-lib --outputPath=../assets/tools", + "build:yang-explorer": "ng build --project tools --prod --modulePath=./yang-explorer/yang-explorer.module#YangExplorerModule --pluginName=yang-explorer --sharedLibs=netconf-lib --outputPath=../assets/tools", + "build:yang-configure": "ng build --project tools --prod --modulePath=./yang-configure/yang-configure.module#YangConfigureModule --pluginName=yang-configure --sharedLibs=netconf-lib --outputPath=../assets/tools", + "build:color-picker": "ng build --project tools --prod --modulePath=./color-picker/color-picker.module#ColorPickerModule --pluginName=color-picker --sharedLibs=netconf-lib --outputPath=../assets/tools" }, - "author": "", - "license": "BSD", - "bugs": { - "url": "https://github.com/CESNET/Netopeer2GUI/issues" + "private": true, + "dependencies": { + "@angular/animations": "^6.0.0", + "@angular/common": "^6.0.0", + "@angular/compiler": "^6.0.0", + "@angular/core": "^6.0.0", + "@angular/forms": "^6.0.0", + "@angular/platform-browser": "^6.0.0", + "@angular/platform-browser-dynamic": "^6.0.0", + "@angular/router": "^6.0.0", + "core-js": "^2.5.4", + "rxjs": "~6.2.0", + "systemjs": "^6.2.5", + "zone.js": "~0.8.26", + "socket.io-client": "^2.0.0", + "acorn": ">=5.7.4", + "minimist": ">=1.2.2", + "serialize-javascript": ">=3.1.0" }, - "homepage": "https://github.com/CESNET/Netopeer2GUI", - "dependencies" : { - "@angular/material": "^6.0.0", - "@angular/cdk": "^6.0.0" + "devDependencies": { + "@angular-devkit/build-angular": "~0.8.0", + "@angular-devkit/build-ng-packagr": "~0.8.0", + "@angular/cli": "~6.2.9", + "@angular/compiler-cli": "^6.0.0", + "@angular/language-service": "^6.0.0", + "@types/jasmine": "~2.8.8", + "@types/jasminewd2": "~2.0.3", + "@types/node": "~8.10.61", + "@types/socket.io-client": "^1.4.33", + "codelyzer": "~4.3.0", + "jasmine-core": "~2.99.1", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~3.0.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "~2.0.1", + "karma-jasmine": "~1.1.2", + "karma-jasmine-html-reporter": "^0.2.2", + "ng-packagr": "^4.1.0", + "protractor": "~5.4.0", + "ts-node": "~7.0.0", + "tsickle": "~0.37.0", + "tslib": "^1.9.0", + "tslint": "~5.11.0", + "typescript": "~2.9.2" } } diff --git a/frontend/plugins/plugins.component.html b/frontend/plugins/plugins.component.html deleted file mode 100644 index 4b2b2f5..0000000 --- a/frontend/plugins/plugins.component.html +++ /dev/null @@ -1,11 +0,0 @@ -
- -

Plugins (TBD)

-

Framework for schema(s) specific applications - simplified/more user friendly configuration approach than the generic configuration tree in the configuration tab, for example:

-
    -
  • visual network connections configuration
  • -
  • connected devices time synchronisation checking
  • -
  • ...
  • -
- {{text}} -
\ No newline at end of file diff --git a/frontend/plugins/plugins.component.scss b/frontend/plugins/plugins.component.scss deleted file mode 100644 index 12dd39c..0000000 --- a/frontend/plugins/plugins.component.scss +++ /dev/null @@ -1 +0,0 @@ -@import '../netopeer-common'; \ No newline at end of file diff --git a/frontend/plugins/plugins.component.ts b/frontend/plugins/plugins.component.ts deleted file mode 100644 index caca99e..0000000 --- a/frontend/plugins/plugins.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector : 'netopeer-plugins', - templateUrl : './plugins.component.html', - styleUrls : ['./plugins.component.scss'] -}) - -export class PluginsComponent implements OnInit { - title = 'Plugins'; - text = "test... ignore"; - - sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - - async ngOnInit() { - await this.sleep(2000); - this.text = "still testing... still ignore"; - } -} diff --git a/frontend/projects/netconf-lib/browserslist b/frontend/projects/netconf-lib/browserslist new file mode 100644 index 0000000..ffcbb4e --- /dev/null +++ b/frontend/projects/netconf-lib/browserslist @@ -0,0 +1,5 @@ +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 diff --git a/frontend/projects/netconf-lib/karma.conf.js b/frontend/projects/netconf-lib/karma.conf.js new file mode 100644 index 0000000..4c5f8d0 --- /dev/null +++ b/frontend/projects/netconf-lib/karma.conf.js @@ -0,0 +1,31 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage'), + reports: ['html', 'lcovonly'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/frontend/projects/netconf-lib/ng-package.json b/frontend/projects/netconf-lib/ng-package.json new file mode 100644 index 0000000..a0589d8 --- /dev/null +++ b/frontend/projects/netconf-lib/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/netconf-lib", + "lib": { + "entryFile": "src/public_api.ts" + } +} \ No newline at end of file diff --git a/frontend/projects/netconf-lib/package.json b/frontend/projects/netconf-lib/package.json new file mode 100644 index 0000000..b8cbc2f --- /dev/null +++ b/frontend/projects/netconf-lib/package.json @@ -0,0 +1,10 @@ +{ + "name": "netconf-lib", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^6.0.0-rc.0 || ^6.0.0", + "@angular/core": "^6.0.0-rc.0 || ^6.0.0", + "socket.io-client": "^2.0.0", + "@angular/http": "^6.0.0" + } +} diff --git a/frontend/projects/netconf-lib/src/lib/classes/ConnectionStatus.ts b/frontend/projects/netconf-lib/src/lib/classes/ConnectionStatus.ts new file mode 100644 index 0000000..c506c1b --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/classes/ConnectionStatus.ts @@ -0,0 +1,15 @@ +/** + * Author: Jakub Man + * States of device connection + */ +export enum ConnectionStatus { + WAITING_FOR_CONNECTION = -2, + CONNECTING, + WAITING_FOR_DEVICE, + CONNECTED, + ERR_HTTP, + ERR_PASSWORD_REQUIRED, + ERR_HOSTCHECK_CONFIRMATION, + ERR_SCHEMA_REQUIRED, + ERR_SERVER +} diff --git a/frontend/projects/netconf-lib/src/lib/classes/DeviceWithStatus.ts b/frontend/projects/netconf-lib/src/lib/classes/DeviceWithStatus.ts new file mode 100644 index 0000000..605cad3 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/classes/DeviceWithStatus.ts @@ -0,0 +1,13 @@ +/** + * Author: Jakub Man + * A structure for devices when connecting them + */ +import {Device} from "./device"; +import {ConnectionStatus} from "./ConnectionStatus"; + +export class DeviceWithStatus { + device: Device; + status: ConnectionStatus | string; + hostcheckMessageId?: string; + hostcheckMessage?: string; +} diff --git a/frontend/projects/netconf-lib/src/lib/classes/GenericServerResponse.ts b/frontend/projects/netconf-lib/src/lib/classes/GenericServerResponse.ts new file mode 100644 index 0000000..ceb4390 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/classes/GenericServerResponse.ts @@ -0,0 +1,9 @@ +/** + * Author: Jakub Man + * + */ +export class GenericServerResponse { + success: boolean; + code: number; + message?: string; +} diff --git a/frontend/projects/netconf-lib/src/lib/classes/ModificationType.ts b/frontend/projects/netconf-lib/src/lib/classes/ModificationType.ts new file mode 100644 index 0000000..ee3ef16 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/classes/ModificationType.ts @@ -0,0 +1,17 @@ +/** + * Author: Jakub Man + * + */ +export const enum ModificationType { + /** Creating a new node */ + Create = "create", + /** Changing value of a current leaf node */ + Change = "change", + /** Delete a current node */ + Delete = "delete", + /** Replacing a current node */ + Replace = "replace", + /** Reordering user-ordered lists or leaf-lists */ + Reorder = "reorder" +} + diff --git a/frontend/projects/netconf-lib/src/lib/classes/device.ts b/frontend/projects/netconf-lib/src/lib/classes/device.ts new file mode 100644 index 0000000..23caada --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/classes/device.ts @@ -0,0 +1,13 @@ +/** + * Author: Jakub Man + * + */ +export class Device { + public id: string; + public name? = ''; + public hostname = ''; + public port = 830; + public username = ''; + public password?: string = ''; + public fingerprint? = ''; +} diff --git a/frontend/projects/netconf-lib/src/lib/classes/session.ts b/frontend/projects/netconf-lib/src/lib/classes/session.ts new file mode 100644 index 0000000..9600224 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/classes/session.ts @@ -0,0 +1,12 @@ +/** + * Author: Jakub Man + * + */ +import {Device} from './device'; + +export class Session { + public key: string; + public device: Device; + public data?: object[]; + public modifications: object; +} diff --git a/frontend/projects/netconf-lib/src/lib/components/content-box.component.scss b/frontend/projects/netconf-lib/src/lib/components/content-box.component.scss new file mode 100644 index 0000000..92de4a3 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/content-box.component.scss @@ -0,0 +1,25 @@ +@import "../../../../shared-styles/colors"; + +.content-box { + margin-bottom: 10px; + background: $colorItemBackground; + border-radius: 5px; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +.box-header { + background: $colorMain; + width: 100%; + font-size: 1.5rem; + border-radius: 5px 5px 0 0; + color: $colorTextInverse; + padding: 5px 10px; + text-align: center; +} +.box-content { + padding: 5px 10px; +} +.box-content-limited { + max-width: 1200px; + margin-left: auto; + margin-right: auto; +} diff --git a/frontend/projects/netconf-lib/src/lib/components/content-box.component.ts b/frontend/projects/netconf-lib/src/lib/components/content-box.component.ts new file mode 100644 index 0000000..29b7307 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/content-box.component.ts @@ -0,0 +1,31 @@ +/** + * Author: Jakub Man + * Universal content container with a header + */ +import {Component, OnInit, Input} from '@angular/core'; + +@Component({ + selector: 'lib-content-box', + template: ` +
+
{{title}}
+
+ +
+
+ `, + styleUrls: ['./content-box.component.scss'] +}) +export class ContentBoxComponent implements OnInit { + + @Input() title = ''; + @Input() limitWidth = false; + + constructor() { + } + + ngOnInit() { + + } + +} diff --git a/frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.html b/frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.html new file mode 100644 index 0000000..b0f9073 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.html @@ -0,0 +1,8 @@ +
+
+ {{session.device.name}}
+ {{session.device.hostname}}:{{session.device.port}} +
+
diff --git a/frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.scss b/frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.scss new file mode 100644 index 0000000..bdbdd8b --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.scss @@ -0,0 +1,54 @@ +@import "../../../../../shared-styles/colors"; +.quickswitch-container { + width: 100%; + border-radius: 5px; + border: 1px solid transparentize($colorText, 0.8); + box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); +} + +.quickswitch-item { + display: inline-block; + text-align: center; + border: 1px solid transparentize($colorText, 0.5); + border-radius: 0; + color: $colorText; + background: $colorItemBackground; + font-size: 13px; + padding: 5px; + cursor: pointer; + transition: all 0.3s cubic-bezier(.25,.8,.25,1); + &:first-child { + border-bottom-left-radius: 5px; + border-top-left-radius: 5px; + } + &:last-child { + border-bottom-right-radius: 5px; + border-top-right-radius: 5px; + } + &.vertical { + display: block; + width: 100%; + text-align: left; + font-size: 1.1em; + &:first-child { + border-top-right-radius: 5px; + border-top-left-radius: 5px; + } + &:last-child { + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + } + } + &.selected { + background: $colorSelected2; + } + &:hover { + color: $colorText; + background: darken($colorItemBackground, 5%); + } + +} + +.device-name { + font-weight: bold; +} diff --git a/frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.ts b/frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.ts new file mode 100644 index 0000000..56a4e6e --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/device-quickswitch/device-quickswitch.component.ts @@ -0,0 +1,52 @@ +/** + * Author: Jakub Man + * Quickly switch between selected devices + */ +import {Component, OnInit, Input, Output, EventEmitter} from '@angular/core'; +import {DeviceService} from '../../services/device.service'; +import {Device} from '../../classes/device'; +import {Session} from '../../classes/session'; + +@Component({ + selector: 'lib-device-quickswitch', + templateUrl: './device-quickswitch.component.html', + styleUrls: ['./device-quickswitch.component.scss'] +}) +export class DeviceQuickswitchComponent implements OnInit { + + @Input() sessions: Session[]; + @Input() vertical = false; + @Input() multiSelect = true; + + @Output() selectionChanged: EventEmitter = new EventEmitter(); + compatibleDevices: Device[] = []; + selected: Session[]; + + constructor(private deviceService: DeviceService) { } + + ngOnInit() { + if (this.sessions) { + if (this.multiSelect) { + this.selected = this.sessions; + } else { + this.selected = [this.sessions[0]]; + } + this.selectionChanged.emit(this.selected); + } + } + + sessionSelected(session: Session) { + if (this.multiSelect) { + if (this.selected.indexOf(session) === -1) { + this.selected.push(session); + this.selectionChanged.emit(this.selected); + } + } else { + if (this.selected[0] !== session) { + this.selected[0] = session; + this.selectionChanged.emit(this.selected); + } + } + } + +} diff --git a/frontend/projects/netconf-lib/src/lib/components/device-selection.component.html b/frontend/projects/netconf-lib/src/lib/components/device-selection.component.html new file mode 100644 index 0000000..8eaa82c --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/device-selection.component.html @@ -0,0 +1,32 @@ + +
+ + + + +
+
+
+ +
+
+
+

No compatible devices connected.

+
+
+ Cancel + +
+

{{errorMessage}}

+
+ diff --git a/frontend/projects/netconf-lib/src/lib/components/device-selection.component.scss b/frontend/projects/netconf-lib/src/lib/components/device-selection.component.scss new file mode 100644 index 0000000..cbb4806 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/device-selection.component.scss @@ -0,0 +1,39 @@ +@import "../../../../shared-styles/colors"; +@import "../../../../shared-styles/netconf"; + +.device-selection-title { + font-size: 1.2em; + margin-bottom: 0; +} + +.device-name { + font-weight: bold; + margin-right: 0.5rem; +} + +.device-item { + cursor: pointer; + border: 2px solid $colorHighlight; + background: $colorItemBackground; + border-radius: 5px; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); + margin-bottom: 0; +} + +.hostname { + font-size: 0.8em; + white-space: nowrap; + display: inline-block; + color: transparentize($colorText, 0.3); +} + +.toolbox { + width: 100%; + @media only screen and (min-width: 600px) { + display: flex; + } + .right { + margin-left: auto; + } +} + diff --git a/frontend/projects/netconf-lib/src/lib/components/device-selection.component.ts b/frontend/projects/netconf-lib/src/lib/components/device-selection.component.ts new file mode 100644 index 0000000..ac58ff3 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/device-selection.component.ts @@ -0,0 +1,83 @@ +/** + * Author: Jakub Man + * A list of connected devices with checkboxes next to each device + * Outputs a list of selected devices when user clicks the submit button + */ + +import {Component, OnInit, Input, Output, EventEmitter} from '@angular/core'; +import {SessionService} from '../services/session.service'; +import {Session} from '../classes/session'; + +@Component({ + selector: 'lib-device-selection', + templateUrl: './device-selection.component.html', + styleUrls: ['./device-selection.component.scss'], +}) +export class DeviceSelectionComponent implements OnInit { + + @Input() schemaFilter = ''; + @Output() devicesSelected: EventEmitter = new EventEmitter(); + compatibleDevices: {session: Session, selected: boolean}[] = []; + + errorMessage = ''; + + constructor(public sessionService: SessionService) { + } + + ngOnInit() { + this.reload(); + } + + /** + * Returns true, if there is at least one device selected. Returns false otherwise. + */ + areDevicesSelected(): boolean { + for (const d of this.compatibleDevices) { + if (d.selected) { + return true; + } + } + return false; + } + + setAllSelectionsTo(val: boolean) { + for (const d of this.compatibleDevices) { + d.selected = val; + } + } + + submit() { + if (this.areDevicesSelected()) { + const selectedDevices: Session[] = []; + for (const d of this.compatibleDevices) { + if (d.selected) { + selectedDevices.push(d.session); + } + } + this.devicesSelected.emit(selectedDevices); + this.errorMessage = ''; + } else { + this.errorMessage = 'No devices selected'; + } + } + + reload() { + this.sessionService.getCompatibleDeviceSessions('').subscribe( + ses => { + this.compatibleDevices = []; + for (const s of ses) { + this.compatibleDevices.push({session: s, selected: true}); + } + } + ); + this.sessionService.sessionsChanged.subscribe( + ses => { + this.compatibleDevices = []; + for (const s of ses) { + this.compatibleDevices.push({session: s, selected: true}); + } + } + ); + } + +} diff --git a/frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.html b/frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.html new file mode 100644 index 0000000..56c8c41 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.html @@ -0,0 +1,68 @@ + +
+

Missing YANG schemas

+
+

{{schema['name']}}@{{schema['revision']}}

+
+
+ +
+

+ Uploading...

+

Uploaded.

+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + +
Device nameAddress:portUsernameHostkeyStatus
{{device.device.name ? device.device.name : ""}}{{device.device.hostname}}:{{device.device.port}}{{device.device.username}}{{device.device.fingerprint ? device.device.fingerprint : ""}}{{device.status | libConnectionStatus}} + +

{{device['hostcheckMessage']}} Continue connecting?

+ + + + + +
+ +
diff --git a/frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.scss b/frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.scss new file mode 100644 index 0000000..1405f66 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.scss @@ -0,0 +1,24 @@ +@import "../../../../../shared-styles/colors"; + +.text-error { + font-weight: bolder; + color: #ee1d23; +} + +.text-success { + font-weight: bolder; + color: green; +} + +.upload-schema-label { + border: 1px solid #231f20; + padding: 0 5px; + margin-left: 5px; + border-radius: 30px; + cursor: pointer; + background: transparent; + transition: all ease-in-out 150ms; + &:hover { + background: lighten($colorHighlight, 15%); + } +} diff --git a/frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.ts b/frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.ts new file mode 100644 index 0000000..50454fd --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/now-connecting-form/now-connecting-form.component.ts @@ -0,0 +1,228 @@ +/** + * Author: Jakub Man + * A dialog shown when connecting to devices + */ +import {Component, OnInit} from '@angular/core'; +import {DeviceService} from '../../services/device.service'; +import {SessionService} from '../../services/session.service'; +import {SocketService} from '../../services/socket.service'; +import {ConnectionStatus} from '../../classes/ConnectionStatus'; +import {DeviceWithStatus} from '../../classes/DeviceWithStatus'; + + +enum ssh_hostcheck_status { + SSH_SERVER_NOT_KNOWN = 0, + SSH_SERVER_KNOWN_CHANGED = 2, + SSH_SERVER_FOUND_OTHER = 3, + SSH_SERVER_FILE_NOT_FOUND = 4 +} + + +@Component({ + selector: 'lib-now-connecting', + templateUrl: './now-connecting-form.component.html', + styleUrls: ['./now-connecting-form.component.scss'] +}) +export class NowConnectingFormComponent implements OnInit { + + + show = false; + connecting = false; + + error = ''; + + schemasRequired = []; + + constructor(public deviceService: DeviceService, + public socketService: SocketService, + public sessionService: SessionService) { + } + + ngOnInit() { + + this.deviceService.newDevicesShouldBeConnected.subscribe( + newRequest => { + if (!this.shouldCloseSelf()) { + this.show = true; + this.connectToAllWaiting(); + this.connecting = true; + } else { + this.show = false; + } + } + ); + + + this.socketService.subscribe('device_auth').subscribe((message: any) => { + this.handleAuthRequest(message); + }); + this.socketService.subscribe('getschema').subscribe((message: any) => { + this.schemasRequired.push(message); + }); + this.socketService.subscribe('hostcheck').subscribe((message: any) => { + this.handleHostkeyCheck(message); + }); + } + + connectToAllWaiting() { + for (const dev of this.deviceService.nowConnectingDevices) { + if (dev.status === ConnectionStatus.WAITING_FOR_CONNECTION) { + this.connectToDevice(dev); + } + } + } + + connectToDevice(device: DeviceWithStatus) { + this.updateDeviceStatus(device, ConnectionStatus.CONNECTING); + this.deviceService.connectToDevice(device.device).subscribe( + request => { + if (request['success']) { + this.sessionService.addSession(request['session-key'], device.device); + this.updateDeviceStatus(device, ConnectionStatus.WAITING_FOR_DEVICE); + this.checkSession(request['session-key'], device); + } else { + if (request['message']) { + this.updateDeviceStatus(device, request['message']); + } else { + this.updateDeviceStatus(device, ConnectionStatus.ERR_SERVER); + } + + } + this.connecting = false; + }, + err => { + this.updateDeviceStatus(device, ConnectionStatus.ERR_HTTP); + this.connecting = false; + } + ); + } + + checkSession(key, device: DeviceWithStatus) { + this.sessionService.sessionAlive(key).subscribe( + alive => { + if (alive['success']) { + this.updateDeviceStatus(device, ConnectionStatus.CONNECTED); + if (this.shouldCloseSelf()) { + this.deviceService.clearWaitList(); + this.close(); + } + } else { + this.updateDeviceStatus(device, ConnectionStatus.ERR_SERVER); + } + }, + err => { + this.updateDeviceStatus(device, ConnectionStatus.ERR_HTTP); + } + ); + } + + updateDeviceStatus(device: DeviceWithStatus, newStatus: ConnectionStatus | string) { + const idx = this.deviceService.nowConnectingDevices.indexOf(device); + if (idx >= 0) { + this.deviceService.nowConnectingDevices[idx].status = newStatus; + } + } + + + shouldCloseSelf() { + for (const device of this.deviceService.nowConnectingDevices) { + if (device.status !== ConnectionStatus.CONNECTED) { + return false; + } + } + return true; + } + + close() { + this.show = false; + } + + cancel() { + this.sessionService.destroyAllSessions().subscribe( + _ => { + this.sessionService.sessions = []; + this.deviceService.clearWaitList(); + alert('Connecting canceled!'); + this.close(); + }, + err => { + this.error = err.message; + } + ); + } + + handleAuthRequest(message) { + this.socketService.send('device_auth_password', {'id': message['id'], 'password': prompt('Enter password')}); + } + + handleHostkeyCheck(message) { + switch (message['state']) { + case ssh_hostcheck_status.SSH_SERVER_KNOWN_CHANGED: + message['msg'] = 'Server has changed.'; + break; + case ssh_hostcheck_status.SSH_SERVER_NOT_KNOWN: + message['msg'] = 'Server not known.'; + break; + } + const device = this.findDeviceByData( + message['device']['hostname'], + message['device']['port'], + message['device']['username'], + message['device']['name'] + ); + if (device) { + const idx = this.deviceService.nowConnectingDevices.indexOf(device); + this.deviceService.nowConnectingDevices[idx].status = ConnectionStatus.ERR_HOSTCHECK_CONFIRMATION; + this.deviceService.nowConnectingDevices[idx].hostcheckMessageId = message['id']; + this.deviceService.nowConnectingDevices[idx].hostcheckMessage = message['msg']; + this.deviceService.nowConnectingDevices[idx].device.fingerprint = message['hexa']; + } + + } + + confirmHostkeyCheck(messageId, value: boolean, deviceIdx: number) { + this.deviceService.nowConnectingDevices[deviceIdx].status = ConnectionStatus.WAITING_FOR_DEVICE; + this.socketService.send('hostcheck_result', {'id': messageId, 'result': value}); + } + + uploadSchema(fileInput: FileList, schema: any) { + if (fileInput && fileInput.item(0)) { + const idx = this.schemasRequired.indexOf(schema); + this.schemasRequired[idx]['status'] = 1; + const reader = new FileReader(); + const file: File = fileInput[0]; + reader.onloadend = (e) => { + this.socketService.send('getschema_result', { + 'id': schema['id'], + 'filename': fileInput[0]['name'], + 'data': reader.result + }); + this.schemasRequired[idx]['status'] = 2; + }; + reader.readAsText(file); + + } + } + + skipSchemaUpload() { + for (const schema of this.schemasRequired) { + this.socketService.send('getschema_result', {'id': schema['id'], 'filename': '', 'data': ''}); + } + this.schemasRequired = []; + } + + isString(val: any) { + return typeof val === 'string'; + } + + findDeviceByData(hostname, port, username, name): DeviceWithStatus { + return this.deviceService.nowConnectingDevices.find( + e => e.device.hostname === hostname && + e.device.port === port && + e.device.username === username && + e.device.name === name + ); + } + + +} diff --git a/frontend/projects/netconf-lib/src/lib/components/popup.component.scss b/frontend/projects/netconf-lib/src/lib/components/popup.component.scss new file mode 100644 index 0000000..ab31e27 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/popup.component.scss @@ -0,0 +1,46 @@ +@import "../../../../shared-styles/colors"; + +.popup-wrapper { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: transparentize(black, 0.3); + z-index: 9999; +} + +.popup-content { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + max-width: 100vw; + max-height: 100vh; + overflow: auto; + padding: 10px; + background: $colorItemBackground; + border: 3px solid $colorItemBackground; + border-radius: 5px; +} + +.popup-header { + width: calc(100% + 20px); + margin: -10px; + margin-bottom: 10px; + background: $colorMain; + color: $colorTextInverse; + border-radius: 5px 5px 0 0; + padding: 5px; + font-size: 1.3rem; + text-align: center; +} + +.popup-toolbox { + background: $colorBackground; + width: calc(100% + 20px); + margin: -10px; + margin-top: 10px; + margin-bottom: -20px; + padding: 10px; +} diff --git a/frontend/projects/netconf-lib/src/lib/components/popup.component.ts b/frontend/projects/netconf-lib/src/lib/components/popup.component.ts new file mode 100644 index 0000000..77eb311 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/popup.component.ts @@ -0,0 +1,48 @@ +/** + * Author: Jakub Man + * A universal container for popups + */ + +import {Component, OnInit, Input, Output, EventEmitter} from '@angular/core'; + +@Component({ + selector: 'lib-nc-popup', + template: ` + + `, + styleUrls: ['./popup.component.scss'] +}) +export class PopupComponent implements OnInit { + + @Input() title = ''; + @Input() toolbox = true; + @Input() submitBtnText = 'Submit'; + @Input() cancelBtnText = 'Cancel'; + + @Output() canceled: EventEmitter = new EventEmitter(); + @Output() submitted: EventEmitter = new EventEmitter(); + + constructor() { + } + + ngOnInit() { + } + + cancel() { + this.canceled.emit(true); + } + + submit() { + this.submitted.emit(true); + } + +} diff --git a/frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.html b/frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.html new file mode 100644 index 0000000..e6dfd56 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.html @@ -0,0 +1,14 @@ +

Loading schemas...

+
+

{{error}}

+

Click on schema name to view detail

+ +

No schemas found.

+
diff --git a/frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.scss b/frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.scss new file mode 100644 index 0000000..d15dd37 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.scss @@ -0,0 +1,27 @@ +@import "../../../../../shared-styles/colors"; + +.schema-list { + list-style-type: none; +} + +.schema-link { + font-family: "JetBrains Mono", "Source Code Pro", Consolas, monospace; + color: $colorText; + text-decoration: none; + &:hover { + text-decoration: underline; + color: $colorLink; + } + &.selected { + color: $colorLink; + font-weight: bolder; + } +} + +.remove-schema { + cursor: pointer; + margin-left: 20px; + &:hover { + color: red; + } +} diff --git a/frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.ts b/frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.ts new file mode 100644 index 0000000..e502c76 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/schema-list/schema-list.component.ts @@ -0,0 +1,57 @@ +/** + * Author: Jakub Man + * A list of upladed schemas with links to the YANG Explorer tool + */ +import {Component, Input, OnInit} from '@angular/core'; +import {SchemasService} from '../../services/schemas.service'; + +@Component({ + selector: 'lib-schema-list', + templateUrl: './schema-list.component.html', + styleUrls: ['./schema-list.component.scss'] +}) +export class SchemaListComponent implements OnInit { + + constructor(public schemasService: SchemasService) { } + + @Input() selected = ''; + + loading = false; + error = ''; + schemas: string[] = []; + + ngOnInit() { + this.loading = true; + this.schemasService.getSchemaNames().subscribe( + names => { + this.schemas = names; + this.loading = false; + }, + err => { + this.error = err.message; + this.loading = false; + }); + } + + removeSchema(name: string) { + if (confirm('Do you really want to remove ' + name + '?')) { + this.loading = true; + this.schemasService.removeSchema(name).subscribe( + res => { + const idx = this.schemas.indexOf(name); + this.schemas.splice(idx, 1); + if (!res.success) { + this.error = res.message; + } + this.loading = false; + }, + err => { + this.error = err.message; + this.loading = false; + } + ); + } + + } + +} diff --git a/frontend/projects/netconf-lib/src/lib/components/subcomponents/device-selection-item.component.html b/frontend/projects/netconf-lib/src/lib/components/subcomponents/device-selection-item.component.html new file mode 100644 index 0000000..734c68d --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/subcomponents/device-selection-item.component.html @@ -0,0 +1,18 @@ +
+
+
+

+ {{device.hostname}}:{{device.port}} + {{device.name}} +

+

{{device.username}}

+
+
+ +
+
+
+ diff --git a/frontend/projects/netconf-lib/src/lib/components/subcomponents/device-selection-item.component.ts b/frontend/projects/netconf-lib/src/lib/components/subcomponents/device-selection-item.component.ts new file mode 100644 index 0000000..174ea79 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/components/subcomponents/device-selection-item.component.ts @@ -0,0 +1,32 @@ +/** + * Author: Jakub Man + * A single device box for the device selection component + */ + +import {Component, OnInit, Input, Output, EventEmitter} from '@angular/core'; +import {Device} from '../../classes/device'; + + +@Component({ + selector: 'lib-device-selection-item', + templateUrl: './device-selection-item.component.html', + styleUrls: ['../device-selection.component.scss'] +}) +export class DeviceSelectionItemComponent implements OnInit { + + @Input() device: Device; + @Input() selected: boolean; + @Output() selectedChange: EventEmitter = new EventEmitter(); + compatibleDevices: Device[] = []; + + constructor() { + } + + ngOnInit() { + } + + changeSelection() { + this.selectedChange.emit(!this.selected); + } + +} diff --git a/frontend/projects/netconf-lib/src/lib/netconf-lib.component.ts b/frontend/projects/netconf-lib/src/lib/netconf-lib.component.ts new file mode 100644 index 0000000..8a32e33 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/netconf-lib.component.ts @@ -0,0 +1,24 @@ +/** + * Author: Jakub Man + * Library test component + */ + +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'lib-nc', + template: ` +

+ netconf-lib works! +

+ `, + styles: [] +}) +export class NetconfLibComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/frontend/projects/netconf-lib/src/lib/netconf-lib.module.ts b/frontend/projects/netconf-lib/src/lib/netconf-lib.module.ts new file mode 100644 index 0000000..a338aac --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/netconf-lib.module.ts @@ -0,0 +1,45 @@ +/** + * Author: Jakub Man + * A module for the netconf library + * Should be imported by modules, that want to use the library components + */ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { NetconfLibComponent } from './netconf-lib.component'; +import {DeviceQuickswitchComponent} from './components/device-quickswitch/device-quickswitch.component'; +import {DeviceSelectionComponent} from './components/device-selection.component'; +import {DeviceSelectionItemComponent} from './components/subcomponents/device-selection-item.component'; +import {ContentBoxComponent} from './components/content-box.component'; +import {PopupComponent} from './components/popup.component'; +import {HttpClientModule} from '@angular/common/http'; +import {DeviceService} from './services/device.service'; +import {SchemaListComponent} from './components/schema-list/schema-list.component'; +import {NowConnectingFormComponent} from "./components/now-connecting-form/now-connecting-form.component"; +import {ConnectionStatusPipe} from "./pipes/connectionStatus.pipe"; + +const sharedComponents = [ + NetconfLibComponent, + DeviceQuickswitchComponent, + DeviceSelectionComponent, + DeviceSelectionItemComponent, + ContentBoxComponent, + PopupComponent, + SchemaListComponent, + NowConnectingFormComponent, + ConnectionStatusPipe +]; + +@NgModule({ + imports: [ + CommonModule, + RouterModule, + HttpClientModule + ], + declarations: [ ...sharedComponents ], + exports: [ ...sharedComponents ], + providers: [ + DeviceService + ] +}) +export class NetconfLibModule { } diff --git a/frontend/projects/netconf-lib/src/lib/netconf-lib.service.ts b/frontend/projects/netconf-lib/src/lib/netconf-lib.service.ts new file mode 100644 index 0000000..a2beae0 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/netconf-lib.service.ts @@ -0,0 +1,24 @@ +/** + * Author: Jakub Man + * Demo service for testing the library + */ + +import {Injectable} from '@angular/core'; + +export * from './services/configuration.service'; + + +@Injectable({ + providedIn: 'root' +}) +export class NetconfLibService { + + constructor() { + } + + public provideExample(): string { + return 'Example service works!'; + } + + +} diff --git a/frontend/projects/netconf-lib/src/lib/pipes/connectionStatus.pipe.ts b/frontend/projects/netconf-lib/src/lib/pipes/connectionStatus.pipe.ts new file mode 100644 index 0000000..580fff5 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/pipes/connectionStatus.pipe.ts @@ -0,0 +1,38 @@ +/** + * Author: Jakub Man + * Translate device state to human readable string + */ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'libConnectionStatus', + pure: false +}) +export class ConnectionStatusPipe implements PipeTransform{ + transform(status: number | string): string { + switch (status) { + case -2: + return 'Waiting for connection'; + case -1: + return 'Connecting'; + case 0: + return 'Waiting for the device'; + case 1: + return "Connected"; + case 2: + return "HTTP error"; + case 3: + return "Password required"; + case 4: + return "Hostkey changed!"; + case 5: + return "Missing schema!"; + case 6: + return "Server error"; + default: + if(typeof status == 'number') + return status.toString(); + else return status; + } + } +} diff --git a/frontend/projects/netconf-lib/src/lib/services/configuration.service.ts b/frontend/projects/netconf-lib/src/lib/services/configuration.service.ts new file mode 100644 index 0000000..29b33f3 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/services/configuration.service.ts @@ -0,0 +1,24 @@ +/** + * Author: Jakub Man + * Service for configuration changes + */ +import {Injectable} from '@angular/core'; +import {Session} from '../classes/session'; +import {HttpClient} from '@angular/common/http'; +import {Observable} from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class ConfigurationService { + + constructor(public http: HttpClient) { + } + + public commitChanges(session: Session): Observable { + console.log('Modifications: '); + console.log(session.modifications); + return this.http.post('/netconf/session/commit', {'key': session.key, 'modifications': session.modifications}); + } + +} diff --git a/frontend/projects/netconf-lib/src/lib/services/device.service.ts b/frontend/projects/netconf-lib/src/lib/services/device.service.ts new file mode 100644 index 0000000..3abc317 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/services/device.service.ts @@ -0,0 +1,72 @@ +/** + * Author: Jakub Man + * Handling device connecting, saving and loading + */ + +import {EventEmitter, Injectable} from '@angular/core'; +import {Device} from '../classes/device'; +import {Observable} from 'rxjs'; +import {HttpClient} from '@angular/common/http'; +import {ConnectionStatus} from '../classes/ConnectionStatus'; +import {DeviceWithStatus} from '../classes/DeviceWithStatus'; + + +@Injectable() +export class DeviceService { + constructor(public http: HttpClient) { + } + + + public nowConnectingDevices: DeviceWithStatus[] = []; + public newDevicesShouldBeConnected: EventEmitter = new EventEmitter(); + + public getSavedDevices(): Observable { + return this.http.get('/netconf/devices'); + } + + public saveDevice(hostname: string, + port: number, + username: string, + deviceName = '', + password = '', + connect = false): Observable { + const dev: Device = { + fingerprint: '', + id: '', + name: deviceName, + hostname, + port, + username, + password + }; + + if (connect) { + this.createConnectionRequest([dev]); + } + return this.http.post('/netconf/device', {device: dev}); + } + + public createConnectionRequest(devices: Device[]) { + for (const device of devices) { + this.nowConnectingDevices.push({device: device, status: ConnectionStatus.WAITING_FOR_CONNECTION}); + } + this.newDevicesShouldBeConnected.emit(true); + } + + + public connectToDevice(device: Device) { + const body = { + 'name': device.name, + 'hostname': device.hostname, + 'port': device.port, + 'username': device.username, + 'password': device.password + }; + return this.http.post('/netconf/connect', body); + } + + public clearWaitList() { + this.nowConnectingDevices = []; + } + +} diff --git a/frontend/projects/netconf-lib/src/lib/services/schemas.service.ts b/frontend/projects/netconf-lib/src/lib/services/schemas.service.ts new file mode 100644 index 0000000..1869579 --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/services/schemas.service.ts @@ -0,0 +1,98 @@ +/** + * Author: Jakub Man + * Load, upload and parse schemas + */ + +import { Injectable } from '@angular/core'; +import {HttpClient} from '@angular/common/http'; +import {Observable} from 'rxjs'; +import {GenericServerResponse} from '../classes/GenericServerResponse'; + +@Injectable({ + providedIn: 'root' +}) +export class SchemasService { + + constructor(private http: HttpClient) { } + + static newlineToBr(message: string) { + const entityMap = { + '&': '&', + '<': '<', + '>': '>', + '/': '/' + }; + return message.replace(/[&<>\/]/g, s => entityMap[s]) + .replace(/\n/g, '
') + .replace(/\t/g, ' '); + } + + static formatYang(message: string) { + const chars = [...message]; // Split message to chars in unicode-safe way + + let bracketPos = 0; + let stringFlag = false; + let patternFlag = false; + let result = ''; + let idx = 0; + for (const c of chars) { + switch (c) { + case '{': + if (!stringFlag && !patternFlag) { + bracketPos++; + result += c + '
'; + } else { + result += c; + } + break; + case '}': + if (!stringFlag && !patternFlag) { + bracketPos--; + result += '
' + c; + } else { + result += c; + } + break; + case '"': + if (stringFlag) { + result += c + ''; + } else { + result += '' + c; + } + stringFlag = !stringFlag; + break; + case '\'': + if (!stringFlag) { + if (patternFlag) { + result += c + ''; + } else { + result += '' + c; + } + patternFlag = !patternFlag; + } else { + result += c; + } + break; + default: + result += c; + break; + } + idx++; + } + return result; + } + + getSchemaNames(): Observable { + return this.http.get('/netconf/schemas'); + } + + getSchema(schemaName: string): Observable { + return this.http.get('/netconf/schema/' + schemaName); + } + + removeSchema(schemaName: string): Observable { + return this.http.delete('/netconf/schema/' + schemaName); + } + + +} diff --git a/frontend/projects/netconf-lib/src/lib/services/session.service.ts b/frontend/projects/netconf-lib/src/lib/services/session.service.ts new file mode 100644 index 0000000..d39377c --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/services/session.service.ts @@ -0,0 +1,168 @@ +/** + * Author: Jakub Man + * Handle device sessions + */ + +import {EventEmitter, Injectable} from '@angular/core'; +import {HttpClient, HttpParams} from '@angular/common/http'; +import {GenericServerResponse} from '../classes/GenericServerResponse'; +import {Session} from '../classes/session'; +import {Device} from '../classes/device'; +import {Observable, of} from 'rxjs'; +import {tap} from 'rxjs/operators'; +import {ModificationType} from '../classes/ModificationType'; + + +@Injectable({ + providedIn: 'root' +}) +export class SessionService { + + get sessions(): Session[] { + return this._sessions; + } + + set sessions(value: Session[]) { + console.log('Sessions changed!'); + console.log(value); + this._sessions = value; + this.sessionsChanged.emit(value); + } + + constructor(public http: HttpClient) { + } + + private _sessions: Session[] = []; + + public sessionsChanged: EventEmitter = new EventEmitter(); + public modificationAdded: EventEmitter = new EventEmitter(); + + addSession(key: string, device: Device) { + if (!this.doesSessionExists(key)) { + const sessions = this.sessions; + sessions.push({ + key, device, modifications: {} + }); + this.sessions = sessions; + } else { + const idx = this.findSessionIndex(key); + this._sessions[idx].device = device; + this.sessionsChanged.emit(this.sessions); + } + } + + + destroySession(key: string) { + const idx = this.findSessionIndex(key); + return this.http.delete('/netconf/session/' + key) + .pipe( + tap( + next => { + this._sessions.splice(idx, 1); + this.sessionsChanged.emit(this.sessions); + } + ) + ); + } + + loadOpenSessions(): Observable { + return this.http.get('/netconf/sessions'); + } + + destroyAllSessions() { + return this.http.delete('/netconf/sessions'); + } + + /** + * Check if session exists on the server. + */ + sessionAlive(key: string): Observable { + /*const params = new HttpParams() + .append('key', key);*/ + return this.http.get('/netconf/session/alive/' + key); + } + + + doesSessionExists(key: string): Boolean { + for (const session of this._sessions) { + if (session.key === key) { + return true; + } + } + return false; + } + + findSessionIndex(key: string): number { + return this._sessions.findIndex(s => s.key === key); + } + + /** + * Path is xpath. + * For more information see https://netopeer.liberouter.org/doc/libyang/devel/howtoxpath.html + */ + public getCompatibleDeviceSessions(path: any): Observable { + if (this.sessions.length === 0) { + return this.loadOpenSessions(); + } else { + return of(this.sessions); + } + + } + + /** + * Format of path is described in detail here: https://netopeer.liberouter.org/doc/libyang/devel/howtoxpath.html + * When no path is provided, the whole tree is requested + */ + public rpcGet(sessionKey: string, recursive: boolean, path?: string, forceReload = false) { + const idx = this.findSessionIndex(sessionKey); + if (!forceReload && idx >= 0 + && this.sessions[idx] + && this.sessions[idx].data + && Object.keys(this.sessions[idx].data).length > 0 + && !path) { + // TODO: Find path + return of(this.sessions[idx].data); + } else { + const params = new HttpParams() + .append('key', sessionKey) + .append('recursive', recursive ? 'true' : 'false'); + if (path) { + params.append('path', path); + } + return this.http.get('/netconf/session/rpcGet', {params}); + } + + } + + createChangeModification(sessionKey: string, path: string, node: object, newValue: string) { + if (node['value'] == newValue) { + // No change + console.log('Value did not change'); + return; + } + const idx = this.findSessionIndex(sessionKey); + if (idx < 0) { + console.warn('Session "' + sessionKey + '" not found'); + return; + } + if (!this.sessions[idx].modifications) { + this.sessions[idx].modifications = {}; + } + this.sessions[idx].modifications[path] = { + 'type': ModificationType.Change, + 'original': node['value'], + 'value': newValue, + 'data': node + }; + this.modificationAdded.emit(this.sessions[idx]); + } + + discardModifications(sessionKey: string) { + const idx = this.findSessionIndex(sessionKey); + if (idx > 0) { + this.sessions[idx].modifications = {}; + } + + } + +} diff --git a/frontend/projects/netconf-lib/src/lib/services/socket.service.ts b/frontend/projects/netconf-lib/src/lib/services/socket.service.ts new file mode 100644 index 0000000..f1879fa --- /dev/null +++ b/frontend/projects/netconf-lib/src/lib/services/socket.service.ts @@ -0,0 +1,38 @@ +/** + * Author: Jakub Man + * Handle web socket communication + */ + +import { Injectable } from '@angular/core'; +import * as socketIo from 'socket.io-client'; +import {Observable} from 'rxjs'; + +@Injectable({ + providedIn: 'root' +}) +export class SocketService { + private socket; + + constructor() { + console.log('initSocket ' + window.location.origin); + this.socket = socketIo.connect(window.location.origin); + } + + send(event: string, message: any = null) { + if (message) { + this.socket.emit(event, message); + } else { + this.socket.emit(event); + } + } + + subscribe(event: string) { + return new Observable(observer => { + this.socket.on(event, (data) => observer.next(data)); + }); + } + + unsubscribe(event: string) { + this.socket.removeListener(event) + } +} diff --git a/frontend/projects/netconf-lib/src/public_api.ts b/frontend/projects/netconf-lib/src/public_api.ts new file mode 100644 index 0000000..10aea67 --- /dev/null +++ b/frontend/projects/netconf-lib/src/public_api.ts @@ -0,0 +1,12 @@ +/* + * Public API Surface of netconf-lib + */ + +export * from './lib/netconf-lib.service'; +export * from './lib/netconf-lib.module'; +export * from './lib/services/session.service'; +export * from './lib/services/device.service'; +export * from './lib/services/schemas.service'; +export * from './lib/services/session.service'; +export * from './lib/classes/DeviceWithStatus'; +export * from './lib/classes/session'; diff --git a/frontend/projects/netconf-lib/src/test.ts b/frontend/projects/netconf-lib/src/test.ts new file mode 100644 index 0000000..e11ff1c --- /dev/null +++ b/frontend/projects/netconf-lib/src/test.ts @@ -0,0 +1,22 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'core-js/es7/reflect'; +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/frontend/projects/netconf-lib/tsconfig.lib.json b/frontend/projects/netconf-lib/tsconfig.lib.json new file mode 100644 index 0000000..89a9991 --- /dev/null +++ b/frontend/projects/netconf-lib/tsconfig.lib.json @@ -0,0 +1,32 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "target": "es2015", + "module": "es2015", + "moduleResolution": "node", + "declaration": true, + "sourceMap": true, + "inlineSources": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "types": [], + "lib": [ + "dom", + "es2015" + ] + }, + "angularCompilerOptions": { + "annotateForClosureCompiler": true, + "skipTemplateCodegen": true, + "strictMetadataEmit": true, + "fullTemplateTypeCheck": true, + "strictInjectionParameters": true, + "enableResourceInlining": true + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/frontend/projects/netconf-lib/tsconfig.spec.json b/frontend/projects/netconf-lib/tsconfig.spec.json new file mode 100644 index 0000000..16da33d --- /dev/null +++ b/frontend/projects/netconf-lib/tsconfig.spec.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/frontend/projects/netconf-lib/tslint.json b/frontend/projects/netconf-lib/tslint.json new file mode 100644 index 0000000..73f120b --- /dev/null +++ b/frontend/projects/netconf-lib/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "lib", + "camelCase" + ], + "component-selector": [ + true, + "element", + "lib", + "kebab-case" + ] + } +} diff --git a/frontend/projects/shared-styles/_colors.scss b/frontend/projects/shared-styles/_colors.scss new file mode 100644 index 0000000..c30eb84 --- /dev/null +++ b/frontend/projects/shared-styles/_colors.scss @@ -0,0 +1,14 @@ +$colorMain: #008545; +$colorHighlight: #016d39; +$colorSelected: #016d39; +$colorSelected2: #00b55d; +$colorBackground: #fafafa; +$colorItemBackground: #fff; +$colorText: #231f20; +$colorTextInverse: #fff; +$colorLink: #0068a2; +$colorLinkHover: #00a1e3; +$colorHeading: #555; + +$colorSuccess: #44bd32; +$colorError: #ee1d23; diff --git a/frontend/projects/shared-styles/_components.scss b/frontend/projects/shared-styles/_components.scss new file mode 100644 index 0000000..e49fc35 --- /dev/null +++ b/frontend/projects/shared-styles/_components.scss @@ -0,0 +1,39 @@ +@import "colors"; +.btn { + margin-right: 5px; +} + +.box { + margin-bottom: 10px; + background: $colorItemBackground; + border-radius: 5px; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +.box-header { + background: $colorMain; + width: 100%; + font-size: 1.5rem; + border-radius: 5px 5px 0 0; + color: $colorTextInverse; + padding: 5px 10px; + text-align: center; +} +.box-content { + padding: 5px 10px; +} +.box-content-limited { + max-width: 1200px; + margin-left: auto; + margin-right: auto; +} +.clickable { + cursor: pointer; + &::selection, &::-moz-selection { + background: none; + color: $colorText; + } +} + +.error-text { + color: $colorError; +} diff --git a/frontend/projects/shared-styles/_forms.scss b/frontend/projects/shared-styles/_forms.scss new file mode 100644 index 0000000..4a31e63 --- /dev/null +++ b/frontend/projects/shared-styles/_forms.scss @@ -0,0 +1,61 @@ +@import "colors"; +.checkbox-container { + display: block; + position: relative; + padding-left: 35px; + margin-bottom: 32px; + cursor: pointer; + font-size: 22px; + line-height: 1; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + transition: all ease-in-out 150ms; + input { + position: absolute; + opacity: 0; + cursor: pointer; + height: 0; + width: 0; + } + &:hover { + input ~ .checkmark { + background-color: $colorSelected2; + }} + input:checked ~ .checkmark { + background-color: $colorText; + } + input:checked ~ .checkmark:after { + display: block; + } + .checkmark:after { + left: 7px; + top: -1px; + width: 12px; + height: 22px; + border: solid white; + border-width: 0 4px 4px 0; + border-radius: 2px; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } +} +.checkmark { + position: absolute; + top: 0; + left: 0; + height: 32px; + width: 32px; + background-color: $colorTextInverse; + border: 3px solid $colorText; + border-radius: 5px; + transition: all ease-in-out 150ms; + + &:after { + content: ""; + position: absolute; + display: none; + } +} diff --git a/frontend/projects/shared-styles/netconf.scss b/frontend/projects/shared-styles/netconf.scss new file mode 100644 index 0000000..90297ba --- /dev/null +++ b/frontend/projects/shared-styles/netconf.scss @@ -0,0 +1,2 @@ +@import "components"; +@import "forms"; diff --git a/frontend/projects/tools/src/color-picker/color-picker.module.ts b/frontend/projects/tools/src/color-picker/color-picker.module.ts new file mode 100644 index 0000000..32385ed --- /dev/null +++ b/frontend/projects/tools/src/color-picker/color-picker.module.ts @@ -0,0 +1,26 @@ +/** + * Author: Jakub Man + * Example tool module + * Copy this to a new folder and rename to your tool to start developing a new tool + */ + +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ColorPickerComponent } from './components/color-picker.component'; +// @ts-ignore +import {NetconfLibModule} from 'netconf-lib'; +import {HttpClientModule} from '@angular/common/http'; + + +@NgModule({ + imports: [ + CommonModule, + HttpClientModule, + NetconfLibModule + ], + declarations: [ColorPickerComponent], + entryComponents: [ColorPickerComponent] +}) +export class ColorPickerModule { + static entry = ColorPickerComponent; +} diff --git a/frontend/projects/tools/src/color-picker/components/color-picker.component.html b/frontend/projects/tools/src/color-picker/components/color-picker.component.html new file mode 100644 index 0000000..b92baa7 --- /dev/null +++ b/frontend/projects/tools/src/color-picker/components/color-picker.component.html @@ -0,0 +1,16 @@ +
+ +
+
+

Hello

+
+
+ +
+
+
+ + diff --git a/frontend/projects/tools/src/color-picker/components/color-picker.component.scss b/frontend/projects/tools/src/color-picker/components/color-picker.component.scss new file mode 100644 index 0000000..335f2be --- /dev/null +++ b/frontend/projects/tools/src/color-picker/components/color-picker.component.scss @@ -0,0 +1,3 @@ +:host { + width: 100%; +} diff --git a/frontend/projects/tools/src/color-picker/components/color-picker.component.ts b/frontend/projects/tools/src/color-picker/components/color-picker.component.ts new file mode 100644 index 0000000..e59da48 --- /dev/null +++ b/frontend/projects/tools/src/color-picker/components/color-picker.component.ts @@ -0,0 +1,36 @@ +/** + * Author: Jakub Man + */ + +import {Component, OnInit} from '@angular/core'; +import {NetconfLibService, SessionService} from 'netconf-lib'; +import {Session} from 'netconf-lib/lib/classes/session'; + +@Component({ + selector: 'nct-example-tool', + templateUrl: './color-picker.component.html', + styleUrls: ['./color-picker.component.scss'] +}) +export class ColorPickerComponent implements OnInit { + constructor(private libService: NetconfLibService, private sessionService: SessionService + ) { + } + + x = false; + serviceText = 'Loading service...'; + sessions: Session[] = []; + selectedSessions = []; + + ngOnInit(): void { + this.serviceText = this.libService.provideExample(); + } + + onDevicesSelected(sessions: Session[]) { + this.sessions = sessions; + this.selectedSessions = sessions; + } + + onDeviceSelectionChanged(sessions: Session[]) { + this.selectedSessions = sessions; + } +} diff --git a/frontend/projects/tools/src/example/example.component.html b/frontend/projects/tools/src/example/example.component.html new file mode 100644 index 0000000..b1069d3 --- /dev/null +++ b/frontend/projects/tools/src/example/example.component.html @@ -0,0 +1,9 @@ +
+ + +

{{sessions.length}} devices selected.

+

{{serviceText}}

+
+
+ + diff --git a/frontend/projects/tools/src/example/example.component.scss b/frontend/projects/tools/src/example/example.component.scss new file mode 100644 index 0000000..335f2be --- /dev/null +++ b/frontend/projects/tools/src/example/example.component.scss @@ -0,0 +1,3 @@ +:host { + width: 100%; +} diff --git a/frontend/projects/tools/src/example/example.component.ts b/frontend/projects/tools/src/example/example.component.ts new file mode 100644 index 0000000..4a7e1cd --- /dev/null +++ b/frontend/projects/tools/src/example/example.component.ts @@ -0,0 +1,33 @@ +/** + * Author: Jakub Man + * Example tool component + * Edit this component to start developing a your tool + * After the onDevicesSelected function is called, you can call rpc_get on the sessions + */ + +import {Component, OnInit} from '@angular/core'; +import {NetconfLibService, SessionService} from 'netconf-lib'; +import {Session} from 'netconf-lib/lib/classes/session'; + +@Component({ + selector: 'nct-example-tool', + templateUrl: './example.component.html', + styleUrls: ['./example.component.scss'] +}) +export class ExampleComponent implements OnInit { + constructor(private libService: NetconfLibService, private sessionService: SessionService + ) { + } + + x = false; + serviceText = 'Loading service...'; + sessions: Session[] = []; + + ngOnInit(): void { + this.serviceText = this.libService.provideExample(); + } + + onDevicesSelected(sessions: Session[]) { + this.sessions = sessions; + } +} diff --git a/frontend/projects/tools/src/example/example.module.ts b/frontend/projects/tools/src/example/example.module.ts new file mode 100644 index 0000000..5fcc8f0 --- /dev/null +++ b/frontend/projects/tools/src/example/example.module.ts @@ -0,0 +1,26 @@ +/** + * Author: Jakub Man + * Example tool module + * Copy this to a new folder and rename to your tool to start developing a new tool + */ + +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ExampleComponent } from './example.component'; +// @ts-ignore +import {NetconfLibModule} from 'netconf-lib'; +import {HttpClientModule} from '@angular/common/http'; + + +@NgModule({ + imports: [ + CommonModule, + HttpClientModule, + NetconfLibModule + ], + declarations: [ExampleComponent], + entryComponents: [ExampleComponent] +}) +export class ExampleModule { + static entry = ExampleComponent; +} diff --git a/frontend/projects/tools/src/index.html b/frontend/projects/tools/src/index.html new file mode 100644 index 0000000..e69de29 diff --git a/frontend/projects/tools/src/main.ts b/frontend/projects/tools/src/main.ts new file mode 100644 index 0000000..e69de29 diff --git a/frontend/projects/tools/src/yang-configure/classes/NodeType.ts b/frontend/projects/tools/src/yang-configure/classes/NodeType.ts new file mode 100644 index 0000000..5cf7321 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/classes/NodeType.ts @@ -0,0 +1,24 @@ +/** + * Author: Jakub Man + * Node types from the libyang library + */ +export enum NodeType { + LYS_UNKNOWN = 0x0000, /**< uninitialized unknown statement node */ + LYS_CONTAINER = 0x0001, /**< container statement node */ + LYS_CHOICE = 0x0002, /**< choice statement node */ + LYS_LEAF = 0x0004, /**< leaf statement node */ + LYS_LEAFLIST = 0x0008, /**< leaf-list statement node */ + LYS_LIST = 0x0010, /**< list statement node */ + LYS_ANYXML = 0x0020, /**< anyxml statement node */ + LYS_CASE = 0x0040, /**< case statement node */ + LYS_NOTIF = 0x0080, /**< notification statement node */ + LYS_RPC = 0x0100, /**< rpc statement node */ + LYS_INPUT = 0x0200, /**< input statement node */ + LYS_OUTPUT = 0x0400, /**< output statement node */ + LYS_GROUPING = 0x0800, /**< grouping statement node */ + LYS_USES = 0x1000, /**< uses statement node */ + LYS_AUGMENT = 0x2000, /**< augment statement node */ + LYS_ACTION = 0x4000, /**< action statement node */ + LYS_ANYDATA = 0x8020, /**< anydata statement node, in tests it can be used for both #LYS_ANYXML and #LYS_ANYDATA */ + LYS_EXT = 0x10000 /**< complex extension instance, ::lys_ext_instance_complex */ +} diff --git a/frontend/projects/tools/src/yang-configure/components/confirm-commit.component.html b/frontend/projects/tools/src/yang-configure/components/confirm-commit.component.html new file mode 100644 index 0000000..7e63450 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/components/confirm-commit.component.html @@ -0,0 +1,8 @@ +
+

Unsaved changes in {{session.device.name}} + {{session.device.hostname + ':' + session.device.port}} +

+

{{error}}

+ + +
diff --git a/frontend/projects/tools/src/yang-configure/components/confirm-commit.component.scss b/frontend/projects/tools/src/yang-configure/components/confirm-commit.component.scss new file mode 100644 index 0000000..5064a02 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/components/confirm-commit.component.scss @@ -0,0 +1,10 @@ +.confirm-commit-wrapper { + position: fixed; + bottom: 40px; + right: 40px; + width: calc(100vw - 80px); + z-index: 999; + background: lightyellow; + text-align: center; + border-radius: 5px; +} diff --git a/frontend/projects/tools/src/yang-configure/components/confirm-commit.component.ts b/frontend/projects/tools/src/yang-configure/components/confirm-commit.component.ts new file mode 100644 index 0000000..1e5596c --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/components/confirm-commit.component.ts @@ -0,0 +1,51 @@ +/** + * Author: Jakub Man + * Dialog to confirm or discard changes to the configuration + */ + +import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; +import {ConfigurationService, SessionService} from 'netconf-lib'; +import {NodeControlService} from '../services/node-control.service'; + +@Component({ + selector: 'nct-confirm-commit', + templateUrl: './confirm-commit.component.html', + styleUrls: ['./confirm-commit.component.scss'] +}) +export class ConfirmCommitComponent implements OnInit { + + @Input() session; + @Output() shouldClose: EventEmitter = new EventEmitter(); + + error = ''; + + constructor(public configurationService: ConfigurationService, + public sessionService: SessionService, + public nodeControlService: NodeControlService) { } + + ngOnInit() { + } + + commitChanges() { + this.configurationService.commitChanges(this.session).subscribe( + success => { + if (!success.success) { + this.error = success.message; + } else { + this.error = ''; + this.shouldClose.emit(true); + } + }, + err => { + this.error = err.message; + } + ); + } + + discardChanges() { + this.nodeControlService.restoreOriginalValuesOnAll(); + this.sessionService.discardModifications(this.session.key); + this.shouldClose.emit(true); + } + +} diff --git a/frontend/projects/tools/src/yang-configure/components/yang-configure.component.html b/frontend/projects/tools/src/yang-configure/components/yang-configure.component.html new file mode 100644 index 0000000..bedbbd8 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/components/yang-configure.component.html @@ -0,0 +1,18 @@ +
+ +

{{error}}

+ +

Loading data...

+
+ + + +
+ +
+ diff --git a/frontend/projects/tools/src/yang-configure/components/yang-configure.component.scss b/frontend/projects/tools/src/yang-configure/components/yang-configure.component.scss new file mode 100644 index 0000000..e3f9d50 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/components/yang-configure.component.scss @@ -0,0 +1,8 @@ +:host { + width: 100%; +} + +.tree-wrapper { + width: 100%; + padding: 20px; +} diff --git a/frontend/projects/tools/src/yang-configure/components/yang-configure.component.ts b/frontend/projects/tools/src/yang-configure/components/yang-configure.component.ts new file mode 100644 index 0000000..c80cde9 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/components/yang-configure.component.ts @@ -0,0 +1,119 @@ +/** + * Author: Jakub Man + * Base component for the YANG Configure tool + * Loads configuration and switches between devices + */ +import {Component, OnInit} from '@angular/core'; +// @ts-ignore +import {ConfigurationService, DeviceService, SessionService} from 'netconf-lib'; +import {Session} from 'netconf-lib/lib/classes/session'; +import {NodeControlService} from '../services/node-control.service'; +import {Device} from 'netconf-lib/lib/classes/device'; + +@Component({ + selector: 'nct-yang-configure', + templateUrl: './yang-configure.component.html', + styleUrls: ['./yang-configure.component.scss'] +}) +export class YangConfigureComponent implements OnInit { + constructor( + public sessionService: SessionService, + public nodeControlService: NodeControlService, + private deviceService: DeviceService + ) { + } + + sessions: Session[] = []; + error = ''; + helpShown = false; + + selected_data = []; + loading = false; + selectedSession: Session; + + commitChangesShown = false; + + ngOnInit(): void { + this.sessionService.loadOpenSessions().subscribe( + sessions => { + console.log(sessions); + this.sessionService.sessions = sessions; + } + ); + this.sessionService.modificationAdded.subscribe( + session => { + if (session.key === this.selectedSession.key) { + console.log('Got modification event'); + console.log(session.modifications); + this.selectedSession.modifications = session.modifications; // Update selected session value + this.commitChangesShown = true; + } + } + ); + } + + changeSelectedSession(session: Session) { + this.selectedSession = session; + this.loadSessionRpc(session, false); + } + + onDevicesSelected(sessions: Session[]) { + this.sessions = sessions; + this.selectedSession = sessions[0]; + /* for (const session of this.sessions) { + } */ + } + + loadSessionRpc(session: Session, forceReload: boolean = false) { + const idx = this.sessions.indexOf(session); + if (forceReload || !this.sessions[idx].data) { + this.loading = true; + this.sessionService.rpcGet(session.key, true).subscribe( + response => { + switch (response['code']) { + case 200: + console.log(response['data']); + this.error = ''; + this.selected_data = response['data']; + this.sessions[idx].data = response['data']; + this.loading = false; + break; + case 410: + this.error = 'Connection failed: ' + response['message']; + this.loading = false; + break; + case 418: + this.error = 'NETCONF error: ' + response['message']; + this.loading = false; + break; + default: + console.error('Invalid response code!'); + this.loading = false; + break; + } + // this.loading = false; + }, + err => { + this.error = 'HTTP error: ' + err.message; + this.loading = false; + } + ); + } else { + this.selected_data = this.sessions[idx].data; + } + } + + toggleHelp() { + if (this.helpShown) { + this.nodeControlService.hideHelpOnAll(); + } else { + this.nodeControlService.showHelpOnAll(); + } + this.helpShown = !this.helpShown; + } + + reconnectDevice(device: Device) { + this.deviceService.connectToDevice(device).subscribe(); + } + +} diff --git a/frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.html b/frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.html new file mode 100644 index 0000000..1693518 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.html @@ -0,0 +1,63 @@ + +
+ + + + + + + + + + + + {{node['info']['name']}} + + + + + + : + {{node['value']}} + + + + + + + + + + + + + + {{node['info']['dsc']}} + + + + {{node['info']['module'].split('@')[0]}} + + +
+ + + +
+ +
+ diff --git a/frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.scss b/frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.scss new file mode 100644 index 0000000..4714b92 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.scss @@ -0,0 +1,57 @@ +@import "../../../../shared-styles/colors"; + +.node { + font-weight: bold; +} + +.hidden { + display: none; +} + +.value { + margin-left: 10px; +} + +.disabled { + color: transparentize($colorText, 0.3); +} + +.key { + padding: 0 5px; +} + +.action-icon { + padding-left: 5px; + padding-right: 5px; + cursor: pointer; + &:first-child { + padding-left: 10px; + } + &:hover { + color: $colorMain; + } +} + +.description { + font-weight: normal; + margin-left: 5px; + color: transparentize($colorText, 0.3); + font-size: 12px; + font-family: "JetBrains Mono", "Source Code Pro", Consolas, monospace; +} + +.child-container { + padding-left: 5px; + border-left: 1px solid transparentize($colorText, 0.5); +} + +.schema-link { + color: transparentize($colorText, 0.2); + font-size: 11px; + font-weight: normal; + font-family: "JetBrains Mono", "Source Code Pro", Consolas, monospace; + &:hover { + color: $colorLinkHover; + text-decoration: underline; + } +} diff --git a/frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.ts b/frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.ts new file mode 100644 index 0000000..e5ce604 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/components/yang-schema-node.component.ts @@ -0,0 +1,88 @@ +/** + * Author: Jakub Man + * A node of the configuration tree + * This is a recursive component - renders all its children + */ +import { Component, OnInit, Input } from '@angular/core'; +import {NodeControlService} from '../services/node-control.service'; +// @ts-ignore +import {ConfigurationService, SessionService} from 'netconf-lib'; + +@Component({ + selector: 'nct-yang-schema-node', + templateUrl: './yang-schema-node.component.html', + styleUrls: ['./yang-schema-node.component.scss'] +}) +export class YangSchemaNodeComponent implements OnInit { + + constructor(public nodeControlService: NodeControlService, + public configurationService: ConfigurationService, + public sessionService: SessionService) { } + + @Input() node: object; + @Input() showChildren = false; + @Input() activeSession; + showAllChildrenOnOpen = false; + showHelp = false; + editing = false; + originalValue = ''; + editingValue = ''; + + ngOnInit() { + this.showAllChildrenOnOpen = this.showChildren; + this.nodeControlService.performNodeAction.subscribe( + action => { + this.performGlobalAction(action); + } + ); + if (this.node['value']) { + this.originalValue = this.node['value']; + this.editingValue = this.node['value']; + } + } + + toggleChildren() { + this.showAllChildrenOnOpen = false; + this.showChildren = !this.showChildren; + } + + toggleAllChildren() { + this.showAllChildrenOnOpen = ! this.showAllChildrenOnOpen; + this.showChildren = !this.showChildren; + } + + toggleEdit() { + this.editing = !this.editing; + } + + performGlobalAction(action: string) { + switch (action) { + case 'hideHelp': + this.showHelp = false; + break; + case 'showHelp': + this.showHelp = true; + break; + case 'close': + this.showChildren = false; + this.showAllChildrenOnOpen = false; + break; + case 'discardChanges': + this.restoreOriginal(); + break; + } + } + + confirmEdit() { + this.editing = false; + this.sessionService.createChangeModification(this.activeSession.key, this.node['info']['path'], this.node, this.editingValue); + this.sessionService.modificationAdded.emit(this.activeSession); + this.node['value'] = this.editingValue; + } + + restoreOriginal() { + this.editingValue = this.originalValue; + this.node['value'] = this.originalValue; + } + +} diff --git a/frontend/projects/tools/src/yang-configure/services/node-control.service.ts b/frontend/projects/tools/src/yang-configure/services/node-control.service.ts new file mode 100644 index 0000000..9cd7f14 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/services/node-control.service.ts @@ -0,0 +1,42 @@ +/** + * Author: Jakub Man + * NodeControlService is responsible for performing operations on all nodes. + * All yang tree nodes listen to the performNodeAction event emitter. + */ + +import {EventEmitter, Injectable} from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class NodeControlService { + + constructor() { } + + /** + * Valid actions: + * "hideHelp": hide help on all nodes + * "showHelp": Show help on all nodes + * "close": Close all node children + */ + public performNodeAction: EventEmitter = new EventEmitter(); + + hideHelpOnAll() { + this.performNodeAction.emit('hideHelp'); + } + + showHelpOnAll() { + this.performNodeAction.emit('showHelp'); + } + + closeAll() { + this.performNodeAction.emit('close'); + } + + restoreOriginalValuesOnAll() { + this.performNodeAction.emit('discardChanges'); + } + + + +} diff --git a/frontend/projects/tools/src/yang-configure/yang-configure.module.ts b/frontend/projects/tools/src/yang-configure/yang-configure.module.ts new file mode 100644 index 0000000..6b3a6e4 --- /dev/null +++ b/frontend/projects/tools/src/yang-configure/yang-configure.module.ts @@ -0,0 +1,30 @@ +/** + * Author: Jakub Man + * YANG Configure tool serve to view and edit device's configuration + */ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { YangConfigureComponent } from './components/yang-configure.component'; +// @ts-ignore +import {NetconfLibModule} from 'netconf-lib'; +import {HttpClientModule} from '@angular/common/http'; +import { YangSchemaNodeComponent } from './components/yang-schema-node.component'; +import {FormsModule} from '@angular/forms'; +import { ConfirmCommitComponent } from './components/confirm-commit.component'; + + +@NgModule({ + imports: [ + CommonModule, + HttpClientModule, + NetconfLibModule, + RouterModule, + FormsModule + ], + declarations: [YangConfigureComponent, YangSchemaNodeComponent, ConfirmCommitComponent], + entryComponents: [YangConfigureComponent] +}) +export class YangConfigureModule { + static entry = YangConfigureComponent; +} diff --git a/frontend/projects/tools/src/yang-explorer/yang-explorer.component.html b/frontend/projects/tools/src/yang-explorer/yang-explorer.component.html new file mode 100644 index 0000000..82d2900 --- /dev/null +++ b/frontend/projects/tools/src/yang-explorer/yang-explorer.component.html @@ -0,0 +1,16 @@ +
+

{{schemaName}}

+
+
+
+ +
+
+

Loading schema...

+
+
+ +
+
+
+
diff --git a/frontend/projects/tools/src/yang-explorer/yang-explorer.component.scss b/frontend/projects/tools/src/yang-explorer/yang-explorer.component.scss new file mode 100644 index 0000000..00fe3b1 --- /dev/null +++ b/frontend/projects/tools/src/yang-explorer/yang-explorer.component.scss @@ -0,0 +1,25 @@ +// https://flatuicolors.com/palette/ca +:host { + width: 100%; +} + +.code::ng-deep { + background: #222f3e; + color: #fff; + font-family: "JetBrains Mono", "Source Code Pro", Consolas, monospace; + padding: 5px; + max-height: 80vh; + overflow: auto; + width: 100%; + .string::ng-deep { + color: #feca57; + } + + .level::ng-deep { + margin-left: 10px; + } + + .pattern::ng-deep { + color: #48dbfb; + } +} diff --git a/frontend/projects/tools/src/yang-explorer/yang-explorer.component.ts b/frontend/projects/tools/src/yang-explorer/yang-explorer.component.ts new file mode 100644 index 0000000..18005ac --- /dev/null +++ b/frontend/projects/tools/src/yang-explorer/yang-explorer.component.ts @@ -0,0 +1,47 @@ +/** + * Author: Jakub Man + * Loads and renders a schema based on the 'schema' path parameter + */ +import {Component, OnInit} from '@angular/core'; +// @ts-ignore +import {SchemasService} from 'netconf-lib'; +import {ActivatedRoute} from '@angular/router'; + + +@Component({ + selector: 'nct-yang-explorer', + templateUrl: './yang-explorer.component.html', + styleUrls: ['./yang-explorer.component.scss'] +}) +export class YangExplorerComponent implements OnInit { + constructor(public schemasService: SchemasService, private route: ActivatedRoute) { + } + + schemaName = ''; + schema: any = ''; + loading = true; + error: string; + + ngOnInit(): void { + this.route.paramMap.subscribe( + params => { + this.loading = true; + this.schemaName = params.get('schema'); + this.schemasService.getSchema(this.schemaName).subscribe( + schema => { + this.schema = this.sanitizeYang(schema); + this.loading = false; + }, + err => { + this.loading = false; + this.error = err.message; + } + ); + }); + } + + sanitizeYang(yang: string) { + return SchemasService.formatYang(SchemasService.newlineToBr(yang)); + } + +} diff --git a/frontend/projects/tools/src/yang-explorer/yang-explorer.module.ts b/frontend/projects/tools/src/yang-explorer/yang-explorer.module.ts new file mode 100644 index 0000000..3264b1a --- /dev/null +++ b/frontend/projects/tools/src/yang-explorer/yang-explorer.module.ts @@ -0,0 +1,26 @@ +/** + * Author: Jakub Man + * YANG Explorer tool displays uploaded YANG schemas + */ + +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { YangExplorerComponent } from './yang-explorer.component'; +// @ts-ignore +import {NetconfLibModule} from 'netconf-lib'; +import {HttpClientModule} from '@angular/common/http'; + + +@NgModule({ + imports: [ + CommonModule, + HttpClientModule, + NetconfLibModule, + NetconfLibModule, + ], + declarations: [YangExplorerComponent], + entryComponents: [YangExplorerComponent] +}) +export class YangExplorerModule { + static entry = YangExplorerComponent; +} diff --git a/frontend/projects/tools/tsconfig.app.json b/frontend/projects/tools/tsconfig.app.json new file mode 100644 index 0000000..f443ca6 --- /dev/null +++ b/frontend/projects/tools/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/app", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ], + "files": ["./src/main.ts"] +} diff --git a/frontend/src/app/_colors.scss b/frontend/src/app/_colors.scss new file mode 120000 index 0000000..a10d652 --- /dev/null +++ b/frontend/src/app/_colors.scss @@ -0,0 +1 @@ +/mnt/e/CESNET/liberouter-gui/frontend/src/styles/_colors.scss \ No newline at end of file diff --git a/frontend/src/app/angular.json b/frontend/src/app/angular.json new file mode 100644 index 0000000..e29fa72 --- /dev/null +++ b/frontend/src/app/angular.json @@ -0,0 +1,18 @@ +{ + "projects": { + "liberouter-gui": { + "architect": { + "build": { + "options": { + "scripts": [ + + "node_modules/systemjs/dist/s.js", + "node_modules/systemjs/dist/extras/named-register.js", + "node_modules/systemjs/dist/extras/amd.js" + ] + } + } + } + } + } +} diff --git a/frontend/src/app/classes/GenericServerResponse.ts b/frontend/src/app/classes/GenericServerResponse.ts new file mode 100644 index 0000000..1d52b7f --- /dev/null +++ b/frontend/src/app/classes/GenericServerResponse.ts @@ -0,0 +1,9 @@ +/** + * Author: Jakub Man + * + */ +export class GenericServerResponse { + success: boolean; + code: number; + message?: string; +} diff --git a/frontend/src/app/classes/Notification.ts b/frontend/src/app/classes/Notification.ts new file mode 100644 index 0000000..79084d0 --- /dev/null +++ b/frontend/src/app/classes/Notification.ts @@ -0,0 +1,10 @@ +/** + * Author: Jakub Man + */ +export class Notification { + id: number; + title: string; + time: string; + deviceName: string; + channel: string; +} diff --git a/frontend/src/app/classes/ProfileDevice.ts b/frontend/src/app/classes/ProfileDevice.ts new file mode 100644 index 0000000..2e9e0d0 --- /dev/null +++ b/frontend/src/app/classes/ProfileDevice.ts @@ -0,0 +1,14 @@ +/** + * Author: Jakub Man + * Structure to display a device in the profiles tab + */ +export class ProfileDevice { + id: string; + name?: string; + hostname: string; + port: number; + username: string; + password?: string; + subscriptions?: string[]; + fingerprint?: string; +} diff --git a/frontend/src/app/classes/ProfileItem.ts b/frontend/src/app/classes/ProfileItem.ts new file mode 100644 index 0000000..b986f6f --- /dev/null +++ b/frontend/src/app/classes/ProfileItem.ts @@ -0,0 +1,7 @@ +/** + * Author: Jakub Man + */ +export class ProfileItem { + id: string; // Device ID + subscriptions: string[]; // Channel names +} diff --git a/frontend/src/app/components/devices/device-list/device-list.component.html b/frontend/src/app/components/devices/device-list/device-list.component.html new file mode 100644 index 0000000..f72071b --- /dev/null +++ b/frontend/src/app/components/devices/device-list/device-list.component.html @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + +
Device nameAddress:portUsernameStatusDisconnect
{{session.device.name ? session.device.name : ""}}{{session.device.hostname}}:{{session.device.port}}{{session.device.username}}
diff --git a/frontend/src/app/components/devices/device-list/device-list.component.scss b/frontend/src/app/components/devices/device-list/device-list.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/app/components/devices/device-list/device-list.component.ts b/frontend/src/app/components/devices/device-list/device-list.component.ts new file mode 100644 index 0000000..11d7427 --- /dev/null +++ b/frontend/src/app/components/devices/device-list/device-list.component.ts @@ -0,0 +1,35 @@ +/** + * Author: Jakub Man + * A list of connected devices + */ +import { Component, OnInit } from '@angular/core'; +import {SessionService} from '../../../netconf-lib'; +import {Session} from '../../../netconf-lib/lib/classes/session'; + +@Component({ + selector: 'nc-device-list', + templateUrl: './device-list.component.html', + styleUrls: ['./device-list.component.scss'] +}) +export class DeviceListComponent implements OnInit { + + constructor( + private sessionService: SessionService + ) { } + + sessions: Session[] = []; + + ngOnInit() { + this.sessions = this.sessionService.sessions; + this.sessionService.sessionsChanged.subscribe( + sessions => { + this.sessions = sessions; + } + ); + } + + disconnect(sessionKey: string) { + this.sessionService.destroySession(sessionKey).subscribe(); + } + +} diff --git a/frontend/src/app/components/devices/devices.component.html b/frontend/src/app/components/devices/devices.component.html new file mode 100644 index 0000000..3ef1b48 --- /dev/null +++ b/frontend/src/app/components/devices/devices.component.html @@ -0,0 +1,18 @@ +
+
+
+ + + + + + +
+
+ + + +
+
+
+ diff --git a/frontend/src/app/components/devices/devices.component.scss b/frontend/src/app/components/devices/devices.component.scss new file mode 100644 index 0000000..3932c1b --- /dev/null +++ b/frontend/src/app/components/devices/devices.component.scss @@ -0,0 +1,7 @@ +.card { + height: auto; +} + +.card-title { + font-size: 1.2rem; +} \ No newline at end of file diff --git a/frontend/src/app/components/devices/devices.component.ts b/frontend/src/app/components/devices/devices.component.ts new file mode 100644 index 0000000..2e663b7 --- /dev/null +++ b/frontend/src/app/components/devices/devices.component.ts @@ -0,0 +1,19 @@ +/** + * Author: Jakub Man + * Container for the devices tab + */ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'nc-devices', + templateUrl: './devices.component.html', + styleUrls: ['./devices.component.scss'] +}) +export class DevicesComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/frontend/src/app/components/netconf.component.html b/frontend/src/app/components/netconf.component.html new file mode 100644 index 0000000..95c33d6 --- /dev/null +++ b/frontend/src/app/components/netconf.component.html @@ -0,0 +1,24 @@ + +
+ + + +
diff --git a/frontend/src/app/components/netconf.component.scss b/frontend/src/app/components/netconf.component.scss new file mode 100644 index 0000000..92d59c8 --- /dev/null +++ b/frontend/src/app/components/netconf.component.scss @@ -0,0 +1,35 @@ +@import "../colors"; + +.nc-nav-container { + background: $colorMain; + width: calc(100% + 32px); + margin: -8px 0 0 -16px; +} + +.nc-nav { + list-style: none; +} + +.nc-nav-item { + display: inline-block; + color: $colorTextInverse; +} + +.nc-nav-link { + display: inline-block; + padding: 5px 15px; + color: $colorTextInverse; + text-decoration: none; + border-bottom: 2px solid $colorMain; + transition: all ease-in-out 150ms; + &.active, &:hover { + background: $colorSelected; + border-bottom: 2px solid $colorBackground; + } +} + +.status-info { + float: right; + margin-right: 15px; + margin-top: 5px; +} diff --git a/frontend/src/app/components/netconf.component.ts b/frontend/src/app/components/netconf.component.ts new file mode 100644 index 0000000..6b2e5bc --- /dev/null +++ b/frontend/src/app/components/netconf.component.ts @@ -0,0 +1,99 @@ +/** + * Author: Jakub Man + * Container for the whole module + */ + +import {Component, OnInit} from '@angular/core'; +import {ConfigService} from "../services/config.service"; +import {ProfileService} from "../services/profile.service"; +import {NotificationService} from "../services/notification.service"; +import {DeviceService, SessionService} from "../netconf-lib"; +import {DeviceWithStatus} from "../netconf-lib"; + +@Component({ + selector: 'nc-base', + templateUrl: './netconf.component.html', + styleUrls: ['./netconf.component.scss'] +}) +export class NetconfComponent implements OnInit { + + constructor( + private configService: ConfigService, + private profileService: ProfileService, + private notificationService: NotificationService, + public deviceService: DeviceService, + public sessionService: SessionService + ) { + } + + statusMessage: string = "Loading..."; + config: object = {}; + + ngOnInit() { + this.statusMessage = "Loading config..."; + this.configService.getConfig().subscribe( + config => { + this.config = config; + this.statusMessage = "Checking open sessions..."; + this.sessionService.loadOpenSessions().subscribe( + sessions => { + if (sessions.length > 0) { + if(confirm('Found active device sessions. Load them? (Answering "cancel" will discard these sessions)')) { + this.sessionService.sessions = sessions; + } + else { + this.sessionService.destroyAllSessions().subscribe(); + this.loadProfile(); + } + } else { + this.loadProfile(); + } + } + ); + this.loadProfile(); + }, + err => { + this.statusMessage = ""; + } + ); + } + + loadProfile() { + this.statusMessage = "Loading profile..."; + this.profileService.getOnLoginProfile().subscribe( + data => { + this.statusMessage = ""; + if (data.connectOnLogin) { + this.deviceService.createConnectionRequest(data.devices); + } + }, + err => { + this.statusMessage = ""; + } + ); + + + /*setTimeout(() => { + this.notificationService.sendNotification( + this.notificationService.createNotification("Notification 1", "Internal", "Channel 1") + ); + }, 250); + setTimeout(() => { + this.notificationService.sendNotification( + this.notificationService.createNotification("Notification 2", "Internal", "Channel 1") + ); + }, 1500); + setTimeout(() => { + this.notificationService.sendNotification( + this.notificationService.createNotification("Notification 3", "Internal", "Channel 1") + ); + }, 3000); + setTimeout(() => { + this.notificationService.sendNotification( + this.notificationService.createNotification("Notification 4", "Internal", "Channel 1") + ); + }, 5000);*/ + + } + +} diff --git a/frontend/src/app/components/notifications/notifications.component.html b/frontend/src/app/components/notifications/notifications.component.html new file mode 100644 index 0000000..2694eac --- /dev/null +++ b/frontend/src/app/components/notifications/notifications.component.html @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/app/components/notifications/notifications.component.scss b/frontend/src/app/components/notifications/notifications.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/app/components/notifications/notifications.component.ts b/frontend/src/app/components/notifications/notifications.component.ts new file mode 100644 index 0000000..f991ce1 --- /dev/null +++ b/frontend/src/app/components/notifications/notifications.component.ts @@ -0,0 +1,19 @@ +/** + * Author: Jakub Man + * Container for the notifications tab + */ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'nc-devices', + templateUrl: './notifications.component.html', + styleUrls: ['./notifications.component.scss'] +}) +export class NotificationsComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/frontend/src/app/components/profiles/popup-add-profile.component.html b/frontend/src/app/components/profiles/popup-add-profile.component.html new file mode 100644 index 0000000..693fc34 --- /dev/null +++ b/frontend/src/app/components/profiles/popup-add-profile.component.html @@ -0,0 +1,17 @@ + +
+ + +

{{error}}

+
+
diff --git a/frontend/src/app/components/profiles/popup-add-profile.component.ts b/frontend/src/app/components/profiles/popup-add-profile.component.ts new file mode 100644 index 0000000..7d089c8 --- /dev/null +++ b/frontend/src/app/components/profiles/popup-add-profile.component.ts @@ -0,0 +1,53 @@ +/* +* Author: Jakub Man +* Popup shown to the user when clicking on the "add profile" button +*/ + + +import {Component, OnInit, Output, EventEmitter, Input} from '@angular/core'; +import {ProfileService} from "../../services/profile.service"; + + +@Component({ + selector: 'nc-add-profile', + templateUrl: './popup-add-profile.component.html', + styleUrls: ['./profiles.component.scss'] +}) +export class PopupAddProfileComponent implements OnInit { + + @Output() saved: EventEmitter = new EventEmitter(); + @Output() canceled: EventEmitter = new EventEmitter(); + + loading = false; + + inputVal = ''; + error = ''; + + constructor(private profileService: ProfileService) { + } + + ngOnInit() { + } + + saveProfile() { + if(this.inputVal) { + this.loading = true; + this.profileService.addProfile(this.inputVal).subscribe( + _ => { + this.saved.emit(this.inputVal); + this.loading = false; + this.inputVal = ''; + }, + err => { + this.error = err.message; + this.loading = false; + } + ); + } + else { + this.error = 'Name can not be empty'; + } + + } + +} diff --git a/frontend/src/app/components/profiles/popup-connect-profile.component.html b/frontend/src/app/components/profiles/popup-connect-profile.component.html new file mode 100644 index 0000000..df93ce8 --- /dev/null +++ b/frontend/src/app/components/profiles/popup-connect-profile.component.html @@ -0,0 +1,12 @@ + +
+

Do you want to disconnect from currently active sessions?

+

You will no longer be able to view and modify configuration of devices, + that are not in this profile, until you connect them again

+
+
diff --git a/frontend/src/app/components/profiles/popup-connect-profile.component.ts b/frontend/src/app/components/profiles/popup-connect-profile.component.ts new file mode 100644 index 0000000..fc32cf2 --- /dev/null +++ b/frontend/src/app/components/profiles/popup-connect-profile.component.ts @@ -0,0 +1,53 @@ +/** + * Author: Jakub Man + * Popup shown to the user before connecting to all devices from the profiles tab + */ + +import {Component, OnInit, Output, EventEmitter, Input} from '@angular/core'; +import {DeviceService, SessionService} from "../../netconf-lib"; +import {ProfileDevice} from "../../classes/ProfileDevice"; + + +@Component({ + selector: 'nc-connect-profile', + templateUrl: './popup-connect-profile.component.html', + styleUrls: ['./profiles.component.scss'] +}) +export class PopupConnectProfileComponent implements OnInit { + + @Input() profileName: string; + @Input() devices: ProfileDevice[]; + @Output() shouldClose: EventEmitter = new EventEmitter(); + + error = ''; + + constructor(private deviceService: DeviceService, private sessionService: SessionService) { + } + + ngOnInit() { + if(this.sessionService.sessions == []) { + this.connect(); + } + } + + public connectProfile(purge: boolean) { + if(purge) { + this.sessionService.destroyAllSessions().subscribe( + _ => { + this.sessionService.sessions = []; + this.deviceService.nowConnectingDevices = []; + this.connect(); + } + ) + } + else { + this.connect(); + } + } + + connect() { + this.deviceService.createConnectionRequest(this.devices); + this.shouldClose.emit(true); + } + +} diff --git a/frontend/src/app/components/profiles/profile-edit.component.html b/frontend/src/app/components/profiles/profile-edit.component.html new file mode 100644 index 0000000..ec8d987 --- /dev/null +++ b/frontend/src/app/components/profiles/profile-edit.component.html @@ -0,0 +1,62 @@ + +
+
+ + +
+
+
+
+

Could not load profiles!

+

Error details: {{error}}

+
+
+

Could not save changes!

+

Error details: {{saveError}}

+
+
+ + +
+ Notification subscriptions +

+ {{channel}} +

+
+
+
+
+
+

Loading devices...

+
+
+
+
+ +
+
+
+
+ Cancel + +
+
+
+ diff --git a/frontend/src/app/components/profiles/profile-edit.component.scss b/frontend/src/app/components/profiles/profile-edit.component.scss new file mode 100644 index 0000000..988638f --- /dev/null +++ b/frontend/src/app/components/profiles/profile-edit.component.scss @@ -0,0 +1,26 @@ +@import "../../colors"; +@import "../../styles/inputs"; + +.subscriptions { + width: calc(100% - 10px); + margin-top: 0; + margin-left: auto; + margin-right: auto; + background: #e9e9e9; + padding: 0 5px; + border-radius: 0 0 5px 5px; + box-shadow: 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(0,0,0,.23); +} +.channel { + font-size: 0.8em; + padding: 2px 5px; + border-radius: 20px; + border: 1px solid $colorText; + margin: 3px; + .remove { + cursor: pointer; + &:hover { + color: red; + } + } +} diff --git a/frontend/src/app/components/profiles/profile-edit.component.ts b/frontend/src/app/components/profiles/profile-edit.component.ts new file mode 100644 index 0000000..44b7120 --- /dev/null +++ b/frontend/src/app/components/profiles/profile-edit.component.ts @@ -0,0 +1,144 @@ +/** + * Author: Jakub Man + * Displays a list of saved devices that can be added to a profile + */ + +import {Component, OnInit} from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import {Router} from '@angular/router'; +import {ProfileService} from '../../services/profile.service'; +import {DeviceService} from '../../netconf-lib'; +import {ProfileDevice} from '../../classes/ProfileDevice'; +import {Device} from '../../netconf-lib/lib/classes/device'; + + + + +@Component({ + selector: 'nc-profile-edit', + templateUrl: './profile-edit.component.html', + styleUrls: ['./profile-edit.component.scss'] +}) +export class ProfileEditComponent implements OnInit { + constructor( + private route: ActivatedRoute, + private profileService: ProfileService, + private deviceService: DeviceService, + private router: Router + ) { + } + + selectedProfile: string; + allDevices: Device[]; + savedDevices: {device: ProfileDevice, inProfile: boolean, subscriptions?: string[]}[] = []; + searchedText = ''; + + paginationOptions = {page: 1, perPage: 9}; + + loading = false; + error = ''; + saving = false; + saveError = ''; + + ngOnInit() { + this.loading = true; + this.initDevices(); + } + + initDevices() { + this.deviceService.getSavedDevices().subscribe( + devices => { + this.allDevices = devices; + this.route.paramMap.subscribe( + params => { + this.selectedProfile = params.get('profile'); + if (this.selectedProfile) { + this.loadProfile(); + } + }); + }, + err => { + this.error = err.message; + this.loading = false; + } + ); + } + + loadProfile() { + this.loading = true; + if (!this.allDevices) { + this.initDevices(); + return; + } + this.profileService.getProfileDevices(this.selectedProfile).subscribe( + profileDevices => { + for (const device of this.allDevices) { + let inProfile = false; + let subscriptions = []; + for (const profileDevice of profileDevices) { + if (profileDevice.id === device.id) { + inProfile = true; + subscriptions = profileDevice.subscriptions; + break; + } + } + this.savedDevices.push({device, inProfile, subscriptions}); + } + this.loading = false; + }, + err => { + this.error = err.message; + this.loading = false; + } + ); + } + + nextPage() { + if ((this.paginationOptions.page * this.paginationOptions.perPage) < this.savedDevices.length) { + this.paginationOptions.page++; + } + + } + + prevPage() { + if (this.paginationOptions.page > 1) { + this.paginationOptions.page--; + } + } + + setPage(page: number) { + this.paginationOptions.page = page; + } + + removeSubscription(device: ProfileDevice, channel: string) { + + } + + saveChanges() { + const ids = []; + for (const device of this.savedDevices) { + if (device.inProfile) { + ids.push({id: device.device.id}); + } + } + console.log(ids); + this.saving = true; + this.saveError = ''; + this.profileService.saveProfile(this.selectedProfile, ids).subscribe( + success => { + this.saving = false; + if (success.success) { + this.router.navigateByUrl('/netconf/profiles'); + } else { + this.saveError = 'Server could not write data to profile ' + this.selectedProfile + '.'; + } + }, + err => { + this.saving = false; + this.saveError = err.message; + } + ); + } + + +} diff --git a/frontend/src/app/components/profiles/profiles.component.html b/frontend/src/app/components/profiles/profiles.component.html new file mode 100644 index 0000000..5e4102f --- /dev/null +++ b/frontend/src/app/components/profiles/profiles.component.html @@ -0,0 +1,83 @@ +
+
+ +
+

Error while handling profiles!

+

{{error}}

+
+ + + +

+ Add new profile

+

Connect to + all devices in this profile

+

+ Remove this profile +

+ + + + +

Active profile: {{activeProfile}} +

+ +
+
+
+ +
+

No devices in profile {{selectedProfile}}

+ +
+
+ + + + + + + + + + + + + + + + + + +
Device nameAddress:portUsernameCurrently connected
{{device.name ? device.name : ""}}{{device.hostname}}:{{device.port}}{{device.username}}Yes
+
+

Loading devices...

+
+
+
+ +
+

You don't have any profiles

+

{{error}}

+ +
+
+ + + diff --git a/frontend/src/app/components/profiles/profiles.component.scss b/frontend/src/app/components/profiles/profiles.component.scss new file mode 100644 index 0000000..f3b1713 --- /dev/null +++ b/frontend/src/app/components/profiles/profiles.component.scss @@ -0,0 +1,35 @@ +@import "../../styles/inputs"; +@import "../../colors"; +.card-content { + text-align: left; +} + +.text-bold { + font-weight: bold; +} + +.btn-attention { + font-size: 1.3em; + margin-top: 20px; + margin-bottom: 20px; + -webkit-animation: ping 0.8s ease-in-out infinite both; + animation: ping 0.8s ease-in-out infinite both; +} + + +@-webkit-keyframes ping { + 0% { + box-shadow: 0 0 0 2px transparentize($colorMain, 0.2); + } + 100% { + box-shadow: 0 0 5px 22px transparent; + } +} +@keyframes ping { + 0% { + box-shadow: 0 0 0 2px transparentize($colorMain, 0.2); + } + 100% { + box-shadow: 0 0 5px 22px transparent; + } +} diff --git a/frontend/src/app/components/profiles/profiles.component.ts b/frontend/src/app/components/profiles/profiles.component.ts new file mode 100644 index 0000000..05c9cbf --- /dev/null +++ b/frontend/src/app/components/profiles/profiles.component.ts @@ -0,0 +1,136 @@ +/** + * Author: Jakub Man + * Container for the profiles tab + */ + +import {Component, OnInit} from '@angular/core'; +import {ProfileService} from "../../services/profile.service"; +import {ProfileDevice} from "../../classes/ProfileDevice"; + + +@Component({ + selector: 'nc-profiles', + templateUrl: './profiles.component.html', + styleUrls: ['./profiles.component.scss'] +}) +export class ProfilesComponent implements OnInit { + + constructor( + private profileService: ProfileService + ) { + } + + profiles: string[] = []; + selectedProfile: string; + activeProfile: string; + devices: ProfileDevice[] = []; + connectOnLogin = false; + loading = false; + activationLoading = false; + connectOnLoginChangeLoading = false; + + error = ''; + + addNewProfileShown = false; + connectProfileShown = false; + + ngOnInit() { + this.loading = true; + this.profileService.getAllProfileNames().subscribe( + profiles => { + this.profiles = profiles; + }, + err => { + this.error = err.message; + } + ); + this.profileService.getOnLoginProfile().subscribe( + data => { + this.selectedProfile = data.name; + this.devices = data.devices; + this.loading = false; + this.activeProfile = data.name; + this.connectOnLogin = data.connectOnLogin; + } + ); + } + + reloadDevices() { + this.loading = true; + this.profileService.getProfileDevices(this.selectedProfile).subscribe( + data => { + this.devices = data; + this.loading = false; + } + ); + } + + setActiveProfile(profileName: string) { + this.activationLoading = true; + this.profileService.setActiveProfile(profileName).subscribe( + _ => { + this.activeProfile = profileName; + this.activationLoading = false; + }, + err => { + console.error(err.message); + this.error = err.message; + this.activationLoading = false; + } + ); + } + + removeProfile() { + this.profileService.removeProfile(this.selectedProfile).subscribe( + _ => { + this.profiles = this.profiles.filter(p => p !== this.selectedProfile); + if(this.profiles.length !== 0) { + this.selectedProfile = this.profiles[0]; + this.reloadDevices(); + } + }, + err => { + + } + ); + } + + addProfile(profileName: string) { + this.profiles.push(profileName); + this.addNewProfileShown = false; + this.selectProfile(profileName); + } + + + selectProfile(profileName: string) { + this.selectedProfile = profileName; + this.reloadDevices(); + } + + setShouldConnectOnLogin(value) { + this.connectOnLoginChangeLoading = true; + this.profileService.setProfileConnectOnLogin(this.selectedProfile, value.target.checked).subscribe( + + response => { + if(!response.success) { + this.error = "Server error!" + } + this.connectOnLoginChangeLoading = false; + }, + err => { + this.error = "HTTP error"; + if(err.message) { + this.error += ": " + err.message + } + this.connectOnLoginChangeLoading = false; + } + ) + } + + showConnectProfileDialog() { + this.connectProfileShown = true; + } + + + +} diff --git a/frontend/src/app/components/shared/add-device-form/add-device-form.component.html b/frontend/src/app/components/shared/add-device-form/add-device-form.component.html new file mode 100644 index 0000000..b9a06d3 --- /dev/null +++ b/frontend/src/app/components/shared/add-device-form/add-device-form.component.html @@ -0,0 +1,61 @@ +
+
Connect to a new device
+

{{error}}

+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ +
+ +
+
+
diff --git a/frontend/src/app/components/shared/add-device-form/add-device-form.component.scss b/frontend/src/app/components/shared/add-device-form/add-device-form.component.scss new file mode 100644 index 0000000..914cfc6 --- /dev/null +++ b/frontend/src/app/components/shared/add-device-form/add-device-form.component.scss @@ -0,0 +1,10 @@ +@import "../../../colors"; +@import "../../../styles/inputs"; + +.nc-label { + min-width: 105px; +} +.btn-primary:disabled, .btn-primary[disabled] { + background: lighten($colorMain, 10%); + cursor: not-allowed; +} diff --git a/frontend/src/app/components/shared/add-device-form/add-device-form.component.ts b/frontend/src/app/components/shared/add-device-form/add-device-form.component.ts new file mode 100644 index 0000000..446de82 --- /dev/null +++ b/frontend/src/app/components/shared/add-device-form/add-device-form.component.ts @@ -0,0 +1,65 @@ +/** + * Author: Jakub Man + * A form for connecting to new devices and adding them to the database + */ + +import { Component, OnInit } from '@angular/core'; +import {DeviceService} from '../../../netconf-lib'; +import { FormGroup, FormControl } from '@angular/forms'; + +@Component({ + selector: 'nc-add-device', + templateUrl: './add-device-form.component.html', + styleUrls: ['./add-device-form.component.scss'] +}) +export class AddDeviceFormComponent implements OnInit { + + deviceForm = new FormGroup({ + deviceName: new FormControl(''), + hostname: new FormControl('localhost'), + port: new FormControl(''), + username: new FormControl('admin'), + password: new FormControl(''), + connectToDevice: new FormControl(true), + saveDevice: new FormControl(true), + addToActiveProfile: new FormControl(false) + }); + error = ''; + + constructor(private deviceService: DeviceService) { } + + ngOnInit() { + } + + onSubmit() { + if(this.deviceForm.value.connectToDevice) { + this.deviceService.createConnectionRequest([ + { + id: '', + port: this.deviceForm.value.port, + username: this.deviceForm.value.username, + name: this.deviceForm.value.deviceName, + hostname: this.deviceForm.value.hostname, + password: this.deviceForm.value.password + } + ]) + } + if(this.deviceForm.value.saveDevice) { + this.deviceService.saveDevice(this.deviceForm.value.hostname, + this.deviceForm.value.port, + this.deviceForm.value.username, + this.deviceForm.value.deviceName, + this.deviceForm.value.password, + this.deviceForm.value.saveDevice + ).subscribe( + id => { + this.deviceForm.reset(); + }, + err => { + this.error = err.message; + } + ); + } + } + +} diff --git a/frontend/src/app/components/shared/notification-display/notification-display.component.html b/frontend/src/app/components/shared/notification-display/notification-display.component.html new file mode 100644 index 0000000..ee011fc --- /dev/null +++ b/frontend/src/app/components/shared/notification-display/notification-display.component.html @@ -0,0 +1,13 @@ +
+ + +
+ +
+
\ No newline at end of file diff --git a/frontend/src/app/components/shared/notification-display/notification-display.component.scss b/frontend/src/app/components/shared/notification-display/notification-display.component.scss new file mode 100644 index 0000000..2c7cb6e --- /dev/null +++ b/frontend/src/app/components/shared/notification-display/notification-display.component.scss @@ -0,0 +1,36 @@ +@import "../../../colors"; + +.notification-display-wrapper { + position: fixed; + bottom: 0; + right: 0; + z-index: 999; + overflow-x: hidden; + overflow-y: scroll; + max-height: 140px; + width: 100vw; + max-width: 450px; + + &::-webkit-scrollbar { + width: 8px; + } + &::-webkit-scrollbar-track { + border-radius: 5px; + background: rgba(0,0,0,0.3); + } + &::-webkit-scrollbar-thumb { + border-radius: 5px; + background: $black; + } +} + +.clear-btn-wrapper { + width: 100%; + text-align: right; + a { + background: $colorItemBackground; + border-radius: 5px; + padding: 5px; + } +} + diff --git a/frontend/src/app/components/shared/notification-display/notification-display.component.ts b/frontend/src/app/components/shared/notification-display/notification-display.component.ts new file mode 100644 index 0000000..005a050 --- /dev/null +++ b/frontend/src/app/components/shared/notification-display/notification-display.component.ts @@ -0,0 +1,65 @@ +/** + * Author: Jakub Man + * Container for notifications in the bottom-right corner of the screen + */ +import {Component, OnInit} from '@angular/core'; +import {NotificationService} from "../../../services/notification.service"; +import {Notification} from "../../../classes/Notification"; + +@Component({ + selector: 'nc-notification-display', + templateUrl: './notification-display.component.html', + styleUrls: ['./notification-display.component.scss'] +}) +export class NotificationDisplayComponent implements OnInit { + + constructor( + private notificationService: NotificationService + ) { + } + + displayedNotifications: { notification: Notification, state: string }[] = []; + toRemove: number[] = []; + + ngOnInit() { + this.notificationService.onNewNotification.subscribe( + notification => { + this.addNotification(notification); + } + ); + } + + + addNotification(notification: Notification) { + this.displayedNotifications.push({notification, state: "initial"}); + if (this.displayedNotifications.length > 3) { + for(let i = 0; i < this.displayedNotifications.length - 3; i++) { + this.toRemove.push(this.displayedNotifications[i].notification.id); + this.displayedNotifications[i].state = "final" + } + + } + } + + clearClicked() { + this.displayedNotifications = []; + } + + removeNotification(notificationId: number) { + if (this.toRemove.indexOf(notificationId) > -1) { + this.displayedNotifications = this.displayedNotifications.filter( + notification => notification.notification.id !== notificationId); + } + } + + forceRemoveNotification(notificationId: number) { + this.displayedNotifications = this.displayedNotifications.filter( + notification => notification.notification.id !== notificationId); + } + + cleanupNotifications() { + + } +} + + diff --git a/frontend/src/app/components/shared/notification-info/notification-info.component.html b/frontend/src/app/components/shared/notification-info/notification-info.component.html new file mode 100644 index 0000000..d4e5a53 --- /dev/null +++ b/frontend/src/app/components/shared/notification-info/notification-info.component.html @@ -0,0 +1,11 @@ +
+

{{notification.title}}

+ {{notification.time}} +
+

Device: {{notification.deviceName}}

+

Channel: {{notification.channel}}

+
+ +
+
diff --git a/frontend/src/app/components/shared/notification-info/notification-info.component.scss b/frontend/src/app/components/shared/notification-info/notification-info.component.scss new file mode 100644 index 0000000..c9fe3f4 --- /dev/null +++ b/frontend/src/app/components/shared/notification-info/notification-info.component.scss @@ -0,0 +1,104 @@ +@import "../../../colors"; + +.notification-wrapper { + max-width: 100%; + background: $colorItemBackground; + border-radius: 5px; + margin: 1px; + padding: 5px; + border: 1px solid $colorText; + border-left: 3px solid $red; + width: calc(100% - 10px); + cursor: pointer; + -webkit-animation: puff-in-right 0.25s cubic-bezier(0.470, 0.000, 0.745, 0.715) both; + animation: puff-in-right 0.25s cubic-bezier(0.470, 0.000, 0.745, 0.715) both; + h1 { + font-size: 1rem; + font-weight: bold; + margin-bottom: 2px; + display: inline-block; + margin-right: 10px; + } + p { + margin: 0; + font-size: 0.5rem; + } +} + +.notification-text-wrapper { + display: inline-block; +} + +.time { + float: right; + font-size: 12px; + position: absolute; + top: 5px; + right: 5px; + +} + + +.timeout-bar { + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 2px; + background: $colorMain; +} + + + +/* ---------------------------------------------- + * Generated by Animista on 2020-02-21 12:09:00 + * Licensed under FreeBSD License. + * See http://animista.net/license for more info. + * w: http://animista.net, t: @cssanimista + * ---------------------------------------------- */ + +/** + * ---------------------------------------- + * animation puff-in-right + * ---------------------------------------- + */ +@-webkit-keyframes puff-in-right { + 0% { + -webkit-transform: scale(2); + transform: scale(2); + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-filter: blur(4px); + filter: blur(4px); + opacity: 0; + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-filter: blur(0px); + filter: blur(0px); + opacity: 1; + } +} +@keyframes puff-in-right { + 0% { + -webkit-transform: scale(2); + transform: scale(2); + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-filter: blur(4px); + filter: blur(4px); + opacity: 0; + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-filter: blur(0px); + filter: blur(0px); + opacity: 1; + } +} diff --git a/frontend/src/app/components/shared/notification-info/notification-info.component.ts b/frontend/src/app/components/shared/notification-info/notification-info.component.ts new file mode 100644 index 0000000..7ab1b91 --- /dev/null +++ b/frontend/src/app/components/shared/notification-info/notification-info.component.ts @@ -0,0 +1,53 @@ +/** + * Author: Jakub Man + * Content of a single notification + */ +import {Component, OnInit, Input, Output, EventEmitter} from '@angular/core'; +import {NotificationService} from "../../../services/notification.service"; +import {Notification} from "../../../classes/Notification"; +import {trigger, state, style, animate, transition} from '@angular/animations'; + +@Component({ + selector: 'nc-notification-info', + templateUrl: './notification-info.component.html', + styleUrls: ['./notification-info.component.scss'], + animations: [ + trigger('changeDivSize', [ + state('initial', style({ + backgroundColor: 'green', + width: '100%', + })), + state('final', style({ + backgroundColor: 'red', + width: '0', + })), + transition('initial=>final', animate('10s')), + ]), + ] +}) +export class NotificationInfoComponent implements OnInit { + + constructor( + private notificationService: NotificationService + ) { + } + @Input() currentState: string; + @Input() notification: Notification; + + @Output() timedRemove: EventEmitter = new EventEmitter(); + @Output() forceRemove: EventEmitter = new EventEmitter(); + + + + + ngOnInit() { + } + + removeSelf() { + this.timedRemove.emit(this.notification.id); + } + + forceRemoveSelf() { + this.forceRemove.emit(this.notification.id); + } +} diff --git a/frontend/src/app/components/shared/pagination/pagination.component.html b/frontend/src/app/components/shared/pagination/pagination.component.html new file mode 100644 index 0000000..43f4492 --- /dev/null +++ b/frontend/src/app/components/shared/pagination/pagination.component.html @@ -0,0 +1,31 @@ +
+
+
+ + + + + + + +
+
+ Go to page: /{{totalPages()}} +
+ +
+ +
diff --git a/frontend/src/app/components/shared/pagination/pagination.component.scss b/frontend/src/app/components/shared/pagination/pagination.component.scss new file mode 100644 index 0000000..8ad5363 --- /dev/null +++ b/frontend/src/app/components/shared/pagination/pagination.component.scss @@ -0,0 +1,61 @@ +@import "../../../colors"; + +.align-center { + text-align: center; +} +.pagination { + width: 100%; + position: relative; + flex: 1; + display: flex; + flex-direction: row; + align-items: center; + overflow: auto; + .pagination-content { + margin-left: auto; + margin-right: auto; + } + .page-btn { + padding: 5px 10px; + margin-left: 0.2em; + margin-right: 0.2em; + border-radius: 5px; + min-width: 4em; + border: 2px solid $colorItemBackground; + color: $colorText; + background: $colorItemBackground; + cursor: pointer; + transition: all ease-in-out 250ms; + &:hover { + color: $colorTextInverse; + background: $colorMain; + } + &:focus, &:active { + outline: none; + } + &.active { + color: $colorTextInverse; + background: $colorMain; + } + &.disabled { + cursor: not-allowed; + color: transparentize($colorText, 0.5); + background: transparentize($colorItemBackground, 0.5); + } + } + .set-page-input { + border: none; + border-bottom: 1px solid $colorText; + color: $colorText; + width: 5em; + background: $colorItemBackground; + margin-left: 1em; + text-align:right; + } +} + +.no-mobile { + @media (max-width: 767px) { + display: none; + } +} diff --git a/frontend/src/app/components/shared/pagination/pagination.component.ts b/frontend/src/app/components/shared/pagination/pagination.component.ts new file mode 100644 index 0000000..ad42d4b --- /dev/null +++ b/frontend/src/app/components/shared/pagination/pagination.component.ts @@ -0,0 +1,102 @@ +/*** + * Author: Jakub Man + * A simple universal pagination + * + * Based on article by Ben Tedder + * http://www.bentedder.com/create-a-pagination-component-in-angular-4/ + */ +import { Component, Input, EventEmitter, Output } from '@angular/core'; + +@Component({ + selector: 'nc-pagination', + templateUrl: './pagination.component.html', + styleUrls: ['./pagination.component.scss'] +}) +export class PaginationComponent { + + @Input() page: number; + @Input() itemCount: number; + @Input() itemsPerPage: number; + @Input() loading: boolean; // Is content loading? + + @Output() goPrev = new EventEmitter(); + @Output() goNext = new EventEmitter(); + @Output() goPage = new EventEmitter(); + + pagesToShow: number = 5; + + constructor() { + } + + setPage(n: number): void { + if(!this.loading) { + if(n > 0 && n <= this.totalPages()) { + this.goPage.emit(n); + } + else { + this.page = 1; + } + } + } + + nextPage(): void { + if(this.page < this.totalPages() && !this.loading) { + this.goNext.emit(true); + } + + } + + prevPage(): void { + if(this.page > 1 && !this.loading) { + this.goPrev.emit(true); + } + + } + + totalPages(): number { + return Math.ceil(this.itemCount / this.itemsPerPage) || 1; + } + + isLastPage(): boolean { + return this.itemsPerPage * this.page > this.itemCount; + } + + getPages(): number[] { + const p = this.page || 1; + const pages = this.pagesToShow || 10; + let nums: number[] = []; + if(p < Math.ceil(pages / 2) + 2) { + for(let i = 2; i <= pages + 1; i++) { + if(i >= this.totalPages()) { + break; + } + if(i < 2) { + continue; + } + nums.push(i); + } + } + else if(p > (this.totalPages() - Math.ceil(pages / 2))) { + for(let i = this.totalPages() - pages; i < this.totalPages(); i++) { + if(i < 2) { + continue; + } + nums.push(i); + } + } + else { + for(let i = Math.ceil(p - (pages / 2)); i < Math.ceil(p + (pages / 2)); i++) { + if(i >= this.totalPages()) { + break; + } + if(i < 2) { + continue; + } + nums.push(i); + } + } + + return nums; + } + +} diff --git a/frontend/src/app/components/tools/tools.component.html b/frontend/src/app/components/tools/tools.component.html new file mode 100644 index 0000000..60b002c --- /dev/null +++ b/frontend/src/app/components/tools/tools.component.html @@ -0,0 +1,31 @@ +
+
+
+

{{error}}

+
+
+
+
+
+ icon +
+

{{tool.value.name}}

+

{{tool.value.description}}

+
+ Use > +
+ + +
+
+ Icons made by Eucalyp and + Freepik + from www.flaticon.com + +
+
+
+ +
+ +
diff --git a/frontend/src/app/components/tools/tools.component.scss b/frontend/src/app/components/tools/tools.component.scss new file mode 100644 index 0000000..87b3a3b --- /dev/null +++ b/frontend/src/app/components/tools/tools.component.scss @@ -0,0 +1,46 @@ +@import "../../colors"; + +.tool-wrapper { + background: $colorItemBackground; + border-radius: 15px; + padding: 10px; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); + overflow: hidden; +} + +.tool-text-wrapper { + display: inline-block; + padding-left: 10px; + max-width: 70%; + h1 { + margin: 0; + font-weight: bolder; + color: $colorText; + } +} + +.tool-icon { + width: 30%; + max-width: 100px; + height: auto; + display: inline-block; + +} + +.tool-btn { + float: right; +} + +.text-error { + color: $red; +} + +h1 { + font-size: 1.5rem; +} + +.attribution { + position: absolute; + bottom: 0; + color: transparentize($colorText, 0.5); +} diff --git a/frontend/src/app/components/tools/tools.component.ts b/frontend/src/app/components/tools/tools.component.ts new file mode 100644 index 0000000..c8c1716 --- /dev/null +++ b/frontend/src/app/components/tools/tools.component.ts @@ -0,0 +1,69 @@ +/** + * Author: Jakub Man + * Container for the tools tab and caller of the tool loader + */ +import {Component, OnInit, Injector, ViewChild, ViewContainerRef} from '@angular/core'; +import {ActivatedRoute} from '@angular/router'; +import {ToolLoaderService} from '../../services/tool-loader/tool-loader.service'; +import {ToolConfigProvider} from '../../services/tool-config.provider'; + +@Component({ + selector: 'nc-devices', + templateUrl: './tools.component.html', + styleUrls: ['./tools.component.scss'] +}) +export class ToolsComponent implements OnInit { + + @ViewChild('targetRef', {read: ViewContainerRef}) vcRef: ViewContainerRef; + config: any; + activeTool: string; + error = ''; + + constructor( + private injector: Injector, + private toolLoader: ToolLoaderService, + private configProvider: ToolConfigProvider, + private route: ActivatedRoute + ) { + } + + ngOnInit() { + this.config = this.configProvider.config; + this.route.paramMap.subscribe( + params => { + if (this.activeTool !== params.get('tool')) { + this.activeTool = params.get('tool'); + if (this.activeTool) { + this.loadTool(this.activeTool); + } + } + + }); + } + + loadTool(toolName: string) { + try { + this.toolLoader.load(toolName).then(moduleFactory => { + try { + const moduleRef = moduleFactory.create(this.injector); + const entryComponent = (moduleFactory.moduleType as any).entry; + const compFactory = moduleRef.componentFactoryResolver.resolveComponentFactory( + entryComponent + ); + this.vcRef.createComponent(compFactory); + this.error = ''; + } catch (e) { + this.error = 'Selected tool could not be loaded. Check the console for more details.'; + console.log(e); + console.error(e.message); + this.activeTool = null; + } + } + ); + } catch (e) { + this.error = 'Selected tool does not exist or crashed during launch.'; + this.activeTool = null; + } + } + +} diff --git a/frontend/src/app/netconf.module.ts b/frontend/src/app/netconf.module.ts new file mode 100644 index 0000000..a671a98 --- /dev/null +++ b/frontend/src/app/netconf.module.ts @@ -0,0 +1,163 @@ +import { APP_INITIALIZER, NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Routes, RouterModule} from '@angular/router'; +import { FormsModule } from '@angular/forms'; +import { HttpClientModule } from '@angular/common/http'; +// @ts-ignore +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { ReactiveFormsModule } from '@angular/forms'; +// @ts-ignore +import { AuthGuard } from 'app/utils/auth.guard'; +// @ts-ignore +import { SafePipe, SafePipeModule } from 'app/utils/safe.pipe'; + + + +import { NetconfComponent } from './components/netconf.component'; +import {DevicesComponent} from './components/devices/devices.component'; +import {ToolsComponent} from './components/tools/tools.component'; +import {NotificationsComponent} from './components/notifications/notifications.component'; +import {ProfilesComponent} from './components/profiles/profiles.component'; +import {AddDeviceFormComponent} from './components/shared/add-device-form/add-device-form.component'; +import {DeviceListComponent} from './components/devices/device-list/device-list.component'; +import {NotificationDisplayComponent} from './components/shared/notification-display/notification-display.component'; +import {NotificationInfoComponent} from './components/shared/notification-info/notification-info.component'; +import {ToolLoaderService} from './services/tool-loader/tool-loader.service'; +import {ClientToolLoaderService} from './services/tool-loader/client-tool-loader.service'; +import {ToolConfigProvider} from './services/tool-config.provider'; +import {PopupAddProfileComponent} from './components/profiles/popup-add-profile.component'; +import {ProfileEditComponent} from './components/profiles/profile-edit.component'; +import {DeviceFilterPipe} from './pipes/device-filter.pipe'; +import {PaginationPipe} from './pipes/pagination.pipe'; +import {PaginationComponent} from './components/shared/pagination/pagination.component'; +import {ConnectionStatusPipe} from './pipes/connectionStatus.pipe'; + + +import {NetconfLibModule} from './netconf-lib'; +import {PopupConnectProfileComponent} from "./components/profiles/popup-connect-profile.component"; + + +const routes: Routes = [{ + path: 'netconf', + component: NetconfComponent, + canActivate: [AuthGuard], + data: { + role: 10, + name: 'NETCONF', + description: 'Configure your network devices using the NETCONF protocol', + icon: 'fa-server' + }, + children: [ + { + path: '', + redirectTo: 'devices', + pathMatch: 'full' + }, + { + path: 'devices', + component: DevicesComponent, + canActivate: [AuthGuard], + data: { + role: 10 + } + }, + { + path: 'tool/:tool', + component: ToolsComponent, + canActivate: [AuthGuard], + data: { + role: 10 + } + }, + { + path: 'tool/:tool', + component: ToolsComponent, + canActivate: [AuthGuard], + data: { + role: 10 + } + }, + { + path: 'tools', + component: ToolsComponent, + canActivate: [AuthGuard], + data: { + role: 10 + } + }, + { + path: 'profile/:profile', + component: ProfileEditComponent, + canActivate: [AuthGuard], + data: { + role: 10 + } + }, + { + path: 'profiles', + component: ProfilesComponent, + canActivate: [AuthGuard], + data: { + role: 10 + } + }, + { + path: 'notifications', + component: NotificationsComponent, + canActivate: [AuthGuard], + data: { + role: 10 + } + } + ] +}]; + + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + HttpClientModule, + SafePipeModule, + RouterModule.forChild(routes), + NgbModule, + BrowserAnimationsModule, + NetconfLibModule, + ReactiveFormsModule + ], + declarations: [ + NetconfComponent, + DevicesComponent, + ToolsComponent, + NotificationsComponent, + ProfilesComponent, + AddDeviceFormComponent, + DeviceListComponent, + NotificationDisplayComponent, + NotificationInfoComponent, + PopupAddProfileComponent, + ProfileEditComponent, + DeviceFilterPipe, + PaginationPipe, + ConnectionStatusPipe, + PaginationComponent, + PopupConnectProfileComponent + ], + providers: [ + SafePipe, + { provide: ToolLoaderService, useClass: ClientToolLoaderService }, + ToolConfigProvider, + { + provide: APP_INITIALIZER, + useFactory: (provider: ToolConfigProvider) => () => + provider + .loadConfig() + .toPromise() + .then(config => (provider.config = config)), + multi: true, + deps: [ToolConfigProvider] + } + ] +}) +export class NetconfModule {} diff --git a/frontend/src/app/package.json b/frontend/src/app/package.json new file mode 100644 index 0000000..575ff80 --- /dev/null +++ b/frontend/src/app/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "systemjs": "3.0.2" + }, + "devDependencies": { + } +} diff --git a/frontend/src/app/pipes/connectionStatus.pipe.ts b/frontend/src/app/pipes/connectionStatus.pipe.ts new file mode 100644 index 0000000..ab430a7 --- /dev/null +++ b/frontend/src/app/pipes/connectionStatus.pipe.ts @@ -0,0 +1,38 @@ +/** + * Author: Jakub Man + * Translating a connection status number to human readable status text + */ +import { Pipe, PipeTransform } from "@angular/core"; + +@Pipe({ + name: 'connectionStatus', + pure: false +}) +export class ConnectionStatusPipe implements PipeTransform{ + transform(status: number | string): string { + switch (status) { + case -2: + return 'Waiting for connection'; + case -1: + return 'Connecting'; + case 0: + return 'Waiting for the device'; + case 1: + return "Connected"; + case 2: + return "HTTP error"; + case 3: + return "Password required"; + case 4: + return "Hostkey changed!"; + case 5: + return "Missing schema!"; + case 6: + return "Server error"; + default: + if(typeof status == 'number') + return status.toString(); + else return status; + } + } +} diff --git a/frontend/src/app/pipes/device-filter.pipe.ts b/frontend/src/app/pipes/device-filter.pipe.ts new file mode 100644 index 0000000..e2dc1f7 --- /dev/null +++ b/frontend/src/app/pipes/device-filter.pipe.ts @@ -0,0 +1,25 @@ +/** + * Author: Jakub Man + * Implementation of the search input in device selection for profiles + */ +import { Pipe, PipeTransform } from '@angular/core'; +import {Device} from '../netconf-lib/lib/classes/device'; + +@Pipe({ + name: 'deviceFilter', + pure: false +}) +export class DeviceFilterPipe implements PipeTransform { + transform(items: {device: Device, inProfile: boolean}[], searchText: string): any { + if (!items) { return []; } + if (!searchText) { return items; } + searchText = searchText.toLowerCase(); + + return items.filter( device => { + return (device.device.name && device.device.name.toLowerCase().includes(searchText)) || + device.device.hostname.toLowerCase().includes(searchText) || + (device.device.hostname.toLowerCase() + ':' + device.device.port.toString()).includes(searchText) || + device.device.username.toLowerCase().includes(searchText); + }); + } +} diff --git a/frontend/src/app/pipes/pagination.pipe.ts b/frontend/src/app/pipes/pagination.pipe.ts new file mode 100644 index 0000000..39dba59 --- /dev/null +++ b/frontend/src/app/pipes/pagination.pipe.ts @@ -0,0 +1,18 @@ +/** + * Author: Jakub Man + * Pipe implementing a sliding window for pagination + */ +import { Pipe, PipeTransform } from "@angular/core"; + +@Pipe({ + name: 'pagination', + pure: false +}) +export class PaginationPipe implements PipeTransform{ + transform(items: any[], options: {page: number, perPage: number}): any { + if(!items) return []; + if(!options) return items; + + return items.slice((options.page - 1) * options.perPage, options.page * options.perPage); + } +} diff --git a/frontend/src/app/services/config.service.ts b/frontend/src/app/services/config.service.ts new file mode 100644 index 0000000..669a063 --- /dev/null +++ b/frontend/src/app/services/config.service.ts @@ -0,0 +1,27 @@ +/** + * Author: Jakub Man + * A service for loading configuration + */ + +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Observable, of } from 'rxjs'; + + +@Injectable({ + providedIn: 'root' +}) +export class ConfigService { + constructor( + private http: HttpClient + ) + {} + + getConfig(): Observable { + return of({ + allowPasswordSaving: false + }); + } + + +} diff --git a/frontend/src/app/services/notification.service.ts b/frontend/src/app/services/notification.service.ts new file mode 100644 index 0000000..e471b70 --- /dev/null +++ b/frontend/src/app/services/notification.service.ts @@ -0,0 +1,47 @@ +/** + * Author: Jakub Man + * Service for loading and displaying notifications + */ +import {EventEmitter, Injectable} from '@angular/core'; +import {Observable} from 'rxjs'; +import {Notification} from "../classes/Notification"; + +@Injectable({ + providedIn: 'root' +}) +export class NotificationService { + + public onNewNotification: EventEmitter = new EventEmitter(); + + constructor() { + } + + currentId = 0; + + public createNotification(title: string, deviceName: string, channel: string): Notification { + return { + id: this.getNextAvailableId(), + title, + time: NotificationService.getCurrentTime(), + deviceName, + channel + } + }; + + + public sendNotification(notification: Notification) { + this.onNewNotification.emit(notification); + } + + public static getCurrentTime(): string { + let now = new Date(); + return ("0" + now.getHours()).slice(-2) + ":" + + ("0" + now.getMinutes()).slice(-2) + ":" + + ("0" + now.getSeconds()).slice(-2); + } + + public getNextAvailableId(): number { + this.currentId++; + return this.currentId; + } +} diff --git a/frontend/src/app/services/profile.service.ts b/frontend/src/app/services/profile.service.ts new file mode 100644 index 0000000..48a491b --- /dev/null +++ b/frontend/src/app/services/profile.service.ts @@ -0,0 +1,57 @@ +/** + * Author: Jakub Man + * Service for handling profile operations + */ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { ProfileDevice } from "../classes/ProfileDevice"; +import {ProfileItem} from '../classes/ProfileItem'; +import {GenericServerResponse} from '../classes/GenericServerResponse'; + +// TODO: Caching to prevent multiple unnecessary HTTP requests + +@Injectable({ + providedIn: 'root' +}) +export class ProfileService { + constructor( + private http: HttpClient + ) {} + + /** + * Get all devices from profile, that uses sets as a default profile + */ + public getOnLoginProfile(): Observable<{devices: ProfileDevice[], name: string, connectOnLogin: boolean}> { + return this.http.get<{devices: ProfileDevice[], name: string, connectOnLogin: boolean}>('/netconf/profileOnLogin'); + } + + public getProfileDevices(profileName: string): Observable { + return this.http.get('/netconf/profile/' + profileName); + + } + + public getAllProfileNames(): Observable { + return this.http.get('/netconf/profiles'); + } + + public addProfile(name: string): Observable { + return this.http.post('/netconf/profile', {profile: name}); + } + + public removeProfile(name: string): Observable { + return this.http.post('/netconf/removeProfile', {profile: name}); + } + + public setActiveProfile(profileName: string): Observable { + return this.http.post('/netconf/activateProfile', {profile: profileName}); + } + + public saveProfile(profileName: string, profiles: ProfileItem[]): Observable { + return this.http.post('/netconf/profileSet', {profile: profileName, value: profiles}); + } + + public setProfileConnectOnLogin(profileName: string, value: boolean): Observable { + return this.http.post('/netconf/profile/setConnectOnLogin', {profile: profileName, value}); + } +} diff --git a/frontend/src/app/services/tool-config.provider.ts b/frontend/src/app/services/tool-config.provider.ts new file mode 100644 index 0000000..11d0801 --- /dev/null +++ b/frontend/src/app/services/tool-config.provider.ts @@ -0,0 +1,60 @@ +/** + MIT License + + Copyright (c) 2018 Alexey Zuev + + Available from https://github.com/alexzuza/angular-plugin-architecture/ + + 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. + */ + +// @ts-ignore +import { Injectable } from '@angular/core'; +// @ts-ignore +import { HttpClient, HttpBackend } from '@angular/common/http'; + + +interface ToolConfig { + [key: string]: { + name: string; + path: string; + image?: string; + description?: string; + deps: string[]; + }; +} + +@Injectable() +export class ToolConfigProvider { + config: ToolConfig; + + private http: HttpClient; + + constructor(handler: HttpBackend) { + // Go around HTTP interceptor + this.http = new HttpClient(handler); + } + + loadConfig() { + return this.http.get( + `/assets/libnetconf/tools-config.json` + ); + } +} + diff --git a/frontend/src/app/services/tool-loader/client-tool-loader.service.ts b/frontend/src/app/services/tool-loader/client-tool-loader.service.ts new file mode 100644 index 0000000..5443271 --- /dev/null +++ b/frontend/src/app/services/tool-loader/client-tool-loader.service.ts @@ -0,0 +1,74 @@ +/** + MIT License + + Copyright (c) 2018 Alexey Zuev + + Available from https://github.com/alexzuza/angular-plugin-architecture/ + + 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. + */ + +// @ts-ignore +import { Injectable, NgModuleFactory } from '@angular/core'; +import { TOOL_EXTERNALS_MAP } from './tool-externals'; +import {ToolConfigProvider} from '../tool-config.provider'; +import {ToolLoaderService} from './tool-loader.service'; + +const SystemJS = window.System; + + +@Injectable() +export class ClientToolLoaderService extends ToolLoaderService { + constructor(private configProvider: ToolConfigProvider) { + super(); + } + + provideExternals() { + Object.keys(TOOL_EXTERNALS_MAP).forEach(externalKey => + window.define(externalKey, [], () => TOOL_EXTERNALS_MAP[externalKey]) + ); + } + + load(pluginName): Promise> { + const { config } = this.configProvider; + if (!config[pluginName]) { + throw Error(`Can't find appropriate plugin`); + } + + const depsPromises = (config[pluginName].deps || []).map(dep => { + return SystemJS.import(config[dep].path).then(m => { + window['define'](dep, [], () => m.default); + }); + }); + + if (typeof TOOL_EXTERNALS_MAP.netconf_lib === 'string') { + depsPromises.push(SystemJS.import('/assets/libnetconf/tools/netconf-lib.js').then(m => { + TOOL_EXTERNALS_MAP.netconf_lib = m.default; + window['define']('netconf-lib', [], () => m.default); + console.log('Defined netconf-lib'); + })); + } + + return Promise.all(depsPromises).then(() => { + return SystemJS.import(config[pluginName].path).then( + module => module.default.default + ); + }); + } +} diff --git a/frontend/src/app/services/tool-loader/tool-externals.prod.ts b/frontend/src/app/services/tool-loader/tool-externals.prod.ts new file mode 100644 index 0000000..821c449 --- /dev/null +++ b/frontend/src/app/services/tool-loader/tool-externals.prod.ts @@ -0,0 +1,50 @@ +/** + MIT License + + Copyright (c) 2018 Alexey Zuev + + Available from https://github.com/alexzuza/angular-plugin-architecture/ + + 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. + */ + +import * as core from '@angular/core'; +import * as common from '@angular/common'; +import * as forms from '@angular/forms'; +import * as router from '@angular/router'; +import * as rxjs from 'rxjs'; +import * as tslib from 'tslib'; +import * as socketIo from 'socket.io-client'; +import * as http from '@angular/common/http'; +import * as lib from '../../netconf-lib'; + + +export const TOOL_EXTERNALS_MAP = { + 'ng.http': http, + 'ng.core': core, + 'ng.common': common, + 'ng.forms': forms, + 'ng.router': router, + rxjs, + tslib, + socketIo, + netconf_lib: { ...lib, ...require('netconf-lib/netconf-lib.ngfactory') } +}; + +declare let require: any; diff --git a/frontend/src/app/services/tool-loader/tool-externals.ts b/frontend/src/app/services/tool-loader/tool-externals.ts new file mode 100644 index 0000000..df15ccf --- /dev/null +++ b/frontend/src/app/services/tool-loader/tool-externals.ts @@ -0,0 +1,49 @@ +/** + MIT License + + Copyright (c) 2018 Alexey Zuev + + Available from https://github.com/alexzuza/angular-plugin-architecture/ + + 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. + */ + +import * as core from '@angular/core'; +import * as common from '@angular/common'; +import * as forms from '@angular/forms'; +import * as router from '@angular/router'; +import * as socketIo from 'socket.io-client'; +import * as rxjs from 'rxjs'; +import * as tslib from 'tslib'; +import * as http from '@angular/common/http'; +// @ts-ignore +import * as socketService from 'app/services/socket.service'; + +export const TOOL_EXTERNALS_MAP = { + 'ng.http': http, + 'ng.core': core, + 'ng.common': common, + 'ng.forms': forms, + 'ng.router': router, + rxjs, + tslib, + 'socket.io-client': socketIo, + netconf_lib: '/assets/libnetconf/tools/netconf-lib.js', + socketService +}; diff --git a/frontend/src/app/services/tool-loader/tool-loader.service.ts b/frontend/src/app/services/tool-loader/tool-loader.service.ts new file mode 100644 index 0000000..47055d3 --- /dev/null +++ b/frontend/src/app/services/tool-loader/tool-loader.service.ts @@ -0,0 +1,36 @@ +/** + MIT License + + Copyright (c) 2018 Alexey Zuev + + Available from https://github.com/alexzuza/angular-plugin-architecture/ + + 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. + */ +import { NgModuleFactory } from '@angular/core'; + +export abstract class ToolLoaderService { + protected constructor() { + this.provideExternals(); + } + + abstract provideExternals(): void; + + abstract load(pluginName): Promise>; +} diff --git a/frontend/src/app/styles/_inputs.scss b/frontend/src/app/styles/_inputs.scss new file mode 100644 index 0000000..011fcab --- /dev/null +++ b/frontend/src/app/styles/_inputs.scss @@ -0,0 +1,75 @@ +@import "../colors"; + +.nc-form-group { + display: block; + text-align: right; + margin-top: 10px; +} + +.centered { + margin-left: auto; + margin-right: auto; +} + +.nc-form-group-inline { + display: inline-block; + margin: 10px; +} + +.nc-input { + text-align: left; + border: 1px solid $colorText; + border-radius: 5px; + font-size: 16px; + padding: 0 5px; + max-width: 95%; + &:focus { + border: 1px solid $colorMain; + outline: 1px solid $colorMain; + } +} + +.nc-input-wide { + max-width: 100%; + width: 600px; +} +.nc-label { + text-align: right; + margin-right: 10px; + font-size: 14px; + color: $colorText; +} +.nc-label-center { + display: block; + text-align: center; +} + + + +.nc-big-input-container { + margin-left: auto; + margin-right: auto; +} +.nc-big-input { + font-size: 1.6em; + padding: 10px; + border-radius: 5px; + border: 3px solid $colorText; + color: $colorText; + font-weight: bold; + &:focus { + border: 3px solid $colorMain; + outline: 1px solid $colorMain; + } +} +.nc-big-input-label { + font-size: 1rem; + margin-bottom: 0; + display: block; + color: $colorHeading; + text-transform: uppercase; +} + +.text-bold { + font-weight: bold; +} diff --git a/frontend/src/app/styles/netconf.scss b/frontend/src/app/styles/netconf.scss new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/app/tsconfig.json b/frontend/src/app/tsconfig.json new file mode 100644 index 0000000..a5540bf --- /dev/null +++ b/frontend/src/app/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./lib/out-tsc", + "baseUrl": "src", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2016", + "dom" + ], + "paths": { + "netconf-lib": [ + ".dist/netconf-lib" + ], + "netconf-lib/*": [ + "./dist/netconf-lib/*" + ] + } + } +} diff --git a/frontend/src/app/typings.d.ts b/frontend/src/app/typings.d.ts new file mode 100644 index 0000000..cee2b68 --- /dev/null +++ b/frontend/src/app/typings.d.ts @@ -0,0 +1,7 @@ +interface Window { + define: (name: string, deps: string[], definitionFn: () => any) => void; + + System: { + import: (path) => Promise; + }; +} diff --git a/frontend/src/assets/.gitkeep b/frontend/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/assets/tools/example.js b/frontend/src/assets/tools/example.js new file mode 100644 index 0000000..3873c24 --- /dev/null +++ b/frontend/src/assets/tools/example.js @@ -0,0 +1 @@ +!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("ng.common"),require("ng.core"),require("lib")):"function"==typeof define&&define.amd?define(["ng.common","ng.core","lib"],e):"object"==typeof exports?exports.example=e(require("ng.common"),require("ng.core"),require("lib")):n.example=e(n["ng.common"],n["ng.core"],n.lib)}("undefined"!=typeof self?self:this,function(n,e,l){return function(n){var e={};function l(o){if(e[o])return e[o].exports;var t=e[o]={i:o,l:!1,exports:{}};return n[o].call(t.exports,t,t.exports,l),t.l=!0,t.exports}return l.m=n,l.c=e,l.d=function(n,e,o){l.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:o})},l.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},l.t=function(n,e){if(1&e&&(n=l(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var o=Object.create(null);if(l.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var t in n)l.d(o,t,(function(e){return n[e]}).bind(null,t));return o},l.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return l.d(e,"a",e),e},l.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},l.p="",l(l.s=0)}({0:function(n,e,l){n.exports=l("zUnb")},"0S4P":function(e,l){e.exports=n},vOrQ:function(n,l){n.exports=e},"y+nh":function(n,e){n.exports=l},zUnb:function(n,e,l){"use strict";l.r(e);var o=function(){this.x=!1},t=function(){function n(){}return n.entry=o,n}(),u=l("vOrQ"),r=l("y+nh"),i=u["\u0275crt"]({encapsulation:2,styles:[],data:{}});function c(n){return u["\u0275vid"](0,[(n()(),u["\u0275eld"](0,0,null,null,5,"div",[["class","col-sm-12 col-md-3"]],null,null,null,null,null)),(n()(),u["\u0275eld"](1,0,null,null,4,"div",[["class","tool-wrapper"]],null,null,null,null,null)),(n()(),u["\u0275eld"](2,0,null,null,1,"h1",[],null,null,null,null,null)),(n()(),u["\u0275ted"](-1,null,["Tools work! Hello from example tool"])),(n()(),u["\u0275eld"](4,0,null,null,1,"lib-lib",[],null,null,null,r.View_LibComponent_0,r.RenderType_LibComponent)),u["\u0275did"](5,114688,null,0,r.LibComponent,[],null,null)],function(n,e){n(e,5,0)},null)}var d=u["\u0275ccf"]("app-example-tool",o,function(n){return u["\u0275vid"](0,[(n()(),u["\u0275eld"](0,0,null,null,1,"app-example-tool",[],null,null,null,c,i)),u["\u0275did"](1,49152,null,0,o,[],null,null)],null,null)},{},{},[]),f=l("0S4P"),p=u["\u0275cmf"](t,[],function(n){return u["\u0275mod"]([u["\u0275mpd"](512,u.ComponentFactoryResolver,u["\u0275CodegenComponentFactoryResolver"],[[8,[d]],[3,u.ComponentFactoryResolver],u.NgModuleRef]),u["\u0275mpd"](4608,f.NgLocalization,f.NgLocaleLocalization,[u.LOCALE_ID,[2,f["\u0275angular_packages_common_common_a"]]]),u["\u0275mpd"](1073742336,f.CommonModule,f.CommonModule,[]),u["\u0275mpd"](1073742336,r.LibModule,r.LibModule,[]),u["\u0275mpd"](1073742336,t,t,[])])});l.d(e,"ExampleModule",function(){return t}),l.d(e,"ExampleModuleNgFactory",function(){return p}),e.default=p}})}); \ No newline at end of file diff --git a/frontend/src/assets/tools/index.html b/frontend/src/assets/tools/index.html new file mode 100644 index 0000000..dcf1c55 --- /dev/null +++ b/frontend/src/assets/tools/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/assets/tools/lib.js b/frontend/src/assets/tools/lib.js new file mode 100644 index 0000000..aad0364 --- /dev/null +++ b/frontend/src/assets/tools/lib.js @@ -0,0 +1 @@ +!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("ng.core")):"function"==typeof define&&define.amd?define(["ng.core"],e):"object"==typeof exports?exports.lib=e(require("ng.core")):n.lib=e(n["ng.core"])}("undefined"!=typeof self?self:this,function(n){return function(n){var e={};function t(o){if(e[o])return e[o].exports;var r=e[o]={i:o,l:!1,exports:{}};return n[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}return t.m=n,t.c=e,t.d=function(n,e,o){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:o})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var o=Object.create(null);if(t.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var r in n)t.d(o,r,(function(e){return n[e]}).bind(null,r));return o},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}({0:function(n,e,t){n.exports=t("zUnb")},vOrQ:function(e,t){e.exports=n},zUnb:function(n,e,t){"use strict";t.r(e);var o=t("vOrQ"),r=function(){function n(){}return n.ngInjectableDef=Object(o.defineInjectable)({factory:function(){return new n},token:n,providedIn:"root"}),n}(),u=function(){function n(){}return n.prototype.ngOnInit=function(){},n}(),l=function(){},i=o["\u0275cmf"](l,[],function(n){return o["\u0275mod"]([o["\u0275mpd"](512,o.ComponentFactoryResolver,o["\u0275CodegenComponentFactoryResolver"],[[8,[]],[3,o.ComponentFactoryResolver],o.NgModuleRef]),o["\u0275mpd"](1073742336,l,l,[])])}),c=o["\u0275crt"]({encapsulation:2,styles:[],data:{}});function f(n){return o["\u0275vid"](0,[(n()(),o["\u0275eld"](0,0,null,null,1,"p",[],null,null,null,null,null)),(n()(),o["\u0275ted"](-1,null,[" lib works! "]))],null,null)}function d(n){return o["\u0275vid"](0,[(n()(),o["\u0275eld"](0,0,null,null,1,"lib-lib",[],null,null,null,f,c)),o["\u0275did"](1,114688,null,0,u,[],null,null)],function(n,e){n(e,1,0)},null)}var p=o["\u0275ccf"]("lib-lib",u,d,{},{},[]);t.d(e,"LibService",function(){return r}),t.d(e,"LibComponent",function(){return u}),t.d(e,"LibModule",function(){return l}),t.d(e,"LibModuleNgFactory",function(){return i}),t.d(e,"RenderType_LibComponent",function(){return c}),t.d(e,"View_LibComponent_0",function(){return f}),t.d(e,"View_LibComponent_Host_0",function(){return d}),t.d(e,"LibComponentNgFactory",function(){return p}),e.default=i}})}); \ No newline at end of file diff --git a/frontend/src/browserslist b/frontend/src/browserslist new file mode 100644 index 0000000..37371cb --- /dev/null +++ b/frontend/src/browserslist @@ -0,0 +1,11 @@ +# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries +# +# For IE 9-11 support, please remove 'not' from the last line of the file and adjust as needed + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 \ No newline at end of file diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/frontend/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts new file mode 100644 index 0000000..7b4f817 --- /dev/null +++ b/frontend/src/environments/environment.ts @@ -0,0 +1,16 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/frontend/src/favicon.ico b/frontend/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8081c7ceaf2be08bf59010158c586170d9d2d517 GIT binary patch literal 5430 zcmc(je{54#6vvCoAI3i*G5%$U7!sA3wtMZ$fH6V9C`=eXGJb@R1%(I_{vnZtpD{6n z5Pl{DmxzBDbrB>}`90e12m8T*36WoeDLA&SD_hw{H^wM!cl_RWcVA!I+x87ee975; z@4kD^=bYPn&pmG@(+JZ`rqQEKxW<}RzhW}I!|ulN=fmjVi@x{p$cC`)5$a!)X&U+blKNvN5tg=uLvuLnuqRM;Yc*swiexsoh#XPNu{9F#c`G zQLe{yWA(Y6(;>y|-efAy11k<09(@Oo1B2@0`PtZSkqK&${ zgEY}`W@t{%?9u5rF?}Y7OL{338l*JY#P!%MVQY@oqnItpZ}?s z!r?*kwuR{A@jg2Chlf0^{q*>8n5Ir~YWf*wmsh7B5&EpHfd5@xVaj&gqsdui^spyL zB|kUoblGoO7G(MuKTfa9?pGH0@QP^b#!lM1yHWLh*2iq#`C1TdrnO-d#?Oh@XV2HK zKA{`eo{--^K&MW66Lgsktfvn#cCAc*(}qsfhrvOjMGLE?`dHVipu1J3Kgr%g?cNa8 z)pkmC8DGH~fG+dlrp(5^-QBeEvkOvv#q7MBVLtm2oD^$lJZx--_=K&Ttd=-krx(Bb zcEoKJda@S!%%@`P-##$>*u%T*mh+QjV@)Qa=Mk1?#zLk+M4tIt%}wagT{5J%!tXAE;r{@=bb%nNVxvI+C+$t?!VJ@0d@HIyMJTI{vEw0Ul ze(ha!e&qANbTL1ZneNl45t=#Ot??C0MHjjgY8%*mGisN|S6%g3;Hlx#fMNcL<87MW zZ>6moo1YD?P!fJ#Jb(4)_cc50X5n0KoDYfdPoL^iV`k&o{LPyaoqMqk92wVM#_O0l z09$(A-D+gVIlq4TA&{1T@BsUH`Bm=r#l$Z51J-U&F32+hfUP-iLo=jg7Xmy+WLq6_tWv&`wDlz#`&)Jp~iQf zZP)tu>}pIIJKuw+$&t}GQuqMd%Z>0?t%&BM&Wo^4P^Y z)c6h^f2R>X8*}q|bblAF?@;%?2>$y+cMQbN{X$)^R>vtNq_5AB|0N5U*d^T?X9{xQnJYeU{ zoZL#obI;~Pp95f1`%X3D$Mh*4^?O?IT~7HqlWguezmg?Ybq|7>qQ(@pPHbE9V?f|( z+0xo!#m@Np9PljsyxBY-UA*{U*la#8Wz2sO|48_-5t8%_!n?S$zlGe+NA%?vmxjS- zHE5O3ZarU=X}$7>;Okp(UWXJxI%G_J-@IH;%5#Rt$(WUX?6*Ux!IRd$dLP6+SmPn= z8zjm4jGjN772R{FGkXwcNv8GBcZI#@Y2m{RNF_w8(Z%^A*!bS*!}s6sh*NnURytky humW;*g7R+&|Ledvc- + + + + NetconfToolDevkit + + + + + + + + + diff --git a/frontend/src/karma.conf.js b/frontend/src/karma.conf.js new file mode 100644 index 0000000..b6e0042 --- /dev/null +++ b/frontend/src/karma.conf.js @@ -0,0 +1,31 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../coverage'), + reports: ['html', 'lcovonly'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; \ No newline at end of file diff --git a/frontend/src/main.ts b/frontend/src/main.ts new file mode 100644 index 0000000..28bfa9e --- /dev/null +++ b/frontend/src/main.ts @@ -0,0 +1,13 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.error(err)); + diff --git a/frontend/src/polyfills.ts b/frontend/src/polyfills.ts new file mode 100644 index 0000000..d310405 --- /dev/null +++ b/frontend/src/polyfills.ts @@ -0,0 +1,80 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** IE10 and IE11 requires the following for the Reflect API. */ +// import 'core-js/es6/reflect'; + + +/** Evergreen browsers require these. **/ +// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. +import 'core-js/es7/reflect'; + + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + */ + + // (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + // (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + // (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + + /* + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + */ +// (window as any).__Zone_enable_cross_context_check = true; + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/frontend/src/styles.css b/frontend/src/styles.css new file mode 100644 index 0000000..90d4ee0 --- /dev/null +++ b/frontend/src/styles.css @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/frontend/src/test.ts b/frontend/src/test.ts new file mode 100644 index 0000000..1631789 --- /dev/null +++ b/frontend/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/frontend/src/tsconfig.app.json b/frontend/src/tsconfig.app.json new file mode 100644 index 0000000..190fd30 --- /dev/null +++ b/frontend/src/tsconfig.app.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/frontend/src/tsconfig.spec.json b/frontend/src/tsconfig.spec.json new file mode 100644 index 0000000..de77336 --- /dev/null +++ b/frontend/src/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/frontend/src/tslint.json b/frontend/src/tslint.json new file mode 100644 index 0000000..752eaae --- /dev/null +++ b/frontend/src/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "nc", + "kebab-case" + ] + } +} diff --git a/frontend/src/typings.d.ts b/frontend/src/typings.d.ts new file mode 100644 index 0000000..233544d --- /dev/null +++ b/frontend/src/typings.d.ts @@ -0,0 +1,7 @@ +interface Window { + define: (name: string, deps: string[], definitionFn: () => any) => void; + + System: { + import: (path) => Promise; + }; +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..685d014 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "module": "es2015", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2016", + "dom" + ], + "paths": { + "netconf-lib": [ + "dist/netconf-lib" + ], + "netconf-lib/*": [ + "dist/netconf-lib/*" + ] + } + } +} diff --git a/frontend/tslint.json b/frontend/tslint.json new file mode 100644 index 0000000..6ddb6b2 --- /dev/null +++ b/frontend/tslint.json @@ -0,0 +1,131 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "deprecation": { + "severity": "warn" + }, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "no-output-on-prefix": true, + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} diff --git a/frontend/yang/schemas.service.ts b/frontend/yang/schemas.service.ts deleted file mode 100644 index c611d97..0000000 --- a/frontend/yang/schemas.service.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http'; -import { Observable } from 'rxjs/Observable'; -import { catchError } from "rxjs/operators"; -import 'rxjs/add/operator/catch'; -import 'rxjs/add/operator/map'; - -import { Schema } from '../inventory/schema'; - -@Injectable() -export class SchemasService { - public schemas: Schema[]; - public activeSchema: string; - public history; - - constructor( private http: HttpClient ) { - this.loadSchemas(); - this.activeSchema = localStorage.getItem('activeSchema'); - if (!this.schemas) { - this.schemas = []; - } - if (!this.activeSchema) { - this.activeSchema = ""; - } else if (!this.getSchema(this.activeSchema)) { - if (this.schemas.length) { - this.activeSchema = this.schemas[0]['name']; - } else { - this.activeSchema = ""; - } - } - } - - storeSchemas(): void { - if (this.schemas) { - localStorage.setItem('schemas', JSON.stringify(this.schemas)); - } else { - localStorage.removeItem('schemas'); - } - - localStorage.setItem('YEHistory', JSON.stringify(this.history)); - } - - loadSchemas(): void { - this.schemas = JSON.parse(localStorage.getItem('schemas')); - this.history = JSON.parse(localStorage.getItem('YEHistory')); - if (!this.history) { - this.history = []; - } - } -/* - getSchemaKey(schema: Schema) { - if (!schema) { - return null; - } else if ('revision' in schema) { - return schema.name + '@' + schema.revision + '.yang'; - } else { - return schema.name + '.yang'; - } - } -*/ - getSchema(key: string = this.activeSchema): Schema { - if (key) { - for (let i = this.schemas.length; i > 0; i--) { - if (this.schemas[i - 1].key == key) { - return this.schemas[i - 1]; - } - } - } - return null; - } - - getActiveSchema(key: string = this.activeSchema): Schema { - return this.getSchema(); - } - - changeActiveSchemaKey(key: string): Schema { - let result = this.getSchema(key); - if (result) { - this.activeSchema = key; - localStorage.setItem('activeSchema', this.activeSchema); - } - return result; - } - - getSchemas(): Observable { - return this.http.get( '/netopeer/inventory/schemas' ); - } - - show(key: string, type: string = 'text', path: string = null): Observable { - let schema = new Schema(key); - let i:number; - for (i = this.schemas.length; i > 0; i--) { - if (this.schemas[i - 1].key == key) { - break; - } - } - - let params = new HttpParams() - .set('key', key) - .set('type', type); - if (path) { - params = params.set('path', path); - } - - return this.http.get('/netopeer/inventory/schema', {params: params}) - .map((result: object) => { - if ( result['success'] ) { - schema.name = result['name']; - if ( 'revision' in result ) { - schema.revision = result['revision']; - } - schema.type = type; - if ( path ) { - switch (type) { - case 'tree-grouping': - schema.path = 'grouping' + path; - break; - default: - schema.path = path; - break; - } - } else { - schema.path = ''; - } - schema.data = result['data']; - let last = this.history[this.history.length - 1]; - if (!last || last.key != key || last.type != type || last.path != path) { - this.history.push( { key, type, path } ); - } - - if (i > 0) { - /* replacing already present schema */ - this.schemas.splice(i - 1, 1, schema); - } else { - /* adding new schema to the end of the list */ - this.schemas.push(schema); - } - this.storeSchemas(); - this.changeActiveSchemaKey(key); - } - return result; - }); - } - - cleanHistory( key:string ) { - for (let i = this.history.length; i > 0; i--) { - if (this.history[i - 1].key == key) { - this.history.splice(i - 1, 1); - } - } - } - - close( key: string ) { - let index = this.schemas.findIndex((s: Schema) => s.key == key); - if ( this.activeSchema == key ) { - if ( index > 0 ) { - this.changeActiveSchemaKey(this.schemas[index - 1].key); - } else if (Object.keys(this.schemas).length > 1) { - this.changeActiveSchemaKey(this.schemas[1].key); - } else { - this.activeSchema = null; - localStorage.removeItem('activeSchema'); - } - } - this.schemas.splice(index, 1); - this.cleanHistory(key); - this.storeSchemas(); - } - - addSchema( schema: File ) { - let headers = new HttpHeaders( { 'specific-content-type': '' } ); - let input = new FormData(); - input.append( "schema", schema ); - return this.http.post( '/netopeer/inventory/schemas', input, { headers: headers } ) - .pipe( - catchError((err: any) => Observable.throwError(err)) - ) - } - - rmSchema(key: string) { - - return this.http.request('DELETE', '/netopeer/inventory/schemas', { body: JSON.stringify(key)}) - .pipe( - catchError((err: any) => Observable.throwError(err)) - ) - } - - cutPath(path: string, refpath: string) { - let result = []; - let delim = 0; - while(path.substr(delim, 3) === '../') { - delim += 3; - refpath = refpath.slice(0, refpath.lastIndexOf('/')); - result.push({id:'..', path:refpath}); - } - if (delim == 0) { - refpath = ''; - } else { - delim = delim - 1; - } - while (delim != -1) { - let end = path.indexOf('/', delim + 1); - let id; - if (end == -1) { - id = path.slice(delim + 1); - } else { - id = path.slice(delim + 1, end) - } - refpath = refpath + '/' + id; - result.push({id:id, path:refpath}); - delim = end; - } - //console.log(result) - return result; - } - - static newlineToBr(message: string) { - let entityMap = { - "&": "&", - "<": "<", - ">": ">", - '"': '"', - "'": ''', - "/": '/' - }; - return message.replace(/[&<>"'\/]/g, s => entityMap[s]).replace(/\n/g, "
"); - } -} diff --git a/frontend/yang/yang.component.html b/frontend/yang/yang.component.html deleted file mode 100644 index 6a3eba5..0000000 --- a/frontend/yang/yang.component.html +++ /dev/null @@ -1,41 +0,0 @@ - -
-Start here with that + sign. -
- back - - interactive - text - - module -
- -
{{activeSchema.data}}
- - - - - - -
{{activeSchema.data | json}}
-
-
- -
diff --git a/frontend/yang/yang.component.scss b/frontend/yang/yang.component.scss deleted file mode 100644 index 7ea9526..0000000 --- a/frontend/yang/yang.component.scss +++ /dev/null @@ -1,98 +0,0 @@ -@import '../netopeer-common'; -@import '../inventory/inventory.component'; - -$colorLineHover: #e1e1e1; -$colorLineSelected: #999999; - -.nav-button { - height: 2em; - cursor: pointer; - margin: 0.3em; -} - -.loading { - text-align: center; - margin: auto; - width: 10em; - div { - margin: auto; - width: 50px; - } -} - -.yang-infobox { - display: block; - cursor: default; -} - -.yang-info-section-label, -.yang-info-subsection-label, -.yang-info-label { - color: black; - font-weight: 100; - text-transform: uppercase; -} - -.yang-info-section { - display: flex; - flex-direction: column; - flex-wrap: wrap; - width: 100%; - padding-left: 2em; -} - -.yang-info-subsection { - .yang-info { - padding-left: 2em; - } -} - -.yang-info, -.yang-info-label, -.yang-info-value { - border: none; - a { - font-weight: normal; - } -} - -.yang-info { - display: flex; - padding: 5px; -} -.yang-info:hover { - background-color: $colorLineHover; -} - -.yang-info:nth-of-type(even), .yang-info-subsection:nth-of-type(even) { - background: lighten($colorLineHover, 5%); -} - -.yang-info-value { - display: inline-block; -} - -.yang-info-section-label, -.yang-info-subsection-label, -.yang-info-label { - min-width: 10em; - overflow: hidden; - text-overflow: ellipsis; - display: inline-block; -} -.yang-revision-label { - font-style: italic; -} - -.yang-subsection-container { - margin-left: 2em; -} - -.pattern { - .selectedGroup { - background-color: $colorLineSelected; - } - .bracket { - } -} - diff --git a/frontend/yang/yang.component.ts b/frontend/yang/yang.component.ts deleted file mode 100644 index 94793cd..0000000 --- a/frontend/yang/yang.component.ts +++ /dev/null @@ -1,421 +0,0 @@ -import { Component, Input, Output, OnInit, EventEmitter, OnChanges, SimpleChanges, ViewEncapsulation } from '@angular/core'; -import { Router } from '@angular/router'; - -import { SchemasService } from './schemas.service'; -import { Schema } from '../inventory/schema'; - -import { NoPrefixPipe, PrefixOnlyPipe, PatternHighlightPipe } from '../common/pipes'; - -class iffItem { - constructor( - public type:string, - public content:string, - public key:string = null, - public path: string = null - ) {} -} - -@Component( { - selector: 'yang-module', - templateUrl: './yang.module.html', - styleUrls: ['./yang.component.scss'] -} ) - -export class YANGModule implements OnInit, OnChanges { - @Input() schema: Schema; - @Output() refresh = new EventEmitter(); - data: any; - - constructor(public schemasService: SchemasService) {} - - getKeys(object: Object) { - return Object.keys(object); - } - - section(name: string, set: any = null) { - let i = this.schema.sections.indexOf(name); - if (set == null) { - if (i < 0) { - return false; - } else { - return true; - } - } else if (set && i == -1) { - this.schema.sections.push(name); - } else if (!set && i != -1) { - this.schema.sections.splice(i, 1); - } - this.schemasService.storeSchemas(); - } - - link(key: string, type: string = 'tree', path: string = null) { - this.schemasService.show(key, type, path) - .subscribe((result: object) => { - if (result['success']) { - this.refresh.emit(); - } - }); - } - - onRefresh() { - this.refresh.emit(); - } - - ngOnChanges(changes: SimpleChanges) { - this.ngOnInit(); - } - - ngOnInit(): void { - this.data = this.schema.data[Object.keys(this.schema.data)[0]]; - } - newlineToBr = SchemasService.newlineToBr; -} - -@Component( { - selector: 'yang-identity', - templateUrl: './yang.identity.html', - styleUrls: ['./yang.component.scss'] -} ) - -export class YANGIdentity implements OnInit, OnChanges { - @Input() schema: Schema; - @Output() refresh = new EventEmitter(); - data: any; - name: string; - - constructor(public schemasService: SchemasService) {} - - base(id: string) { - let i = id.indexOf(':'); - let key = id.slice(0, i) + '.yang'; - let path = '/' + id.slice(i + 1); - this.schemasService.show(key, 'tree-identity', path) - .subscribe((result: object) => { - if (result['success']) { - this.refresh.emit(); - this.ngOnInit(); - } - }); - } - - onRefresh() { - this.refresh.emit(); - } - - ngOnChanges(changes: SimpleChanges) { - this.ngOnInit(); - } - - ngOnInit(): void { - this.name = Object.keys(this.schema.data)[0] - this.data = this.schema.data[this.name]; - } - - newlineToBr = SchemasService.newlineToBr; -} - -@Component( { - selector: 'yang-feature', - templateUrl: './yang.feature.html', - styleUrls: ['./yang.component.scss'] -} ) - -export class YANGFeature implements OnInit, OnChanges { - @Input() schema: Schema; - @Output() refresh = new EventEmitter(); - data: any; - name: string; - - constructor(public schemasService: SchemasService) {} - - onRefresh() { - this.refresh.emit(); - } - - ngOnChanges(changes: SimpleChanges) { - this.ngOnInit(); - } - - ngOnInit(): void { - this.name = Object.keys(this.schema.data)[0] - this.data = this.schema.data[this.name]; - } - newlineToBr = SchemasService.newlineToBr; -} - -@Component( { - selector: 'yang-typedef', - templateUrl: './yang.typedef.html', - styleUrls: ['./yang.component.scss'] -} ) -export class YANGTypedef implements OnInit, OnChanges { - @Input() schema: Schema; - @Input() data: any; - @Output() refresh = new EventEmitter(); - name: string; - - constructor() {} - - onRefresh() { - this.refresh.emit(); - } - - ngOnChanges(changes: SimpleChanges) { - this.ngOnInit(); - } - - ngOnInit(): void { - this.name = Object.keys(this.schema.data)[0] - } - - newlineToBr = SchemasService.newlineToBr; -} - -@Component( { - selector: 'yang-type', - templateUrl: './yang.type.html', - styleUrls: ['./yang.component.scss'] -} ) -export class YANGType { - @Input() schema: Schema; - @Input() data: any; - @Input() typedef: boolean = true; - @Output() refresh = new EventEmitter(); - - constructor(public schemasService: SchemasService) {} - - newlineToBr = SchemasService.newlineToBr; - - derivedFrom(id: string) { - let i = id.indexOf(':'); - let key = id.slice(0, i) + '.yang'; - let path = '/' + id.slice(i + 1); - this.schemasService.show(key, 'tree-typedef', path) - .subscribe((result: object) => { - if (result['success']) { - this.refresh.emit(); - } - }); - } - - onRefresh() { - this.refresh.emit(); - } - - base(id: string) { - let i = id.indexOf(':'); - let key = id.slice(0, i) + '.yang'; - let path = '/' + id.slice(i + 1); - this.schemasService.show(key, 'tree-identity', path) - .subscribe((result: object) => { - if (result['success']) { - this.refresh.emit(); - } - }); - } - - linkNode( key: string, path: string ) { - this.schemasService.show(key + '.yang', 'tree-node', path) - .subscribe(( result: object ) => { - if ( result['success'] ) { - this.refresh.emit(); - } - } ); - } -} - -@Component( { - selector: 'yang-restriction', - templateUrl: './yang.restriction.html', - styleUrls: ['./yang.component.scss'], - encapsulation: ViewEncapsulation.None, -} ) -export class YANGRestriction { - @Input() data: any; - @Input() name: string; -} - -@Component( { - selector: 'yang-node', - templateUrl: './yang.node.html', - styleUrls: ['./yang.component.scss'] -} ) -export class YANGNode implements OnInit, OnChanges { - @Input() schema: Schema; - @Input() data: any; - @Output() refresh = new EventEmitter(); - name: string; - - constructor(public schemasService: SchemasService) {} - - getKeys(object: Object) { - return Object.keys(object); - } - - link(key: string, type: string = 'tree', path: string = null) { - if (path) { - path = this.schema.path + '/' + path; - } - this.linkNode(key, type, path); - } - - linkNode(key: string, type: string = 'tree', path: string = null) { - this.schemasService.show(key, type, path) - .subscribe((result: object) => { - if (result['success']) { - this.refresh.emit(); - this.ngOnInit(); - } - }); - } - - derivedFrom(id: string) { - let i = id.indexOf(':'); - let key = id.slice(0, i) + '.yang'; - let path = '/' + id.slice(i + 1); - this.schemasService.show(key, 'tree-typedef', path) - .subscribe((result: object) => { - if (result['success']) { - this.refresh.emit(); - this.ngOnInit(); - } - }); - } - - onRefresh() { - this.refresh.emit(); - } - - ngOnChanges(changes: SimpleChanges) { - this.ngOnInit(); - } - - ngOnInit(): void { - this.name = Object.keys(this.schema.data)[0] - } - - newlineToBr = SchemasService.newlineToBr; -} - -@Component( { - selector: 'yang-iffeature', - template: ` - if-feature - - - {{item.content | noPrefix}} - {{item.content}} - - `, - styleUrls: ['./yang.component.scss'] -} ) -export class YANGIffeature { - @Input() schema: Schema; - @Input() data: string; - @Output() refresh = new EventEmitter(); - - constructor(public schemasService: SchemasService) {} - - link(key: string, type: string = 'tree', path: string = null) { - this.schemasService.show(key, type, path) - .subscribe((result: object) => { - if (result['success']) { - this.refresh.emit(); - } - }); - } - - iffeatureParse(expression: string) { - let index: number; - let length = expression.length; - let result = []; - - for ( index = 0; index < length; index++ ) { - if ( expression[index].match( "[ ()]" ) ) { - result.push(new iffItem('string', expression[index])); - continue; - } else if ( expression.slice( index, index + 3 ).match( "or " ) ) { - result.push(new iffItem('string', "or ")); - index += 2; - continue; - } else if ( expression.slice( index, index + 4 ).match( "and " ) ) { - result.push(new iffItem('string', "and ")); - index += 3; - continue; - } - - let argstop: number = index; - while ( expression[argstop] && expression[argstop].match( "[a-zA-Z0-9:@_\\-.]" ) ) { - argstop++; - } - let item = new iffItem('link', expression.slice( index, argstop )); - let c = item.content.indexOf(':'); - if (c != -1) { - item.key = item.content.slice(0, c) + '.yang'; - } else { - item.key = this.schema.key; - } - item.path = '/' + item.content.slice(c + 1); - - result.push(item); - index = argstop - 1; - } - return result; - } -} - -@Component( { - selector: 'netopeer-yang', - templateUrl: './yang.component.html', - styleUrls: ['./yang.component.scss'] -} ) - -export class YANGComponent { - title = 'YANG Explorer'; - activeSchema: Schema = null; - - constructor(private router: Router, public schemasService: SchemasService ) { - this.refreshActiveSchema(); - } - - refreshActiveSchema() { - this.activeSchema = this.schemasService.getSchema(this.schemasService.activeSchema); - } - - back() { - this.schemasService.history.pop(); /* the currently displayed element, forget it */ - let prev = this.schemasService.history.pop(); /* the previous one we want to display, it will be stored again by show() */ - this.schemasService.show(prev.key, prev.type, prev.path) - .subscribe((result: object) => { - if (result['success']) { - this.refreshActiveSchema(); - } - }); - } - - show(key:string, type:string) { - this.schemasService.show(key, type, null) - .subscribe((result: object) => { - if (result['success']) { - this.refreshActiveSchema(); - } - }); - } - - changeView(key: string) { - this.schemasService.changeActiveSchemaKey(key); - this.refreshActiveSchema(); - let type = this.activeSchema.type; - let path = this.activeSchema.path; - this.schemasService.history.push({key, type, path}); - localStorage.setItem('YEHistory', JSON.stringify(this.schemasService.history)); - } - - schemaData(schema: Schema) { - return schema.data[Object.keys(schema.data)[0]] - } - - addSchema() { - this.router.navigateByUrl( '/netopeer/inventory/schemas' ); - } -} diff --git a/frontend/yang/yang.feature.html b/frontend/yang/yang.feature.html deleted file mode 100644 index 2a3a538..0000000 --- a/frontend/yang/yang.feature.html +++ /dev/null @@ -1,23 +0,0 @@ -
-

Feature {{name}}

-
-
- -
-
- -
-
- status{{data.status.value}} -
-
- description -
-
- reference -
-
- -
- - diff --git a/frontend/yang/yang.identity.html b/frontend/yang/yang.identity.html deleted file mode 100644 index d5026b2..0000000 --- a/frontend/yang/yang.identity.html +++ /dev/null @@ -1,30 +0,0 @@ - -
-

Identity {{name}}

-
-
- -
-
- -
- -
- -
-
- status{{data.status.value}} -
-
- description -
-
- reference -
-
- -
- - diff --git a/frontend/yang/yang.module.html b/frontend/yang/yang.module.html deleted file mode 100644 index 4868866..0000000 --- a/frontend/yang/yang.module.html +++ /dev/null @@ -1,233 +0,0 @@ - -
- -
-
- yang-version - {{data['yang-version'].value}} -
-
- namespace - {{data.namespace}} -
-
- prefix - {{data.prefix}} -
-
- - - - -
- - -
- - {{key}} - -
-
- prefix - {{data['import'][key].prefix.value}} -
-
- description - -
-
- reference - -
-
-
-
-
-
- - -
- -
-
- {{key}} -
- description - -
-
- reference - -
-
-
- -
-
- - - -
- -
-
- organization - -
-
- contact - -
-
- description - -
-
- reference - -
-
- -
- - - - -
- -
-
- - Revision {{key}} -
- description - -
-
- reference - -
-
-
-
-
- - -
-
- -
-
- -
- -
- -
-
- -
-
- -
-
- -
-
- -
-
- -
- -
-
{{data['data'][key]['nodetype']}} {{key}}
-
-
- - -
- -
-
- -
- {{key}} - -
- when - {{data['augment'][key].when.condition}} -
-
-
- description - -
-
- reference - -
-
-
- -
- -
-
-
- status - {{data['augment'][key].status.value}} -
-
- description - -
-
- reference - -
-
data -
-
{{data['augment'][key]['data'][datakey]['nodetype']}}  - {{datakey}}
-
-
-
-
-
-
- -
-
- {{rpc}} -
-
-
- -
-
-
- {{key}} -
-
-
- - -
- diff --git a/frontend/yang/yang.node.html b/frontend/yang/yang.node.html deleted file mode 100644 index 664f149..0000000 --- a/frontend/yang/yang.node.html +++ /dev/null @@ -1,191 +0,0 @@ - -
-

{{data.nodetype | titlecase }} {{name}}

-
-
path - - /{{parent.id}} - -
- - -
- when{{data.when.condition}} -
-
-
- description -
-
- reference -
-
-
- - -
- -
-
-
- -
-
- - - {{data.type['derived-from'] | noPrefix}} - - - {{data.type['derived-from'] | noPrefix}} - -
- - -
- units{{data.units.name}} -
-
- -
- - - -
- -
-
- default{{default}} -
-
- -
- -
- key{{value}} -
-
- -
- unique - - {{item}}  - -
-
-
- -
-
- presence{{data.presence.value}} -
-
- config{{data.config.value}} -
-
- min-elements{{data['min-elements'].value}} -
-
- max-elements{{data['max-elements'].value}} -
-
- mandatory{{data.mandatory.value}} -
-
- ordered by{{data['ordered-by'].value}} -
-
- status{{data.status.value}} -
-
- description -
-
- reference -
-
- -
- -
- -
- -
- -
-
-
{{data['data'][key]['nodetype']}} {{key}}
-
-
- -
- -
- -
-
- -
-
- -
-
- - - -
- -
- -
- -
- -
- -
-
- {{data.input.data[key]['nodetype']}} {{key}} -
-
-
- -
-
- - - -
- -
- -
- -
- -
- -
-
- {{data.output.data[key]['nodetype']}} {{key}} -
-
-
-
- - - diff --git a/frontend/yang/yang.restriction.html b/frontend/yang/yang.restriction.html deleted file mode 100644 index 64386fd..0000000 --- a/frontend/yang/yang.restriction.html +++ /dev/null @@ -1,30 +0,0 @@ -
- {{name}} - -
-
- {{name}} - {{data.value}} -
-
-
- modifier - {{data.modifier.value}} -
-
- error-message - {{data['error-message'].value}} -
-
- error-app-tag - {{data['error-app-tag'].value}} -
-
- description -
{{data.description.text}}
-
-
- reference -
{{data.reference.text}}
-
-
\ No newline at end of file diff --git a/frontend/yang/yang.type.html b/frontend/yang/yang.type.html deleted file mode 100644 index c105e72..0000000 --- a/frontend/yang/yang.type.html +++ /dev/null @@ -1,112 +0,0 @@ -
-
-
- base - - {{data['derived-from'] | noPrefix}} ({{data['basetype']}}) - - - {{data['derived-from'] | noPrefix}} - -
-
- base{{data['basetype']}} -
-
- - -
-
- fraction-digits{{data['fraction-digits'].value}} -
- - - - - -
- path - - - /{{parent.id}} - - - {{data.path.value}} -
-
- require-instance{{data['require-instance'].value}} -
-
- - -
- -
- bit {{bit.position}}{{bit.name}} -
-
- -
- -
-
-
- status{{bit.status.value}} -
-
- description -
-
- reference -
-
-
-
- - -
- -
- enum {{enum.name}}value {{enum.value}} -
-
- -
- -
-
-
- status{{enum.status.value}} -
-
- description -
-
- reference -
-
-
-
- - -
- -
- - -
- -
- type -
-
- -
-
-
-
- - - diff --git a/frontend/yang/yang.typedef.html b/frontend/yang/yang.typedef.html deleted file mode 100644 index 81483f1..0000000 --- a/frontend/yang/yang.typedef.html +++ /dev/null @@ -1,28 +0,0 @@ - -
-

Typedef {{name}}

- - - -
-
- units{{data.units.name}} -
-
- default{{data.default.value}} -
-
- status{{data.status.value}} -
-
- description -
-
- reference -
-
- -
- - - diff --git a/schema.svg b/schema.svg deleted file mode 100644 index f864727..0000000 --- a/schema.svg +++ /dev/null @@ -1,874 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - Netopeer2GUIbackend - Python3/Flask - Netopeer2GUIfrontend - Angular2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - netopeer - - web browser - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NETCONFdevices - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vagrant/OpenSUSE/Vagrantfile b/vagrant/OpenSUSE/Vagrantfile deleted file mode 100644 index f94d02a..0000000 --- a/vagrant/OpenSUSE/Vagrantfile +++ /dev/null @@ -1,124 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -$tools = <

+A-f1!~mW{ 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