From c895877b7e7319a572b3784fb0159d9b5544fad8 Mon Sep 17 00:00:00 2001 From: Dillon-Brown Date: Tue, 30 Mar 2021 19:12:01 +0100 Subject: [PATCH] SuiteCRM 8 initial commit --- .github/CONTRIBUTING.md | 183 + .github/FUNDING.yml | 12 + .github/ISSUE_TEMPLATE.md | 37 + .github/PULL_REQUEST_TEMPLATE.md | 30 + .github/SECURITY.md | 21 + .github/config.yml | 94 + .gitignore | 141 + CODE_OF_CONDUCT.md | 35 + README.md | 60 + composer.json | 52 + composer.lock | 5756 ++++++++ config/.gitkeep | 0 core/app/engine/.editorconfig | 13 + core/app/engine/.gitignore | 56 + core/app/engine/README.md | 108 + core/app/engine/angular.json | 138 + core/app/engine/e2e/app.e2e-spec.ts | 14 + core/app/engine/e2e/app.po.ts | 11 + core/app/engine/e2e/tsconfig.e2e.json | 14 + core/app/engine/package-lock.json | 12059 ++++++++++++++++ core/app/engine/package.json | 62 + .../src/app/app-manager/app-manager.module.ts | 72 + .../app/app-manager/app-manager.service.ts | 127 + .../src/app/app-manager/app-manifest.ts | 16 + core/app/engine/src/app/app-routing.module.ts | 46 + core/app/engine/src/app/app.component.html | 5 + core/app/engine/src/app/app.component.scss | 0 core/app/engine/src/app/app.component.spec.ts | 19 + core/app/engine/src/app/app.component.ts | 17 + core/app/engine/src/app/app.module.ts | 38 + .../src/environments/environment.prod.ts | 3 + .../engine/src/environments/environment.ts | 8 + core/app/engine/src/favicon.ico | Bin 0 -> 5430 bytes core/app/engine/src/index.html | 20 + core/app/engine/src/main.ts | 13 + core/app/engine/src/polyfills.ts | 60 + core/app/engine/src/test.ts | 34 + core/app/engine/src/tsconfig.app.json | 11 + core/app/engine/src/tsconfig.spec.json | 20 + core/app/engine/src/typings.d.ts | 6 + core/app/engine/svgbuild.js | 101 + core/app/engine/tsconfig.json | 33 + core/app/engine/tslint.json | 75 + core/app/fields/address/address.php | 3 + .../templates/list/address.component.html | 1 + .../templates/list/address.component.spec.ts | 25 + .../templates/list/address.component.ts | 17 + .../assignedusername/assignedusername.php | 3 + .../list/assignedusername.component.html | 1 + .../list/assignedusername.component.spec.ts | 25 + .../list/assignedusername.component.ts | 17 + core/app/fields/boolean/boolean.php | 3 + .../templates/list/boolean.component.html | 1 + .../templates/list/boolean.component.spec.ts | 25 + .../templates/list/boolean.component.ts | 18 + .../templates/record/boolean.component.html | 3 + .../record/boolean.component.spec.ts | 25 + .../templates/record/boolean.component.ts | 16 + core/app/fields/button/button.php | 3 + .../templates/list/button.component.html | 1 + .../templates/list/button.component.spec.ts | 25 + .../button/templates/list/button.component.ts | 18 + .../templates/record/button.component.html | 1 + .../templates/record/button.component.spec.ts | 21 + .../templates/record/button.component.ts | 16 + core/app/fields/collection/collection.php | 3 + .../templates/list/collection.component.html | 1 + .../list/collection.component.spec.ts | 25 + .../templates/list/collection.component.ts | 17 + core/app/fields/cronschedule/cronschedule.php | 3 + .../list/cronschedule.component.html | 1 + .../list/cronschedule.component.spec.ts | 25 + .../templates/list/cronschedule.component.ts | 17 + core/app/fields/currency/currency.php | 3 + .../templates/list/currency.component.html | 1 + .../templates/list/currency.component.spec.ts | 25 + .../templates/list/currency.component.ts | 18 + .../templates/record/currency.component.html | 3 + .../record/currency.component.spec.ts | 25 + .../templates/record/currency.component.ts | 16 + core/app/fields/date/date.php | 3 + .../date/templates/list/date.component.html | 1 + .../templates/list/date.component.spec.ts | 21 + .../date/templates/list/date.component.ts | 17 + core/app/fields/datetime/datetime.php | 3 + .../templates/list/datetime.component.html | 1 + .../templates/list/datetime.component.spec.ts | 25 + .../templates/list/datetime.component.ts | 17 + .../fields/datetimecombo/datetimecombo.php | 3 + .../list/datetimecombo.component.html | 1 + .../list/datetimecombo.component.spec.ts | 25 + .../templates/list/datetimecombo.component.ts | 17 + core/app/fields/default/default.php | 3 + .../templates/list/default.component.html | 1 + .../templates/list/default.component.spec.ts | 25 + .../templates/list/default.component.ts | 17 + core/app/fields/download/download.php | 3 + .../templates/list/download.component.html | 1 + .../templates/list/download.component.spec.ts | 25 + .../templates/list/download.component.ts | 17 + .../fields/dynamicnumber/dynamicnumber.php | 3 + .../list/dynamicnumber.component.html | 1 + .../list/dynamicnumber.component.spec.ts | 25 + .../templates/list/dynamicnumber.component.ts | 17 + core/app/fields/emailbody/emailbody.php | 3 + .../templates/list/emailbody.component.html | 1 + .../list/emailbody.component.spec.ts | 25 + .../templates/list/emailbody.component.ts | 17 + core/app/fields/enum/enum.php | 3 + .../enum/templates/list/enum.component.html | 1 + .../templates/list/enum.component.spec.ts | 25 + .../enum/templates/list/enum.component.ts | 17 + .../enum/templates/record/enum.component.html | 9 + .../templates/record/enum.component.spec.ts | 25 + .../enum/templates/record/enum.component.ts | 16 + core/app/fields/field.component.spec.ts | 31 + core/app/fields/field.component.ts | 66 + core/app/fields/field.module.ts | 23 + core/app/fields/file/file.php | 3 + .../file/templates/list/file.component.html | 1 + .../templates/list/file.component.spec.ts | 25 + .../file/templates/list/file.component.ts | 17 + core/app/fields/float/float.php | 3 + .../float/templates/list/float.component.html | 1 + .../templates/list/float.component.spec.ts | 25 + .../float/templates/list/float.component.ts | 17 + .../templates/record/float.component.html | 3 + .../templates/record/float.component.spec.ts | 21 + .../float/templates/record/float.component.ts | 16 + core/app/fields/fullname/fullname.php | 3 + .../templates/list/fullname.component.html | 1 + .../templates/list/fullname.component.spec.ts | 25 + .../templates/list/fullname.component.ts | 17 + core/app/fields/int/int.php | 3 + .../int/templates/list/int.component.html | 1 + .../int/templates/list/int.component.spec.ts | 25 + .../int/templates/list/int.component.ts | 17 + .../int/templates/record/int.component.html | 3 + .../templates/record/int.component.spec.ts | 25 + .../int/templates/record/int.component.ts | 16 + core/app/fields/multienum/multienum.php | 3 + .../templates/list/multienum.component.html | 1 + .../list/multienum.component.spec.ts | 25 + .../templates/list/multienum.component.ts | 17 + .../templates/record/multienum.component.html | 9 + .../record/multienum.component.spec.ts | 25 + .../templates/record/multienum.component.ts | 16 + core/app/fields/password/password.php | 3 + .../templates/list/password.component.html | 1 + .../templates/list/password.component.spec.ts | 25 + .../templates/list/password.component.ts | 17 + .../templates/record/password.component.html | 9 + .../record/password.component.spec.ts | 21 + .../templates/record/password.component.ts | 16 + core/app/fields/relate/relate.php | 3 + .../templates/list/relate.component.html | 1 + .../templates/list/relate.component.spec.ts | 21 + .../relate/templates/list/relate.component.ts | 29 + .../templates/record/relate.component.html | 3 + .../templates/record/relate.component.spec.ts | 25 + .../templates/record/relate.component.ts | 16 + core/app/fields/submit/submit.php | 3 + .../templates/list/submit.component.html | 1 + .../templates/list/submit.component.spec.ts | 25 + .../submit/templates/list/submit.component.ts | 18 + .../templates/record/submit.component.html | 1 + .../templates/record/submit.component.spec.ts | 25 + .../templates/record/submit.component.ts | 16 + .../templates/list/varchar.component.html | 1 + .../templates/list/varchar.component.spec.ts | 25 + .../templates/list/varchar.component.ts | 35 + .../templates/record/varchar.component.html | 10 + .../record/varchar.component.spec.ts | 21 + .../templates/record/varchar.component.ts | 16 + core/app/fields/varchar/varchar.php | 3 + core/app/themes/default/default.php | 3 + .../suite8/css/abstracts/_functions.scss | 1 + .../suite8/css/abstracts/_typography.scss | 8 + .../suite8/css/abstracts/_variables.scss | 37 + core/app/themes/suite8/css/base/_reset.scss | 0 .../themes/suite8/css/components/_button.scss | 258 + .../suite8/css/components/_checkbox.scss | 262 + .../suite8/css/components/_dropdown.scss | 302 + .../themes/suite8/css/components/_input.scss | 193 + .../themes/suite8/css/components/_svg.scss | 403 + .../themes/suite8/css/layout/_actionbar.scss | 30 + .../app/themes/suite8/css/layout/_common.scss | 59 + .../app/themes/suite8/css/layout/_footer.scss | 89 + core/app/themes/suite8/css/layout/_forms.scss | 32 + .../themes/suite8/css/layout/_listview.scss | 371 + core/app/themes/suite8/css/layout/_modal.scss | 132 + .../app/themes/suite8/css/layout/_navbar.scss | 206 + core/app/themes/suite8/css/style.scss | 19 + core/app/themes/suite8/images/3d_chart.jpeg | Bin 0 -> 8990 bytes core/app/themes/suite8/images/alert_icon.svg | 18 + core/app/themes/suite8/images/alert_red.svg | 18 + core/app/themes/suite8/images/arrow_down.svg | 16 + .../suite8/images/arrow_down_filled.svg | 16 + .../themes/suite8/images/arrow_down_red.svg | 16 + .../suite8/images/arrow_left_filled.svg | 16 + core/app/themes/suite8/images/arrow_right.svg | 17 + .../suite8/images/arrow_right_filled.svg | 16 + .../themes/suite8/images/arrow_separator.svg | 12 + .../themes/suite8/images/arrow_up_filled.svg | 16 + .../themes/suite8/images/arrow_up_grey.svg | 16 + core/app/themes/suite8/images/bars_blue.svg | 20 + core/app/themes/suite8/images/bars_white.svg | 20 + core/app/themes/suite8/images/bug_blue.svg | 45 + core/app/themes/suite8/images/bug_white.svg | 45 + core/app/themes/suite8/images/bulb_blue.svg | 61 + core/app/themes/suite8/images/bulb_white.svg | 60 + core/app/themes/suite8/images/calendar.svg | 38 + .../themes/suite8/images/calendar_dark.svg | 31 + .../themes/suite8/images/calendar_grey.svg | 40 + .../themes/suite8/images/calendar_hover.svg | 20 + .../themes/suite8/images/calendar_icon.svg | 43 + .../themes/suite8/images/calendar_purple.svg | 30 + .../suite8/images/calendar_purple_hover.svg | 20 + .../themes/suite8/images/calendar_white.svg | 36 + core/app/themes/suite8/images/calls_icon.svg | 23 + core/app/themes/suite8/images/check_1_a.svg | 15 + core/app/themes/suite8/images/check_1_b.svg | 14 + core/app/themes/suite8/images/check_2_a.svg | 15 + core/app/themes/suite8/images/check_2_b.svg | 14 + core/app/themes/suite8/images/check_2_c.svg | 15 + core/app/themes/suite8/images/check_3_a.svg | 15 + core/app/themes/suite8/images/check_3_b.svg | 14 + core/app/themes/suite8/images/check_3_c.svg | 15 + core/app/themes/suite8/images/check_3_d.svg | 14 + core/app/themes/suite8/images/clock.svg | 39 + core/app/themes/suite8/images/clock_large.svg | 39 + core/app/themes/suite8/images/cross.svg | 17 + core/app/themes/suite8/images/cross_grey.svg | 18 + core/app/themes/suite8/images/cross_hover.svg | 15 + .../app/themes/suite8/images/cross_purple.svg | 17 + .../suite8/images/cross_purple_hover.svg | 15 + core/app/themes/suite8/images/cross_thin.svg | 20 + core/app/themes/suite8/images/cross_white.svg | 17 + core/app/themes/suite8/images/cursor_grey.svg | 17 + core/app/themes/suite8/images/donut_chart.png | Bin 0 -> 9952 bytes core/app/themes/suite8/images/dots.svg | 21 + core/app/themes/suite8/images/dots_hover.svg | 15 + .../themes/suite8/images/double_arrows.svg | 20 + core/app/themes/suite8/images/down_arrow.svg | 16 + .../themes/suite8/images/down_arrow_white.svg | 16 + core/app/themes/suite8/images/download.svg | 17 + .../themes/suite8/images/drop_menu_arrow.svg | 15 + core/app/themes/suite8/images/edit.svg | 19 + .../app/themes/suite8/images/email_purple.svg | 18 + .../suite8/images/email_purple_hover.svg | 14 + .../app/themes/suite8/images/expand_arrow.svg | 17 + core/app/themes/suite8/images/eye.svg | 22 + core/app/themes/suite8/images/favicon.ico | Bin 0 -> 5391 bytes core/app/themes/suite8/images/filter_icon.svg | 17 + core/app/themes/suite8/images/folder_blue.svg | 18 + .../app/themes/suite8/images/folder_white.svg | 18 + core/app/themes/suite8/images/graph_white.svg | 21 + core/app/themes/suite8/images/hamburger.svg | 17 + .../app/themes/suite8/images/history_icon.svg | 29 + core/app/themes/suite8/images/home_icon.svg | 17 + .../themes/suite8/images/home_icon_red.svg | 17 + core/app/themes/suite8/images/icon_first.svg | 15 + core/app/themes/suite8/images/icon_last.svg | 15 + .../themes/suite8/images/icon_modal_close.svg | 19 + core/app/themes/suite8/images/icon_next.svg | 15 + core/app/themes/suite8/images/icon_prev.svg | 15 + core/app/themes/suite8/images/info.svg | 21 + .../app/themes/suite8/images/info_circled.svg | 24 + core/app/themes/suite8/images/info_dark.svg | 22 + core/app/themes/suite8/images/info_hover.svg | 17 + .../themes/suite8/images/info_hover_dark.svg | 19 + core/app/themes/suite8/images/kanban.svg | 23 + core/app/themes/suite8/images/letter.svg | 14 + .../app/themes/suite8/images/letter_hover.svg | 14 + .../themes/suite8/images/list_icon_purple.svg | 21 + .../suite8/images/list_icon_purple_hover.svg | 18 + .../themes/suite8/images/login_password.svg | 16 + core/app/themes/suite8/images/login_user.svg | 27 + core/app/themes/suite8/images/mega_blue.svg | 19 + core/app/themes/suite8/images/mega_white.svg | 19 + core/app/themes/suite8/images/minimise.svg | 16 + .../themes/suite8/images/minimise_circled.svg | 22 + .../suite8/images/mobile_collapse_icon.svg | 15 + .../images/mobile_expand_calendar copy.svg | 20 + .../suite8/images/mobile_expand_calendar.svg | 20 + .../images/mobile_expand_check_icon.svg | 18 + .../suite8/images/mobile_expand_icon.svg | 15 + .../images/mobile_expand_letter copy.svg | 14 + .../suite8/images/mobile_expand_letter.svg | 14 + .../suite8/images/mobile_expand_list copy.svg | 18 + .../suite8/images/mobile_expand_list.svg | 18 + .../images/mobile_expand_phone copy.svg | 14 + .../suite8/images/mobile_expand_phone.svg | 14 + .../app/themes/suite8/images/padlock_blue.svg | 37 + .../themes/suite8/images/padlock_white.svg | 37 + core/app/themes/suite8/images/pencil_grey.svg | 24 + .../suite8/images/pencil_grey_hover.svg | 21 + core/app/themes/suite8/images/person_blue.svg | 16 + .../app/themes/suite8/images/person_white.svg | 16 + core/app/themes/suite8/images/phone.svg | 18 + core/app/themes/suite8/images/phone_dark.svg | 18 + core/app/themes/suite8/images/phone_hover.svg | 14 + .../app/themes/suite8/images/phone_purple.svg | 18 + .../suite8/images/phone_purple_hover.svg | 14 + core/app/themes/suite8/images/pie_blue.svg | 22 + core/app/themes/suite8/images/pie_icon.svg | 17 + core/app/themes/suite8/images/pie_white.svg | 22 + .../themes/suite8/images/pipeline_chart.png | Bin 0 -> 6731 bytes core/app/themes/suite8/images/plus.svg | 17 + core/app/themes/suite8/images/plus_dark.svg | 17 + core/app/themes/suite8/images/plus_grey.svg | 18 + core/app/themes/suite8/images/plus_hover.svg | 14 + core/app/themes/suite8/images/plus_thin.svg | 17 + core/app/themes/suite8/images/plus_white.svg | 17 + core/app/themes/suite8/images/pound_blue.svg | 22 + core/app/themes/suite8/images/pound_white.svg | 22 + .../themes/suite8/images/poundbox_blue.svg | 26 + .../themes/suite8/images/poundbox_white.svg | 26 + core/app/themes/suite8/images/purplecross.svg | 16 + .../suite8/images/purplecross_hover.svg | 16 + core/app/themes/suite8/images/purplepen.svg | 36 + .../themes/suite8/images/purplepen_hover.svg | 36 + core/app/themes/suite8/images/refresh.svg | 25 + .../themes/suite8/images/refresh_hover.svg | 18 + core/app/themes/suite8/images/search.svg | 22 + core/app/themes/suite8/images/settings.svg | 20 + .../themes/suite8/images/settings_hover.svg | 14 + core/app/themes/suite8/images/shield_blue.svg | 35 + .../app/themes/suite8/images/shield_white.svg | 35 + .../themes/suite8/images/signature_blue.svg | 29 + .../themes/suite8/images/signature_white.svg | 29 + core/app/themes/suite8/images/sort.svg | 16 + core/app/themes/suite8/images/sort_ascend.svg | 16 + .../app/themes/suite8/images/sort_descend.svg | 16 + core/app/themes/suite8/images/spark_blue.svg | 18 + core/app/themes/suite8/images/spark_white.svg | 18 + core/app/themes/suite8/images/star.svg | 18 + core/app/themes/suite8/images/star_icon.svg | 18 + .../themes/suite8/images/suitecrm_logo.png | Bin 0 -> 3335 bytes core/app/themes/suite8/images/tick.svg | 17 + core/app/themes/suite8/images/user.svg | 22 + core/app/themes/suite8/images/vert_line.svg | 16 + core/app/themes/suite8/images/view.svg | 22 + .../app/themes/suite8/images/white_pencil.svg | 59 + core/app/themes/suite8/suite8.php | 3 + .../components/account/account.component.html | 1 + .../account/account.component.spec.ts | 57 + .../components/account/account.component.ts | 16 + .../ui/components/account/account.module.ts | 18 + .../components/action-bar/action-bar-model.ts | 7 + .../action-bar/action-bar.component.html | 105 + .../action-bar/action-bar.component.spec.ts | 31 + .../action-bar/action-bar.component.ts | 23 + .../action-bar/action-bar.module.ts | 19 + .../action-bar/favorite-record-model.ts | 7 + .../ui/components/chart/chart.component.html | 1 + .../components/chart/chart.component.spec.ts | 33 + .../ui/components/chart/chart.component.ts | 12 + .../classic-view/classic-view.component.html | 3 + .../classic-view.component.spec.ts | 33 + .../classic-view/classic-view.component.ts | 16 + .../classic-view/classic-view.module.ts | 22 + .../classic-view/classic-view.routes.ts | 9 + .../components/footer/footer.component.html | 101 + .../footer/footer.component.spec.ts | 31 + .../ui/components/footer/footer.component.ts | 59 + .../app/ui/components/footer/footer.module.ts | 19 + .../ui/components/home/home.component.html | 3 + .../ui/components/home/home.component.spec.ts | 33 + core/app/ui/components/home/home.component.ts | 16 + core/app/ui/components/home/home.module.ts | 26 + core/app/ui/components/home/home.routes.ts | 19 + .../list-view/list-view-column-model.ts | 21 + .../list-view/list-view-data-model.ts | 27 + .../list-view/list-view.component.html | 521 + .../list-view/list-view.component.spec.ts | 63 + .../list-view/list-view.component.ts | 131 + .../components/list-view/list-view.module.ts | 22 + .../ui/components/login/login.component.html | 30 + .../components/login/login.component.spec.ts | 33 + .../ui/components/login/login.component.ts | 50 + core/app/ui/components/login/login.module.ts | 29 + core/app/ui/components/login/login.routes.ts | 10 + .../ui/components/logo/logo.component.html | 1 + .../ui/components/logo/logo.component.spec.ts | 31 + core/app/ui/components/logo/logo.component.ts | 10 + .../components/logout/logout.component.html | 2 + .../logout/logout.component.spec.ts | 30 + .../ui/components/logout/logout.component.ts | 40 + .../app/ui/components/message/message-type.ts | 6 + .../components/message/message-types.enum.ts | 11 + .../components/message/message.component.html | 8 + .../message/message.component.spec.ts | 25 + .../components/message/message.component.ts | 31 + .../modal-view/modal-view.component.html | 165 + .../modal-view/modal-view.component.spec.ts | 25 + .../modal-view/modal-view.component.ts | 54 + .../modal-view/modal-view.module.ts | 19 + .../ui/components/navbar/action-link-model.ts | 8 + .../ui/components/navbar/all-menu-model.ts | 6 + .../components/navbar/current-user-model.ts | 4 + core/app/ui/components/navbar/link-model.ts | 9 + core/app/ui/components/navbar/link-target.ts | 7 + .../components/navbar/navbar.component.html | 191 + .../navbar/navbar.component.spec.ts | 31 + .../ui/components/navbar/navbar.component.ts | 21 + .../app/ui/components/navbar/navbar.module.ts | 26 + .../components/navbar/recent-record-model.ts | 10 + .../ui/components/svg-icon/icon-ref-model.ts | 4 + .../svg-icon/svg-filename-map-model.ts | 4 + .../svg-icon/svg-icon.component.html | 3370 +++++ .../svg-icon/svg-icon.component.spec.ts | 25 + .../components/svg-icon/svg-icon.component.ts | 17 + .../user-action-menu.component.html | 4 + .../user-action-menu.component.spec.ts | 30 + .../user-action-menu.component.ts | 19 + core/app/ui/pipes/keys.pipe.spec.ts | 8 + core/app/ui/pipes/keys.pipe.ts | 16 + core/app/ui/pipes/safe.pipe.ts | 12 + .../api/api-access-token-response-empty.ts | 9 + .../api/api-access-token-response-model.ts | 7 + .../services/api/api-response-error-model.ts | 3 + .../app/ui/services/api/api-response-model.ts | 8 + .../ui/services/api/api-subscription-model.ts | 7 + core/app/ui/services/api/api.service.spec.ts | 18 + core/app/ui/services/api/api.service.ts | 335 + .../ui/services/auth/auth-guard.service.ts | 17 + core/app/ui/services/auth/auth.service.ts | 99 + .../ui/services/auth/login-response-model.ts | 7 + .../ui/services/auth/logout-response-model.ts | 3 + core/app/ui/services/auth/user-model.ts | 8 + .../services/message/message.service.spec.ts | 12 + .../ui/services/message/message.service.ts | 112 + core/app/views/create/create.php | 3 + core/app/views/default/default.php | 3 + core/app/views/kanban/kanban.php | 3 + core/app/views/list/list.php | 3 + core/app/views/record/record.php | 3 + core/base/Cli/CommandMapper.php | 106 + core/base/Cli/SuiteCommand.php | 19 + core/base/Config/Loader/YamlLoader.php | 42 + core/base/Config/Manager.php | 65 + core/base/Config/ParameterCollection.php | 13 + core/base/Config/modules.config.yml | 4 + core/base/Config/services.config.yml | 2 + core/base/Helper/Data/Collection.php | 127 + core/base/Helper/Data/CollectionInterface.php | 50 + core/base/Helper/File/File.php | 166 + core/base/Helper/File/FileMapperInterface.php | 18 + core/base/Http/Request.php | 42 + core/base/Http/Response.php | 14 + core/base/Instance.php | 109 + core/base/Module/Controller.php | 294 + core/base/Module/Manager.php | 134 + core/base/Module/ModuleCollection.php | 22 + core/base/Module/ModuleInterface.php | 20 + core/base/Module/ModuleMapper.php | 126 + core/base/Module/Service/Manager.php | 34 + .../base/Module/Service/ServiceCollection.php | 22 + .../Service/ServiceFactoryInterface.php | 25 + core/base/Module/Service/ServiceMapper.php | 107 + .../Module/Storage/DataCollectionManager.php | 58 + core/base/Module/Storage/DoctrineCommands.php | 37 + core/base/Module/Storage/Manager.php | 25 + core/base/Module/Storage/TablePrefix.php | 49 + core/base/Module/View/Handler.php | 39 + core/base/Module/View/template/debug.html.php | 3 + .../Module/View/template/default.json.php | 4 + core/base/Route/DefaultRouter.php | 91 + core/base/Route/ModRewriteRouter.php | 99 + core/base/Route/RouterInterface.php | 15 + core/base/RunnableInterface.php | 15 + core/legacy/Authentication.php | 50 + core/legacy/AuthenticationService.php | 38 + core/legacy/LegacyHandler.php | 38 + .../modules/Administration/Administration.php | 28 + .../Cli/App/AppRebuildCommand.php | 351 + .../Cli/App/AppThemeRebuildCommand.php | 82 + .../Cli/Composer/ComposerInstallCommand.php | 71 + .../Cli/Composer/ComposerUpdateCommand.php | 53 + .../Cli/Modules/ListModulesCommand.php | 63 + .../Cli/Repair/QuickRepairRebuildCommand.php | 33 + .../Cli/Users/AddNewUserCommand.php | 36 + .../Users/Config/orm/OAuthAccessToken.orm.yml | 37 + .../Config/orm/OAuthAuthorizationCode.orm.yml | 42 + .../Users/Config/orm/OAuthClient.orm.yml | 22 + .../Users/Config/orm/OAuthPublicKey.orm.yml | 22 + .../Config/orm/OAuthRefreshToken.orm.yml | 37 + .../Users/Config/orm/OAuthUser.orm.yml | 20 + .../Users/Config/orm/OAuthUserClaims.orm.yml | 15 + core/modules/Users/Controller/Oauth.php | 213 + .../modules/Users/Entity/EncryptableField.php | 31 + .../modules/Users/Entity/OAuthAccessToken.php | 248 + .../Users/Entity/OAuthAuthorizationCode.php | 303 + core/modules/Users/Entity/OAuthClient.php | 195 + core/modules/Users/Entity/OAuthPublicKey.php | 127 + .../Users/Entity/OAuthRefreshToken.php | 245 + core/modules/Users/Entity/OAuthUser.php | 108 + core/modules/Users/Entity/OAuthUserClaims.php | 99 + core/modules/Users/Entity/UserProfile.php | 13 + core/modules/Users/Helper/Authentication.php | 11 + .../Users/Service/AuthenticationService.php | 34 + .../Users/Storage/OAuthAccessTokenStorage.php | 91 + .../Storage/OAuthAuthorizationCodeStorage.php | 82 + .../Users/Storage/OAuthClientStorage.php | 102 + .../Users/Storage/OAuthPublicKeyStorage.php | 33 + .../Storage/OAuthRefreshTokenStorage.php | 104 + .../Users/Storage/OAuthUserClaimsStorage.php | 80 + .../Users/Storage/OAuthUserStorage.php | 68 + core/modules/Users/Users.php | 24 + core/modules/Users/View/index.json.php | 3 + core/tests/phpunit.sh | 3 + core/tests/phpunit.xml.dist | 39 + .../testdata/CommandMapperTest/config.yml | 20 + .../noenabledmodules.config.yml | 13 + .../testdata/ConfigTest/LoadEmpty/config.yml | 0 .../ConfigTest/LoadMultiple/config_1.yml | 9 + .../ConfigTest/LoadMultiple/config_2.yml | 9 + .../ConfigTest/LoadMultiple/config_3.yml | 9 + .../testdata/ConfigTest/LoadSingle/config.yml | 9 + core/tests/testdata/InstanceTest/config.yml | 20 + core/tests/testdata/ModuleMapper/config.yml | 20 + .../ModuleMapper/noenabledmodules.config.yml | 13 + .../RouterTest/DefaultRouter/config.yml | 20 + .../DefaultRouter/defaultaction.config.yml | 20 + .../defaultcontroller.config.yml | 20 + .../DefaultRouter/defaultmodule.config.yml | 20 + .../RouterTest/ModRewriteRouter/config.yml | 17 + .../ModRewriteRouter/defaultaction.config.yml | 20 + .../defaultcontroller.config.yml | 21 + .../ModRewriteRouter/defaultmodule.config.yml | 20 + .../phpunit/base/Cli/CommandMapperTest.php | 78 + .../unit/phpunit/base/Cli/SuiteCommand.php | 13 + .../unit/phpunit/base/Config/ConfigTest.php | 92 + .../base/Helper/DataCollectionTest.php | 146 + .../phpunit/base/Helper/FileHelperTest.php | 262 + .../unit/phpunit/base/LoadInstanceTest.php | 120 + .../phpunit/base/Module/ModuleMapperTest.php | 76 + .../phpunit/base/Router/DefaultRouterTest.php | 260 + .../base/Router/ModRewriteRouterTest.php | 278 + .../legacy/AuthenticationServiceTest.php | 40 + .../phpunit/legacy/AuthenticationTest.php | 0 extentions/.gitkeep | 0 index.php | 79 + logs/.gitkeep | 0 public/.gitkeep | 0 robots.txt | 5 + 547 files changed, 40449 insertions(+) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/SECURITY.md create mode 100644 .github/config.yml create mode 100644 .gitignore create mode 100644 CODE_OF_CONDUCT.md create mode 100755 README.md create mode 100755 composer.json create mode 100644 composer.lock create mode 100644 config/.gitkeep create mode 100644 core/app/engine/.editorconfig create mode 100644 core/app/engine/.gitignore create mode 100644 core/app/engine/README.md create mode 100644 core/app/engine/angular.json create mode 100644 core/app/engine/e2e/app.e2e-spec.ts create mode 100644 core/app/engine/e2e/app.po.ts create mode 100644 core/app/engine/e2e/tsconfig.e2e.json create mode 100644 core/app/engine/package-lock.json create mode 100644 core/app/engine/package.json create mode 100644 core/app/engine/src/app/app-manager/app-manager.module.ts create mode 100644 core/app/engine/src/app/app-manager/app-manager.service.ts create mode 100644 core/app/engine/src/app/app-manager/app-manifest.ts create mode 100644 core/app/engine/src/app/app-routing.module.ts create mode 100644 core/app/engine/src/app/app.component.html create mode 100644 core/app/engine/src/app/app.component.scss create mode 100644 core/app/engine/src/app/app.component.spec.ts create mode 100644 core/app/engine/src/app/app.component.ts create mode 100644 core/app/engine/src/app/app.module.ts create mode 100644 core/app/engine/src/environments/environment.prod.ts create mode 100644 core/app/engine/src/environments/environment.ts create mode 100644 core/app/engine/src/favicon.ico create mode 100644 core/app/engine/src/index.html create mode 100644 core/app/engine/src/main.ts create mode 100644 core/app/engine/src/polyfills.ts create mode 100644 core/app/engine/src/test.ts create mode 100644 core/app/engine/src/tsconfig.app.json create mode 100644 core/app/engine/src/tsconfig.spec.json create mode 100644 core/app/engine/src/typings.d.ts create mode 100644 core/app/engine/svgbuild.js create mode 100644 core/app/engine/tsconfig.json create mode 100644 core/app/engine/tslint.json create mode 100644 core/app/fields/address/address.php create mode 100644 core/app/fields/address/templates/list/address.component.html create mode 100644 core/app/fields/address/templates/list/address.component.spec.ts create mode 100644 core/app/fields/address/templates/list/address.component.ts create mode 100644 core/app/fields/assignedusername/assignedusername.php create mode 100644 core/app/fields/assignedusername/templates/list/assignedusername.component.html create mode 100644 core/app/fields/assignedusername/templates/list/assignedusername.component.spec.ts create mode 100644 core/app/fields/assignedusername/templates/list/assignedusername.component.ts create mode 100644 core/app/fields/boolean/boolean.php create mode 100644 core/app/fields/boolean/templates/list/boolean.component.html create mode 100644 core/app/fields/boolean/templates/list/boolean.component.spec.ts create mode 100644 core/app/fields/boolean/templates/list/boolean.component.ts create mode 100644 core/app/fields/boolean/templates/record/boolean.component.html create mode 100644 core/app/fields/boolean/templates/record/boolean.component.spec.ts create mode 100644 core/app/fields/boolean/templates/record/boolean.component.ts create mode 100644 core/app/fields/button/button.php create mode 100644 core/app/fields/button/templates/list/button.component.html create mode 100644 core/app/fields/button/templates/list/button.component.spec.ts create mode 100644 core/app/fields/button/templates/list/button.component.ts create mode 100644 core/app/fields/button/templates/record/button.component.html create mode 100644 core/app/fields/button/templates/record/button.component.spec.ts create mode 100644 core/app/fields/button/templates/record/button.component.ts create mode 100644 core/app/fields/collection/collection.php create mode 100644 core/app/fields/collection/templates/list/collection.component.html create mode 100644 core/app/fields/collection/templates/list/collection.component.spec.ts create mode 100644 core/app/fields/collection/templates/list/collection.component.ts create mode 100644 core/app/fields/cronschedule/cronschedule.php create mode 100644 core/app/fields/cronschedule/templates/list/cronschedule.component.html create mode 100644 core/app/fields/cronschedule/templates/list/cronschedule.component.spec.ts create mode 100644 core/app/fields/cronschedule/templates/list/cronschedule.component.ts create mode 100644 core/app/fields/currency/currency.php create mode 100644 core/app/fields/currency/templates/list/currency.component.html create mode 100644 core/app/fields/currency/templates/list/currency.component.spec.ts create mode 100644 core/app/fields/currency/templates/list/currency.component.ts create mode 100644 core/app/fields/currency/templates/record/currency.component.html create mode 100644 core/app/fields/currency/templates/record/currency.component.spec.ts create mode 100644 core/app/fields/currency/templates/record/currency.component.ts create mode 100644 core/app/fields/date/date.php create mode 100644 core/app/fields/date/templates/list/date.component.html create mode 100644 core/app/fields/date/templates/list/date.component.spec.ts create mode 100644 core/app/fields/date/templates/list/date.component.ts create mode 100644 core/app/fields/datetime/datetime.php create mode 100644 core/app/fields/datetime/templates/list/datetime.component.html create mode 100644 core/app/fields/datetime/templates/list/datetime.component.spec.ts create mode 100644 core/app/fields/datetime/templates/list/datetime.component.ts create mode 100644 core/app/fields/datetimecombo/datetimecombo.php create mode 100644 core/app/fields/datetimecombo/templates/list/datetimecombo.component.html create mode 100644 core/app/fields/datetimecombo/templates/list/datetimecombo.component.spec.ts create mode 100644 core/app/fields/datetimecombo/templates/list/datetimecombo.component.ts create mode 100644 core/app/fields/default/default.php create mode 100644 core/app/fields/default/templates/list/default.component.html create mode 100644 core/app/fields/default/templates/list/default.component.spec.ts create mode 100644 core/app/fields/default/templates/list/default.component.ts create mode 100644 core/app/fields/download/download.php create mode 100644 core/app/fields/download/templates/list/download.component.html create mode 100644 core/app/fields/download/templates/list/download.component.spec.ts create mode 100644 core/app/fields/download/templates/list/download.component.ts create mode 100644 core/app/fields/dynamicnumber/dynamicnumber.php create mode 100644 core/app/fields/dynamicnumber/templates/list/dynamicnumber.component.html create mode 100644 core/app/fields/dynamicnumber/templates/list/dynamicnumber.component.spec.ts create mode 100644 core/app/fields/dynamicnumber/templates/list/dynamicnumber.component.ts create mode 100644 core/app/fields/emailbody/emailbody.php create mode 100644 core/app/fields/emailbody/templates/list/emailbody.component.html create mode 100644 core/app/fields/emailbody/templates/list/emailbody.component.spec.ts create mode 100644 core/app/fields/emailbody/templates/list/emailbody.component.ts create mode 100644 core/app/fields/enum/enum.php create mode 100644 core/app/fields/enum/templates/list/enum.component.html create mode 100644 core/app/fields/enum/templates/list/enum.component.spec.ts create mode 100644 core/app/fields/enum/templates/list/enum.component.ts create mode 100644 core/app/fields/enum/templates/record/enum.component.html create mode 100644 core/app/fields/enum/templates/record/enum.component.spec.ts create mode 100644 core/app/fields/enum/templates/record/enum.component.ts create mode 100644 core/app/fields/field.component.spec.ts create mode 100644 core/app/fields/field.component.ts create mode 100644 core/app/fields/field.module.ts create mode 100644 core/app/fields/file/file.php create mode 100644 core/app/fields/file/templates/list/file.component.html create mode 100644 core/app/fields/file/templates/list/file.component.spec.ts create mode 100644 core/app/fields/file/templates/list/file.component.ts create mode 100644 core/app/fields/float/float.php create mode 100644 core/app/fields/float/templates/list/float.component.html create mode 100644 core/app/fields/float/templates/list/float.component.spec.ts create mode 100644 core/app/fields/float/templates/list/float.component.ts create mode 100644 core/app/fields/float/templates/record/float.component.html create mode 100644 core/app/fields/float/templates/record/float.component.spec.ts create mode 100644 core/app/fields/float/templates/record/float.component.ts create mode 100644 core/app/fields/fullname/fullname.php create mode 100644 core/app/fields/fullname/templates/list/fullname.component.html create mode 100644 core/app/fields/fullname/templates/list/fullname.component.spec.ts create mode 100644 core/app/fields/fullname/templates/list/fullname.component.ts create mode 100644 core/app/fields/int/int.php create mode 100644 core/app/fields/int/templates/list/int.component.html create mode 100644 core/app/fields/int/templates/list/int.component.spec.ts create mode 100644 core/app/fields/int/templates/list/int.component.ts create mode 100644 core/app/fields/int/templates/record/int.component.html create mode 100644 core/app/fields/int/templates/record/int.component.spec.ts create mode 100644 core/app/fields/int/templates/record/int.component.ts create mode 100644 core/app/fields/multienum/multienum.php create mode 100644 core/app/fields/multienum/templates/list/multienum.component.html create mode 100644 core/app/fields/multienum/templates/list/multienum.component.spec.ts create mode 100644 core/app/fields/multienum/templates/list/multienum.component.ts create mode 100644 core/app/fields/multienum/templates/record/multienum.component.html create mode 100644 core/app/fields/multienum/templates/record/multienum.component.spec.ts create mode 100644 core/app/fields/multienum/templates/record/multienum.component.ts create mode 100644 core/app/fields/password/password.php create mode 100644 core/app/fields/password/templates/list/password.component.html create mode 100644 core/app/fields/password/templates/list/password.component.spec.ts create mode 100644 core/app/fields/password/templates/list/password.component.ts create mode 100644 core/app/fields/password/templates/record/password.component.html create mode 100644 core/app/fields/password/templates/record/password.component.spec.ts create mode 100644 core/app/fields/password/templates/record/password.component.ts create mode 100644 core/app/fields/relate/relate.php create mode 100644 core/app/fields/relate/templates/list/relate.component.html create mode 100644 core/app/fields/relate/templates/list/relate.component.spec.ts create mode 100644 core/app/fields/relate/templates/list/relate.component.ts create mode 100644 core/app/fields/relate/templates/record/relate.component.html create mode 100644 core/app/fields/relate/templates/record/relate.component.spec.ts create mode 100644 core/app/fields/relate/templates/record/relate.component.ts create mode 100644 core/app/fields/submit/submit.php create mode 100644 core/app/fields/submit/templates/list/submit.component.html create mode 100644 core/app/fields/submit/templates/list/submit.component.spec.ts create mode 100644 core/app/fields/submit/templates/list/submit.component.ts create mode 100644 core/app/fields/submit/templates/record/submit.component.html create mode 100644 core/app/fields/submit/templates/record/submit.component.spec.ts create mode 100644 core/app/fields/submit/templates/record/submit.component.ts create mode 100644 core/app/fields/varchar/templates/list/varchar.component.html create mode 100644 core/app/fields/varchar/templates/list/varchar.component.spec.ts create mode 100644 core/app/fields/varchar/templates/list/varchar.component.ts create mode 100644 core/app/fields/varchar/templates/record/varchar.component.html create mode 100644 core/app/fields/varchar/templates/record/varchar.component.spec.ts create mode 100644 core/app/fields/varchar/templates/record/varchar.component.ts create mode 100644 core/app/fields/varchar/varchar.php create mode 100644 core/app/themes/default/default.php create mode 100644 core/app/themes/suite8/css/abstracts/_functions.scss create mode 100644 core/app/themes/suite8/css/abstracts/_typography.scss create mode 100644 core/app/themes/suite8/css/abstracts/_variables.scss create mode 100644 core/app/themes/suite8/css/base/_reset.scss create mode 100644 core/app/themes/suite8/css/components/_button.scss create mode 100644 core/app/themes/suite8/css/components/_checkbox.scss create mode 100644 core/app/themes/suite8/css/components/_dropdown.scss create mode 100644 core/app/themes/suite8/css/components/_input.scss create mode 100644 core/app/themes/suite8/css/components/_svg.scss create mode 100644 core/app/themes/suite8/css/layout/_actionbar.scss create mode 100644 core/app/themes/suite8/css/layout/_common.scss create mode 100644 core/app/themes/suite8/css/layout/_footer.scss create mode 100644 core/app/themes/suite8/css/layout/_forms.scss create mode 100644 core/app/themes/suite8/css/layout/_listview.scss create mode 100644 core/app/themes/suite8/css/layout/_modal.scss create mode 100644 core/app/themes/suite8/css/layout/_navbar.scss create mode 100644 core/app/themes/suite8/css/style.scss create mode 100644 core/app/themes/suite8/images/3d_chart.jpeg create mode 100644 core/app/themes/suite8/images/alert_icon.svg create mode 100644 core/app/themes/suite8/images/alert_red.svg create mode 100644 core/app/themes/suite8/images/arrow_down.svg create mode 100644 core/app/themes/suite8/images/arrow_down_filled.svg create mode 100644 core/app/themes/suite8/images/arrow_down_red.svg create mode 100644 core/app/themes/suite8/images/arrow_left_filled.svg create mode 100644 core/app/themes/suite8/images/arrow_right.svg create mode 100644 core/app/themes/suite8/images/arrow_right_filled.svg create mode 100644 core/app/themes/suite8/images/arrow_separator.svg create mode 100644 core/app/themes/suite8/images/arrow_up_filled.svg create mode 100644 core/app/themes/suite8/images/arrow_up_grey.svg create mode 100644 core/app/themes/suite8/images/bars_blue.svg create mode 100644 core/app/themes/suite8/images/bars_white.svg create mode 100644 core/app/themes/suite8/images/bug_blue.svg create mode 100644 core/app/themes/suite8/images/bug_white.svg create mode 100644 core/app/themes/suite8/images/bulb_blue.svg create mode 100644 core/app/themes/suite8/images/bulb_white.svg create mode 100644 core/app/themes/suite8/images/calendar.svg create mode 100644 core/app/themes/suite8/images/calendar_dark.svg create mode 100644 core/app/themes/suite8/images/calendar_grey.svg create mode 100644 core/app/themes/suite8/images/calendar_hover.svg create mode 100644 core/app/themes/suite8/images/calendar_icon.svg create mode 100644 core/app/themes/suite8/images/calendar_purple.svg create mode 100644 core/app/themes/suite8/images/calendar_purple_hover.svg create mode 100644 core/app/themes/suite8/images/calendar_white.svg create mode 100644 core/app/themes/suite8/images/calls_icon.svg create mode 100644 core/app/themes/suite8/images/check_1_a.svg create mode 100644 core/app/themes/suite8/images/check_1_b.svg create mode 100644 core/app/themes/suite8/images/check_2_a.svg create mode 100644 core/app/themes/suite8/images/check_2_b.svg create mode 100644 core/app/themes/suite8/images/check_2_c.svg create mode 100644 core/app/themes/suite8/images/check_3_a.svg create mode 100644 core/app/themes/suite8/images/check_3_b.svg create mode 100644 core/app/themes/suite8/images/check_3_c.svg create mode 100644 core/app/themes/suite8/images/check_3_d.svg create mode 100644 core/app/themes/suite8/images/clock.svg create mode 100644 core/app/themes/suite8/images/clock_large.svg create mode 100644 core/app/themes/suite8/images/cross.svg create mode 100644 core/app/themes/suite8/images/cross_grey.svg create mode 100644 core/app/themes/suite8/images/cross_hover.svg create mode 100644 core/app/themes/suite8/images/cross_purple.svg create mode 100644 core/app/themes/suite8/images/cross_purple_hover.svg create mode 100644 core/app/themes/suite8/images/cross_thin.svg create mode 100644 core/app/themes/suite8/images/cross_white.svg create mode 100644 core/app/themes/suite8/images/cursor_grey.svg create mode 100644 core/app/themes/suite8/images/donut_chart.png create mode 100644 core/app/themes/suite8/images/dots.svg create mode 100644 core/app/themes/suite8/images/dots_hover.svg create mode 100644 core/app/themes/suite8/images/double_arrows.svg create mode 100644 core/app/themes/suite8/images/down_arrow.svg create mode 100644 core/app/themes/suite8/images/down_arrow_white.svg create mode 100644 core/app/themes/suite8/images/download.svg create mode 100644 core/app/themes/suite8/images/drop_menu_arrow.svg create mode 100644 core/app/themes/suite8/images/edit.svg create mode 100644 core/app/themes/suite8/images/email_purple.svg create mode 100644 core/app/themes/suite8/images/email_purple_hover.svg create mode 100644 core/app/themes/suite8/images/expand_arrow.svg create mode 100644 core/app/themes/suite8/images/eye.svg create mode 100644 core/app/themes/suite8/images/favicon.ico create mode 100644 core/app/themes/suite8/images/filter_icon.svg create mode 100644 core/app/themes/suite8/images/folder_blue.svg create mode 100644 core/app/themes/suite8/images/folder_white.svg create mode 100644 core/app/themes/suite8/images/graph_white.svg create mode 100644 core/app/themes/suite8/images/hamburger.svg create mode 100644 core/app/themes/suite8/images/history_icon.svg create mode 100644 core/app/themes/suite8/images/home_icon.svg create mode 100644 core/app/themes/suite8/images/home_icon_red.svg create mode 100644 core/app/themes/suite8/images/icon_first.svg create mode 100644 core/app/themes/suite8/images/icon_last.svg create mode 100644 core/app/themes/suite8/images/icon_modal_close.svg create mode 100644 core/app/themes/suite8/images/icon_next.svg create mode 100644 core/app/themes/suite8/images/icon_prev.svg create mode 100644 core/app/themes/suite8/images/info.svg create mode 100644 core/app/themes/suite8/images/info_circled.svg create mode 100644 core/app/themes/suite8/images/info_dark.svg create mode 100644 core/app/themes/suite8/images/info_hover.svg create mode 100644 core/app/themes/suite8/images/info_hover_dark.svg create mode 100644 core/app/themes/suite8/images/kanban.svg create mode 100644 core/app/themes/suite8/images/letter.svg create mode 100644 core/app/themes/suite8/images/letter_hover.svg create mode 100644 core/app/themes/suite8/images/list_icon_purple.svg create mode 100644 core/app/themes/suite8/images/list_icon_purple_hover.svg create mode 100644 core/app/themes/suite8/images/login_password.svg create mode 100644 core/app/themes/suite8/images/login_user.svg create mode 100644 core/app/themes/suite8/images/mega_blue.svg create mode 100644 core/app/themes/suite8/images/mega_white.svg create mode 100644 core/app/themes/suite8/images/minimise.svg create mode 100644 core/app/themes/suite8/images/minimise_circled.svg create mode 100644 core/app/themes/suite8/images/mobile_collapse_icon.svg create mode 100644 core/app/themes/suite8/images/mobile_expand_calendar copy.svg create mode 100644 core/app/themes/suite8/images/mobile_expand_calendar.svg create mode 100644 core/app/themes/suite8/images/mobile_expand_check_icon.svg create mode 100644 core/app/themes/suite8/images/mobile_expand_icon.svg create mode 100644 core/app/themes/suite8/images/mobile_expand_letter copy.svg create mode 100644 core/app/themes/suite8/images/mobile_expand_letter.svg create mode 100644 core/app/themes/suite8/images/mobile_expand_list copy.svg create mode 100644 core/app/themes/suite8/images/mobile_expand_list.svg create mode 100644 core/app/themes/suite8/images/mobile_expand_phone copy.svg create mode 100644 core/app/themes/suite8/images/mobile_expand_phone.svg create mode 100644 core/app/themes/suite8/images/padlock_blue.svg create mode 100644 core/app/themes/suite8/images/padlock_white.svg create mode 100644 core/app/themes/suite8/images/pencil_grey.svg create mode 100644 core/app/themes/suite8/images/pencil_grey_hover.svg create mode 100644 core/app/themes/suite8/images/person_blue.svg create mode 100644 core/app/themes/suite8/images/person_white.svg create mode 100644 core/app/themes/suite8/images/phone.svg create mode 100644 core/app/themes/suite8/images/phone_dark.svg create mode 100644 core/app/themes/suite8/images/phone_hover.svg create mode 100644 core/app/themes/suite8/images/phone_purple.svg create mode 100644 core/app/themes/suite8/images/phone_purple_hover.svg create mode 100644 core/app/themes/suite8/images/pie_blue.svg create mode 100644 core/app/themes/suite8/images/pie_icon.svg create mode 100644 core/app/themes/suite8/images/pie_white.svg create mode 100644 core/app/themes/suite8/images/pipeline_chart.png create mode 100644 core/app/themes/suite8/images/plus.svg create mode 100644 core/app/themes/suite8/images/plus_dark.svg create mode 100644 core/app/themes/suite8/images/plus_grey.svg create mode 100644 core/app/themes/suite8/images/plus_hover.svg create mode 100644 core/app/themes/suite8/images/plus_thin.svg create mode 100644 core/app/themes/suite8/images/plus_white.svg create mode 100644 core/app/themes/suite8/images/pound_blue.svg create mode 100644 core/app/themes/suite8/images/pound_white.svg create mode 100644 core/app/themes/suite8/images/poundbox_blue.svg create mode 100644 core/app/themes/suite8/images/poundbox_white.svg create mode 100644 core/app/themes/suite8/images/purplecross.svg create mode 100644 core/app/themes/suite8/images/purplecross_hover.svg create mode 100644 core/app/themes/suite8/images/purplepen.svg create mode 100644 core/app/themes/suite8/images/purplepen_hover.svg create mode 100644 core/app/themes/suite8/images/refresh.svg create mode 100644 core/app/themes/suite8/images/refresh_hover.svg create mode 100644 core/app/themes/suite8/images/search.svg create mode 100644 core/app/themes/suite8/images/settings.svg create mode 100644 core/app/themes/suite8/images/settings_hover.svg create mode 100644 core/app/themes/suite8/images/shield_blue.svg create mode 100644 core/app/themes/suite8/images/shield_white.svg create mode 100644 core/app/themes/suite8/images/signature_blue.svg create mode 100644 core/app/themes/suite8/images/signature_white.svg create mode 100644 core/app/themes/suite8/images/sort.svg create mode 100644 core/app/themes/suite8/images/sort_ascend.svg create mode 100644 core/app/themes/suite8/images/sort_descend.svg create mode 100644 core/app/themes/suite8/images/spark_blue.svg create mode 100644 core/app/themes/suite8/images/spark_white.svg create mode 100644 core/app/themes/suite8/images/star.svg create mode 100644 core/app/themes/suite8/images/star_icon.svg create mode 100644 core/app/themes/suite8/images/suitecrm_logo.png create mode 100644 core/app/themes/suite8/images/tick.svg create mode 100644 core/app/themes/suite8/images/user.svg create mode 100644 core/app/themes/suite8/images/vert_line.svg create mode 100644 core/app/themes/suite8/images/view.svg create mode 100644 core/app/themes/suite8/images/white_pencil.svg create mode 100644 core/app/themes/suite8/suite8.php create mode 100644 core/app/ui/components/account/account.component.html create mode 100644 core/app/ui/components/account/account.component.spec.ts create mode 100644 core/app/ui/components/account/account.component.ts create mode 100644 core/app/ui/components/account/account.module.ts create mode 100644 core/app/ui/components/action-bar/action-bar-model.ts create mode 100644 core/app/ui/components/action-bar/action-bar.component.html create mode 100644 core/app/ui/components/action-bar/action-bar.component.spec.ts create mode 100644 core/app/ui/components/action-bar/action-bar.component.ts create mode 100644 core/app/ui/components/action-bar/action-bar.module.ts create mode 100644 core/app/ui/components/action-bar/favorite-record-model.ts create mode 100644 core/app/ui/components/chart/chart.component.html create mode 100644 core/app/ui/components/chart/chart.component.spec.ts create mode 100644 core/app/ui/components/chart/chart.component.ts create mode 100644 core/app/ui/components/classic-view/classic-view.component.html create mode 100644 core/app/ui/components/classic-view/classic-view.component.spec.ts create mode 100644 core/app/ui/components/classic-view/classic-view.component.ts create mode 100644 core/app/ui/components/classic-view/classic-view.module.ts create mode 100644 core/app/ui/components/classic-view/classic-view.routes.ts create mode 100644 core/app/ui/components/footer/footer.component.html create mode 100644 core/app/ui/components/footer/footer.component.spec.ts create mode 100644 core/app/ui/components/footer/footer.component.ts create mode 100644 core/app/ui/components/footer/footer.module.ts create mode 100644 core/app/ui/components/home/home.component.html create mode 100644 core/app/ui/components/home/home.component.spec.ts create mode 100644 core/app/ui/components/home/home.component.ts create mode 100644 core/app/ui/components/home/home.module.ts create mode 100644 core/app/ui/components/home/home.routes.ts create mode 100644 core/app/ui/components/list-view/list-view-column-model.ts create mode 100644 core/app/ui/components/list-view/list-view-data-model.ts create mode 100644 core/app/ui/components/list-view/list-view.component.html create mode 100644 core/app/ui/components/list-view/list-view.component.spec.ts create mode 100644 core/app/ui/components/list-view/list-view.component.ts create mode 100644 core/app/ui/components/list-view/list-view.module.ts create mode 100644 core/app/ui/components/login/login.component.html create mode 100644 core/app/ui/components/login/login.component.spec.ts create mode 100644 core/app/ui/components/login/login.component.ts create mode 100644 core/app/ui/components/login/login.module.ts create mode 100644 core/app/ui/components/login/login.routes.ts create mode 100644 core/app/ui/components/logo/logo.component.html create mode 100644 core/app/ui/components/logo/logo.component.spec.ts create mode 100644 core/app/ui/components/logo/logo.component.ts create mode 100644 core/app/ui/components/logout/logout.component.html create mode 100644 core/app/ui/components/logout/logout.component.spec.ts create mode 100644 core/app/ui/components/logout/logout.component.ts create mode 100644 core/app/ui/components/message/message-type.ts create mode 100644 core/app/ui/components/message/message-types.enum.ts create mode 100644 core/app/ui/components/message/message.component.html create mode 100644 core/app/ui/components/message/message.component.spec.ts create mode 100644 core/app/ui/components/message/message.component.ts create mode 100644 core/app/ui/components/modal-view/modal-view.component.html create mode 100644 core/app/ui/components/modal-view/modal-view.component.spec.ts create mode 100644 core/app/ui/components/modal-view/modal-view.component.ts create mode 100644 core/app/ui/components/modal-view/modal-view.module.ts create mode 100644 core/app/ui/components/navbar/action-link-model.ts create mode 100644 core/app/ui/components/navbar/all-menu-model.ts create mode 100644 core/app/ui/components/navbar/current-user-model.ts create mode 100644 core/app/ui/components/navbar/link-model.ts create mode 100644 core/app/ui/components/navbar/link-target.ts create mode 100644 core/app/ui/components/navbar/navbar.component.html create mode 100644 core/app/ui/components/navbar/navbar.component.spec.ts create mode 100644 core/app/ui/components/navbar/navbar.component.ts create mode 100644 core/app/ui/components/navbar/navbar.module.ts create mode 100644 core/app/ui/components/navbar/recent-record-model.ts create mode 100644 core/app/ui/components/svg-icon/icon-ref-model.ts create mode 100644 core/app/ui/components/svg-icon/svg-filename-map-model.ts create mode 100644 core/app/ui/components/svg-icon/svg-icon.component.html create mode 100644 core/app/ui/components/svg-icon/svg-icon.component.spec.ts create mode 100644 core/app/ui/components/svg-icon/svg-icon.component.ts create mode 100644 core/app/ui/components/user-action-menu/user-action-menu.component.html create mode 100644 core/app/ui/components/user-action-menu/user-action-menu.component.spec.ts create mode 100644 core/app/ui/components/user-action-menu/user-action-menu.component.ts create mode 100644 core/app/ui/pipes/keys.pipe.spec.ts create mode 100644 core/app/ui/pipes/keys.pipe.ts create mode 100644 core/app/ui/pipes/safe.pipe.ts create mode 100644 core/app/ui/services/api/api-access-token-response-empty.ts create mode 100644 core/app/ui/services/api/api-access-token-response-model.ts create mode 100644 core/app/ui/services/api/api-response-error-model.ts create mode 100644 core/app/ui/services/api/api-response-model.ts create mode 100644 core/app/ui/services/api/api-subscription-model.ts create mode 100644 core/app/ui/services/api/api.service.spec.ts create mode 100644 core/app/ui/services/api/api.service.ts create mode 100644 core/app/ui/services/auth/auth-guard.service.ts create mode 100644 core/app/ui/services/auth/auth.service.ts create mode 100644 core/app/ui/services/auth/login-response-model.ts create mode 100644 core/app/ui/services/auth/logout-response-model.ts create mode 100644 core/app/ui/services/auth/user-model.ts create mode 100644 core/app/ui/services/message/message.service.spec.ts create mode 100644 core/app/ui/services/message/message.service.ts create mode 100644 core/app/views/create/create.php create mode 100644 core/app/views/default/default.php create mode 100644 core/app/views/kanban/kanban.php create mode 100644 core/app/views/list/list.php create mode 100644 core/app/views/record/record.php create mode 100644 core/base/Cli/CommandMapper.php create mode 100644 core/base/Cli/SuiteCommand.php create mode 100644 core/base/Config/Loader/YamlLoader.php create mode 100644 core/base/Config/Manager.php create mode 100644 core/base/Config/ParameterCollection.php create mode 100644 core/base/Config/modules.config.yml create mode 100644 core/base/Config/services.config.yml create mode 100644 core/base/Helper/Data/Collection.php create mode 100644 core/base/Helper/Data/CollectionInterface.php create mode 100644 core/base/Helper/File/File.php create mode 100644 core/base/Helper/File/FileMapperInterface.php create mode 100644 core/base/Http/Request.php create mode 100644 core/base/Http/Response.php create mode 100644 core/base/Instance.php create mode 100644 core/base/Module/Controller.php create mode 100644 core/base/Module/Manager.php create mode 100644 core/base/Module/ModuleCollection.php create mode 100644 core/base/Module/ModuleInterface.php create mode 100644 core/base/Module/ModuleMapper.php create mode 100644 core/base/Module/Service/Manager.php create mode 100644 core/base/Module/Service/ServiceCollection.php create mode 100644 core/base/Module/Service/ServiceFactoryInterface.php create mode 100644 core/base/Module/Service/ServiceMapper.php create mode 100644 core/base/Module/Storage/DataCollectionManager.php create mode 100644 core/base/Module/Storage/DoctrineCommands.php create mode 100644 core/base/Module/Storage/Manager.php create mode 100644 core/base/Module/Storage/TablePrefix.php create mode 100644 core/base/Module/View/Handler.php create mode 100644 core/base/Module/View/template/debug.html.php create mode 100644 core/base/Module/View/template/default.json.php create mode 100644 core/base/Route/DefaultRouter.php create mode 100644 core/base/Route/ModRewriteRouter.php create mode 100644 core/base/Route/RouterInterface.php create mode 100644 core/base/RunnableInterface.php create mode 100644 core/legacy/Authentication.php create mode 100644 core/legacy/AuthenticationService.php create mode 100644 core/legacy/LegacyHandler.php create mode 100644 core/modules/Administration/Administration.php create mode 100644 core/modules/Administration/Cli/App/AppRebuildCommand.php create mode 100644 core/modules/Administration/Cli/App/AppThemeRebuildCommand.php create mode 100644 core/modules/Administration/Cli/Composer/ComposerInstallCommand.php create mode 100644 core/modules/Administration/Cli/Composer/ComposerUpdateCommand.php create mode 100644 core/modules/Administration/Cli/Modules/ListModulesCommand.php create mode 100644 core/modules/Administration/Cli/Repair/QuickRepairRebuildCommand.php create mode 100644 core/modules/Administration/Cli/Users/AddNewUserCommand.php create mode 100644 core/modules/Users/Config/orm/OAuthAccessToken.orm.yml create mode 100644 core/modules/Users/Config/orm/OAuthAuthorizationCode.orm.yml create mode 100644 core/modules/Users/Config/orm/OAuthClient.orm.yml create mode 100644 core/modules/Users/Config/orm/OAuthPublicKey.orm.yml create mode 100644 core/modules/Users/Config/orm/OAuthRefreshToken.orm.yml create mode 100644 core/modules/Users/Config/orm/OAuthUser.orm.yml create mode 100644 core/modules/Users/Config/orm/OAuthUserClaims.orm.yml create mode 100644 core/modules/Users/Controller/Oauth.php create mode 100644 core/modules/Users/Entity/EncryptableField.php create mode 100644 core/modules/Users/Entity/OAuthAccessToken.php create mode 100644 core/modules/Users/Entity/OAuthAuthorizationCode.php create mode 100644 core/modules/Users/Entity/OAuthClient.php create mode 100644 core/modules/Users/Entity/OAuthPublicKey.php create mode 100644 core/modules/Users/Entity/OAuthRefreshToken.php create mode 100644 core/modules/Users/Entity/OAuthUser.php create mode 100644 core/modules/Users/Entity/OAuthUserClaims.php create mode 100644 core/modules/Users/Entity/UserProfile.php create mode 100644 core/modules/Users/Helper/Authentication.php create mode 100644 core/modules/Users/Service/AuthenticationService.php create mode 100644 core/modules/Users/Storage/OAuthAccessTokenStorage.php create mode 100644 core/modules/Users/Storage/OAuthAuthorizationCodeStorage.php create mode 100644 core/modules/Users/Storage/OAuthClientStorage.php create mode 100644 core/modules/Users/Storage/OAuthPublicKeyStorage.php create mode 100644 core/modules/Users/Storage/OAuthRefreshTokenStorage.php create mode 100644 core/modules/Users/Storage/OAuthUserClaimsStorage.php create mode 100644 core/modules/Users/Storage/OAuthUserStorage.php create mode 100644 core/modules/Users/Users.php create mode 100644 core/modules/Users/View/index.json.php create mode 100644 core/tests/phpunit.sh create mode 100644 core/tests/phpunit.xml.dist create mode 100644 core/tests/testdata/CommandMapperTest/config.yml create mode 100644 core/tests/testdata/CommandMapperTest/noenabledmodules.config.yml create mode 100644 core/tests/testdata/ConfigTest/LoadEmpty/config.yml create mode 100644 core/tests/testdata/ConfigTest/LoadMultiple/config_1.yml create mode 100644 core/tests/testdata/ConfigTest/LoadMultiple/config_2.yml create mode 100644 core/tests/testdata/ConfigTest/LoadMultiple/config_3.yml create mode 100644 core/tests/testdata/ConfigTest/LoadSingle/config.yml create mode 100644 core/tests/testdata/InstanceTest/config.yml create mode 100644 core/tests/testdata/ModuleMapper/config.yml create mode 100644 core/tests/testdata/ModuleMapper/noenabledmodules.config.yml create mode 100644 core/tests/testdata/RouterTest/DefaultRouter/config.yml create mode 100644 core/tests/testdata/RouterTest/DefaultRouter/defaultaction.config.yml create mode 100644 core/tests/testdata/RouterTest/DefaultRouter/defaultcontroller.config.yml create mode 100644 core/tests/testdata/RouterTest/DefaultRouter/defaultmodule.config.yml create mode 100644 core/tests/testdata/RouterTest/ModRewriteRouter/config.yml create mode 100644 core/tests/testdata/RouterTest/ModRewriteRouter/defaultaction.config.yml create mode 100644 core/tests/testdata/RouterTest/ModRewriteRouter/defaultcontroller.config.yml create mode 100644 core/tests/testdata/RouterTest/ModRewriteRouter/defaultmodule.config.yml create mode 100644 core/tests/unit/phpunit/base/Cli/CommandMapperTest.php create mode 100644 core/tests/unit/phpunit/base/Cli/SuiteCommand.php create mode 100644 core/tests/unit/phpunit/base/Config/ConfigTest.php create mode 100644 core/tests/unit/phpunit/base/Helper/DataCollectionTest.php create mode 100644 core/tests/unit/phpunit/base/Helper/FileHelperTest.php create mode 100644 core/tests/unit/phpunit/base/LoadInstanceTest.php create mode 100644 core/tests/unit/phpunit/base/Module/ModuleMapperTest.php create mode 100644 core/tests/unit/phpunit/base/Router/DefaultRouterTest.php create mode 100644 core/tests/unit/phpunit/base/Router/ModRewriteRouterTest.php create mode 100644 core/tests/unit/phpunit/legacy/AuthenticationServiceTest.php create mode 100644 core/tests/unit/phpunit/legacy/AuthenticationTest.php create mode 100644 extentions/.gitkeep create mode 100755 index.php create mode 100644 logs/.gitkeep create mode 100644 public/.gitkeep create mode 100755 robots.txt diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 000000000..e913c2a3a --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,183 @@ +## How to contribute to SuiteCRM + + +### **Code of Conduct** + +This project and all community members are expected to uphold the [SuiteCRM Code of Conduct.](https://github.com/salesagility/SuiteCRM/blob/master/CODE_OF_CONDUCT.md) + +#### **Bug Reporting** + +* **Please do not open a GitHub issue if the bug is a security vulnerability**, and instead email us at security@suitecrm.com. This will be delivered to the product team who handle security issues. Please don't disclose security bugs publicly until they have been handled by the security team. + +* Your email will be acknowledged within 24 hours during the business week (Mon - Fri), and you’ll receive a more detailed response to your email within 72 hours during the business week (Mon - Fri) indicating the next steps in handling your report. + +* **Ensure the bug was not already reported** by searching on GitHub under [Issues.](https://github.com/salesagility/SuiteCRM/issues) + +* If you're unable to find an open issue that relates to your problem, [open a new one.](https://github.com/salesagility/SuiteCRM/issues/new) Please be sure to follow the issue template as much as possible. + +* **Ensure that the bug you are reporting is a core SuiteCRM issue** and not specific to your individual setup. For these types of issues please use the [Community Forum.](https://www.suitecrm.com/forum/suite-forum) + +#### **Did you fix a bug?** + +* To provide a code contribution for an issue you will need to set up your own fork of the SuiteCRM repository, make your code changes, commit the changes and make a Pull Request to the appropriate branch on the SuiteCM repository. See our [Quick Guide to Fork SuiteCRM.](https://suitecrm.com/wiki/index.php/Contributing_to_SuiteCRM#Quick_Guide_to_Fork_SuiteCRM) Once you have set up your forked repository you can begin making commits to the project. + +* Determine which base branch your bug fix should use. If your bug is present in both hotfix and hotfix-7.10.x then you will need to make a seperate pull request for each branch. + +* Separate each fix into a new branch in your repository and name it with the issue ID e.g. bugfix_3062 or issue-1234. + +* When committing to your individual bugfix branch, please try and use the following as your commit message +```Fixed #1234 - ```. E.g. ```Fixed #1436 - Reports with nested Parentheses are removing parameters```. By using this format we can easily include all bug fixes within major and minor release notes on our [Wiki](https://suitecrm.com/wiki/index.php/Main_Page). + +* If you are new to Writing Commit Messages in git, follow the guide [here.](http://chris.beams.io/posts/git-commit/#seven-rules) + +* After you have made your commits and pushed them up to your forked repository you then create a [Pull Request](https://help.github.com/articles/about-pull-requests/) to be reviewed and merged into the SuiteCRM repository. Make a new Pull Request for each issue you fix – do not combine multiple bugfixes into one Pull Request. + Ensure that your Pull Request fork is salesagility/SuiteCRM, base branch is either hotfix or hotfix-7.8.x, the head fork is your repository, and the base branch is your unique bugfix branch e.g. bugfix_1234. + We will automatically reject any Pull Requests made to the wrong branch! + +* If you have not signed our CLA [Contributor License Agreement](https://www.clahub.com/agreements/salesagility/SuiteCRM) then your pull request will fail a check and we will be unable to merge it into the project. You will only be required to sign this once. + +* When a new Pull Request is opened, Travis CI will test the merging of the origin and upstream branch and update the Pull Request. If this check fails you can review the test results and resolve accordingly. To test prior to making a Pull Request install PHPUnit via composer into your develop environment then cd into the tests directory and run: ```$ sh runtests.sh``` + +* Ensure that you follow the pull request [template](https://github.com/salesagility/SuiteCRM/blob/master/.github/PULL_REQUEST_TEMPLATE.md) as much as possible. + +#### **Did you create a new feature or enhancement?** + +* Changes that can be considered a new feature or enhancement should be made to the develop branch instead of the hotfix or hotfix-7.8.x. branch. + +* To contribute a feature to SuiteCRM, similar to providing a Bug Fix, you must create a forked repository of SuiteCRM and set up your git and development environment. + Once done, create a new branch from **hotfix-7.10.x** (Issues effecting 7.10 & 7.11) or **hotfix** (Issues effecting 7.11 only) and name it relevant to the feature's purpose e.g campaign-wizard-ui. Following our [Code Standards,](https://suitecrm.com/wiki/index.php/Coding_Standards) develop the new feature and ensure your forked repository is kept up to date with minor/major releases. See our [Quick Guide to Fork SuiteCRM](https://suitecrm.com/wiki/index.php/Contributing_to_SuiteCRM#Quick_Guide_to_Fork_SuiteCRM) to update your repository. + Make sure your commit messages are relevant and descriptive. When ready to submit for review, make a Pull Request detailing your feature's functionality. + Ensure that your Pull Requests base fork is **salesagility/SuiteCRM**, the base branch is **hotfix-7.10.x** (Issues effecting 7.10 & 7.11) or **hotfix** (Issues effecting 7.11 only), the head fork is your repository, and the base branch is your feature branch. + Add any new PHPUnit tests to the new feature branch if required e.g new modules or classes. + +### Issue and Pull Request Labels + +* This section lists the labels we use to help us track and manage issues and pull requests across the SuiteCRM repositories. + +* By using [GitHub search](https://help.github.com/articles/searching-issues/) you can use labels to help find issues and pull requests that you are interested in. If for example, you are interested in which PR's will be included in the next release of SuiteCRM, you can use the [open issues "Resolved: Next Release"](https://github.com/salesagility/SuiteCRM/issues?q=is%3Aopen+is%3Aissue+label%3A%22Resolved%3A+Next+Release%22) label. + +* We encourage users whom feel an issue should be raised as a higher priority for a next release that they should make a comment to that affect. This also applies to incorrect labelling. + +#### General Labels + +| Label name | `salesagility/SuiteCRM` | Description | +| --- | --- | --- | +| `Bug` | [search][search-suitecrm-label-Bug] | Bugs within the core SuiteCRM codebase | +| `Community Contribution` | [search][search-suitecrm-label-Community-Contribution] | These are contribution made by the community | +| `Deprecated` | [search][search-suitecrm-label-Deprecated] | Issues & PRs related to an unsupported version of SuiteCRM | +| `Enhancement` | [search][search-suitecrm-label-Enhancement] | Pull requests that provide more functionality. Associated Issues are called suggestions | +| `Fix Proposed` | [search][search-suitecrm-label-Fix-Proposed] | A issue that has a PR related to it that provides a possible resolution | +| `Good First Issue` | [search][search-suitecrm-label-Good-First-Issue] | A good issue for someone new to SuiteCRM or web development | +| `Help Wanted` | [search][search-suitecrm-label-Help-Wanted] | Requesting help from the community to achieve a solution | +| `High Priority` | [search][search-suitecrm-label-High-Priority] | Issues & PRs that are critical; broken core functionality; fatal errors; there are no workarounds | +| `Medium Priority` | [search][search-suitecrm-label-Medium-Priority] | Issues & PRs that are important; broken functions; errors; there are workarounds | +| `Low Priority` | [search][search-suitecrm-label-Low-Priority] | Issues & PRs that are minor; broken styling; warns; there are practical workarounds | +| `Resolved: Next Release` | [search][search-suitecrm-label-Resolved-Next-Release] | Issues that have been resolved in a hotfix branch and scheduled to be in the next release | +| `Suggestion` | [search][search-suitecrm-label-Suggestion] | Issue containing a suggestion of functionality, process or UI. Associated PRs are called enhancement | +| `Question` | [search][search-suitecrm-label-Question] | This is a question raised about the functionality of SuiteCRM | + +#### Description Labels + +| Label name | `salesagility/SuiteCRM` | Description | +| --- | --- | --- | +| `API` | [search][search-suitecrm-label-API] | Issues & PRs related to all things regarding the API | +| `Campaigns` | [search][search-suitecrm-label-Campaigns] | Issues & PRs related to all things regarding campaigns | +| `Cases` | [search][search-suitecrm-label-Cases] | Issues & PRs related to all things regarding cases | +| `Clean Up` | [search][search-suitecrm-label-Clean-Up] | Issues & PRs related to all things regarding to technical debt and log files | +| `Databases` | [search][search-suitecrm-label-Databases] | Issues & PRs related to all things regarding databases | +| `Dependencies` | [search][search-suitecrm-label-Dependencies] | Pull Requests that update a core dependency | +| `Developer Tools` | [search][search-suitecrm-label-Developer-Tools] | Issues & PRs related to all things regarding development tools like Robo, Travis, etc | +| `Discussion` | [search][search-suitecrm-label-Discussion] | Issues & PRs related to ongoing discussions | +| `Elasticsearch` | [search][search-suitecrm-label-Elasticsearch] | Issues & PRs related to all things regarding Elasticsearch | +| `Emails:Campaigns` | [search][search-suitecrm-label-Emails:Campaigns] | Issues & PRs related to email campaigns | +| `Emails:Cases` | [search][search-suitecrm-label-Emails:Cases] | Issues & PRs related to email cases & AOP | +| `Emails:Compose` | [search][search-suitecrm-label-Emails:Compose] | Issues & PRs related to email compose | +| `Emails:Config` | [search][search-suitecrm-label-Emails:Config] | Issues & PRs related to email configuration | +| `Emails:Templates` | [search][search-suitecrm-label-Emails:Templates] | Issues & PRs related to email templates | +| `Emails` | [search][search-suitecrm-label-Emails] | Issues & PRs related to all things regarding emails & email module | +| `Enviroment` | [search][search-suitecrm-label-Enviroment] | Issues & PRs related to the application environment | +| `Installation` | [search][search-suitecrm-label-Installation] | Issues & PRs related to the installation of the application | +| `Language` | [search][search-suitecrm-label-Language] | Issues & PRs that are confirmed as issues with language & translation within the core | +| `Module` | [search][search-suitecrm-label-Module] | Issues & PRs related to modules that do not have specific label | +| `Reports` | [search][search-suitecrm-label-Reports] | Issues & PRs related to all things regarding reports | +| `Upgrading` | [search][search-suitecrm-label-Upgrading] | Issues & PRs related to all things regarding upgrading & UpgradeWizard | +| `Workflow` | [search][search-suitecrm-label-Workflow] | Issues & PRs related to all things regarding workflow | +| `Studio` | [search][search-suitecrm-label-Studio] | Issues & PRs related to all things regarding studio & module builder | +| `Styling` | [search][search-suitecrm-label-Styling] | Issues & PRs related to all things regarding styling | + +#### Status Labels + +| Label name | `salesagility/SuiteCRM` | Description | +| --- | --- | --- | +| `Assessed` | [search][search-suitecrm-label-Assessed] | PRs that have been tested and confirmed to resolve an issue by a core team member | +| `Community Assessed` | [search][search-suitecrm-label-Community-Assessed] | PRs that have been tested and confirmed to resolve an issue by at least 2 community members | +| `In Review` | [search][search-suitecrm-label-In-Review] | Pull Requests that are activity being reviewed by the core team | +| `Wrong Branch` | [search][search-suitecrm-label-Wrong-Branch] | Pull requests that point towards a restricted branch such as master | +| `Needs Review` | [search][search-suitecrm-label-Needs-Review] | Needs the core team to code review | +| `Needs Assessed` | [search][search-suitecrm-label-Needs-Assessed] | Needs the core team to assess | +| `Invalid` | [search][search-suitecrm-label-Invalid] | Issues & PRs which are a duplicate of an existing issue/PR | +| `Duplicate` | [search][search-suitecrm-label-Duplicate] | Issues & PRs which are a duplicate of an existing issue/PR | +| `Requires Tests` | [search][search-suitecrm-label-Requires-Tests] | Suggestion to OP to provide automated testing (unit, or acceptance) | +| `Requires Updates` | [search][search-suitecrm-label-Requires-Updates] | Issues & PRs which requires input or update from the author | +| `Needs Documentation` | [search][search-suitecrm-label-Needs-Documentation] | Requires adding documentation | +| `Needs Duplicated: Latest` | [search][search-suitecrm-label-Needs-Duplicated-Latest] | Pull Requests that require being duplicated to the "latest" branches i.e. Hotfix | +| `Needs Duplicated: LTS` | [search][search-suitecrm-label-Needs-Duplicated-LTS] | Pull Requests that require being duplicated to the LTS branches i.e. hotfix-7.x.x | +| `Work In Progress` | [search][search-suitecrm-label-Work-In-Progress] | Pull Requests that are not yet ready to be assessed | + +[search-suitecrm-label-Bug]: https://github.com/salesagility/SuiteCRM/labels/Bug +[search-suitecrm-label-Community-Contribution]: https://github.com/salesagility/SuiteCRM/labels/Community%20Contribution +[search-suitecrm-label-Deprecated]: https://github.com/salesagility/SuiteCRM/labels/Deprecated +[search-suitecrm-label-Enhancement]: https://github.com/salesagility/SuiteCRM/labels/Enhancement +[search-suitecrm-label-Fix-Proposed]: https://github.com/salesagility/SuiteCRM/labels/Fix%20Proposed +[search-suitecrm-label-Good-First-Issue]: https://github.com/salesagility/SuiteCRM/labels/Good%20First%20Issue +[search-suitecrm-label-Help-Wanted]: https://github.com/salesagility/SuiteCRM/labels/Help%20Wanted +[search-suitecrm-label-High-Priority]: https://github.com/salesagility/SuiteCRM/labels/High%20Priority +[search-suitecrm-label-Medium-Priority]: https://github.com/salesagility/SuiteCRM/labels/Medium%20Priority +[search-suitecrm-label-Low-Priority]: https://github.com/salesagility/SuiteCRM/labels/Low%20Priority +[search-suitecrm-label-Resolved-Next-Release]: https://github.com/salesagility/SuiteCRM/labels/Resolved%3A%20Next%20Release +[search-suitecrm-label-Suggestion]: https://github.com/salesagility/SuiteCRM/labels/Suggestion +[search-suitecrm-label-Question]: https://github.com/salesagility/SuiteCRM/labels/Question + +[search-suitecrm-label-API]: https://github.com/salesagility/SuiteCRM/labels/API +[search-suitecrm-label-Campaigns]: https://github.com/salesagility/SuiteCRM/labels/Campaigns +[search-suitecrm-label-Cases]: https://github.com/salesagility/SuiteCRM/labels/Cases +[search-suitecrm-label-Clean-Up]: https://github.com/salesagility/SuiteCRM/labels/Clean%20Up +[search-suitecrm-label-Databases]: https://github.com/salesagility/SuiteCRM/labels/Databases +[search-suitecrm-label-Dependencies]: https://github.com/salesagility/SuiteCRM/labels/Dependencies +[search-suitecrm-label-Developer-Tools]: https://github.com/salesagility/SuiteCRM/labels/Developer%20Tools +[search-suitecrm-label-Discussion]: https://github.com/salesagility/SuiteCRM/labels/Discussion +[search-suitecrm-label-Elasticsearch]: https://github.com/salesagility/SuiteCRM/labels/Elasticsearch +[search-suitecrm-label-Emails:Campaigns]: https://github.com/salesagility/SuiteCRM/labels/Emails%3ACampaigns +[search-suitecrm-label-Emails:Cases]: https://github.com/salesagility/SuiteCRM/labels/Emails%3ACases +[search-suitecrm-label-Emails:Compose]: https://github.com/salesagility/SuiteCRM/labels/Emails%3ACompose +[search-suitecrm-label-Emails:Config]: https://github.com/salesagility/SuiteCRM/labels/Emails%3AConfig +[search-suitecrm-label-Emails:Templates]: https://github.com/salesagility/SuiteCRM/labels/Emails%3ATemplates +[search-suitecrm-label-Emails]: https://github.com/salesagility/SuiteCRM/labels/Emails +[search-suitecrm-label-Enviroment]: https://github.com/salesagility/SuiteCRM/labels/Environment +[search-suitecrm-label-Installation]: https://github.com/salesagility/SuiteCRM/labels/Installation +[search-suitecrm-label-Language]: https://github.com/salesagility/SuiteCRM/labels/Language +[search-suitecrm-label-Module]: https://github.com/salesagility/SuiteCRM/labels/Module +[search-suitecrm-label-Reports]: https://github.com/salesagility/SuiteCRM/labels/Reports +[search-suitecrm-label-Studio]: https://github.com/salesagility/SuiteCRM/labels/Studio +[search-suitecrm-label-Styling]: https://github.com/salesagility/SuiteCRM/labels/Styling +[search-suitecrm-label-Upgrading]: https://github.com/salesagility/SuiteCRM/labels/Upgrading +[search-suitecrm-label-Workflow]: https://github.com/salesagility/SuiteCRM/labels/Workflow + +[search-suitecrm-label-Duplicate]: https://github.com/salesagility/SuiteCRM/labels/Duplicate +[search-suitecrm-label-Assessed]: https://github.com/salesagility/SuiteCRM/labels/Assessed +[search-suitecrm-label-Community-Assessed]: https://github.com/salesagility/SuiteCRM/labels/Community%20Assessed +[search-suitecrm-label-In-Review]: https://github.com/salesagility/SuiteCRM/labels/In%20Review +[search-suitecrm-label-Invalid]: https://github.com/salesagility/SuiteCRM/labels/Invalid +[search-suitecrm-label-Needs-Assessed]: https://github.com/salesagility/SuiteCRM/labels/Needs%20Assessed +[search-suitecrm-label-Needs-Documentation]: https://github.com/salesagility/SuiteCRM/labels/Needs%20Documentation +[search-suitecrm-label-Needs-Duplicated-Latest]: https://github.com/salesagility/SuiteCRM/labels/Needs%20Duplicated%3A%20Latest +[search-suitecrm-label-Needs-Duplicated-LTS]: https://github.com/salesagility/SuiteCRM/labels/Needs%20Duplicated%3A%20LTS +[search-suitecrm-label-Needs-Review]: https://github.com/salesagility/SuiteCRM/labels/Needs%20Review +[search-suitecrm-label-Requires-Tests]: https://github.com/salesagility/SuiteCRM/labels/Requires%20Tests +[search-suitecrm-label-Requires-Updates]: https://github.com/salesagility/SuiteCRM/labels/Requires%20Updates +[search-suitecrm-label-Work-In-Progress]: https://github.com/salesagility/SuiteCRM/labels/Work%20In%20Progress +[search-suitecrm-label-Wrong-Branch]: https://github.com/salesagility/SuiteCRM/labels/Wrong%20Branch + +Thanks! + +SuiteCRM Team diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..accac62b5 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: # Replace with a single Patreon username +open_collective: suitecrm +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..25c2f11c6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,37 @@ + + + + +#### Issue + + + +#### Expected Behavior + + +#### Actual Behavior + + + +#### Possible Fix + + +#### Steps to Reproduce + + +1. +2. +3. +4. + +#### Context + + + +#### Your Environment + +* SuiteCRM Version used: +* Browser name and version (e.g. Chrome Version 51.0.2704.63 (64-bit)): +* Environment name and version (e.g. MySQL, PHP 7): +* Operating System and version (e.g Ubuntu 16.04): + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..1895389e2 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,30 @@ + + +## Description + + + + + +## Motivation and Context + + +## How To Test This + + +## Types of changes + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to change) + +### Final checklist + + +- [ ] My code follows the code style of this project found [here](https://docs.suitecrm.com/community/contributing-code/coding-standards/). +- [ ] My change requires a change to the documentation. +- [ ] I have read the [**How to Contribute**](https://docs.suitecrm.com/community/contributing-code/) guidelines. + + + + \ No newline at end of file diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 000000000..9d151e57a --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +For a complete compatibility matrix, please see the documentation [here](https://docs.suitecrm.com/admin/compatibility-matrix/). + +| Version | Supported | +| ------- | ------------------ | +| 7.11.x | :heavy_check_mark: | +| 7.10.x | :heavy_check_mark: | +| ≤7.8.x | :x: | + +## Reporting a Vulnerability + +We take Security seriously here at SuiteCRM so if you have discovered a security risk report it by +emailing [security@suitecrm.com](mailto:security@suitecrm.com). This will be delivered to the product team who handle security issues. +Please don't disclose security bugs publicly until they have been handled by the security team. + +Your email will be acknowledged within 24 hours during the business week (Mon - Fri), and you’ll receive a more +detailed response to your email within 72 hours during the business week (Mon - Fri) indicating the next steps in +handling your report. diff --git a/.github/config.yml b/.github/config.yml new file mode 100644 index 000000000..f81222362 --- /dev/null +++ b/.github/config.yml @@ -0,0 +1,94 @@ +owner: + - salesagility + +repo: + - SuiteCRM + +members: + - cameronblaikie + - CamoMacdonald + - code-ph0y + - craigpanton + - Dillon-Brown + - e-reeley + - g-fantini + - gregsoper + - gymad + - jack7anderson7 + - JackBuchanan + - Jason-Dang + - JimMackin + - johnM2401 + - Mac-Rae + - mattlorimer + - MikeyJC + - murdal + - PedroErnst + - pgorod + - samus-aran + - SuiteBot + - willrennie + +eolBranches: + - 7.9.x, + - 7.8.x, + - hotfix-7.8.x + +invalidBranches: + - master + - 7.10.x + +invalid: > + Hello and thanks for the contribution! would you be able to rebase this pull request to the hotfix-7.10.x branch? + we currently don't accept pull requests directly to this branch + (See [SuiteDocs](https://docs.suitecrm.com/community/contributing-code/bugs) for more information). +eol: > + Hello and thanks for the contribution! unfortunately this branch is EOL + (See our [blog post](https://suitecrm.com/7-8-x-end-of-life/) for more information). +invalidIssueTemplate: > + Hello and thanks for raising this issue! I notice you don't seem to be following the standard issue template. If this is a bug report, would you be able to go back and edit this issue while following the template and including exact replication steps? + + + Thanks. +sprintPlanning: > + Hello Everyone! :wave: + + + We are 1 week away from commencing our Sprint. So we would like to take this opportunity to ask for your nominated issues here in this thread so we can assess, refine and coordinate with ourselves (the Core Team) and the community contributors on the upcoming priorities. + + + If you are new to this sprint planning then essentially we are asking you, as the users, to post your issues (by referencing the GitHub hash/ID) that you would like to see being tackled. We, the Core Team, will review and select the achievable ones within the sprint and allocate them among ourselves. The others we may label them as Help Wanted which would make them up for grabs by our community code contributors. This process will help encourage ownership of these bugs and their bug fixes. [Find out more of the sprint concept here](https://docs.suitecrm.com/community/nominating-issues-in-sprint-planning) :point_left: + + + Sprints are every 2 weeks with the aim to deliver a release every 2 Sprints (monthly). + + + Just to re-iterate from previous posts, that the core team do have other tasks that may not be identified in the above sprints and these are usually from our own internal backlog i.e. improving the release process, CI/CD tools, security patches etc so that accounts for some ‘slack’ visible in the public sprints. + + + Look forward to your nominations! :writing_hand: +sprintRetrospective: > + Hello Everyone! + + + Welcome to the sprint retrospective, lets break down the previous sprint. + + + To Do | In Progress | In Review | Done + + ------------ | ------------- | ------------- | ------------- + + SPRINTMETRICS + + + Again, to note, that we also tackle a lot of other issues that are high priorities, security patches and internal roadmap tasks + + + List of the currently open "Help Wanted" issues: + + HELPWANTED + + + + Thanks everyone and comment below to start a discussion to improve the open sprint processes & gain feedback +1 + We are planning to open the next Sprint for nominations next week. diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..af9cf0ee3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,141 @@ +## SuiteCRM 8 ## + +build/ +config/ +!config/.gitkeep +cache/ +extentions/ +!extentions/.gitkeep +logs/ +!logs/.gitkeep +public/ + +# Theme +.sass-cache +*.css.map +*.min.css + +# Tests +core/tests/coverage + +# Composer +vendor/ +composer.phar + + +# Profiling files +chrome-profiler-events.json +speed-measure-plugin.json + +# Compiled output +dist +tmp +out-tsc + +# Only exists if Bazel was run +bazel-out + +# e2e test files +e2e/*.js +e2e/*.map + +## Generic ## + +# Logs +*.log + +# composer +/vendor/* + +#Ignore bower_components +bower_components/ +node_modules/ + +# htacess +/.htaccess + +## IDE specific items +# Eclipse +*.pydevproject +.project +.buildpath +.metadata +bin/** +tmp/** +tmp/**/* +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath +# Emacs +*~ +\#*\# +/.emacs.desktop +/.emacs.desktop.lock +.elc +auto-save-list +tramp +# IntelliJ Idea +*.iml +*.ipr +*.iws +.idea/ +.phpstorm.meta.php +.sass-cache/ +.php_cs.cache +# NetBeans +nbproject/ +#Visual Studio Code +.vscode/ +# Vim +.*.sw[a-z] +*.un~ +*.sln +*.suo +*.phpproj +Session.vim +# Windows +Thumbs.db +Desktop.ini +.DS_Store +.DS_Store? +.save +#browserstack +BrowserStackLocal +browserstack.err + + +# zips and executables +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip +*.exe + +# sql +*.sql +*.sql.gz +*.sqlite + +# Ignore testing environment +build/tmp/ + +# Misc +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +.c9/ +*.launch diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..a62339b32 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,35 @@ +# Code of Conduct # + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +Examples of behaviour that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community in a professional manner +* Showing empathy towards other community members + +Examples of unacceptable behaviour by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +The SuiteCRM project maintainers are responsible for clarifying the standards of acceptable behaviour and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team. + +The SuiteCRM project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviours that they deem inappropriate, threatening, offensive, or harmful. + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, within project forums, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +Instances of abusive, harassing, or otherwise unacceptable behaviour may be reported by contacting the project team at [community@suitecrm.com][community_email]. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[community_email]: mailto:community@suitecrm.com +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100755 index 000000000..c6f82c9d1 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ + + + + +# SuiteCRM 8.0-alpha + +[SuiteCRM](https://suitecrm.com) is the award-winning open-source, enterprise-ready Customer Relationship Management (CRM) software application. + +Our vision is to be the most adopted open source enterprise CRM in the world, giving users full control of their data and freedom to own and customise their business solution. + +Try out a free fully working [SuiteCRM demo available here](https://suitecrm.com/demo/) + + +### License [![AGPLv3](https://img.shields.io/github/license/suitecrm/suitecrm.svg)](./LICENSE.txt) + +SuiteCRM is published under the AGPLv3 license. + + +## Quick Start Quide + +### System Requirements + +| Requirement | Version | | Database | Version | +|---|---|---|---|---| +| PHP | 7.2+ || MariaDB |10.2+ | +| Angular | 7+ || MySQL | 5.6-5.7| +| Node.js | 10 || SQL Server | 2012+ | +| Apache | 2.4 | + +### Installation + +1. Run `composer install` in the root directory +2. Run `composer install` in legacy directory +3. Compile legacy theme +3. Run legacy install process +4. Create config.yml with config directory with the following strucure +``` +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: '{db_host}' + dbname: '{db_name}' + user: '{db_user}' + password: '{db_pass}' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +``` +5. Set permissions +``` +chown -R {user ID}:{web user group} . +find . -type d -exec chmod 0755 {} \; +find . -type f -exec chmod 0644 {} \; +chmod +x bin/cli +``` +6. Run `bin/cli orm:schema-tool:update --force` +7. Run `bin/cli app:rebuild` \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100755 index 000000000..593ea050a --- /dev/null +++ b/composer.json @@ -0,0 +1,52 @@ +{ + "name": "salesagility/suitecrm", + "description": "SuiteCRM Application", + "homepage": "https://suitecrm.com", + "type": "project", + "config": { + "vendor-dir": "vendor", + "platform": { + "php": "7.2.0" + }, + "optimize-autoloader": true, + "sort-packages": true + }, + "require": { + "ext-json": "*", + "bshaffer/oauth2-server-httpfoundation-bridge": "^1.4", + "bshaffer/oauth2-server-php": "^1.11.1", + "composer/installers": "~1.0", + "doctrine/cache": "^1.8", + "doctrine/dbal": "^2.9", + "doctrine/orm": "2.6.*", + "monolog/monolog": "^1.23", + "symfony/config": "^4.2", + "symfony/console": "^4.3", + "symfony/http-foundation": "^4.2", + "symfony/routing": "4.4.x-dev", + "symfony/yaml": "^4.2" + }, + "require-dev": { + "roave/security-advisories": "dev-master", + "phpunit/phpunit": "^7.3", + "phpmetrics/phpmetrics": "^2.4.1", + "phploc/phploc": "^4.0.1", + "doctrine/doctrine-fixtures-bundle": "~3.2", + "dama/doctrine-test-bundle": "^5.0" + }, + "license": "GPL-3.0", + "authors": [ + { + "name": "SalesAgility Ltd" + } + ], + "autoload": { + "psr-4": { + "SuiteCRM\\Core\\Base\\": "core/base/", + "SuiteCRM\\Core\\Modules\\": "core/modules/", + "SuiteCRM\\Core\\Legacy\\": "core/legacy/" + } + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..3f43d371a --- /dev/null +++ b/composer.lock @@ -0,0 +1,5756 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "1dd262db5abdd532a2ad48b4d72b44c7", + "packages": [ + { + "name": "bshaffer/oauth2-server-httpfoundation-bridge", + "version": "v1.4", + "source": { + "type": "git", + "url": "https://github.com/bshaffer/oauth2-server-httpfoundation-bridge.git", + "reference": "f2479fb24db24932962430deadac0e29ca2729f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bshaffer/oauth2-server-httpfoundation-bridge/zipball/f2479fb24db24932962430deadac0e29ca2729f7", + "reference": "f2479fb24db24932962430deadac0e29ca2729f7", + "shasum": "" + }, + "require": { + "bshaffer/oauth2-server-php": ">=0.9", + "php": ">=5.3.0", + "symfony/http-foundation": ">=2.1" + }, + "type": "library", + "autoload": { + "psr-0": { + "OAuth2\\HttpFoundationBridge": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brent Shaffer", + "email": "bshafs@gmail.com", + "homepage": "http://brentertainment.com" + } + ], + "description": "A bridge to HttpFoundation for oauth2-server-php", + "homepage": "http://github.com/bshaffer/oauth2-server-httpfoundation-bridge", + "keywords": [ + "auth", + "httpfoundation", + "oauth", + "oauth2" + ], + "time": "2018-12-04T02:28:38+00:00" + }, + { + "name": "bshaffer/oauth2-server-php", + "version": "v1.11.1", + "source": { + "type": "git", + "url": "https://github.com/bshaffer/oauth2-server-php.git", + "reference": "5a0c8000d4763b276919e2106f54eddda6bc50fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bshaffer/oauth2-server-php/zipball/5a0c8000d4763b276919e2106f54eddda6bc50fa", + "reference": "5a0c8000d4763b276919e2106f54eddda6bc50fa", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "aws/aws-sdk-php": "~2.8", + "firebase/php-jwt": "~2.2", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^4.0", + "predis/predis": "dev-master", + "thobbs/phpcassa": "dev-master" + }, + "suggest": { + "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage", + "firebase/php-jwt": "~2.2 is required to use JWT features", + "mongodb/mongodb": "^1.1 is required to use MongoDB storage", + "predis/predis": "Required to use Redis storage", + "thobbs/phpcassa": "Required to use Cassandra storage" + }, + "type": "library", + "autoload": { + "psr-0": { + "OAuth2": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brent Shaffer", + "email": "bshafs@gmail.com", + "homepage": "http://brentertainment.com" + } + ], + "description": "OAuth2 Server for PHP", + "homepage": "http://github.com/bshaffer/oauth2-server-php", + "keywords": [ + "auth", + "oauth", + "oauth2" + ], + "time": "2018-12-04T00:29:32+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.2.4", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/10bb96592168a0f8e8f6dcde3532d9fa50b0b527", + "reference": "10bb96592168a0f8e8f6dcde3532d9fa50b0b527", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", + "psr/log": "^1.0", + "symfony/process": "^2.5 || ^3.0 || ^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "time": "2019-08-30T08:44:50+00:00" + }, + { + "name": "composer/composer", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "bb01f2180df87ce7992b8331a68904f80439dd2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/bb01f2180df87ce7992b8331a68904f80439dd2f", + "reference": "bb01f2180df87ce7992b8331a68904f80439dd2f", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0", + "composer/semver": "^1.0", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^1.1", + "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", + "php": "^5.3.2 || ^7.0", + "psr/log": "^1.0", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.0", + "symfony/console": "^2.7 || ^3.0 || ^4.0", + "symfony/filesystem": "^2.7 || ^3.0 || ^4.0", + "symfony/finder": "^2.7 || ^3.0 || ^4.0", + "symfony/process": "^2.7 || ^3.0 || ^4.0" + }, + "conflict": { + "symfony/console": "2.8.38" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7", + "phpunit/phpunit-mock-objects": "^2.3 || ^3.0" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives", + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\": "src/Composer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "time": "2019-11-01T16:20:17+00:00" + }, + { + "name": "composer/installers", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/composer/installers.git", + "reference": "141b272484481432cda342727a427dc1e206bfa0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/installers/zipball/141b272484481432cda342727a427dc1e206bfa0", + "reference": "141b272484481432cda342727a427dc1e206bfa0", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0" + }, + "replace": { + "roundcube/plugin-installer": "*", + "shama/baton": "*" + }, + "require-dev": { + "composer/composer": "1.0.*@dev", + "phpunit/phpunit": "^4.8.36" + }, + "type": "composer-plugin", + "extra": { + "class": "Composer\\Installers\\Plugin", + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Installers\\": "src/Composer/Installers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "https://composer.github.io/installers/", + "keywords": [ + "Craft", + "Dolibarr", + "Eliasis", + "Hurad", + "ImageCMS", + "Kanboard", + "Lan Management System", + "MODX Evo", + "Mautic", + "Maya", + "OXID", + "Plentymarkets", + "Porto", + "RadPHP", + "SMF", + "Thelia", + "Whmcs", + "WolfCMS", + "agl", + "aimeos", + "annotatecms", + "attogram", + "bitrix", + "cakephp", + "chef", + "cockpit", + "codeigniter", + "concrete5", + "croogo", + "dokuwiki", + "drupal", + "eZ Platform", + "elgg", + "expressionengine", + "fuelphp", + "grav", + "installer", + "itop", + "joomla", + "known", + "kohana", + "laravel", + "lavalite", + "lithium", + "magento", + "majima", + "mako", + "mediawiki", + "modulework", + "modx", + "moodle", + "osclass", + "phpbb", + "piwik", + "ppi", + "puppet", + "pxcms", + "reindex", + "roundcube", + "shopware", + "silverstripe", + "sydes", + "symfony", + "typo3", + "wordpress", + "yawik", + "zend", + "zikula" + ], + "time": "2019-08-12T15:00:31+00:00" + }, + { + "name": "composer/semver", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/46d9139568ccb8d9e7cdd4539cab7347568a5e2e", + "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "time": "2019-03-19T17:25:45+00:00" + }, + { + "name": "composer/spdx-licenses", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/7ac1e6aec371357df067f8a688c3d6974df68fa5", + "reference": "7ac1e6aec371357df067f8a688c3d6974df68fa5", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Spdx\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "SPDX licenses list and validation library.", + "keywords": [ + "license", + "spdx", + "validator" + ], + "time": "2019-07-29T10:31:59+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "cbe23383749496fe0f373345208b79568e4bc248" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248", + "reference": "cbe23383749496fe0f373345208b79568e4bc248", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "time": "2019-11-06T16:40:04+00:00" + }, + { + "name": "doctrine/annotations", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/904dca4eb10715b92569fbcd79e201d5c349b6bc", + "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc", + "shasum": "" + }, + "require": { + "doctrine/lexer": "1.*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/cache": "1.*", + "phpunit/phpunit": "^7.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "time": "2019-10-01T18:55:10+00:00" + }, + { + "name": "doctrine/cache", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/382e7f4db9a12dc6c19431743a2b096041bcdd62", + "reference": "382e7f4db9a12dc6c19431743a2b096041bcdd62", + "shasum": "" + }, + "require": { + "php": "~7.1" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0", + "predis/predis": "~1.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "time": "2019-11-29T15:36:20+00:00" + }, + { + "name": "doctrine/collections", + "version": "1.6.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7", + "reference": "6b1e4b2b66f6d6e49983cebfe23a21b7ccc5b0d7", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan-shim": "^0.9.2", + "phpunit/phpunit": "^7.0", + "vimeo/psalm": "^3.2.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "time": "2019-11-13T13:07:11+00:00" + }, + { + "name": "doctrine/common", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common.git", + "reference": "b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/common/zipball/b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff", + "reference": "b8ca1dcf6b0dc8a2af7a09baac8d0c48345df4ff", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/inflector": "^1.0", + "doctrine/lexer": "^1.0", + "doctrine/persistence": "^1.1", + "doctrine/reflection": "^1.0", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^1.0", + "phpstan/phpstan": "^0.11", + "phpstan/phpstan-phpunit": "^0.11", + "phpunit/phpunit": "^7.0", + "squizlabs/php_codesniffer": "^3.0", + "symfony/phpunit-bridge": "^4.0.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.", + "homepage": "https://www.doctrine-project.org/projects/common.html", + "keywords": [ + "common", + "doctrine", + "php" + ], + "time": "2019-09-10T10:10:14+00:00" + }, + { + "name": "doctrine/dbal", + "version": "v2.10.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "0c9a646775ef549eb0a213a4f9bd4381d9b4d934" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/0c9a646775ef549eb0a213a4f9bd4381d9b4d934", + "reference": "0c9a646775ef549eb0a213a4f9bd4381d9b4d934", + "shasum": "" + }, + "require": { + "doctrine/cache": "^1.0", + "doctrine/event-manager": "^1.0", + "ext-pdo": "*", + "php": "^7.2" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "jetbrains/phpstorm-stubs": "^2019.1", + "phpstan/phpstan": "^0.11.3", + "phpunit/phpunit": "^8.4.1", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.10.x-dev", + "dev-develop": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlanywhere", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "time": "2019-11-03T16:50:43+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "629572819973f13486371cb611386eb17851e85c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/629572819973f13486371cb611386eb17851e85c", + "reference": "629572819973f13486371cb611386eb17851e85c", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "time": "2019-11-10T09:48:07+00:00" + }, + { + "name": "doctrine/inflector", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/ec3a55242203ffa6a4b27c58176da97ff0a7aec1", + "reference": "ec3a55242203ffa6a4b27c58176da97ff0a7aec1", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^6.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Common String Manipulations with regard to casing and singular/plural rules.", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "inflection", + "pluralize", + "singularize", + "string" + ], + "time": "2019-10-30T19:59:35+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", + "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13", + "phpstan/phpstan-phpunit": "^0.11", + "phpstan/phpstan-shim": "^0.11", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2019-10-21T16:45:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "shasum": "" + }, + "require": { + "php": "^7.2" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "time": "2019-10-30T14:39:59+00:00" + }, + { + "name": "doctrine/orm", + "version": "v2.6.6", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "2d9b9351831d1230881c52f006011cbf72fe944e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/2d9b9351831d1230881c52f006011cbf72fe944e", + "reference": "2d9b9351831d1230881c52f006011cbf72fe944e", + "shasum": "" + }, + "require": { + "doctrine/annotations": "~1.5", + "doctrine/cache": "~1.6", + "doctrine/collections": "^1.4", + "doctrine/common": "^2.7.1", + "doctrine/dbal": "^2.6", + "doctrine/instantiator": "~1.1", + "ext-pdo": "*", + "php": "^7.1", + "symfony/console": "~3.0|~4.0" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "phpunit/phpunit": "^7.5", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "bin": [ + "bin/doctrine" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "lib/Doctrine/ORM" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "orm" + ], + "time": "2019-11-18T22:01:21+00:00" + }, + { + "name": "doctrine/persistence", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "43526ae63312942e5316100bb3ed589ba1aba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/43526ae63312942e5316100bb3ed589ba1aba491", + "reference": "43526ae63312942e5316100bb3ed589ba1aba491", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/event-manager": "^1.0", + "doctrine/reflection": "^1.0", + "php": "^7.1" + }, + "conflict": { + "doctrine/common": "<2.10@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^5.0", + "phpstan/phpstan": "^0.8", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "time": "2019-04-23T12:39:21+00:00" + }, + { + "name": "doctrine/reflection", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/reflection.git", + "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.0", + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "doctrine/coding-standard": "^4.0", + "doctrine/common": "^2.8", + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpunit/phpunit": "^7.0", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Doctrine Reflection component", + "homepage": "https://www.doctrine-project.org/projects/reflection.html", + "keywords": [ + "reflection" + ], + "time": "2018-06-14T14:45:07+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.2.9", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "44c6787311242a979fa15c704327c20e7221a0e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4", + "reference": "44c6787311242a979fa15c704327c20e7221a0e4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "time": "2019-09-25T14:49:45+00:00" + }, + { + "name": "monolog/monolog", + "version": "1.25.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "d5e2fb341cb44f7e2ab639d12a1e5901091ec287" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/d5e2fb341cb44f7e2ab639d12a1e5901091ec287", + "reference": "d5e2fb341cb44f7e2ab639d12a1e5901091ec287", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/log": "~1.0" + }, + "provide": { + "psr/log-implementation": "1.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "graylog2/gelf-php": "~1.0", + "jakub-onderka/php-parallel-lint": "0.9", + "php-amqplib/php-amqplib": "~2.4", + "php-console/php-console": "^3.1.3", + "phpunit/phpunit": "~4.5", + "phpunit/phpunit-mock-objects": "2.3.0", + "ruflin/elastica": ">=0.90 <3.0", + "sentry/sentry": "^0.13", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server", + "sentry/sentry": "Allow sending log messages to a Sentry server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2019-11-13T10:00:05+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, + { + "name": "psr/log", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", + "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2019-11-01T11:05:21+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.7.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19", + "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "time": "2019-10-24T14:27:39+00:00" + }, + { + "name": "seld/phar-utils", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/7009b5139491975ef6486545a39f3e6dad5ac30a", + "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\PharUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phra" + ], + "time": "2015-10-13T18:44:15+00:00" + }, + { + "name": "symfony/config", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "7aa5817f1b7a8ed377752b90fcc47dfb3c67b40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/7aa5817f1b7a8ed377752b90fcc47dfb3c67b40c", + "reference": "7aa5817f1b7a8ed377752b90fcc47dfb3c67b40c", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/filesystem": "^3.4|^4.0|^5.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<3.4" + }, + "require-dev": { + "symfony/event-dispatcher": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/messenger": "^4.1|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2019-12-01T10:50:45+00:00" + }, + { + "name": "symfony/console", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "f0aea3df20d15635b3cb9730ca5eea1c65b7f201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/f0aea3df20d15635b3cb9730ca5eea1c65b7f201", + "reference": "f0aea3df20d15635b3cb9730ca5eea1c65b7f201", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3|>=5", + "symfony/lock": "<4.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/event-dispatcher": "^4.3", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/var-dumper": "^4.3|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2019-12-01T10:06:17+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "40c2606131d56eff6f193b6e2ceb92414653b591" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/40c2606131d56eff6f193b6e2ceb92414653b591", + "reference": "40c2606131d56eff6f193b6e2ceb92414653b591", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2019-11-26T23:16:41+00:00" + }, + { + "name": "symfony/finder", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "ce8743441da64c41e2a667b8eb66070444ed911e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/ce8743441da64c41e2a667b8eb66070444ed911e", + "reference": "ce8743441da64c41e2a667b8eb66070444ed911e", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2019-11-17T21:56:56+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "8bccc59e61b41963d14c3dbdb23181e5c932a1d5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8bccc59e61b41963d14c3dbdb23181e5c932a1d5", + "reference": "8bccc59e61b41963d14c3dbdb23181e5c932a1d5", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/mime": "^4.3|^5.0", + "symfony/polyfill-mbstring": "~1.1" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/expression-language": "^3.4|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2019-11-28T13:33:56+00:00" + }, + { + "name": "symfony/mime", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "010cc488e56cafe5f7494dea70aea93100c234df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/010cc488e56cafe5f7494dea70aea93100c234df", + "reference": "010cc488e56cafe5f7494dea70aea93100c234df", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10", + "symfony/dependency-injection": "^3.4|^4.1|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "time": "2019-11-30T08:27:26+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "reference": "6f9c239e61e1b0c9229a28ff89a812dc449c3d46", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.9" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T14:18:11+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/66fea50f6cb37a35eea048d75a7d99a45b586038", + "reference": "66fea50f6cb37a35eea048d75a7d99a45b586038", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T13:56:44+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.13.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/4b0e2222c55a25b4541305a053013d5647d3a25f", + "reference": "4b0e2222c55a25b4541305a053013d5647d3a25f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.13-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-11-27T16:25:15+00:00" + }, + { + "name": "symfony/process", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "51c0135ef3f44c5803b33dc60e96bf4f77752726" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/51c0135ef3f44c5803b33dc60e96bf4f77752726", + "reference": "51c0135ef3f44c5803b33dc60e96bf4f77752726", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2019-11-28T13:33:56+00:00" + }, + { + "name": "symfony/routing", + "version": "4.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "51f3f20ad29329a0bdf5c0e2f722d3764b065273" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/51f3f20ad29329a0bdf5c0e2f722d3764b065273", + "reference": "51f3f20ad29329a0bdf5c0e2f722d3764b065273", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "conflict": { + "symfony/config": "<4.2", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.4" + }, + "require-dev": { + "doctrine/annotations": "~1.2", + "psr/log": "~1.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "doctrine/annotations": "For using the annotation loader", + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Routing Component", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2019-12-01T08:39:58+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v1.1.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf", + "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-10-14T12:27:06+00:00" + }, + { + "name": "symfony/yaml", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "76de473358fe802578a415d5bb43c296cf09d211" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/76de473358fe802578a415d5bb43c296cf09d211", + "reference": "76de473358fe802578a415d5bb43c296cf09d211", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2019-11-12T14:51:11+00:00" + } + ], + "packages-dev": [ + { + "name": "dama/doctrine-test-bundle", + "version": "v5.0.5", + "source": { + "type": "git", + "url": "https://github.com/dmaicher/doctrine-test-bundle.git", + "reference": "a60b0712f4659eab710c49783713b4b43e3c3149" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/a60b0712f4659eab710c49783713b4b43e3c3149", + "reference": "a60b0712f4659eab710c49783713b4b43e3c3149", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9,>=2.9.3", + "doctrine/doctrine-bundle": "~1.4|~2.0", + "php": "^7.1", + "symfony/framework-bundle": "~3.4|~4.0" + }, + "require-dev": { + "phpunit/phpunit": "~7.0|~8.0", + "symfony/phpunit-bridge": "^4.3", + "symfony/yaml": "~2.8|~3.0|~4.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "DAMA\\DoctrineTestBundle\\": "src/DAMA/DoctrineTestBundle" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David Maicher", + "email": "mail@dmaicher.de" + } + ], + "description": "Symfony bundle to isolate doctrine database tests and improve test performance", + "keywords": [ + "Symfony 3", + "Symfony 4", + "doctrine", + "isolation", + "performance", + "symfony", + "symfony 2", + "tests" + ], + "time": "2019-11-25T10:12:28+00:00" + }, + { + "name": "doctrine/data-fixtures", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/data-fixtures.git", + "reference": "608a35a3b5bcc4214d116603095f8b0c51091592" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/608a35a3b5bcc4214d116603095f8b0c51091592", + "reference": "608a35a3b5bcc4214d116603095f8b0c51091592", + "shasum": "" + }, + "require": { + "doctrine/common": "^2.11", + "php": "^7.2" + }, + "conflict": { + "doctrine/phpcr-odm": "<1.3.0" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/coding-standard": "^6.0", + "doctrine/dbal": "^2.5.4", + "doctrine/mongodb-odm": "^1.3.0", + "doctrine/orm": "^2.5.4", + "phpunit/phpunit": "^7.0" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7", + "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures", + "doctrine/orm": "For loading ORM fixtures", + "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Data Fixtures for all Doctrine Object Managers", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database" + ], + "time": "2019-10-30T20:03:18+00:00" + }, + { + "name": "doctrine/doctrine-bundle", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineBundle.git", + "reference": "f96fac225563f5b3b4eeb2f80eb982b7f56484d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/f96fac225563f5b3b4eeb2f80eb982b7f56484d8", + "reference": "f96fac225563f5b3b4eeb2f80eb982b7f56484d8", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.9.0", + "jdorn/sql-formatter": "^1.2.16", + "php": "^7.1", + "symfony/cache": "^4.3.3|^5.0", + "symfony/config": "^4.3.3|^5.0", + "symfony/console": "^3.4.30|^4.3.3|^5.0", + "symfony/dependency-injection": "^4.3.3|^5.0", + "symfony/doctrine-bridge": "^4.3.7|^5.0", + "symfony/framework-bundle": "^3.4.30|^4.3.3|^5.0" + }, + "conflict": { + "doctrine/orm": "<2.6", + "twig/twig": "<1.34|>=2.0,<2.4" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "doctrine/orm": "^2.6", + "phpunit/phpunit": "^7.5", + "symfony/phpunit-bridge": "^4.2", + "symfony/property-info": "^4.3.3|^5.0", + "symfony/twig-bridge": "^3.4.30|^4.3.3|^5.0", + "symfony/validator": "^3.4.30|^4.3.3|^5.0", + "symfony/web-profiler-bundle": "^3.4.30|^4.3.3|^5.0", + "symfony/yaml": "^3.4.30|^4.3.3|^5.0", + "twig/twig": "^1.34|^2.12" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", + "symfony/web-profiler-bundle": "To use the data collector." + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\DoctrineBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org/" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "dbal", + "orm", + "persistence" + ], + "time": "2019-11-28T08:38:10+00:00" + }, + { + "name": "doctrine/doctrine-fixtures-bundle", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/DoctrineFixturesBundle.git", + "reference": "8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70", + "reference": "8f07fcfdac7f3591f3c4bf13a50cbae05f65ed70", + "shasum": "" + }, + "require": { + "doctrine/data-fixtures": "^1.3", + "doctrine/doctrine-bundle": "^1.11|^2.0", + "doctrine/orm": "^2.6.0", + "php": "^7.1", + "symfony/config": "^3.4|^4.3|^5.0", + "symfony/console": "^3.4|^4.3|^5.0", + "symfony/dependency-injection": "^3.4|^4.3|^5.0", + "symfony/doctrine-bridge": "^3.4|^4.1|^5.0", + "symfony/http-kernel": "^3.4|^4.3|^5.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.4", + "symfony/phpunit-bridge": "^4.1|^5.0" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Bundle\\FixturesBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Doctrine Project", + "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony DoctrineFixturesBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "Fixture", + "persistence" + ], + "time": "2019-11-13T15:46:58+00:00" + }, + { + "name": "jdorn/sql-formatter", + "version": "v1.2.17", + "source": { + "type": "git", + "url": "https://github.com/jdorn/sql-formatter.git", + "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", + "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "lib" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeremy Dorn", + "email": "jeremy@jeremydorn.com", + "homepage": "http://jeremydorn.com/" + } + ], + "description": "a PHP SQL highlighting library", + "homepage": "https://github.com/jdorn/sql-formatter/", + "keywords": [ + "highlight", + "sql" + ], + "time": "2014-01-12T16:20:24+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/007c053ae6f31bba39dfa19a7726f56e9763bbea", + "reference": "007c053ae6f31bba39dfa19a7726f56e9763bbea", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2019-08-09T12:45:53+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.3.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9a9981c347c5c49d6dfe5cf826bb882b824080dc", + "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "0.0.5", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2019-11-08T13:50:10+00:00" + }, + { + "name": "phar-io/manifest", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^2.0", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2018-07-08T19:23:20+00:00" + }, + { + "name": "phar-io/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2018-07-08T19:19:57+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", + "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "~6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2018-08-07T13:53:10+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "4.3.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/b83ff7cfcfee7827e1e78b637a5904fe6a96698e", + "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", + "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "doctrine/instantiator": "^1.0.5", + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^6.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2019-09-12T14:27:41+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "shasum": "" + }, + "require": { + "php": "^7.1", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "^7.1", + "mockery/mockery": "~1", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "time": "2019-08-22T18:11:29+00:00" + }, + { + "name": "phploc/phploc", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phploc.git", + "reference": "6a8a9416517b82d6326ac9c2d040ad53c13654eb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phploc/zipball/6a8a9416517b82d6326ac9c2d040ad53c13654eb", + "reference": "6a8a9416517b82d6326ac9c2d040ad53c13654eb", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "sebastian/finder-facade": "^1.1", + "sebastian/version": "^2.0", + "symfony/console": "^2.7|^3.0|^4.0" + }, + "bin": [ + "phploc" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "A tool for quickly measuring the size of a PHP project.", + "homepage": "https://github.com/sebastianbergmann/phploc", + "time": "2017-11-18T17:35:43+00:00" + }, + { + "name": "phpmetrics/phpmetrics", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpmetrics/PhpMetrics.git", + "reference": "39095017413805cd6d9ada16cfaf8aaffcb2fec4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmetrics/PhpMetrics/zipball/39095017413805cd6d9ada16cfaf8aaffcb2fec4", + "reference": "39095017413805cd6d9ada16cfaf8aaffcb2fec4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^3|^4", + "php": ">=5.5" + }, + "replace": { + "halleck45/php-metrics": "*", + "halleck45/phpmetrics": "*" + }, + "require-dev": { + "phpunit/phpunit": ">=4.8.27,<=5.7.13", + "sebastian/comparator": ">=1.2.3" + }, + "bin": [ + "bin/phpmetrics" + ], + "type": "library", + "autoload": { + "psr-0": { + "Hal\\": "./src/" + }, + "files": [ + "./src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jean-François Lépine", + "email": "lepinejeanfrancois@yahoo.fr", + "homepage": "http://www.lepine.pro", + "role": "Copyright Holder" + } + ], + "description": "Static analyzer tool for PHP : Coupling, Cyclomatic complexity, Maintainability Index, Halstead's metrics... and more !", + "homepage": "http://www.phpmetrics.org", + "keywords": [ + "analysis", + "qa", + "quality", + "testing" + ], + "time": "2018-07-10T17:19:33+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/f6811d96d97bdf400077a0cc100ae56aa32b9203", + "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", + "sebastian/comparator": "^1.1|^2.0|^3.0", + "sebastian/recursion-context": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.5|^3.2", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2019-10-03T11:07:50+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "6.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": "^7.1", + "phpunit/php-file-iterator": "^2.0", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.0", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.1 || ^4.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "suggest": { + "ext-xdebug": "^2.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2018-10-31T16:06:48+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "050bedf145a257b1ff02746c31894800e5122946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", + "reference": "050bedf145a257b1ff02746c31894800e5122946", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2018-09-13T20:33:42+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", + "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2019-06-07T04:22:29+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", + "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2019-09-17T06:23:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "7.5.17", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "4c92a15296e58191a4cd74cff3b34fc8e374174a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4c92a15296e58191a4cd74cff3b34fc8e374174a", + "reference": "4c92a15296e58191a4cd74cff3b34fc8e374174a", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "myclabs/deep-copy": "^1.7", + "phar-io/manifest": "^1.0.2", + "phar-io/version": "^2.0", + "php": "^7.1", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^6.0.7", + "phpunit/php-file-iterator": "^2.0.1", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1", + "sebastian/comparator": "^3.0", + "sebastian/diff": "^3.0", + "sebastian/environment": "^4.0", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0", + "sebastian/version": "^2.0.1" + }, + "conflict": { + "phpunit/phpunit-mock-objects": "*" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2019-10-28T10:37:36+00:00" + }, + { + "name": "psr/cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", + "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "time": "2016-08-06T20:24:11+00:00" + }, + { + "name": "roave/security-advisories", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Roave/SecurityAdvisories.git", + "reference": "e4ee2c8e4ccd908debc64069faf023c684a76760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/e4ee2c8e4ccd908debc64069faf023c684a76760", + "reference": "e4ee2c8e4ccd908debc64069faf023c684a76760", + "shasum": "" + }, + "conflict": { + "3f/pygmentize": "<1.2", + "adodb/adodb-php": "<5.20.12", + "alterphp/easyadmin-extension-bundle": ">=1.2,<1.2.11|>=1.3,<1.3.1", + "amphp/artax": "<1.0.6|>=2,<2.0.6", + "amphp/http": "<1.0.1", + "api-platform/core": ">=2.2,<2.2.10|>=2.3,<2.3.6", + "asymmetricrypt/asymmetricrypt": ">=0,<9.9.99", + "aws/aws-sdk-php": ">=3,<3.2.1", + "brightlocal/phpwhois": "<=4.2.5", + "bugsnag/bugsnag-laravel": ">=2,<2.0.2", + "cakephp/cakephp": ">=1.3,<1.3.18|>=2,<2.4.99|>=2.5,<2.5.99|>=2.6,<2.6.12|>=2.7,<2.7.6|>=3,<3.5.18|>=3.6,<3.6.15|>=3.7,<3.7.7", + "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cartalyst/sentry": "<=2.1.6", + "codeigniter/framework": "<=3.0.6", + "composer/composer": "<=1-alpha.11", + "contao-components/mediaelement": ">=2.14.2,<2.21.1", + "contao/core": ">=2,<3.5.39", + "contao/core-bundle": ">=4,<4.4.39|>=4.5,<4.7.5", + "contao/listing-bundle": ">=4,<4.4.8", + "datadog/dd-trace": ">=0.30,<0.30.2", + "david-garcia/phpwhois": "<=4.3.1", + "doctrine/annotations": ">=1,<1.2.7", + "doctrine/cache": ">=1,<1.3.2|>=1.4,<1.4.2", + "doctrine/common": ">=2,<2.4.3|>=2.5,<2.5.1", + "doctrine/dbal": ">=2,<2.0.8|>=2.1,<2.1.2", + "doctrine/doctrine-bundle": "<1.5.2", + "doctrine/doctrine-module": "<=0.7.1", + "doctrine/mongodb-odm": ">=1,<1.0.2", + "doctrine/mongodb-odm-bundle": ">=2,<3.0.1", + "doctrine/orm": ">=2,<2.4.8|>=2.5,<2.5.1", + "dompdf/dompdf": ">=0.6,<0.6.2", + "drupal/core": ">=7,<7.67|>=8,<8.6.16|>=8.7,<8.7.1|>8.7.3,<8.7.5", + "drupal/drupal": ">=7,<7.67|>=8,<8.6.16|>=8.7,<8.7.1|>8.7.3,<8.7.5", + "erusev/parsedown": "<1.7.2", + "ezsystems/ezplatform-admin-ui": ">=1.3,<1.3.5|>=1.4,<1.4.4", + "ezsystems/ezpublish-kernel": ">=5.3,<5.3.12.1|>=5.4,<5.4.13.1|>=6,<6.7.9.1|>=6.8,<6.13.5.1|>=7,<7.2.4.1|>=7.3,<7.3.2.1", + "ezsystems/ezpublish-legacy": ">=5.3,<5.3.12.6|>=5.4,<5.4.12.3|>=2011,<2017.12.4.3|>=2018.6,<2018.6.1.4|>=2018.9,<2018.9.1.3", + "ezsystems/repository-forms": ">=2.3,<2.3.2.1", + "ezyang/htmlpurifier": "<4.1.1", + "firebase/php-jwt": "<2", + "fooman/tcpdf": "<6.2.22", + "fossar/tcpdf-parser": "<6.2.22", + "friendsofsymfony/rest-bundle": ">=1.2,<1.2.2", + "friendsofsymfony/user-bundle": ">=1.2,<1.3.5", + "fuel/core": "<1.8.1", + "gree/jose": "<=2.2", + "gregwar/rst": "<1.0.3", + "guzzlehttp/guzzle": ">=4-rc.2,<4.2.4|>=5,<5.3.1|>=6,<6.2.1", + "illuminate/auth": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.10", + "illuminate/cookie": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "illuminate/database": ">=4,<4.0.99|>=4.1,<4.1.29", + "illuminate/encryption": ">=4,<=4.0.11|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.40|>=5.6,<5.6.15", + "ivankristianto/phpwhois": "<=4.3", + "james-heinrich/getid3": "<1.9.9", + "joomla/session": "<1.3.1", + "jsmitty12/phpwhois": "<5.1", + "kazist/phpwhois": "<=4.2.6", + "kreait/firebase-php": ">=3.2,<3.8.1", + "la-haute-societe/tcpdf": "<6.2.22", + "laravel/framework": ">=4,<4.0.99|>=4.1,<=4.1.31|>=4.2,<=4.2.22|>=5,<=5.0.35|>=5.1,<=5.1.46|>=5.2,<=5.2.45|>=5.3,<=5.3.31|>=5.4,<=5.4.36|>=5.5,<5.5.42|>=5.6,<5.6.30", + "laravel/socialite": ">=1,<1.0.99|>=2,<2.0.10", + "league/commonmark": "<0.18.3", + "magento/magento1ce": "<1.9.4.3", + "magento/magento1ee": ">=1,<1.14.4.3", + "magento/product-community-edition": ">=2,<2.2.10|>=2.3,<2.3.2", + "monolog/monolog": ">=1.8,<1.12", + "namshi/jose": "<2.2", + "onelogin/php-saml": "<2.10.4", + "openid/php-openid": "<2.3", + "oro/crm": ">=1.7,<1.7.4", + "oro/platform": ">=1.7,<1.7.4", + "padraic/humbug_get_contents": "<1.1.2", + "pagarme/pagarme-php": ">=0,<3", + "paragonie/random_compat": "<2", + "paypal/merchant-sdk-php": "<3.12", + "pear/archive_tar": "<1.4.4", + "phpmailer/phpmailer": ">=5,<5.2.27|>=6,<6.0.6", + "phpoffice/phpexcel": "<=1.8.1", + "phpoffice/phpspreadsheet": "<=1.5", + "phpunit/phpunit": ">=4.8.19,<4.8.28|>=5.0.10,<5.6.3", + "phpwhois/phpwhois": "<=4.2.5", + "phpxmlrpc/extras": "<0.6.1", + "propel/propel": ">=2-alpha.1,<=2-alpha.7", + "propel/propel1": ">=1,<=1.7.1", + "pusher/pusher-php-server": "<2.2.1", + "robrichards/xmlseclibs": ">=1,<3.0.4", + "sabre/dav": ">=1.6,<1.6.99|>=1.7,<1.7.11|>=1.8,<1.8.9", + "sensiolabs/connect": "<4.2.3", + "serluck/phpwhois": "<=4.2.6", + "shopware/shopware": "<5.3.7", + "silverstripe/cms": ">=3,<=3.0.11|>=3.1,<3.1.11", + "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/framework": ">=3,<3.6.7|>=3.7,<3.7.3|>=4,<4.4", + "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.1.2", + "silverstripe/registry": ">=2.1,<2.1.2|>=2.2,<2.2.1", + "silverstripe/restfulserver": ">=1,<1.0.9|>=2,<2.0.4", + "silverstripe/userforms": "<3", + "simple-updates/phpwhois": "<=1", + "simplesamlphp/saml2": "<1.10.6|>=2,<2.3.8|>=3,<3.1.4", + "simplesamlphp/simplesamlphp": "<1.17.8", + "simplesamlphp/simplesamlphp-module-infocard": "<1.0.1", + "slim/slim": "<2.6", + "smarty/smarty": "<3.1.33", + "socalnick/scn-social-auth": "<1.15.2", + "spoonity/tcpdf": "<6.2.22", + "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", + "stormpath/sdk": ">=0,<9.9.99", + "studio-42/elfinder": "<2.1.48", + "swiftmailer/swiftmailer": ">=4,<5.4.5", + "sylius/admin-bundle": ">=1,<1.0.17|>=1.1,<1.1.9|>=1.2,<1.2.2", + "sylius/grid": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/grid-bundle": ">=1,<1.1.19|>=1.2,<1.2.18|>=1.3,<1.3.13|>=1.4,<1.4.5|>=1.5,<1.5.1", + "sylius/sylius": ">=1,<1.1.18|>=1.2,<1.2.17|>=1.3,<1.3.12|>=1.4,<1.4.4", + "symfony/cache": ">=3.1,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/dependency-injection": ">=2,<2.0.17|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/form": ">=2.3,<2.3.35|>=2.4,<2.6.12|>=2.7,<2.7.50|>=2.8,<2.8.49|>=3,<3.4.20|>=4,<4.0.15|>=4.1,<4.1.9|>=4.2,<4.2.1", + "symfony/framework-bundle": ">=2,<2.3.18|>=2.4,<2.4.8|>=2.5,<2.5.2|>=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/http-foundation": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/http-kernel": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/intl": ">=2.7,<2.7.38|>=2.8,<2.8.31|>=3,<3.2.14|>=3.3,<3.3.13", + "symfony/mime": ">=4.3,<4.3.8", + "symfony/phpunit-bridge": ">=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/polyfill": ">=1,<1.10", + "symfony/polyfill-php55": ">=1,<1.10", + "symfony/proxy-manager-bridge": ">=2.7,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/routing": ">=2,<2.0.19", + "symfony/security": ">=2,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.1.12|>=4.2,<4.2.7", + "symfony/security-bundle": ">=2,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-core": ">=2.4,<2.6.13|>=2.7,<2.7.9|>=2.7.30,<2.7.32|>=2.8,<2.8.37|>=3,<3.3.17|>=3.4,<3.4.7|>=4,<4.0.7", + "symfony/security-csrf": ">=2.4,<2.7.48|>=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-guard": ">=2.8,<2.8.41|>=3,<3.3.17|>=3.4,<3.4.11|>=4,<4.0.11", + "symfony/security-http": ">=2.3,<2.3.41|>=2.4,<2.7.51|>=2.8,<2.8.50|>=3,<3.4.26|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/serializer": ">=2,<2.0.11", + "symfony/symfony": ">=2,<2.8.52|>=3,<3.4.35|>=4,<4.2.12|>=4.3,<4.3.8", + "symfony/translation": ">=2,<2.0.17", + "symfony/validator": ">=2,<2.0.24|>=2.1,<2.1.12|>=2.2,<2.2.5|>=2.3,<2.3.3", + "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", + "symfony/web-profiler-bundle": ">=2,<2.3.19|>=2.4,<2.4.9|>=2.5,<2.5.4", + "symfony/yaml": ">=2,<2.0.22|>=2.1,<2.1.7", + "tecnickcom/tcpdf": "<6.2.22", + "thelia/backoffice-default-template": ">=2.1,<2.1.2", + "thelia/thelia": ">=2.1-beta.1,<2.1.3", + "theonedemon/phpwhois": "<=4.2.5", + "titon/framework": ">=0,<9.9.99", + "truckersmp/phpwhois": "<=4.3.1", + "twig/twig": "<1.38|>=2,<2.7", + "typo3/cms": ">=6.2,<6.2.30|>=7,<7.6.32|>=8,<8.7.27|>=9,<9.5.8", + "typo3/cms-core": ">=8,<8.7.27|>=9,<9.5.8", + "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.10|>=3.1,<3.1.7|>=3.2,<3.2.7|>=3.3,<3.3.5", + "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4", + "typo3/phar-stream-wrapper": ">=1,<2.1.1|>=3,<3.1.1", + "ua-parser/uap-php": "<3.8", + "wallabag/tcpdf": "<6.2.22", + "willdurand/js-translation-bundle": "<2.1.1", + "yiisoft/yii": ">=1.1.14,<1.1.15", + "yiisoft/yii2": "<2.0.15", + "yiisoft/yii2-bootstrap": "<2.0.4", + "yiisoft/yii2-dev": "<2.0.15", + "yiisoft/yii2-elasticsearch": "<2.0.5", + "yiisoft/yii2-gii": "<2.0.4", + "yiisoft/yii2-jui": "<2.0.4", + "yiisoft/yii2-redis": "<2.0.8", + "zendframework/zend-cache": ">=2.4,<2.4.8|>=2.5,<2.5.3", + "zendframework/zend-captcha": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-crypt": ">=2,<2.4.9|>=2.5,<2.5.2", + "zendframework/zend-db": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.10|>=2.3,<2.3.5", + "zendframework/zend-developer-tools": ">=1.2.2,<1.2.3", + "zendframework/zend-diactoros": ">=1,<1.8.4", + "zendframework/zend-feed": ">=1,<2.10.3", + "zendframework/zend-form": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-http": ">=1,<2.8.1", + "zendframework/zend-json": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zend-ldap": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.8|>=2.3,<2.3.3", + "zendframework/zend-mail": ">=2,<2.4.11|>=2.5,<2.7.2", + "zendframework/zend-navigation": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-session": ">=2,<2.0.99|>=2.1,<2.1.99|>=2.2,<2.2.9|>=2.3,<2.3.4", + "zendframework/zend-validator": ">=2.3,<2.3.6", + "zendframework/zend-view": ">=2,<2.2.7|>=2.3,<2.3.1", + "zendframework/zend-xmlrpc": ">=2.1,<2.1.6|>=2.2,<2.2.6", + "zendframework/zendframework": "<2.5.1", + "zendframework/zendframework1": "<1.12.20", + "zendframework/zendopenid": ">=2,<2.0.2", + "zendframework/zendxml": ">=1,<1.0.1", + "zetacomponents/mail": "<1.8.2", + "zf-commons/zfc-user": "<1.2.2", + "zfcampus/zf-apigility-doctrine": ">=1,<1.0.3", + "zfr/zfr-oauth2-server-module": "<0.1.2" + }, + "type": "metapackage", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "role": "maintainer" + } + ], + "description": "Prevents installation of composer packages with known security vulnerabilities: no API, simply require it", + "time": "2019-12-02T13:03:15+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7 || ^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2017-03-04T06:30:41+00:00" + }, + { + "name": "sebastian/comparator", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "shasum": "" + }, + "require": { + "php": "^7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2018-07-12T15:12:46+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "time": "2019-02-04T06:01:07+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2019-11-20T08:46:58+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", + "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2019-09-14T09:02:43+00:00" + }, + { + "name": "sebastian/finder-facade", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/finder-facade.git", + "reference": "4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f", + "reference": "4a3174709c2dc565fe5fb26fcf827f6a1fc7b09f", + "shasum": "" + }, + "require": { + "symfony/finder": "~2.3|~3.0|~4.0", + "theseer/fdomdocument": "~1.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", + "homepage": "https://github.com/sebastianbergmann/finder-facade", + "time": "2017-11-18T17:31:49+00:00" + }, + { + "name": "sebastian/global-state", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2017-04-27T15:39:26+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "shasum": "" + }, + "require": { + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2017-08-03T12:35:26+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2017-03-03T06:23:57+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2018-10-04T04:07:39+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "symfony/cache", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "de737c81ea95018d11a3ef908ad2ebf203741b96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/de737c81ea95018d11a3ef908ad2ebf203741b96", + "reference": "de737c81ea95018d11a3ef908ad2ebf203741b96", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/cache": "~1.0", + "psr/log": "~1.0", + "symfony/cache-contracts": "^1.1.7|^2", + "symfony/service-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.2|^5.0" + }, + "conflict": { + "doctrine/dbal": "<2.5", + "symfony/dependency-injection": "<3.4", + "symfony/http-kernel": "<4.4", + "symfony/var-dumper": "<4.4" + }, + "provide": { + "psr/cache-implementation": "1.0", + "psr/simple-cache-implementation": "1.0", + "symfony/cache-implementation": "1.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/cache": "~1.6", + "doctrine/dbal": "~2.5", + "predis/predis": "~1.1", + "psr/simple-cache": "^1.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.1|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Cache component with PSR-6, PSR-16, and tags", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "time": "2019-12-01T10:50:45+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v1.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "af50d14ada9e4e82cfabfabdc502d144f89be0a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/af50d14ada9e4e82cfabfabdc502d144f89be0a1", + "reference": "af50d14ada9e4e82cfabfabdc502d144f89be0a1", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/cache": "^1.0" + }, + "suggest": { + "symfony/cache-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-10-04T21:43:27+00:00" + }, + { + "name": "symfony/debug", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "b8600a1d7d20b0e80906398bb1f50612fa074a8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/b8600a1d7d20b0e80906398bb1f50612fa074a8e", + "reference": "b8600a1d7d20b0e80906398bb1f50612fa074a8e", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "^3.4|^4.0|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2019-11-28T13:33:56+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "ad46a4def1325befab696b49c839dffea3fc92bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/ad46a4def1325befab696b49c839dffea3fc92bd", + "reference": "ad46a4def1325befab696b49c839dffea3fc92bd", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0", + "symfony/service-contracts": "^1.1.6|^2" + }, + "conflict": { + "symfony/config": "<4.3|>=5.0", + "symfony/finder": "<3.4", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0", + "symfony/service-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "^4.3", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2019-12-01T10:19:36+00:00" + }, + { + "name": "symfony/doctrine-bridge", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-bridge.git", + "reference": "31c3d72f9e7a03e1b9d136084a9201c2225ee348" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/31c3d72f9e7a03e1b9d136084a9201c2225ee348", + "reference": "31c3d72f9e7a03e1b9d136084a9201c2225ee348", + "shasum": "" + }, + "require": { + "doctrine/event-manager": "~1.0", + "doctrine/persistence": "~1.0", + "php": "^7.1.3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^1.1|^2" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/dependency-injection": "<3.4", + "symfony/form": "<4.4", + "symfony/http-kernel": "<4.3.7", + "symfony/messenger": "<4.3", + "symfony/security-core": "<4.4", + "symfony/validator": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.6", + "doctrine/collections": "~1.0", + "doctrine/data-fixtures": "1.0.*", + "doctrine/dbal": "~2.4", + "doctrine/orm": "^2.6.3", + "doctrine/reflection": "~1.0", + "symfony/config": "^4.2|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/form": "^4.4|^5.0", + "symfony/http-kernel": "^4.3.7", + "symfony/messenger": "^4.4|^5.0", + "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4|^4.0|^5.0", + "symfony/proxy-manager-bridge": "^3.4|^4.0|^5.0", + "symfony/security-core": "^4.4|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/translation": "^3.4|^4.0|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/var-dumper": "^3.4|^4.0|^5.0" + }, + "suggest": { + "doctrine/data-fixtures": "", + "doctrine/dbal": "", + "doctrine/orm": "", + "symfony/form": "", + "symfony/property-info": "", + "symfony/validator": "" + }, + "type": "symfony-bridge", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Doctrine\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Doctrine Bridge", + "homepage": "https://symfony.com", + "time": "2019-12-01T08:39:58+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "a1ad02d62789efed1d2b2796f1c15e0c6a00fc3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/a1ad02d62789efed1d2b2796f1c15e0c6a00fc3b", + "reference": "a1ad02d62789efed1d2b2796f1c15e0c6a00fc3b", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0", + "symfony/debug": "^4.4", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ErrorHandler Component", + "homepage": "https://symfony.com", + "time": "2019-12-01T08:46:01+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "b3c3068a72623287550fe20b84a2b01dcba2686f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b3c3068a72623287550fe20b84a2b01dcba2686f", + "reference": "b3c3068a72623287550fe20b84a2b01dcba2686f", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/event-dispatcher-contracts": "^1.1" + }, + "conflict": { + "symfony/dependency-injection": "<3.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "1.1" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^3.4|^4.0|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^3.4|^4.0|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2019-11-28T13:33:56+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v1.1.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c43ab685673fb6c8d84220c77897b1d6cdbe1d18", + "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "suggest": { + "psr/event-dispatcher": "", + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-09-17T09:54:03+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "69ac426bfaca9270e549cea184eece00357f2675" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/69ac426bfaca9270e549cea184eece00357f2675", + "reference": "69ac426bfaca9270e549cea184eece00357f2675", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "php": "^7.1.3", + "symfony/cache": "^4.4|^5.0", + "symfony/config": "^4.3.4|^5.0", + "symfony/dependency-injection": "^4.4.1|^5.0.1", + "symfony/error-handler": "^4.4.1|^5.0.1", + "symfony/filesystem": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/http-kernel": "^4.4", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^4.4|^5.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.0", + "phpdocumentor/type-resolver": "<0.2.1", + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/asset": "<3.4", + "symfony/browser-kit": "<4.3", + "symfony/console": "<4.3", + "symfony/dom-crawler": "<4.3", + "symfony/dotenv": "<4.3.6", + "symfony/form": "<4.3.5", + "symfony/http-client": "<4.4", + "symfony/lock": "<4.4", + "symfony/mailer": "<4.4", + "symfony/messenger": "<4.4", + "symfony/mime": "<4.4", + "symfony/property-info": "<3.4", + "symfony/security-bundle": "<4.4", + "symfony/serializer": "<4.4", + "symfony/stopwatch": "<3.4", + "symfony/translation": "<4.4", + "symfony/twig-bridge": "<4.1.1", + "symfony/twig-bundle": "<4.4", + "symfony/validator": "<4.4", + "symfony/web-profiler-bundle": "<4.4", + "symfony/workflow": "<4.3.6" + }, + "require-dev": { + "doctrine/annotations": "~1.7", + "doctrine/cache": "~1.0", + "paragonie/sodium_compat": "^1.8", + "phpdocumentor/reflection-docblock": "^3.0|^4.0", + "symfony/asset": "^3.4|^4.0|^5.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/console": "^4.3.4|^5.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dom-crawler": "^4.3|^5.0", + "symfony/dotenv": "^4.3.6|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/form": "^4.3.5|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/mailer": "^4.4|^5.0", + "symfony/messenger": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/property-info": "^3.4|^4.0|^5.0", + "symfony/security-csrf": "^3.4|^4.0|^5.0", + "symfony/security-http": "^3.4|^4.0|^5.0", + "symfony/serializer": "^4.4|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/twig-bundle": "^4.4|^5.0", + "symfony/validator": "^4.4|^5.0", + "symfony/web-link": "^4.4|^5.0", + "symfony/workflow": "^4.3.6|^5.0", + "symfony/yaml": "^3.4|^4.0|^5.0", + "twig/twig": "^1.41|^2.10|^3.0" + }, + "suggest": { + "ext-apcu": "For best performance of the system caches", + "symfony/console": "For using the console commands", + "symfony/form": "For using forms", + "symfony/property-info": "For using the property_info service", + "symfony/serializer": "For using the serializer service", + "symfony/validator": "For using validation", + "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", + "symfony/yaml": "For using the debug:config and lint:yaml commands" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony FrameworkBundle", + "homepage": "https://symfony.com", + "time": "2019-11-28T14:12:27+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "e4187780ed26129ee86d5234afbebf085e144f88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e4187780ed26129ee86d5234afbebf085e144f88", + "reference": "e4187780ed26129ee86d5234afbebf085e144f88", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/log": "~1.0", + "symfony/error-handler": "^4.4", + "symfony/event-dispatcher": "^4.4", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9" + }, + "conflict": { + "symfony/browser-kit": "<4.3", + "symfony/config": "<3.4", + "symfony/console": ">=5", + "symfony/dependency-injection": "<4.3", + "symfony/translation": "<4.2", + "twig/twig": "<1.34|<2.4,>=2" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/cache": "~1.0", + "symfony/browser-kit": "^4.3|^5.0", + "symfony/config": "^3.4|^4.0|^5.0", + "symfony/console": "^3.4|^4.0", + "symfony/css-selector": "^3.4|^4.0|^5.0", + "symfony/dependency-injection": "^4.3|^5.0", + "symfony/dom-crawler": "^3.4|^4.0|^5.0", + "symfony/expression-language": "^3.4|^4.0|^5.0", + "symfony/finder": "^3.4|^4.0|^5.0", + "symfony/process": "^3.4|^4.0|^5.0", + "symfony/routing": "^3.4|^4.0|^5.0", + "symfony/stopwatch": "^3.4|^4.0|^5.0", + "symfony/templating": "^3.4|^4.0|^5.0", + "symfony/translation": "^4.2|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpKernel Component", + "homepage": "https://symfony.com", + "time": "2019-12-01T14:06:38+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "0a89a1dbbedd9fb2cfb2336556dec8305273c19a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0a89a1dbbedd9fb2cfb2336556dec8305273c19a", + "reference": "0a89a1dbbedd9fb2cfb2336556dec8305273c19a", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" + }, + "conflict": { + "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0", + "symfony/console": "<3.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^3.4|^4.0|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^1.34|^2.4|^3.0" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony mechanism for exploring and dumping PHP variables", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2019-11-28T13:33:56+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v4.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "e566070effe60b8d16b99e958cdbd92aa2e470cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/e566070effe60b8d16b99e958cdbd92aa2e470cb", + "reference": "e566070effe60b8d16b99e958cdbd92aa2e470cb", + "shasum": "" + }, + "require": { + "php": "^7.1.3" + }, + "require-dev": { + "symfony/var-dumper": "^4.1.1|^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A blend of var_export() + serialize() to turn any serializable data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "serialize" + ], + "time": "2019-12-01T08:39:58+00:00" + }, + { + "name": "theseer/fdomdocument", + "version": "1.6.6", + "source": { + "type": "git", + "url": "https://github.com/theseer/fDOMDocument.git", + "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/6e8203e40a32a9c770bcb62fe37e68b948da6dca", + "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "lib-libxml": "*", + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "lead" + } + ], + "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.", + "homepage": "https://github.com/theseer/fDOMDocument", + "time": "2017-06-30T11:53:12+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2019-06-13T22:48:21+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "573381c0a64f155a0d9a23f4b0c797194805b925" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/573381c0a64f155a0d9a23f4b0c797194805b925", + "reference": "573381c0a64f155a0d9a23f4b0c797194805b925", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "vimeo/psalm": "<3.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2019-11-24T13:36:37+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "symfony/routing": 20, + "roave/security-advisories": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "platform-overrides": { + "php": "7.2.0" + } +} diff --git a/config/.gitkeep b/config/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/core/app/engine/.editorconfig b/core/app/engine/.editorconfig new file mode 100644 index 000000000..6e87a003d --- /dev/null +++ b/core/app/engine/.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/core/app/engine/.gitignore b/core/app/engine/.gitignore new file mode 100644 index 000000000..29e99e655 --- /dev/null +++ b/core/app/engine/.gitignore @@ -0,0 +1,56 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events.json +speed-measure-plugin.json + +# 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 +.history/* + +# misc +*.css.map +.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db + +src/app/app-files/* +!src/app/app-files/.gitkeep +src/app/config-local.ts +/nbproject diff --git a/core/app/engine/README.md b/core/app/engine/README.md new file mode 100644 index 000000000..732b4ff1f --- /dev/null +++ b/core/app/engine/README.md @@ -0,0 +1,108 @@ +# SuiteCRM + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.3.4. + +## 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). + +# Creating in-build SVG files: + +usage of svgbuild.js: `node svgbuild.js [folder-of-svg-files] [svg-icon-template-html]` + +# Creating local config: + +Set your local specific changes in `config-local.ts`. +See more in `config-example.ts`. + +(Note: You can make more environment specific configuration and set your config class in `config-class.ts`.) + +example for `config-local.ts`: +``` +import { ConfigExample } from './config-example'; + +export class ConfigLocal extends ConfigExample { + + // add your local config overrides here.. + + constructor() { + super(); + + // override the config variables separately: + this.fakeApiUrls.fakeBaseUrl = 'http://localhost/scrm8/fakeapi.php?'; + } +} +``` +# Front End Testing + +Front end tests are created to ensure the application runs as expected from start to finish for the end user + +The Angular CLI downloads and install everything you need to test an Angular application with the Jasmine test framework + +## Running Tests + +The project you create with the CLI is immediately ready to test + +Simply run the CLI command: + +```ng test [options]``` +OR +```ng t [options]``` + +For full testing options, see: https://angular.io/cli/test#options + +### Karma configuration + +Karma is the task runner for the tests written in Jasmine + +There is a config created called karma.conf.js + +The Angular CLI configuration of Karma uses the file “test.ts” as the entry point of the tests for the application + +Within each component there is a test file where you add your unit test code + +This will normally be automatically generated by the CLI as {component-name}.spec.ts as standard + +Karma picks up files with extension '.spec.ts' as test files + +## End-To-End Testing + +In addition to running standard tests, you can run end to end tests within the Angular CLI using: + +```ng e2e [options]``` + OR +```ng e [options]``` + +For full testing options, see: https://angular.io/cli/e2e#options + +The end-to-end tests build and serve your Angular app, then run end-to-end tests using Protractor + +This allows you to run end-to-end testing from a user's perspective + +The tests ensure the application runs as expected from start to finish + +As the tests run, you will see the browser interaction just as you would see it from the user perspective + +To run the tests, Protractor depends on two files + +The spec files inside the e2e folder and the 'protractor.conf.json' file diff --git a/core/app/engine/angular.json b/core/app/engine/angular.json new file mode 100644 index 000000000..c6a59ba63 --- /dev/null +++ b/core/app/engine/angular.json @@ -0,0 +1,138 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "SuiteCRM": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "scrm", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.app.json", + "assets": [ + "src/favicon.ico", + "src/assets" + ], + "scripts": [], + "styles": [ + "node_modules/bootstrap-css-only/css/bootstrap.min.css", + "src/assets/themes/suite8/css/style.min.css" + ] + }, + "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": "SuiteCRM:build" + }, + "configurations": { + "production": { + "browserTarget": "SuiteCRM:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "SuiteCRM: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": [ + "node_modules/bootstrap-css-only/css/bootstrap.min.css", + "themes/suite8/css/style.min.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/**" + ] + } + } + } + }, + "SuiteCRM-e2e": { + "root": "e2e", + "projectType": "application", + "prefix": "", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "SuiteCRM:serve" + }, + "configurations": { + "production": { + "devServerTarget": "SuiteCRM:serve:production" + } + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "SuiteCRM", + "schematics": { + "@schematics/angular:component": { + "prefix": "app", + "styleext": "css" + }, + "@schematics/angular:directive": { + "prefix": "app" + } + } +} \ No newline at end of file diff --git a/core/app/engine/e2e/app.e2e-spec.ts b/core/app/engine/e2e/app.e2e-spec.ts new file mode 100644 index 000000000..785b2cec3 --- /dev/null +++ b/core/app/engine/e2e/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import {AppPage} from './app.po'; + +describe('dynamic-component-loader App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('Welcome to app!'); + }); +}); diff --git a/core/app/engine/e2e/app.po.ts b/core/app/engine/e2e/app.po.ts new file mode 100644 index 000000000..27fb1afae --- /dev/null +++ b/core/app/engine/e2e/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/core/app/engine/e2e/tsconfig.e2e.json b/core/app/engine/e2e/tsconfig.e2e.json new file mode 100644 index 000000000..1d9e5edf0 --- /dev/null +++ b/core/app/engine/e2e/tsconfig.e2e.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/core/app/engine/package-lock.json b/core/app/engine/package-lock.json new file mode 100644 index 000000000..b2e52aed2 --- /dev/null +++ b/core/app/engine/package-lock.json @@ -0,0 +1,12059 @@ +{ + "name": "suitecrm", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.12.4.tgz", + "integrity": "sha512-19f3jbGyP+GzTSBgrHR4SWGK81SUgtTxhkAcyhmsIEDuXrMJM8kPu0HB9WivJ5p08+jzwz6xdF9mpNYSeD9uqw==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.2.4", + "rxjs": "6.3.3" + }, + "dependencies": { + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.12.4.tgz", + "integrity": "sha512-zzjpM9GpCGEUtTPv/T04CALzFXkTgAAiNt1whY1Vmtu2YYUksXOm1ysA2RBLEhb81RodTEwVV2zFUj5v2xHYEw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.12.4", + "@angular-devkit/build-optimizer": "0.12.4", + "@angular-devkit/build-webpack": "0.12.4", + "@angular-devkit/core": "7.2.4", + "@ngtools/webpack": "7.2.4", + "ajv": "6.6.2", + "autoprefixer": "9.4.3", + "circular-dependency-plugin": "5.0.2", + "clean-css": "4.2.1", + "copy-webpack-plugin": "4.6.0", + "file-loader": "2.0.0", + "glob": "7.1.3", + "istanbul": "0.4.5", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.3.0", + "less": "3.9.0", + "less-loader": "4.1.0", + "license-webpack-plugin": "2.0.4", + "loader-utils": "1.1.0", + "mini-css-extract-plugin": "0.4.4", + "minimatch": "3.0.4", + "node-sass": "4.10.0", + "opn": "5.4.0", + "parse5": "4.0.0", + "portfinder": "1.0.17", + "postcss": "7.0.13", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "0.5.1", + "rxjs": "6.3.3", + "sass-loader": "7.1.0", + "semver": "5.5.1", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.9", + "speed-measure-webpack-plugin": "1.2.5", + "stats-webpack-plugin": "0.7.0", + "style-loader": "0.23.1", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser-webpack-plugin": "1.2.1", + "tree-kill": "1.2.0", + "webpack": "4.28.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.6" + }, + "dependencies": { + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.12.4.tgz", + "integrity": "sha512-KraU+ZARX7JMtttPjOku9wVF+dnjMsIbiIVsQrNXhpFiGT1fSJhQTPxc98ONgEmUiGROFXXq2mHLilvMr2WdwQ==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "source-map": "0.5.6", + "typescript": "3.2.4", + "webpack-sources": "1.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", + "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 + } + } + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.12.4.tgz", + "integrity": "sha512-1+t2MUB+dq+1LbfTnvzZwj2QTWiugyMywXqYjsyt0rrh7VcriD1lQ+P5yN8kgFz/R7Ut4LgvS05yDX1JHi20qw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.12.4", + "@angular-devkit/core": "7.2.4", + "rxjs": "6.3.3" + }, + "dependencies": { + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/core": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.4.tgz", + "integrity": "sha512-XHF59tIHg2qEM1Wd415xhykBLjjfOK6yMB7CjNk1bToUMX2QDT87izJF4y1Vwa0lIw9G0jdgP/4/M/OqXcbYmA==", + "dev": true, + "requires": { + "ajv": "6.6.2", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.3.9.tgz", + "integrity": "sha512-xzROGCYp7aQbeJ3V6YC0MND7wKEAdWqmm/GaCufEk0dDS8ZGe0sQhcM2oBRa2nQqGQNeThFIH51kx+FayrJP0w==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.3.9", + "rxjs": "6.3.3" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.9.tgz", + "integrity": "sha512-SaxD+nKFW3iCBKsxNR7+66J30EexW/y7tm8m5AvUH+GwSAgIj0ZYmRUzFEPggcaLVA4WnE/YWqIXZMJW5dT7gw==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@angular/animations": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.15.tgz", + "integrity": "sha512-8oBt3HLgd2+kyJHUgsd7OzKCCss67t2sch15XNoIWlOLfxclqU+EfFE6t/vCzpT8/+lpZS6LU9ZrTnb+UBj5jg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cdk": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-7.3.7.tgz", + "integrity": "sha512-xbXxhHHKGkVuW6K7pzPmvpJXIwpl0ykBnvA2g+/7Sgy5Pd35wCC+UtHD9RYczDM/mkygNxMQtagyCErwFnDtQA==", + "requires": { + "parse5": "^5.0.0", + "tslib": "^1.7.1" + } + }, + "@angular/cli": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.3.9.tgz", + "integrity": "sha512-7oJj7CKDlFUbQav1x1CV4xKKcbt0pnxY4unKcm7Q1tVXhu8bU2bc3cDA0aJnbofcYb6TJcd/C2qHgCt78q7edA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.13.9", + "@angular-devkit/core": "7.3.9", + "@angular-devkit/schematics": "7.3.9", + "@schematics/angular": "7.3.9", + "@schematics/update": "0.13.9", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "inquirer": "6.2.1", + "npm-package-arg": "6.1.0", + "open": "6.0.0", + "pacote": "9.4.0", + "semver": "5.6.0", + "symbol-observable": "1.2.0" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.13.9.tgz", + "integrity": "sha512-EAFtCs9dsGhpMRC45PoYsrkiExpWz9Ax15qXfzwdDRacz5DmdOVt+QpkLW1beUOwiyj/bhFyj23eaONK2RTn/w==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.3.9", + "rxjs": "6.3.3" + } + }, + "@angular-devkit/core": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.9.tgz", + "integrity": "sha512-SaxD+nKFW3iCBKsxNR7+66J30EexW/y7tm8m5AvUH+GwSAgIj0ZYmRUzFEPggcaLVA4WnE/YWqIXZMJW5dT7gw==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.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 + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@angular/common": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.2.15.tgz", + "integrity": "sha512-2b5JY2HWVHCf3D1GZjmde7jdAXSTXkYtmjLtA9tQkjOOTr80eHpNSujQqnzb97dk9VT9OjfjqTQd7K3pxZz8jw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.15.tgz", + "integrity": "sha512-5yb4NcLk8GuXkYf7Dcor4XkGueYp4dgihzDmMjYDUrV0NPhubKlr+SwGtLOtzgRBWJ1I2bO0S3zwa0q0OgIPOw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.2.15.tgz", + "integrity": "sha512-+AsfyKawmj/sa+m4Pz8VSRFbCfx/3IOjAuuEjhopbyr154YpPDSu8NTbcwzq3yfbVcPwK4/4exmbQzpsndaCTg==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "shelljs": "^0.8.1", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "9.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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 + }, + "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" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.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" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "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 + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "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-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 + }, + "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" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^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": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "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 + }, + "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 + }, + "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": { + "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 + }, + "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" + } + } + } + }, + "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" + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.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", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "@angular/core": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.15.tgz", + "integrity": "sha512-XsuYm0jEU/mOqwDOk2utThv8J9kESkAerfuCHClE9rB2TtHUOGCfekF7lJWqjjypu6/J9ygoPFo7hdAE058ZGg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/forms": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.2.15.tgz", + "integrity": "sha512-p0kcIQLtBBC1qeTA6M3nOuXf/k91E80FKquVM9zEsO2kDjI0oZJVfFYL2UMov5samlJOPN+t6lRHEIUa7ApPsw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/http": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.2.15.tgz", + "integrity": "sha512-TR7PEdmLWNIre3Zn8lvyb4lSrvPUJhKLystLnp4hBMcWsJqq5iK8S3bnlR4viZ9HMlf7bW7+Hm4SI6aB3tdUtw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-7.2.15.tgz", + "integrity": "sha512-Ig5Jr7mnDelaZvSbUd9YhI5am3q1ku9xelAuwvtyDKvQJeKQj3BtTagcOgWrnQBfrJ/FsA/M5Zo48ncSsV0tqQ==", + "dev": true + }, + "@angular/material": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-7.3.7.tgz", + "integrity": "sha512-Eq+7frkeNGkLOfEtmkmJgR+AgoWajOipXZWWfCSamNfpCcPof82DwvGOpAmgGni9FuN2XFQdqP5MoaffQzIvUA==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.2.15.tgz", + "integrity": "sha512-aYgmPsbC9Tvp9vmKWD8voeAp4crwCay7/D6lM3ClEe2EeK934LuEXq3/uczMrFVbnIX7BBIo8fh03Tl7wbiGPw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.15.tgz", + "integrity": "sha512-UL2PqhzXMD769NQ6Lh6pxlBDKvN9Qol3XLRFil80lwJ1GRW16ITeYbCamcafIH2GOyd88IhmYcbMfUQ/6q4MMQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/router": { + "version": "7.2.15", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.2.15.tgz", + "integrity": "sha512-qAubRJRQanguUqJQ76J9GSZ4JFtoyhJKRmX5P23ANZJXpB6YLzF2fJmOGi+E6cV8F0tKBMEq1pjxFTisx0MXwQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "requires": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "requires": { + "@babel/types": "^7.7.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz", + "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==" + }, + "@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@ng-bootstrap/ng-bootstrap": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-4.2.2.tgz", + "integrity": "sha512-v8QmC17bv9he5Ep6zutaI9aQ2w/2NqySP0fejOKe7cacKpGUqsLIakpyd2FD7mfZu7pSCCtHYpRWR+h6yq+Ngg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@ngtools/webpack": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.2.4.tgz", + "integrity": "sha512-mXMDODmy53kk+Kb5jgLNQOsSrDBQQMf6C6KZNuGo8AdvUGdGaQeZDze4o7bcUz1KUjuaaP1Zh7pZtho8C4/T+Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.2.4", + "enhanced-resolve": "4.1.0", + "rxjs": "6.3.3", + "tree-kill": "1.2.0", + "webpack-sources": "1.2.0" + }, + "dependencies": { + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.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 + }, + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + } + } + }, + "@schematics/angular": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.3.9.tgz", + "integrity": "sha512-B3lytFtFeYNLfWdlrIzvy3ulFRccD2/zkoL0734J+DAGfUz7vbysJ50RwYL46sQUcKdZdvb48ktfu1S8yooP6Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.3.9", + "@angular-devkit/schematics": "7.3.9", + "typescript": "3.2.4" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.9.tgz", + "integrity": "sha512-SaxD+nKFW3iCBKsxNR7+66J30EexW/y7tm8m5AvUH+GwSAgIj0ZYmRUzFEPggcaLVA4WnE/YWqIXZMJW5dT7gw==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@schematics/update": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.13.9.tgz", + "integrity": "sha512-4MQcaKFxhMzZyE//+DknDh3h3duy3avg2oxSHxdwXlCZ8Q92+4lpegjJcSRiqlEwO4qeJ5XnrjrvzfIiaIZOmA==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.3.9", + "@angular-devkit/schematics": "7.3.9", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.4.0", + "rxjs": "6.3.3", + "semver": "5.6.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.9.tgz", + "integrity": "sha512-SaxD+nKFW3iCBKsxNR7+66J30EexW/y7tm8m5AvUH+GwSAgIj0ZYmRUzFEPggcaLVA4WnE/YWqIXZMJW5dT7gw==", + "dev": true, + "requires": { + "ajv": "6.9.1", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.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 + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@types/chart.js": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.3.tgz", + "integrity": "sha512-R5F39GIQ54fZJ04pmgbLrx0/dOEhyS8LRQNdlAmZd5zWZiFJ0v9zNNSBJ9WOTBRrMjeV53s0qhnRRvhcs6dfyQ==" + }, + "@types/jasmine": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.0.tgz", + "integrity": "sha512-kGCRI9oiCxFS6soGKlyzhMzDydfcPix9PpTkr7h11huxOxhWwP37Tg7DYBaQ18eQTNreZEuLkhpbGSqVNZPnnw==", + "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": "10.17.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.6.tgz", + "integrity": "sha512-0a2X6cgN3RdPBL2MIlR6Lt0KlM7fOFsutuXcdglcOq6WvLnYXgPQSh0Mx6tO1KCAE8MxbHSOSTWDoUxRq+l3DA==" + }, + "@types/object-hash": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.0.tgz", + "integrity": "sha512-il4NIe4jTx4lfhkKaksmmGHw5EsVkO8sHWkpJHM9m59r1dtsVadLSrJqdE8zU74NENDAsR3oLIOlooRAXlPLNA==", + "requires": { + "@types/node": "*" + } + }, + "@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/selenium-webdriver": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.16.tgz", + "integrity": "sha512-lMC2G0ItF2xv4UCiwbJGbnJlIuUixHrioOhNGHSCsYCJ8l4t9hMCUimCytvFv7qy6AfSzRxhRHoGa+UqaqwyeA==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "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 + } + } + }, + "@webassemblyjs/ast": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "@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": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "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" + } + }, + "adm-zip": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "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.9.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", + "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.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-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-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "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==", + "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==", + "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 + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "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, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arg": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz", + "integrity": "sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "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, + "optional": 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-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==", + "dev": true + }, + "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, + "optional": 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, + "optional": 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==", + "dev": true + }, + "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": "9.4.3", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.3.tgz", + "integrity": "sha512-/XSnzDepRkAU//xLcXA/lUWxpsBuw0WiriAHOqnxkuCtzLhaz+fL4it4gp20BQ8n5SyLzK/FOc7A0+u/rti2FQ==", + "dev": true, + "requires": { + "browserslist": "^4.3.6", + "caniuse-lite": "^1.0.30000921", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.6", + "postcss-value-parser": "^3.3.1" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", + "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-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": "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" + } + }, + "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 + }, + "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" + } + }, + "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" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", + "dev": true + } + } + }, + "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" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "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=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "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=", + "dev": true + }, + "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=", + "dev": true, + "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 + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "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, + "optional": 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" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "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" + } + }, + "bootstrap-css-only": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/bootstrap-css-only/-/bootstrap-css-only-4.3.1.tgz", + "integrity": "sha512-xPQNmTR6skX7boM3Q/K2vWDL8RFhfHm5PbTcn/vd7nZtkzg9tc6ScNreIIsMaP9QLUxeqvUx+OGnDaiK4KBRiQ==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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": "4.8.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.0.tgz", + "integrity": "sha512-HYnxc/oLRWvJ3TsGegR0SRL/UDnknGq2s/a8dYYEO+kOQ9m9apKoS5oiathLKZdh/e9uE+/J3j92qPlGD/vTqA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001012", + "electron-to-chromium": "^1.3.317", + "node-releases": "^1.1.41" + } + }, + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "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" + } + }, + "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": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "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" + } + }, + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + } + }, + "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=", + "dev": true + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "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, + "optional": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "optional": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30001013", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001013.tgz", + "integrity": "sha512-hOAXaWKuq/UVFgYawxIOdPdyMQdYcwOCDOjnZcKn7wCgFUrhP7smuNZjGLuJlPSgE6aRA4cRJ+bGSrhtEt7ZAg==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "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==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chart.js": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.3.tgz", + "integrity": "sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw==", + "requires": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "requires": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "requires": { + "color-name": "^1.0.0" + } + }, + "chartjs-plugin-annotation": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/chartjs-plugin-annotation/-/chartjs-plugin-annotation-0.5.7.tgz", + "integrity": "sha1-G/DjAZmmqf+Yic4PN6HnVagNEL8=", + "requires": { + "chart.js": "^2.4.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.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", + "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" + } + }, + "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 + }, + "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-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.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.5.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz", + "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==", + "dev": true, + "requires": { + "app-root-path": "^2.1.0", + "css-selector-tokenizer": "^0.7.0", + "cssauron": "^1.4.0", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.1" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "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==", + "requires": { + "color-name": "1.1.3" + }, + "dependencies": { + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "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.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "compare-versions": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.1.tgz", + "integrity": "sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dev": true, + "requires": { + "mime-db": ">= 1.40.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=" + }, + "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" + } + }, + "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, + "optional": 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==", + "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.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "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": { + "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-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" + } + }, + "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" + } + }, + "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" + } + }, + "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-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 + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "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" + } + } + } + }, + "core-js": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.4.7.tgz", + "integrity": "sha512-qaPVGw30J1wQ0GR3GvoPqlGf9GZfKKF4kFC7kiHlcsPTqH3txrs9crCp3ZiMAXuSenhz89Jnl4GZs/67S5VOSg==" + }, + "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" + } + }, + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.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-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": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "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" + } + }, + "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-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "requires": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "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": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "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, + "optional": 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": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "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=" + }, + "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-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=", + "requires": { + "strip-bom": "^3.0.0" + } + }, + "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 + } + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "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, + "optional": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "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-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" + } + }, + "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 + }, + "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 + }, + "electron-to-chromium": { + "version": "1.3.322", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", + "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==", + "dev": true + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "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" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.2.tgz", + "integrity": "sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==", + "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.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "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-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" + }, + "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=" + }, + "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": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "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 + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "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.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "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-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 + } + } + }, + "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" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "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.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", + "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + } + }, + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.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==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "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" + } + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "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=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "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.1", + "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": "4.1.1", + "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.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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.3", + "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.1", + "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.3", + "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": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.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" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^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.0", + "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" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "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.6.3", + "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.0", + "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.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "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.0.3", + "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, + "optional": 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, + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": 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, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.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, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "optional": 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": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "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, + "optional": 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.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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-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" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "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" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "optional": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "dev": true + }, + "handlebars": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "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" + } + }, + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "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=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "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, + "optional": 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.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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" + } + }, + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "requires": { + "is-stream": "^1.0.1" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" + }, + "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.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "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" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "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" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true, + "optional": 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, + "optional": 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=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.0", + "through": "^2.3.6" + }, + "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 + }, + "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" + } + } + } + } + } + }, + "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" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "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=" + }, + "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.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "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-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.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "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=" + }, + "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-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-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-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "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, + "optional": 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": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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=" + }, + "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": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "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 + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "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" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "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-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" + } + }, + "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 + }, + "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-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" + } + }, + "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 + }, + "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": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" + }, + "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==", + "requires": { + "append-transform": "^1.0.0" + } + }, + "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==", + "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" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "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==", + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "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==", + "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==", + "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": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "requires": { + "handlebars": "^4.1.2" + } + }, + "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": "3.3.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.3.0.tgz", + "integrity": "sha512-3/xSmG/d35hf80BEN66Y6g9Ca5l/Isdeg/j6zvbTYlTzeKinzmaTM4p9am5kYqOmE05D7s1t8FGjzdSnbUbceA==", + "dev": true + }, + "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.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", + "dev": true, + "optional": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "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==" + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz", + "integrity": "sha512-L5SIaXEYqzrh6b1wqYC42tNsFMx2PWuxky84pK9coK09MvmL7mxii3G3bZBh/0rvD27lqDd0le9jyhzvwif73A==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "braces": "^3.0.2", + "chokidar": "^3.0.0", + "colors": "^1.1.0", + "connect": "^3.6.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.14", + "log4js": "^4.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.3.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "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 + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "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 + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "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-cli": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-2.0.0.tgz", + "integrity": "sha512-1Kb28UILg1ZsfqQmeELbPzuEb5C6GZJfVIk0qOr8LNYQuYWmAaqP16WpbpKEjhejDrDYyYOwwJXSZO6u7q5Pvw==", + "dev": true, + "requires": { + "resolve": "^1.3.3" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", + "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.4.2.tgz", + "integrity": "sha512-7g0gPj8+9JepCNJR9WjDyQ2RkZ375jpdurYQyAYv8PorUCadepl8vrD6LmMqOGcM17cnrynBawQYZHaumgDjBw==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "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" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "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": "2.0.4", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.0.4.tgz", + "integrity": "sha512-FQgOqrrIcD4C/VQo6ecWgXZULK5rs0kIDJtHcSVO6SBUrD63kEHZwmKOvBTquFQSgMQn/yeH68qooKDfqiBF2Q==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true, + "optional": 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.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" + }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true, + "optional": 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": "4.5.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", + "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "dev": true, + "requires": { + "date-format": "^2.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.0", + "rfdc": "^1.1.4", + "streamroller": "^1.0.6" + } + }, + "loglevel": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", + "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", + "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, + "optional": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "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==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "magic-string": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.4.tgz", + "integrity": "sha512-oycWO9nEVAP2RVPbIoDoA4Y7LFIJ3xRYov93gAyJhZkET1tNuB0u7uWkZS2LpBWTJUWnmau/To8ECWRC+jKNfw==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "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==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "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" + } + }, + "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 + } + } + }, + "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, + "optional": 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" + } + }, + "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, + "optional": 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" + }, + "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, + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "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, + "optional": 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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "optional": true, + "requires": { + "error-ex": "^1.2.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, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "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, + "optional": 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, + "optional": 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, + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "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, + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.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, + "optional": true, + "requires": { + "is-utf8": "^0.2.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 + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "requires": { + "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==" + } + } + }, + "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.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "dev": true, + "requires": { + "mime-db": "1.42.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" + } + }, + "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==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "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.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "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 + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": 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==" + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==" + }, + "ng2-charts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-2.3.0.tgz", + "integrity": "sha512-D5K7OqF0m5lOBYvNOsraoEo4OPHja9zfGNj+HWy2nUcP0LP2s+Y/QaQlkG/1rHlwXq9HPm8rLxzSutA0eLHxGQ==", + "requires": { + "@types/chart.js": "^2.7.48", + "lodash": "^4.17.11", + "tslib": "^1.9.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 + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "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, + "optional": 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, + "optional": 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.41", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.41.tgz", + "integrity": "sha512-+IctMa7wIs8Cfsa8iYzeaLTFwv5Y4r5jZud+4AnfymzeEXKBCavFX0KBgzVaPVqf0ywa6PrO8/b+bPqdwjGBSg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "node-sass": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.10.0.tgz", + "integrity": "sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==", + "dev": true, + "optional": 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.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "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-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": 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, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": 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" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "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, + "optional": true, + "requires": { + "ansi-regex": "^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, + "optional": true + } + } + }, + "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==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "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.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "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.6", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", + "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^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-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, + "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" + } + }, + "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 + }, + "nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "requires": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.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", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + } + }, + "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=", + "dev": true + }, + "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-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, + "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.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "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.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.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=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + } + } + }, + "open": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.0.0.tgz", + "integrity": "sha512-/yb5mVZBz7mHLySMiSj2DcLtMBbFPJk5JBKEkHVZFxZAPzeg3L026O0T+lbdz1B2nyDnkClRSwRQJdeVUIF7zw==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "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=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "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=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "optional": 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": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "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==", + "requires": { + "p-limit": "^2.0.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": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "pacote": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.4.0.tgz", + "integrity": "sha512-WQ1KL/phGMkedYEQx9ODsjj7xvwLSpdFJJdEXrLyw5SILMxcTNt5DTxT2Z93fXuLFYJBlZJdnwdalrQdB/rX5w==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^11.3.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^5.1.1", + "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.8", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "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" + } + }, + "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-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "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=", + "dev": true, + "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=" + }, + "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=" + }, + "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==" + }, + "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==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "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 + }, + "picomatch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", + "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.17.tgz", + "integrity": "sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ==", + "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": "7.0.13", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.13.tgz", + "integrity": "sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.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 + }, + "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" + } + } + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.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": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "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 + }, + "prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", + "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", + "optimist": "~0.6.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" + }, + "dependencies": { + "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": "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" + } + }, + "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" + } + }, + "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" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "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=" + }, + "psl": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.5.0.tgz", + "integrity": "sha512-4vqUjKi2huMu1OJiLhi3jN6jeeKvMZdI1tYgi/njW5zV52jNLgSAZSdN16m9bJFe61/cT8ulmw4qFitV9QRsEA==", + "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==" + }, + "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 + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "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 + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "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==", + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "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" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "optional": 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 + }, + "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-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.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "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 + } + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "requires": { + "es6-error": "^4.0.1" + } + }, + "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 + }, + "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.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "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.0", + "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.4.3", + "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=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "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.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "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" + }, + "dependencies": { + "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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "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 + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "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==", + "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" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "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.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "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, + "optional": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "optional": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "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, + "optional": 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, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "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, + "optional": 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" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "optional": true, + "requires": { + "error-ex": "^1.2.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, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "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, + "optional": 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, + "optional": 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, + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "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, + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "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, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.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, + "optional": 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, + "optional": true, + "requires": { + "is-utf8": "^0.2.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, + "optional": true + }, + "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, + "optional": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "optional": 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" + } + }, + "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, + "optional": true, + "requires": { + "camelcase": "^3.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" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "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": "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" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "optional": 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, + "optional": 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.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "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": "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 + }, + "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=" + }, + "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 + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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.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" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "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" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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=" + }, + "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.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "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.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true + }, + "spawn-wrap": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "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==", + "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==" + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "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.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.5.tgz", + "integrity": "sha512-S/guYjC4Izn5wY2d0+M4zowED/F77Lxh9yjkTZ+XAr244pr9c1MYNcXcRe9lx2hmAj0GPbOrBXgOF2YIp/CZ8A==", + "dev": true, + "requires": { + "chalk": "^2.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=" + }, + "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.7.0", + "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz", + "integrity": "sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ==", + "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, + "optional": 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.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", + "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "date-format": "^2.0.0", + "debug": "^3.2.6", + "fs-extra": "^7.0.1", + "lodash": "^4.17.14" + }, + "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" + } + }, + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "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": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "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, + "optional": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "style-loader": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" + } + }, + "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==", + "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 + }, + "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, + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "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-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.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 + }, + "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=", + "dev": true + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "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 + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "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, + "optional": 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, + "optional": true, + "requires": { + "glob": "^7.1.2" + } + }, + "ts-node": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.5.4.tgz", + "integrity": "sha512-izbVCRV68EasEPQ8MSIGBNK9dc/4sYJJKYA+IarMQct1RtEot6Xp0bXuClsbUSnKpg50ho+aOAx8en5c+y4OFw==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + } + }, + "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": "3.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", + "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", + "dev": true + }, + "uglify-js": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.1.tgz", + "integrity": "sha512-pnOF7jY82wdIhATVn87uUY/FHU+MDUdPLkmGFvGoclQmeu229eTkbG5gjGGBi3R7UuYYSEeYXY/TTY5j2aym2g==", + "optional": true, + "requires": { + "commander": "~2.20.3", + "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==", + "optional": true + } + } + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "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==", + "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-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" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.x", + "tmp": "0.0.x" + } + }, + "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" + } + }, + "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.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "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==", + "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.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "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.28.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", + "integrity": "sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "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.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "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" + } + } + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "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": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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" + } + }, + "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-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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "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" + } + } + } + }, + "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" + } + }, + "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + } + } + }, + "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.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "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.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "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==", + "requires": { + "isexe": "^2.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=" + }, + "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, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 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, + "optional": 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, + "optional": 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, + "optional": 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": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "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": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "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" + } + }, + "xml2js": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", + "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "util.promisify": "~1.0.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=", + "dev": true + }, + "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 + }, + "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==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "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/core/app/engine/package.json b/core/app/engine/package.json new file mode 100644 index 000000000..5b18b8db5 --- /dev/null +++ b/core/app/engine/package.json @@ -0,0 +1,62 @@ +{ + "name": "suitecrm", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "^7.2.2", + "@angular/cdk": "^7.2.2", + "@angular/common": "^7.2.2", + "@angular/compiler": "^7.2.2", + "@angular/core": "^7.2.2", + "@angular/forms": "^7.2.2", + "@angular/http": "^7.2.2", + "@angular/material": "^7.2.2", + "@angular/platform-browser": "^7.2.2", + "@angular/platform-browser-dynamic": "^7.2.2", + "@angular/router": "^7.2.2", + "@ng-bootstrap/ng-bootstrap": "^4.2.2", + "bootstrap-css-only": "^4.3.1", + "@types/object-hash": "^1.3.0", + "nyc": "~14.1.1", + "chart.js": "^2.8.0", + "chartjs-plugin-annotation": "^0.5.7", + "core-js": "^3.4.5", + "ng2-charts": "^2.2.3", + "object-hash": "^1.3.1", + "rxjs": "^6.3.3", + "tslib": "^1.9.3", + "zone.js": "~0.8.26", + "ajv": "~6.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "0.12.4", + "@angular/cli": "^7.2.2", + "@angular/compiler-cli": "^7.2.2", + "@angular/language-service": "^7.2.2", + "@types/jasmine": "^3.3.7", + "@types/jasminewd2": "^2.0.6", + "@types/node": "^10.12.18", + "codelyzer": "^4.5.0", + "jasmine-core": "~3.3.0", + "jasmine-spec-reporter": "^4.2.1", + "karma": "^4.0.0", + "karma-chrome-launcher": "^2.2.0", + "karma-cli": "^2.0.0", + "karma-coverage-istanbul-reporter": "^2.0.4", + "karma-jasmine": "^2.0.1", + "karma-jasmine-html-reporter": "^1.4.0", + "prettier": "^1.16.1", + "protractor": "^5.4.2", + "ts-node": "^8.0.1", + "tslint": "^5.12.1", + "typescript": "~3.2.4" + } +} diff --git a/core/app/engine/src/app/app-manager/app-manager.module.ts b/core/app/engine/src/app/app-manager/app-manager.module.ts new file mode 100644 index 000000000..31fcf0f71 --- /dev/null +++ b/core/app/engine/src/app/app-manager/app-manager.module.ts @@ -0,0 +1,72 @@ +import { + ANALYZE_FOR_ENTRY_COMPONENTS, + ModuleWithProviders, + NgModule, + NgModuleFactoryLoader, + SystemJsNgModuleLoader, + Type +} from '@angular/core'; + +import {ROUTES} from '@angular/router'; + +import {AppManager} from './app-manager.service'; + +import { + APP_COMPONENT, + APP_MANIFESTS, + APP_MODULE, + AppManifest +} from './app-manifest'; + +@NgModule() +export class AppManagerModule { + static forRoot(manifests: AppManifest[]): ModuleWithProviders { + return { + ngModule: AppManagerModule, + providers: [ + AppManager, + {provide: NgModuleFactoryLoader, useClass: SystemJsNgModuleLoader}, + // provider for Angular CLI to analyzes + {provide: ROUTES, useValue: manifests, multi: true}, + // provider for AppManager to analyze + {provide: APP_MANIFESTS, useValue: manifests} + ] + }; + } + + static forModule(manifest: AppManifest): ModuleWithProviders { + return { + ngModule: AppManagerModule, + providers: [ + { + provide: ANALYZE_FOR_ENTRY_COMPONENTS, + useValue: manifest, + multi: true + }, + // provider for @angular/router to parse + {provide: ROUTES, useValue: manifest, multi: true}, + // provider for AppManager to analyze + {provide: APP_MODULE, useValue: manifest} + ] + }; + } + + static forChild(component: Type): ModuleWithProviders { + return { + ngModule: AppManagerModule, + providers: [ + { + provide: ANALYZE_FOR_ENTRY_COMPONENTS, + useValue: component, + multi: true + }, + // provider for @angular/router to parse + {provide: ROUTES, useValue: [], multi: true}, + // provider for AppManager to analyze + {provide: APP_COMPONENT, useValue: component} + ] + }; + } +} + +export {AppManifest} from './app-manifest'; diff --git a/core/app/engine/src/app/app-manager/app-manager.service.ts b/core/app/engine/src/app/app-manager/app-manager.service.ts new file mode 100644 index 000000000..9319a4625 --- /dev/null +++ b/core/app/engine/src/app/app-manager/app-manager.service.ts @@ -0,0 +1,127 @@ +import { + ComponentFactory, + Inject, + Injectable, + Injector, + NgModuleFactory, + NgModuleFactoryLoader +} from '@angular/core'; + +import {from, Observable, throwError} from 'rxjs'; + +import { + AppManifest, + APP_COMPONENT, + APP_MANIFESTS, + APP_MODULE +} from './app-manifest'; + +@Injectable() +export class AppManager { + constructor( + @Inject(APP_MANIFESTS) + private manifests: AppManifest[], + private loader: NgModuleFactoryLoader, + private injector: Injector + ) { + } + + /** Retrieve a ComponentFactory, based on the specified componentId + * (defined in the AppManifest array). + */ + getComponentFactory( + componentId: string, + injector?: Injector + ): Observable> { + const manifest = this.manifests.find(m => m.componentId === componentId); + if (!manifest) { + return throwError( + `AppManager: Unknown componentId "${componentId}"` + ); + } + + const path = manifest.loadChildren; + + const p = this.load(path, componentId, injector); + return from(p); + } + + load( + path: string, + componentId: string, + injector?: Injector + ): Promise> { + return this.loader + .load(path) + .then(ngModuleFactory => + this.loadFactory(ngModuleFactory, componentId, injector) + ); + } + + loadFactory( + ngModuleFactory: NgModuleFactory, + componentId: string, + injector?: Injector + ): Promise> { + const moduleRef = ngModuleFactory.create(injector || this.injector); + const appComponentType = moduleRef.injector.get( + APP_COMPONENT, + null + ); + if (!appComponentType) { + const AppModule: AppManifest = moduleRef.injector.get( + APP_MODULE, + null + ); + + if (!AppModule) { + throw new Error( + 'AppManager: App module for' + + ` componentId "${componentId}" does not contain` + + ' APP_COMPONENT or App_MODULE as a provider.' + ); + } + if (AppModule.componentId !== componentId) { + throw new Error( + 'AppManager: App module for' + + `${componentId} does not match manifest.` + ); + } + + const path = AppModule.loadChildren; + + if (!path) { + throw new Error(`${componentId} unknown!`); + } + + return this.load(path, componentId, injector); + } + + return Promise.resolve( + moduleRef.componentFactoryResolver.resolveComponentFactory( + appComponentType + ) + ); + } + + loadAppComponent(outlet: any, componentId: string, data: any) { + this.getComponentFactory(componentId) + .subscribe({ + next: componentFactory => { + if (!outlet) { + return; + } + + const ref = outlet.createComponent(componentFactory); + ref.changeDetectorRef.detectChanges(); + + const appComponent = ref.instance; + + appComponent.data = data; + }, + error: err => { + console.warn(err); + } + }); + } +} diff --git a/core/app/engine/src/app/app-manager/app-manifest.ts b/core/app/engine/src/app/app-manager/app-manifest.ts new file mode 100644 index 000000000..35a79b254 --- /dev/null +++ b/core/app/engine/src/app/app-manager/app-manifest.ts @@ -0,0 +1,16 @@ +import {InjectionToken} from '@angular/core'; + +export const APP_COMPONENT = new InjectionToken('APP_COMPONENT'); +export const APP_MODULE = new InjectionToken('APP_MODULE'); +export const APP_MANIFESTS = new InjectionToken('APP_MANIFESTS'); + +export interface AppManifest { + /** Unique identifier, used in the application to retrieve a ComponentFactory. */ + componentId: string; + + /** Unique identifier, used internally by Angular. */ + path: string; + + /** Path to component module. */ + loadChildren: string; +} diff --git a/core/app/engine/src/app/app-routing.module.ts b/core/app/engine/src/app/app-routing.module.ts new file mode 100644 index 000000000..8ce24b965 --- /dev/null +++ b/core/app/engine/src/app/app-routing.module.ts @@ -0,0 +1,46 @@ +import {NgModule} from '@angular/core'; +import {Routes, RouterModule} from '@angular/router'; +import {ClassicViewUiComponent} from './app-files/ui/components/classic-view/classic-view.component'; + +import {AuthGuard} from './app-files/ui/services/auth/auth-guard.service'; + +const routes: Routes = [ + { + path: 'Login', + loadChildren: './app-files/ui/components/login/login.module#LoginUiModule' + }, + { + path: 'Logout', + loadChildren: './app-files/ui/components/logout/logout.module#LogoutUiModule' + }, + { + path: 'Home', + loadChildren: './app-files/ui/components/home/home.module#HomeUiModule', + canActivate: [AuthGuard] + }, + { + path: ':module', + component: ClassicViewUiComponent, + canActivate: [AuthGuard] + }, + { + path: ':module/:action', + component: ClassicViewUiComponent, + canActivate: [AuthGuard] + }, + { + path: ':module/:action/:record', + component: ClassicViewUiComponent, + canActivate: [AuthGuard] + }, + {path: '**', redirectTo: 'Login'}, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes, { + useHash: true + })], + exports: [RouterModule] +}) +export class AppRoutingModule { +} diff --git a/core/app/engine/src/app/app.component.html b/core/app/engine/src/app/app.component.html new file mode 100644 index 000000000..991f1f360 --- /dev/null +++ b/core/app/engine/src/app/app.component.html @@ -0,0 +1,5 @@ + + +
+ + diff --git a/core/app/engine/src/app/app.component.scss b/core/app/engine/src/app/app.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/core/app/engine/src/app/app.component.spec.ts b/core/app/engine/src/app/app.component.spec.ts new file mode 100644 index 000000000..b4328d5b1 --- /dev/null +++ b/core/app/engine/src/app/app.component.spec.ts @@ -0,0 +1,19 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {AppComponent} from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule], + declarations: [ + AppComponent + ], + }).compileComponents(); + })); +}); diff --git a/core/app/engine/src/app/app.component.ts b/core/app/engine/src/app/app.component.ts new file mode 100644 index 000000000..e87651492 --- /dev/null +++ b/core/app/engine/src/app/app.component.ts @@ -0,0 +1,17 @@ +import {Component, ViewChild, ViewContainerRef, OnInit} from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html' +}) +export class AppComponent implements OnInit { + @ViewChild('mainOutlet', {read: ViewContainerRef}) + mainOutlet: ViewContainerRef | undefined; + + constructor() { + } + + ngOnInit() { + + } +} diff --git a/core/app/engine/src/app/app.module.ts b/core/app/engine/src/app/app.module.ts new file mode 100644 index 000000000..c98ec41b8 --- /dev/null +++ b/core/app/engine/src/app/app.module.ts @@ -0,0 +1,38 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {BrowserModule} from '@angular/platform-browser'; +import {HttpClientModule} from '@angular/common/http'; + +import {AppRoutingModule} from './app-routing.module'; +import {AppComponent} from './app.component'; + +import {NavbarUiModule} from './app-files/ui/components/navbar/navbar.module'; +import {FooterUiModule} from './app-files/ui/components/footer/footer.module'; +import {ClassicViewUiModule} from './app-files/ui/components/classic-view/classic-view.module'; +import {MessageUiModule} from './app-files/ui/components/message/message.module'; + +import { + AppManagerModule +} from './app-manager/app-manager.module'; + +@NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + HttpClientModule, + AppManagerModule, + AppRoutingModule, + FooterUiModule, + NavbarUiModule, + MessageUiModule, + ClassicViewUiModule + ], + bootstrap: [AppComponent], + entryComponents: [] +}) +export class AppModule { + constructor() { + + } +} diff --git a/core/app/engine/src/environments/environment.prod.ts b/core/app/engine/src/environments/environment.prod.ts new file mode 100644 index 000000000..3612073bc --- /dev/null +++ b/core/app/engine/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/core/app/engine/src/environments/environment.ts b/core/app/engine/src/environments/environment.ts new file mode 100644 index 000000000..b7f639aec --- /dev/null +++ b/core/app/engine/src/environments/environment.ts @@ -0,0 +1,8 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: false +}; diff --git a/core/app/engine/src/favicon.ico b/core/app/engine/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- + + + + + SuiteCRM + + + + + + + + + + + + + + diff --git a/core/app/engine/src/main.ts b/core/app/engine/src/main.ts new file mode 100644 index 000000000..8463f57fb --- /dev/null +++ b/core/app/engine/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.log(err)); diff --git a/core/app/engine/src/polyfills.ts b/core/app/engine/src/polyfills.ts new file mode 100644 index 000000000..396cc342a --- /dev/null +++ b/core/app/engine/src/polyfills.ts @@ -0,0 +1,60 @@ +// tslint:disable +/** + * 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. + +/** + * Required to support Web Animations `@angular/platform-browser/animations`. + * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation + **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/core/app/engine/src/test.ts b/core/app/engine/src/test.ts new file mode 100644 index 000000000..850a66ea1 --- /dev/null +++ b/core/app/engine/src/test.ts @@ -0,0 +1,34 @@ +// tslint:disable +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import {getTestBed} from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare const __karma__: any; +declare const require: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function () { +}; + +// 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); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/core/app/engine/src/tsconfig.app.json b/core/app/engine/src/tsconfig.app.json new file mode 100644 index 000000000..190fd300b --- /dev/null +++ b/core/app/engine/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/core/app/engine/src/tsconfig.spec.json b/core/app/engine/src/tsconfig.spec.json new file mode 100644 index 000000000..7518a5339 --- /dev/null +++ b/core/app/engine/src/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "baseUrl": "./", + "target": "es5", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/core/app/engine/src/typings.d.ts b/core/app/engine/src/typings.d.ts new file mode 100644 index 000000000..c9059e9a8 --- /dev/null +++ b/core/app/engine/src/typings.d.ts @@ -0,0 +1,6 @@ +/* SystemJS module definition */ +declare var module: NodeModule; + +interface NodeModule { + id: string; +} diff --git a/core/app/engine/svgbuild.js b/core/app/engine/svgbuild.js new file mode 100644 index 000000000..5dc6346bc --- /dev/null +++ b/core/app/engine/svgbuild.js @@ -0,0 +1,101 @@ +var fs = require('fs'); + +// TODO: oop refactoring: use classes +function print(msg) { + process.stdout.write(msg); +} + +function printbk(msg) { + print(msg + '\r'); +} + + +function println(msg) { + print(msg + '\n'); +} + +function clearln() { + process.stdout.clearLine(); +} + +function errorout(err) { + console.error('ERROR: ', err); +} + + +String.prototype.replaceAll = function (search, replacement) { + var target = this; + return target.replace(new RegExp(search, 'g'), replacement); +}; + +class Spinner { + constructor() { + this.chars = '|/-\\'; + this.pos = 0; + } + + next() { + this.pos++; + if (this.pos >= this.chars.length) { + this.pos = 0; + } + return this.chars[this.pos]; + } +} + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +// ---- starting point + +async function doit() { + + try { + + var folder = process.argv[2]; + if (!folder) { + throw Error('Folder parameter is not set!'); + } + var template = process.argv[3]; + if (!template) { + throw Error('Template file as a parameter is not set!'); + } + + println('Processing svg files from folder `' + folder + '` into angular component template: ' + template + '\r\n'); + + if (fs.existsSync(template)) { + println(template + ' file already exists, making a backup..'); + fs.copyFileSync(template, template + '.bak'); + fs.unlinkSync(template); + } + files = fs.readdirSync(folder); + + spinner = new Spinner(); + for (var i = 0; i < files.length; i++) { + clearln(); + printbk('Processing files (' + (i + 1) + '/' + files.length + '): [' + spinner.next() + '] ' + files[i]); + var cnt = + '\n\n' + + (fs.readFileSync(folder + files[i], 'utf-8') + .replace(/^\s*\<\?xml\s+(.*)\?\>/i, '') + .replaceAll(/\s+id\s*\=\s*\"/i, ' class="') + .replaceAll(/](.|\n|\r)*<\/style>/i, '') + .replaceAll(/](.|\n|\r)*<\/title>/i, '') + .replaceAll(/](.|\n|\r)*<\/desc>/i, '') + ) + + '\n\n'; + fs.appendFileSync(template, cnt); + // await sleep(100); + } + clearln(); + println('Template created.\nDone.\n'); + + } catch (err) { + errorout(err); + } + + +} + +doit(); diff --git a/core/app/engine/tsconfig.json b/core/app/engine/tsconfig.json new file mode 100644 index 000000000..1586adc9a --- /dev/null +++ b/core/app/engine/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "paths": { + "*": [ + "types/*" + ], + "core-js/es7/reflect": [ + "node_modules/core-js/proposals/reflect-metadata" + ], + "core-js/es6/*": [ + "node_modules/core-js/es" + ] + }, + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "module": "esnext", + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2018", + "dom" + ] + } +} diff --git a/core/app/engine/tslint.json b/core/app/engine/tslint.json new file mode 100644 index 000000000..868ecba0d --- /dev/null +++ b/core/app/engine/tslint.json @@ -0,0 +1,75 @@ +{ + "extends": "tslint:recommended", + "rulesDirectory": [ + "codelyzer" + ], + "rules": { + "array-type": false, + "arrow-parens": false, + "deprecation": { + "severity": "warn" + }, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "interface-name": false, + "max-classes-per-file": false, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-consecutive-blank-lines": false, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-empty": false, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-non-null-assertion": true, + "no-redundant-jsdoc": true, + "no-switch-case-fall-through": true, + "no-use-before-declare": true, + "no-var-requires": false, + "object-literal-key-quotes": [ + true, + "as-needed" + ], + "object-literal-sort-keys": false, + "ordered-imports": false, + "quotemark": [ + true, + "single" + ], + "trailing-comma": false, + "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/core/app/fields/address/address.php b/core/app/fields/address/address.php new file mode 100644 index 000000000..063883911 --- /dev/null +++ b/core/app/fields/address/address.php @@ -0,0 +1,3 @@ + { + let component: AddressListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AddressListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AddressListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/address/templates/list/address.component.ts b/core/app/fields/address/templates/list/address.component.ts new file mode 100644 index 000000000..01c013c7e --- /dev/null +++ b/core/app/fields/address/templates/list/address.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-address-list', + templateUrl: './address.component.html', + styleUrls: [] +}) +export class AddressListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/assignedusername/assignedusername.php b/core/app/fields/assignedusername/assignedusername.php new file mode 100644 index 000000000..ff99bc439 --- /dev/null +++ b/core/app/fields/assignedusername/assignedusername.php @@ -0,0 +1,3 @@ + { + let component: AssignedusernameListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AssignedusernameListViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AssignedusernameListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/assignedusername/templates/list/assignedusername.component.ts b/core/app/fields/assignedusername/templates/list/assignedusername.component.ts new file mode 100644 index 000000000..eb977a1c1 --- /dev/null +++ b/core/app/fields/assignedusername/templates/list/assignedusername.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-assignedusername-list', + templateUrl: './assignedusername.component.html', + styleUrls: [] +}) +export class AssignedusernameListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/boolean/boolean.php b/core/app/fields/boolean/boolean.php new file mode 100644 index 000000000..d546de0b4 --- /dev/null +++ b/core/app/fields/boolean/boolean.php @@ -0,0 +1,3 @@ + { + let component: BooleanListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [BooleanListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BooleanListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/boolean/templates/list/boolean.component.ts b/core/app/fields/boolean/templates/list/boolean.component.ts new file mode 100644 index 000000000..274c8d2ce --- /dev/null +++ b/core/app/fields/boolean/templates/list/boolean.component.ts @@ -0,0 +1,18 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-boolean-list', + templateUrl: './boolean.component.html', + styleUrls: [] +}) +export class BooleanListFieldsComponent implements OnInit { + + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/boolean/templates/record/boolean.component.html b/core/app/fields/boolean/templates/record/boolean.component.html new file mode 100644 index 000000000..52a1241ca --- /dev/null +++ b/core/app/fields/boolean/templates/record/boolean.component.html @@ -0,0 +1,3 @@ + diff --git a/core/app/fields/boolean/templates/record/boolean.component.spec.ts b/core/app/fields/boolean/templates/record/boolean.component.spec.ts new file mode 100644 index 000000000..006b6631b --- /dev/null +++ b/core/app/fields/boolean/templates/record/boolean.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {BooleanComponent} from './boolean.component'; + +describe('BooleanComponent', () => { + let component: BooleanComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [BooleanComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BooleanComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/boolean/templates/record/boolean.component.ts b/core/app/fields/boolean/templates/record/boolean.component.ts new file mode 100644 index 000000000..89e6f72f1 --- /dev/null +++ b/core/app/fields/boolean/templates/record/boolean.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-boolean-record', + templateUrl: './boolean.component.html', + styleUrls: [] +}) +export class BooleanRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/button/button.php b/core/app/fields/button/button.php new file mode 100644 index 000000000..d8de93c4e --- /dev/null +++ b/core/app/fields/button/button.php @@ -0,0 +1,3 @@ + { + let component: ButtonListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ButtonListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/button/templates/list/button.component.ts b/core/app/fields/button/templates/list/button.component.ts new file mode 100644 index 000000000..3ba72403d --- /dev/null +++ b/core/app/fields/button/templates/list/button.component.ts @@ -0,0 +1,18 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-button-list', + templateUrl: './button.component.html', + styleUrls: [] +}) +export class ButtonListFieldsComponent implements OnInit { + + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/button/templates/record/button.component.html b/core/app/fields/button/templates/record/button.component.html new file mode 100644 index 000000000..8e8881766 --- /dev/null +++ b/core/app/fields/button/templates/record/button.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core/app/fields/button/templates/record/button.component.spec.ts b/core/app/fields/button/templates/record/button.component.spec.ts new file mode 100644 index 000000000..9fc4b9bca --- /dev/null +++ b/core/app/fields/button/templates/record/button.component.spec.ts @@ -0,0 +1,21 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {ButtonRecordFieldsComponent} from './button.component'; + +describe('ButtonRecordFieldsComponent', () => { + let component: ButtonRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ButtonRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/button/templates/record/button.component.ts b/core/app/fields/button/templates/record/button.component.ts new file mode 100644 index 000000000..9efdf90e0 --- /dev/null +++ b/core/app/fields/button/templates/record/button.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-button-list', + templateUrl: './button.component.html', + styleUrls: [] +}) +export class ButtonRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/collection/collection.php b/core/app/fields/collection/collection.php new file mode 100644 index 000000000..3ea93c921 --- /dev/null +++ b/core/app/fields/collection/collection.php @@ -0,0 +1,3 @@ + { + let component: CollectionListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CollectionListViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CollectionListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/collection/templates/list/collection.component.ts b/core/app/fields/collection/templates/list/collection.component.ts new file mode 100644 index 000000000..d8df5f167 --- /dev/null +++ b/core/app/fields/collection/templates/list/collection.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-collection-list', + templateUrl: './collection.component.html', + styleUrls: [] +}) +export class CollectionListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/cronschedule/cronschedule.php b/core/app/fields/cronschedule/cronschedule.php new file mode 100644 index 000000000..fe4ac6aa5 --- /dev/null +++ b/core/app/fields/cronschedule/cronschedule.php @@ -0,0 +1,3 @@ + { + let component: CronscheduleListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CronscheduleListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CronscheduleListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/cronschedule/templates/list/cronschedule.component.ts b/core/app/fields/cronschedule/templates/list/cronschedule.component.ts new file mode 100644 index 000000000..43b676c31 --- /dev/null +++ b/core/app/fields/cronschedule/templates/list/cronschedule.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-cronschedule-list', + templateUrl: './cronschedule.component.html', + styleUrls: [] +}) +export class CronscheduleListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/currency/currency.php b/core/app/fields/currency/currency.php new file mode 100644 index 000000000..8f009cf5f --- /dev/null +++ b/core/app/fields/currency/currency.php @@ -0,0 +1,3 @@ + { + let component: CurrencyListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CurrencyListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CurrencyListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/currency/templates/list/currency.component.ts b/core/app/fields/currency/templates/list/currency.component.ts new file mode 100644 index 000000000..148d991b1 --- /dev/null +++ b/core/app/fields/currency/templates/list/currency.component.ts @@ -0,0 +1,18 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-currency-list', + templateUrl: './currency.component.html', + styleUrls: [] +}) +export class CurrencyListFieldsComponent implements OnInit { + + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/currency/templates/record/currency.component.html b/core/app/fields/currency/templates/record/currency.component.html new file mode 100644 index 000000000..a32bf5f73 --- /dev/null +++ b/core/app/fields/currency/templates/record/currency.component.html @@ -0,0 +1,3 @@ + diff --git a/core/app/fields/currency/templates/record/currency.component.spec.ts b/core/app/fields/currency/templates/record/currency.component.spec.ts new file mode 100644 index 000000000..9411ab52c --- /dev/null +++ b/core/app/fields/currency/templates/record/currency.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {CurrencyRecordFieldsComponent} from './currency.component'; + +describe('CurrencyRecordFieldsComponent', () => { + let component: CurrencyRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [CurrencyRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CurrencyRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/currency/templates/record/currency.component.ts b/core/app/fields/currency/templates/record/currency.component.ts new file mode 100644 index 000000000..329c82372 --- /dev/null +++ b/core/app/fields/currency/templates/record/currency.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-currency-record', + templateUrl: './currency.component.html', + styleUrls: [] +}) +export class CurrencyRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/date/date.php b/core/app/fields/date/date.php new file mode 100644 index 000000000..d4b9cba0f --- /dev/null +++ b/core/app/fields/date/date.php @@ -0,0 +1,3 @@ + { + let component: DateListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DateListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DateListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/date/templates/list/date.component.ts b/core/app/fields/date/templates/list/date.component.ts new file mode 100644 index 000000000..df8f0b169 --- /dev/null +++ b/core/app/fields/date/templates/list/date.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-date-list', + templateUrl: './date.component.html', + styleUrls: [] +}) +export class DateListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/datetime/datetime.php b/core/app/fields/datetime/datetime.php new file mode 100644 index 000000000..97c784121 --- /dev/null +++ b/core/app/fields/datetime/datetime.php @@ -0,0 +1,3 @@ + { + let component: DatetimeListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DatetimeListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatetimeListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/datetime/templates/list/datetime.component.ts b/core/app/fields/datetime/templates/list/datetime.component.ts new file mode 100644 index 000000000..84e4ca053 --- /dev/null +++ b/core/app/fields/datetime/templates/list/datetime.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-datetime-list', + templateUrl: './datetime.component.html', + styleUrls: [] +}) +export class DatetimeListFieldsComponent implements OnInit { + data: any = {}; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/datetimecombo/datetimecombo.php b/core/app/fields/datetimecombo/datetimecombo.php new file mode 100644 index 000000000..e5eb70912 --- /dev/null +++ b/core/app/fields/datetimecombo/datetimecombo.php @@ -0,0 +1,3 @@ + { + let component: DatetimecomboListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DatetimecomboListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DatetimecomboListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/datetimecombo/templates/list/datetimecombo.component.ts b/core/app/fields/datetimecombo/templates/list/datetimecombo.component.ts new file mode 100644 index 000000000..7a4c2724a --- /dev/null +++ b/core/app/fields/datetimecombo/templates/list/datetimecombo.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-datetimecombo-list', + templateUrl: './datetimecombo.component.html', + styleUrls: [] +}) +export class DatetimecomboListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/default/default.php b/core/app/fields/default/default.php new file mode 100644 index 000000000..c48ae25f2 --- /dev/null +++ b/core/app/fields/default/default.php @@ -0,0 +1,3 @@ + { + let component: DefaultListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DefaultListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DefaultListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/default/templates/list/default.component.ts b/core/app/fields/default/templates/list/default.component.ts new file mode 100644 index 000000000..a93543614 --- /dev/null +++ b/core/app/fields/default/templates/list/default.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-default-list', + templateUrl: './default.component.html', + styleUrls: [] +}) +export class DefaultListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/download/download.php b/core/app/fields/download/download.php new file mode 100644 index 000000000..ee832a398 --- /dev/null +++ b/core/app/fields/download/download.php @@ -0,0 +1,3 @@ + { + let component: DownloadListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DownloadListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DownloadListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/download/templates/list/download.component.ts b/core/app/fields/download/templates/list/download.component.ts new file mode 100644 index 000000000..da3a9dcc9 --- /dev/null +++ b/core/app/fields/download/templates/list/download.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-download-list', + templateUrl: './download.component.html', + styleUrls: [] +}) +export class DownloadListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/dynamicnumber/dynamicnumber.php b/core/app/fields/dynamicnumber/dynamicnumber.php new file mode 100644 index 000000000..2bdb7d571 --- /dev/null +++ b/core/app/fields/dynamicnumber/dynamicnumber.php @@ -0,0 +1,3 @@ + { + let component: DynamicnumberListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [DynamicnumberListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DynamicnumberListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/dynamicnumber/templates/list/dynamicnumber.component.ts b/core/app/fields/dynamicnumber/templates/list/dynamicnumber.component.ts new file mode 100644 index 000000000..371dccd64 --- /dev/null +++ b/core/app/fields/dynamicnumber/templates/list/dynamicnumber.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-dynamicnumber-list', + templateUrl: './dynamicnumber.component.html', + styleUrls: [] +}) +export class DynamicnumberListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/emailbody/emailbody.php b/core/app/fields/emailbody/emailbody.php new file mode 100644 index 000000000..95c5ddd23 --- /dev/null +++ b/core/app/fields/emailbody/emailbody.php @@ -0,0 +1,3 @@ + { + let component: EmailbodyListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [EmailbodyListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EmailbodyListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/emailbody/templates/list/emailbody.component.ts b/core/app/fields/emailbody/templates/list/emailbody.component.ts new file mode 100644 index 000000000..ab47e1557 --- /dev/null +++ b/core/app/fields/emailbody/templates/list/emailbody.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-emailbody-list', + templateUrl: './emailbody.component.html', + styleUrls: [] +}) +export class EmailbodyListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/enum/enum.php b/core/app/fields/enum/enum.php new file mode 100644 index 000000000..123441daf --- /dev/null +++ b/core/app/fields/enum/enum.php @@ -0,0 +1,3 @@ + { + let component: EnumListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [EnumListViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EnumListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/enum/templates/list/enum.component.ts b/core/app/fields/enum/templates/list/enum.component.ts new file mode 100644 index 000000000..ba30d7d58 --- /dev/null +++ b/core/app/fields/enum/templates/list/enum.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-enum-list', + templateUrl: './enum.component.html', + styleUrls: [] +}) +export class EnumListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/enum/templates/record/enum.component.html b/core/app/fields/enum/templates/record/enum.component.html new file mode 100644 index 000000000..1d4c46ff3 --- /dev/null +++ b/core/app/fields/enum/templates/record/enum.component.html @@ -0,0 +1,9 @@ + diff --git a/core/app/fields/enum/templates/record/enum.component.spec.ts b/core/app/fields/enum/templates/record/enum.component.spec.ts new file mode 100644 index 000000000..56e727fa6 --- /dev/null +++ b/core/app/fields/enum/templates/record/enum.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {EnumRecordFieldsComponent} from './enum.component'; + +describe('EnumRecordFieldsComponent', () => { + let component: EnumRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [EnumRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(EnumRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/enum/templates/record/enum.component.ts b/core/app/fields/enum/templates/record/enum.component.ts new file mode 100644 index 000000000..6f5dccfc5 --- /dev/null +++ b/core/app/fields/enum/templates/record/enum.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-enum-record', + templateUrl: './enum.component.html', + styleUrls: [] +}) +export class EnumRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/field.component.spec.ts b/core/app/fields/field.component.spec.ts new file mode 100644 index 000000000..2483668ae --- /dev/null +++ b/core/app/fields/field.component.spec.ts @@ -0,0 +1,31 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {PluginManager} from '../../../../plugin-manager/plugin-manager.service'; +import {FieldComponent} from './field.component'; +import {PLUGIN_MANIFESTS} from '../../../../plugin-manager/plugin-manifest'; + + +describe('FieldComponent', () => { + let component: FieldComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FieldComponent], + providers: [PluginManager] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + // it('should create', () => { + // console.log(component); + + // expect(component).toBeTruthy(); + // }); +}); diff --git a/core/app/fields/field.component.ts b/core/app/fields/field.component.ts new file mode 100644 index 000000000..6ae17534d --- /dev/null +++ b/core/app/fields/field.component.ts @@ -0,0 +1,66 @@ +import { + Component, + OnInit, + Input, + ViewChild, + ViewContainerRef +} from '@angular/core'; + +import {AppManager} from '../../app-manager/app-manager.service'; + +@Component({ + selector: 'scrm-field', + template: ` + + `, + styleUrls: [] +}) +export class FieldComponent implements OnInit { + @ViewChild('fieldOutlet', {read: ViewContainerRef}) + fieldOutlet: ViewContainerRef | undefined; + + id: string; + + @Input('view-type') viewType: string; + @Input('field-type') fieldType: string; + @Input('field-name') fieldName: string; + @Input('field-value') fieldValue: string; + @Input('row') row: any; + + constructor(protected appManager: AppManager) { + } + + ngOnInit() { + this.id = this.makeId(8); + + if (this.fieldType == 'phone') { + this.fieldType = 'varchar'; + } + + if (this.fieldType == 'name') { + this.fieldType = 'varchar'; + } + + let data = { + 'viewType': this.viewType, + 'fieldType': this.fieldType, + 'fieldName': this.fieldName, + 'fieldValue': this.fieldValue, + 'row': JSON.parse(this.row), + }; + + const componentId = 'scrm-' + this.fieldType + '-' + this.viewType; + this.appManager.loadAppComponent(this.fieldOutlet, componentId, data); + } + + makeId(length) { + var result = ''; + var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + var charactersLength = characters.length; + for (var i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; + } + +} \ No newline at end of file diff --git a/core/app/fields/field.module.ts b/core/app/fields/field.module.ts new file mode 100644 index 000000000..a14e6a23b --- /dev/null +++ b/core/app/fields/field.module.ts @@ -0,0 +1,23 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule, AppManifest} from '../../app-manager/app-manager.module'; +import {FieldComponent} from './field.component'; + +const manifest: AppManifest[] = []; + +@NgModule({ + declarations: [ + FieldComponent, + ], + exports: [ + FieldComponent, + ], + imports: [ + CommonModule, + AppManagerModule.forRoot(manifest) + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] +}) +export class FieldModule { +} \ No newline at end of file diff --git a/core/app/fields/file/file.php b/core/app/fields/file/file.php new file mode 100644 index 000000000..0e7790dbd --- /dev/null +++ b/core/app/fields/file/file.php @@ -0,0 +1,3 @@ + { + let component: FileListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FileListViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FileListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/file/templates/list/file.component.ts b/core/app/fields/file/templates/list/file.component.ts new file mode 100644 index 000000000..71674516c --- /dev/null +++ b/core/app/fields/file/templates/list/file.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-file-list', + templateUrl: './file.component.html', + styleUrls: [] +}) +export class FileListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/float/float.php b/core/app/fields/float/float.php new file mode 100644 index 000000000..a3cc70ad0 --- /dev/null +++ b/core/app/fields/float/float.php @@ -0,0 +1,3 @@ + { + let component: FloatListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FloatListViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FloatListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/float/templates/list/float.component.ts b/core/app/fields/float/templates/list/float.component.ts new file mode 100644 index 000000000..d5a006b5b --- /dev/null +++ b/core/app/fields/float/templates/list/float.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-float-list', + templateUrl: './float.component.html', + styleUrls: [] +}) +export class FloatListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/float/templates/record/float.component.html b/core/app/fields/float/templates/record/float.component.html new file mode 100644 index 000000000..5d1b02259 --- /dev/null +++ b/core/app/fields/float/templates/record/float.component.html @@ -0,0 +1,3 @@ +
+ {{ form.fields }} +
\ No newline at end of file diff --git a/core/app/fields/float/templates/record/float.component.spec.ts b/core/app/fields/float/templates/record/float.component.spec.ts new file mode 100644 index 000000000..94fc97de9 --- /dev/null +++ b/core/app/fields/float/templates/record/float.component.spec.ts @@ -0,0 +1,21 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {FloatRecordViewComponent} from './float.component'; + +describe('FloatRecordViewComponent', () => { + let component: FloatRecordViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FloatRecordViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FloatRecordViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/float/templates/record/float.component.ts b/core/app/fields/float/templates/record/float.component.ts new file mode 100644 index 000000000..be3b30e5d --- /dev/null +++ b/core/app/fields/float/templates/record/float.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-float-record', + templateUrl: './float.component.html', + styleUrls: [] +}) +export class FloatRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/fullname/fullname.php b/core/app/fields/fullname/fullname.php new file mode 100644 index 000000000..ff8032090 --- /dev/null +++ b/core/app/fields/fullname/fullname.php @@ -0,0 +1,3 @@ + { + let component: FullnameListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FullnameListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FullnameListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/fullname/templates/list/fullname.component.ts b/core/app/fields/fullname/templates/list/fullname.component.ts new file mode 100644 index 000000000..83c4f2828 --- /dev/null +++ b/core/app/fields/fullname/templates/list/fullname.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-fullname-list', + templateUrl: './fullname.component.html', + styleUrls: [] +}) +export class FullnameListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/int/int.php b/core/app/fields/int/int.php new file mode 100644 index 000000000..16cd0d16c --- /dev/null +++ b/core/app/fields/int/int.php @@ -0,0 +1,3 @@ + { + let component: IntListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [IntListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(IntListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/int/templates/list/int.component.ts b/core/app/fields/int/templates/list/int.component.ts new file mode 100644 index 000000000..9b88fc1fe --- /dev/null +++ b/core/app/fields/int/templates/list/int.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-int-list', + templateUrl: './int.component.html', + styleUrls: [] +}) +export class IntListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/int/templates/record/int.component.html b/core/app/fields/int/templates/record/int.component.html new file mode 100644 index 000000000..d403c4abd --- /dev/null +++ b/core/app/fields/int/templates/record/int.component.html @@ -0,0 +1,3 @@ + diff --git a/core/app/fields/int/templates/record/int.component.spec.ts b/core/app/fields/int/templates/record/int.component.spec.ts new file mode 100644 index 000000000..938ffe583 --- /dev/null +++ b/core/app/fields/int/templates/record/int.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {IntComponent} from './int.component'; + +describe('IntComponent', () => { + let component: IntComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [IntComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(IntRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/int/templates/record/int.component.ts b/core/app/fields/int/templates/record/int.component.ts new file mode 100644 index 000000000..401d77e24 --- /dev/null +++ b/core/app/fields/int/templates/record/int.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-int', + templateUrl: './int.component.html', + styleUrls: [] +}) +export class IntRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/multienum/multienum.php b/core/app/fields/multienum/multienum.php new file mode 100644 index 000000000..b9bc741ac --- /dev/null +++ b/core/app/fields/multienum/multienum.php @@ -0,0 +1,3 @@ + { + let component: MultiEnumListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MultiEnumListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MultiEnumListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/multienum/templates/list/multienum.component.ts b/core/app/fields/multienum/templates/list/multienum.component.ts new file mode 100644 index 000000000..5d5d6a886 --- /dev/null +++ b/core/app/fields/multienum/templates/list/multienum.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-multienum-list', + templateUrl: './multienum.component.html', + styleUrls: [] +}) +export class MultienumListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/multienum/templates/record/multienum.component.html b/core/app/fields/multienum/templates/record/multienum.component.html new file mode 100644 index 000000000..1d4c46ff3 --- /dev/null +++ b/core/app/fields/multienum/templates/record/multienum.component.html @@ -0,0 +1,9 @@ + diff --git a/core/app/fields/multienum/templates/record/multienum.component.spec.ts b/core/app/fields/multienum/templates/record/multienum.component.spec.ts new file mode 100644 index 000000000..c5f964dc2 --- /dev/null +++ b/core/app/fields/multienum/templates/record/multienum.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {MultienumRecordFieldsComponent} from './multienum.component'; + +describe('MultienumRecordFieldsComponent', () => { + let component: MultienumRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MultienumRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MultienumRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/multienum/templates/record/multienum.component.ts b/core/app/fields/multienum/templates/record/multienum.component.ts new file mode 100644 index 000000000..d83c2eb60 --- /dev/null +++ b/core/app/fields/multienum/templates/record/multienum.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-multienum-record', + templateUrl: './multienum.component.html', + styleUrls: [] +}) +export class MultienumRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/password/password.php b/core/app/fields/password/password.php new file mode 100644 index 000000000..f2c2a9bcc --- /dev/null +++ b/core/app/fields/password/password.php @@ -0,0 +1,3 @@ + { + let component: PasswordListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PasswordListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/password/templates/list/password.component.ts b/core/app/fields/password/templates/list/password.component.ts new file mode 100644 index 000000000..f5b3aa6cb --- /dev/null +++ b/core/app/fields/password/templates/list/password.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-password-list', + templateUrl: './password.component.html', + styleUrls: [] +}) +export class PasswordListFieldsComponent implements OnInit { + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/password/templates/record/password.component.html b/core/app/fields/password/templates/record/password.component.html new file mode 100644 index 000000000..279cd6dbf --- /dev/null +++ b/core/app/fields/password/templates/record/password.component.html @@ -0,0 +1,9 @@ +
+ + +
\ No newline at end of file diff --git a/core/app/fields/password/templates/record/password.component.spec.ts b/core/app/fields/password/templates/record/password.component.spec.ts new file mode 100644 index 000000000..ed59287af --- /dev/null +++ b/core/app/fields/password/templates/record/password.component.spec.ts @@ -0,0 +1,21 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {PasswordRecordFieldsComponent} from './password.component'; + +describe('PasswordRecordFieldsComponent', () => { + let component: PasswordRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PasswordRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/password/templates/record/password.component.ts b/core/app/fields/password/templates/record/password.component.ts new file mode 100644 index 000000000..f2184a6ff --- /dev/null +++ b/core/app/fields/password/templates/record/password.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-password-record', + templateUrl: './password.component.html', + styleUrls: [] +}) +export class PasswordRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/relate/relate.php b/core/app/fields/relate/relate.php new file mode 100644 index 000000000..1e34cfbe8 --- /dev/null +++ b/core/app/fields/relate/relate.php @@ -0,0 +1,3 @@ +{{ data.fieldValue }} diff --git a/core/app/fields/relate/templates/list/relate.component.spec.ts b/core/app/fields/relate/templates/list/relate.component.spec.ts new file mode 100644 index 000000000..9fa971164 --- /dev/null +++ b/core/app/fields/relate/templates/list/relate.component.spec.ts @@ -0,0 +1,21 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {RelateListFieldsComponent} from './relate.component'; + +describe('RelateListFieldsComponent', () => { + let component: RelateListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [RelateListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RelateListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/relate/templates/list/relate.component.ts b/core/app/fields/relate/templates/list/relate.component.ts new file mode 100644 index 000000000..4438458b1 --- /dev/null +++ b/core/app/fields/relate/templates/list/relate.component.ts @@ -0,0 +1,29 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-relate-list', + templateUrl: './relate.component.html', + styleUrls: [] +}) +export class RelateListFieldsComponent implements OnInit { + data: any = {}; + link = '#/'; + + constructor() { + } + + ngOnInit() { + } + + ngAfterViewChecked() { + //console.log('dbg: [RelateListViewModule.ngAfterViewChecked]', this.data); + this.link = '#/' + (this.data && this.data.fieldName && this.data.row && this.data.row.field_name_map && + this.data.row.field_name_map[this.data.fieldName] && this.data.row.field_name_map[this.data.fieldName].module ? + this.data.row.field_name_map[this.data.fieldName].module : '') + '/DetailView/' + (this.data && this.data.row && + this.data.row.field_name_map && this.data.row.field_name_map[this.data.fieldName] && + this.data.row.field_name_map[this.data.fieldName].id_name && + this.data.row[this.data.row.field_name_map[this.data.fieldName].id_name] ? + this.data.row[this.data.row.field_name_map[this.data.fieldName].id_name] : ''); + } + +} \ No newline at end of file diff --git a/core/app/fields/relate/templates/record/relate.component.html b/core/app/fields/relate/templates/record/relate.component.html new file mode 100644 index 000000000..a32bf5f73 --- /dev/null +++ b/core/app/fields/relate/templates/record/relate.component.html @@ -0,0 +1,3 @@ + diff --git a/core/app/fields/relate/templates/record/relate.component.spec.ts b/core/app/fields/relate/templates/record/relate.component.spec.ts new file mode 100644 index 000000000..3af14dc14 --- /dev/null +++ b/core/app/fields/relate/templates/record/relate.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {RelateRecordFieldsComponent} from './relate.component'; + +describe('RelateRecordFieldsComponent', () => { + let component: RelateRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [RelateRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RelateRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/relate/templates/record/relate.component.ts b/core/app/fields/relate/templates/record/relate.component.ts new file mode 100644 index 000000000..fc0a521da --- /dev/null +++ b/core/app/fields/relate/templates/record/relate.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-relate', + templateUrl: './relate.component.html', + styleUrls: [] +}) +export class RelateRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/submit/submit.php b/core/app/fields/submit/submit.php new file mode 100644 index 000000000..be8801a2f --- /dev/null +++ b/core/app/fields/submit/submit.php @@ -0,0 +1,3 @@ + { + let component: SubmitListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SubmitListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SubmitListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/submit/templates/list/submit.component.ts b/core/app/fields/submit/templates/list/submit.component.ts new file mode 100644 index 000000000..5ea77cdf5 --- /dev/null +++ b/core/app/fields/submit/templates/list/submit.component.ts @@ -0,0 +1,18 @@ +import {Component, OnInit, Input} from '@angular/core'; + +@Component({ + selector: 'scrm-submit-list', + templateUrl: './submit.component.html', + styleUrls: [] +}) +export class SubmitListFieldsComponent implements OnInit { + + data: any = []; + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/submit/templates/record/submit.component.html b/core/app/fields/submit/templates/record/submit.component.html new file mode 100644 index 000000000..b0befe196 --- /dev/null +++ b/core/app/fields/submit/templates/record/submit.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/core/app/fields/submit/templates/record/submit.component.spec.ts b/core/app/fields/submit/templates/record/submit.component.spec.ts new file mode 100644 index 000000000..1c0f4472d --- /dev/null +++ b/core/app/fields/submit/templates/record/submit.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {SubmitRecordFieldsComponent} from './submit.component'; + +describe('SubmitRecordFieldsComponent', () => { + let component: SubmitRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SubmitRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SubmitRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/submit/templates/record/submit.component.ts b/core/app/fields/submit/templates/record/submit.component.ts new file mode 100644 index 000000000..6c10088c6 --- /dev/null +++ b/core/app/fields/submit/templates/record/submit.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-submit-record', + templateUrl: './submit.component.html', + styleUrls: [] +}) +export class SubmitRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/varchar/templates/list/varchar.component.html b/core/app/fields/varchar/templates/list/varchar.component.html new file mode 100644 index 000000000..6e5d3d834 --- /dev/null +++ b/core/app/fields/varchar/templates/list/varchar.component.html @@ -0,0 +1 @@ +{{ data.fieldValue }} diff --git a/core/app/fields/varchar/templates/list/varchar.component.spec.ts b/core/app/fields/varchar/templates/list/varchar.component.spec.ts new file mode 100644 index 000000000..b22a820c7 --- /dev/null +++ b/core/app/fields/varchar/templates/list/varchar.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {VarcharListFieldsComponent} from './varchar.component'; + +describe('VarcharListFieldsComponent', () => { + let component: VarcharListFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [VarcharListFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(VarcharListFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/fields/varchar/templates/list/varchar.component.ts b/core/app/fields/varchar/templates/list/varchar.component.ts new file mode 100644 index 000000000..0fc5f6c5d --- /dev/null +++ b/core/app/fields/varchar/templates/list/varchar.component.ts @@ -0,0 +1,35 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-varchar-list', + templateUrl: './varchar.component.html', + styleUrls: [] +}) +export class VarcharListFieldsComponent implements OnInit { + + data: any = {}; + link = '#'; + class = 'text'; + + constructor() { + } + + ngOnInit() { + } + + ngAfterViewChecked() { + //console.log('dbg: [VarcharListViewComponent.ngAfterViewChecked]', this.data); + if (this.data && this.data.fieldName && this.data.fieldName == 'name') { + this.link = '#/' + this.data.row.module_name + '/DetailView/' + this.data.row.id; + this.class = 'name'; + // this.link = '#/' + (this.data && this.data.fieldName && this.data.row && this.data.row.field_name_map && + // this.data.row.field_name_map[this.data.fieldName] && this.data.row.field_name_map[this.data.fieldName].module ? + // this.data.row.field_name_map[this.data.fieldName].module : '') + '/DetailView/' + (this.data && this.data.row && + // this.data.row.field_name_map && this.data.row.field_name_map[this.data.fieldName] && + // this.data.row.field_name_map[this.data.fieldName].id_name && + // this.data.row[this.data.row.field_name_map[this.data.fieldName].id_name] ? + // this.data.row[this.data.row.field_name_map[this.data.fieldName].id_name] : ''); + } + } + +} \ No newline at end of file diff --git a/core/app/fields/varchar/templates/record/varchar.component.html b/core/app/fields/varchar/templates/record/varchar.component.html new file mode 100644 index 000000000..de3a0430e --- /dev/null +++ b/core/app/fields/varchar/templates/record/varchar.component.html @@ -0,0 +1,10 @@ +
+ + +
\ No newline at end of file diff --git a/core/app/fields/varchar/templates/record/varchar.component.spec.ts b/core/app/fields/varchar/templates/record/varchar.component.spec.ts new file mode 100644 index 000000000..7913a038e --- /dev/null +++ b/core/app/fields/varchar/templates/record/varchar.component.spec.ts @@ -0,0 +1,21 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {VarcharRecordFieldsComponent} from './varchar.component'; + +describe('VarcharRecordFieldsComponent', () => { + let component: VarcharRecordFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [VarcharRecordFieldsComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(VarcharRecordFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); +}); diff --git a/core/app/fields/varchar/templates/record/varchar.component.ts b/core/app/fields/varchar/templates/record/varchar.component.ts new file mode 100644 index 000000000..cc49e996a --- /dev/null +++ b/core/app/fields/varchar/templates/record/varchar.component.ts @@ -0,0 +1,16 @@ +import {Component, OnInit} from '@angular/core'; + +@Component({ + selector: 'scrm-varchar-record', + templateUrl: './varchar.component.html', + styleUrls: [] +}) +export class VarcharRecordFieldsComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} \ No newline at end of file diff --git a/core/app/fields/varchar/varchar.php b/core/app/fields/varchar/varchar.php new file mode 100644 index 000000000..fb15953ad --- /dev/null +++ b/core/app/fields/varchar/varchar.php @@ -0,0 +1,3 @@ + svg { + margin: 0.3em 0.8em 0.8em 0; +} + +.action-btn-icon { + svg { + width: 1.2em; + height: 1.2em; + } +} + +.action-btn-icon svg path, +.global-links svg path { + fill: $white; +} + +.navbar-toggler:hover svg path { + stroke: $salmon-pink; +} + +.close-navmenu svg polygon { + fill: $light-grey; +} + +.close-navmenu svg { + margin: 0 0.3em 0 0; +} + +.back-to-top svg { + width: 1em; + height: 1em; + margin: 0 0.5em; +} + +.back-to-top svg polygon { + fill: $midnight-grey; +} + +.login-form { + svg { + width: 1.2em; + height: 1.2em; + margin: 1em; + + path, + polygon, + rect { + fill: $powdered-blue; + } + } +} + +.list-view-settings svg { + fill: $white; + margin: 0 0.5em 0 0; + vertical-align: middle; +} + +.sort-icon { + fill: $light-grey; + margin: 0 0.2em; +} + +.pagination-icons { + fill: $white; + margin: 0.2em; +} + +.widget-close-icon svg { + fill: $white; + cursor: pointer; +} + +.widget-button-icon { + fill: $white; + margin: 0 0.5em 0 0; + vertical-align: middle; +} + +.remove-button svg { + fill: $sky-blue; +} + +.expand-table-row svg { + fill: $sky-blue; +} + +.modal .close svg { + fill: $white; +} + +.info-icon { + margin: 0 0 0 0.5em; +} + +.info-icon svg circle { + fill: $white; +} + +.info-icon svg path { + fill: $dusty-grey; +} + +.create-popup-arrow svg { + width: 1.2em; +} + +.create-popup-cross svg { + width: 0.75em; + height: 0.75em; +} + +.create-popup-arrow svg polygon, +.create-popup-cross svg polygon, +.create-popup-calendar svg * { + fill: #c3c1c9; +} + +@media all and (min-width: $breakpoint-large) { + button svg { + vertical-align: -0.2em; + display: inline-block; + } +} + +.list-data-icon { + margin: 0; + padding: 0; +} + +.list-data-icon svg { + fill: #aa9dcc; + margin: 0; + padding: 0; +} + +.back-top-icon { + vertical-align: middle; + margin: 0; + padding: 0; +} + +.responsive-menu-toggler svg path { + fill: $white; +} diff --git a/core/app/themes/suite8/css/layout/_actionbar.scss b/core/app/themes/suite8/css/layout/_actionbar.scss new file mode 100644 index 000000000..33df4215d --- /dev/null +++ b/core/app/themes/suite8/css/layout/_actionbar.scss @@ -0,0 +1,30 @@ +/* --------- ACTION BAR SECTION ---------- */ + +.global-action-bar { + clear: both; + margin-top: 3.1em; + background-color: $light-grey; +} + +@media all and (max-width: $breakpoint-small) { + .global-action-bar .col, + .global-action-bar .col-6 { + margin: 0; + padding: 0; + } + .global-action-bar .action-group { + margin: 0.3em 0.3em 0.3em 0; + } + + .global-action-bar .global-search { + margin: 0.3em; + padding: 0; + } +} + +.action-view-all { + font-style: italic; + font-weight: 300; + float: right; + font-size: 0.9em; +} diff --git a/core/app/themes/suite8/css/layout/_common.scss b/core/app/themes/suite8/css/layout/_common.scss new file mode 100644 index 000000000..98d748ba8 --- /dev/null +++ b/core/app/themes/suite8/css/layout/_common.scss @@ -0,0 +1,59 @@ +/* --------- COMMON SECTION ---------- */ + +body { + height: 100%; + margin: 0; + padding: 0; + border: none; + background: $off-white; +} + +/*
 tags shows up in a well separated visible format at a high z-index */
+pre {
+  font-family: monospace;
+  font-size: 1em;
+  background: black;
+  border: gray;
+  color: lightgreen;
+  z-index: 100000;
+}
+
+/* width */
+::-webkit-scrollbar {
+  width: 0.8em;
+}
+
+/* Track */
+::-webkit-scrollbar-track {
+  background: $dusky-blue;
+}
+
+/* Handle */
+::-webkit-scrollbar-thumb {
+  background: $midnight-blue;
+}
+
+/* Handle on hover */
+::-webkit-scrollbar-thumb:hover {
+  background: $midnight-blue;
+}
+
+.navbar-nav a:not([href]):not([tabindex]), .global-links a:not([href]):not([tabindex]) {
+  color: $light-grey;
+}
+
+.navbar-nav a:not([href]):not([tabindex]):focus,
+.navbar-nav a:not([href]):not([tabindex]):hover,
+.global-links a:not([href]):not([tabindex]):focus,
+.global-links a:not([href]):not([tabindex]):hover {
+  color: $salmon-pink;
+  -webkit-transition: color 0.5s ease-out;
+  -moz-transition: color 0.5s ease-out;
+  -o-transition: color 0.5s ease-out;
+  transition: color 0.5s ease-out;
+  cursor: pointer;
+}
+
+iframe {
+  padding-top: 7em;
+}
\ No newline at end of file
diff --git a/core/app/themes/suite8/css/layout/_footer.scss b/core/app/themes/suite8/css/layout/_footer.scss
new file mode 100644
index 000000000..bb221c617
--- /dev/null
+++ b/core/app/themes/suite8/css/layout/_footer.scss
@@ -0,0 +1,89 @@
+.footer a {
+  font-size: 0.8em;
+}
+
+.footer-link {
+  color: $midnight-grey;
+  cursor: pointer;
+  margin: 0 0.5em;
+  font-size: 1em;
+}
+
+a.footer-link:not([href]):not([tabindex]) {
+  color: $midnight-grey;
+}
+
+.footer-link:hover {
+  color: $median-grey;
+  text-decoration: none;
+}
+
+.back-to-top .footer-link {
+  text-transform: uppercase;
+  font-size: 0.75em;
+  vertical-align: middle;
+  cursor: pointer;
+}
+
+@media all and (min-width: $breakpoint-medium) {
+  .footer {
+    position: fixed;
+    left: 0;
+    bottom: 0;
+    padding: 0 1.85em;
+    width: 100%;
+    height: 3.1em;
+    line-height: 3.1em;
+    background-color: $light-grey;
+    color: $midnight-blue;
+  }
+
+  .copyright-links {
+    float: left;
+    line-height: 3.1em;
+  }
+
+  .back-to-top {
+    margin: 0 0.5em 0 0;
+    padding: 0;
+    float: right;
+    line-height: 3.1em;
+  }
+}
+
+@media all and (max-width: $breakpoint-medium) {
+  .copyright-links {
+    float: left;
+    width: 60%;
+    padding: 0.5em 0 0 0.25em;
+  }
+
+  .back-to-top {
+    margin: 0 0.5em 0 0;
+    padding: 0;
+    float: right;
+    line-height: 3.1em;
+    width: 35%;
+  }
+
+  .back-to-top .footer-link {
+    float: right;
+    margin: 0;
+  }
+
+  .footer {
+    left: 0;
+    bottom: 0;
+    padding: 0;
+    width: 100%;
+    height: 3.1em;
+    background-color: $light-grey;
+    color: $midnight-blue;
+    margin: 0;
+  }
+
+  .footer-link {
+    display: block;
+    float: left;
+  }
+}
diff --git a/core/app/themes/suite8/css/layout/_forms.scss b/core/app/themes/suite8/css/layout/_forms.scss
new file mode 100644
index 000000000..d6338390a
--- /dev/null
+++ b/core/app/themes/suite8/css/layout/_forms.scss
@@ -0,0 +1,32 @@
+/* --------- FORM SECTION ---------- */
+
+
+.login-form {
+  @media all and (min-width: $breakpoint-xsmall) {
+    text-align: center;
+    width: 25em;
+    margin: 20% auto;
+  }
+
+  @media all and (max-width: $breakpoint-xsmall) {
+    text-align: center;
+    margin: 5% auto;
+    position: absolute;
+    width: 95%;
+    top: 25%;
+  }
+
+  img {
+    margin-bottom: 1.3em;
+  }
+
+  .forgotten-password {
+    text-align: center;
+    margin: 0.2em 0 0 0;
+  }
+
+  .forgotten-password-link {
+    clear: both;
+    color: $salmon-pink;
+  }
+}
diff --git a/core/app/themes/suite8/css/layout/_listview.scss b/core/app/themes/suite8/css/layout/_listview.scss
new file mode 100644
index 000000000..f6ef99cfe
--- /dev/null
+++ b/core/app/themes/suite8/css/layout/_listview.scss
@@ -0,0 +1,371 @@
+.list-view {
+  padding-top: 7em;
+  width: 100%;
+  margin: 0;
+}
+
+.list-view-header {
+  border-bottom: 0.03em solid $light-grey;
+}
+
+.list-view-title {
+  color: $shell-grey;
+  font-size: 1.8em;
+  font-weight: 300;
+  margin: 1em;
+  letter-spacing: 0.1em;
+  text-transform: uppercase;
+}
+
+.list-view-actions {
+  margin: 1em 0 0 0;
+}
+
+.list-view-container {
+  margin: 1em 0 4em 0;
+  font-size: 0.85em;
+}
+
+.list-view-widget {
+  margin-right: 1.5em;
+}
+
+.widget {
+  background-color: $white;
+  border: 0.1em solid $light-grey;
+}
+
+.widget-header {
+  background-color: $midnight-blue;
+  -webkit-border-top-left-radius: 0.3em;
+  -webkit-border-top-right-radius: 0.3em;
+  -moz-border-radius-topleft: 0.3em;
+  -moz-border-radius-topright: 0.3em;
+  border-top-left-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+
+  h3 {
+    color: $white;
+    font-size: 1.2em;
+    margin: 0;
+    padding: 0.8em;
+  }
+}
+
+.list-view-table {
+  margin: 0;
+}
+
+.table-wrapper {
+  overflow-x: auto;
+  overflow-y: hidden;
+}
+
+.table-header {
+  -webkit-border-top-left-radius: 0.3em;
+  -webkit-border-top-right-radius: 0.3em;
+  -moz-border-radius-topleft: 0.3em;
+  -moz-border-radius-topright: 0.3em;
+  border-top-left-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+
+.table-footer {
+  -webkit-border-bottom-right-radius: 0.3em;
+  -webkit-border-bottom-left-radius: 0.3em;
+  -moz-border-radius-bottomright: 0.3em;
+  -moz-border-radius-bottomleft: 0.3em;
+  border-bottom-right-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+}
+
+.list-view-tableactions {
+  background-color: $cool-blue;
+  padding: 0.2em;
+}
+
+.list-view-table thead {
+  background-color: $nepal-grey;
+  color: $white;
+}
+
+.list-view-table td {
+  color: $median-grey;
+}
+
+.bulk-action {
+  color: $white;
+}
+
+.list-view-table a {
+  color: $burnt-red;
+  font-weight: bold;
+}
+
+.pipeline-chart,
+.donut-chart {
+  margin: 0 0.5em;
+}
+
+.pipeline-chart-content,
+.donut-chart-content {
+  margin: 1.5em 0;
+}
+
+.chart-create {
+  margin: 1em 0;
+}
+
+@media all and (max-width: $breakpoint-xlarge) {
+  .list-view-widget {
+    margin: 1.5em 0;
+  }
+}
+
+@media all and (max-width: $breakpoint-large) {
+  table {
+    table-layout: fixed;
+  }
+  td {
+    word-wrap: break-word;
+  }
+  tbody,
+  tr {
+    display: block;
+    width: 100%;
+  }
+
+  .responsive-table-row th {
+    margin: 0;
+    padding: 1em 1em 0 1em;
+  }
+
+  .responsive-table-row td {
+    margin: 0;
+    padding: 0 1em 1em 1em;
+  }
+
+  .responsive-table td {
+    border: none;
+  }
+
+  .hide-pagination-count {
+    display: none;
+  }
+
+  .responsive-table-row th,
+  .responsive-table-row td {
+    word-wrap: break-word;
+  }
+
+  .list-view-table th,
+  .list-view-table td {
+    word-wrap: break-word;
+  }
+
+  .hide-table-header,
+  .hide-table-rows {
+    display: none;
+  }
+
+  .show-collapsed-header,
+  .show-collapsed-rows {
+    display: none;
+  }
+
+  .expand-table-row {
+    margin: 0 2em;
+    cursor: pointer;
+  }
+
+  .table-striped .responsive-top-row,
+  .table-striped tbody tr:nth-of-type(odd).responsive-top-row {
+    background-color: $sky-blue;
+    -webkit-border-top-left-radius: 0.3em;
+    -webkit-border-top-right-radius: 0.3em;
+    -moz-border-radius-topleft: 0.3em;
+    -moz-border-radius-topright: 0.3em;
+    border-top-left-radius: 0.3em;
+    border-top-right-radius: 0.3em;
+  }
+
+  .responsive-top-row a {
+    color: $white;
+  }
+
+  .first-table-data {
+    background-color: $sky-blue;
+  }
+
+  .responsive-table-row td,
+  .responsive-table-row th {
+    background-color: #edecf0;
+    color: $midnight-blue;
+  }
+
+  .responsive-table th {
+    background-image: linear-gradient(to right, $midnight-grey 10%, rgba(255, 255, 255, 0) 0%);
+    background-position: top;
+    background-size: 5px 1px;
+    background-repeat: repeat-x;
+  }
+
+  tr.responsive-table-row {
+    background-color: #edecf0;
+  }
+
+  .primary-table-header {
+    background-color: $nepal-grey;
+    color: $white;
+  }
+
+  .list-view-table thead th {
+    border: none;
+  }
+
+  .display-block-table th,
+  .display-block-table td {
+    display: block;
+    width: 100%;
+  }
+
+  .responsive-table-toggler {
+    text-align: right;
+    width: 100%;
+    cursor: pointer;
+  }
+
+  .table td {
+    border: none;
+  }
+
+  td.list-group-icon {
+    margin: 0;
+    padding: 0.75rem 0;
+    display: inline;
+  }
+  .list-view-title {
+    margin: 0.5em 1em;
+  }
+
+  .list-view-table .row {
+    margin-left: 1em;
+    margin-right: 1em;
+  }
+
+  .list-view-header .row {
+    padding-left: 0;
+    padding-right: 0;
+    margin-left: 0.9em;
+    margin-right: 0.9em;
+  }
+
+  .list-view-header .col {
+    padding-left: 0;
+    padding-right: 0;
+    margin-left: 0;
+    margin-right: 0;
+  }
+}
+
+.primary-table-header {
+  background-color: $nepal-grey;
+  color: $white;
+  white-space: nowrap;
+}
+
+.primary-table-header span {
+  font-weight: bold;
+}
+
+.primary-table-header span:hover {
+  text-decoration: underline;
+  cursor: pointer;
+}
+
+td.list-group-icon {
+  margin: 0;
+  padding: 0.75rem 0;
+}
+
+.responsive-table-row.display-block-table {
+  border-left: 0.1em solid #aa9dcc;
+  border-right: 0.1em solid #aa9dcc;
+  margin: 0 0 0.5em 0;
+  -webkit-border-bottom-right-radius: 0.25em;
+  -webkit-border-bottom-left-radius: 0.25em;
+  -moz-border-radius-bottomright: 0.25em;
+  -moz-border-radius-bottomleft: 0.25em;
+  border-bottom-right-radius: 0.25em;
+  border-bottom-left-radius: 0.25em;
+}
+
+@media all and (max-width: $breakpoint-large) {
+  .checkbox-container {
+    padding: 0 0.25rem;
+  }
+  th.show-table-rows {
+    padding: 0 1rem;
+  }
+}
+
+.responsive-top-row .responsive-header-link {
+  background-image: linear-gradient(to right, $white 30%, rgba(255, 255, 255, 0) 0%);
+  background-position: bottom;
+  background-size: 5px 1px;
+  background-repeat: repeat-x;
+  text-decoration: none;
+}
+
+.display-block-table th:not(:first-child) {
+  background-image: linear-gradient(to right, $midnight-grey 10%, rgba(255, 255, 255, 0) 0%);
+  background-position: top;
+  background-size: 5px 1px;
+  background-repeat: repeat-x;
+}
+
+.display-block-table td,
+.display-block-table th {
+  border: none;
+}
+
+.primary-table-data {
+  width: 100%;
+}
+
+td {
+  word-wrap: break-word;
+}
+
+.select-action-group {
+  margin: 0 0 0 0.5em;
+  color: $white;
+}
+
+.select-action-group .dropdown-toggle::after,
+.bulk-action-group,
+.bulk-action-group .dropdown-toggle::after {
+  color: $white;
+}
+
+@media all and (min-width: $breakpoint-medium) {
+  .bulk-action {
+    margin-left: 0.5em;
+  }
+}
+
+.pagination-count {
+  vertical-align: text-bottom;
+  margin: 0 0.3em;
+  font-weight: bold;
+}
+
+.list-view .col-lg-12, .list-view .col-lg-9, .list-view .col-lg-3 {
+  transition-timing-function: ease;
+  /* Quick on the way out */
+  transition: 0.5s;
+  -webkit-transition: all .5s ease;
+  -moz-transition: all .5s ease;
+  -o-transition: all .5s ease;
+  transition: all .5s ease;
+}
\ No newline at end of file
diff --git a/core/app/themes/suite8/css/layout/_modal.scss b/core/app/themes/suite8/css/layout/_modal.scss
new file mode 100644
index 000000000..021378379
--- /dev/null
+++ b/core/app/themes/suite8/css/layout/_modal.scss
@@ -0,0 +1,132 @@
+@media all and (max-width: $breakpoint-xsmall) {
+  .modal-header,
+  .modal-footer {
+    background-color: $dusty-grey;
+  }
+  .modal-body {
+    margin: 0;
+    overflow-y: scroll;
+    max-height: $breakpoint-xsmall;
+  }
+}
+
+@media all and (min-width: $breakpoint-xsmall) and (max-width: $breakpoint-xlarge) {
+  .modal-header,
+  .modal-footer {
+    background-color: $dusty-grey;
+  }
+  .modal-redirect-text {
+    color: $white;
+    font-weight: bold;
+    font-size: 0.8em;
+    margin: 0 0 0 3em;
+  }
+  .modal-body {
+    margin: 0;
+    overflow-y: scroll;
+    max-height: $breakpoint-medium;
+  }
+  .modal-redirect-text {
+    margin: 0 0 0 2.5em;
+  }
+  .modal-options {
+    margin: 0 0 0.5em 0;
+  }
+}
+
+.modal-title {
+  text-align: center;
+  margin: 0 auto;
+  padding: 0;
+  line-height: 0.9em;
+  color: $off-white;
+}
+
+.modal-content {
+  border: none;
+  background-color: $white;
+}
+
+@media all and (min-width: $breakpoint-xlarge) {
+  .modal-body {
+    margin: 1em;
+  }
+
+  .modal-redirect-text {
+    color: $white;
+    font-weight: bold;
+    font-size: 0.8em;
+    margin: 1em 0 0 0;
+  }
+
+  .modal-header,
+  .modal-footer {
+    background-color: $dusty-grey;
+    max-height: 2.7rem;
+  }
+
+  .modal-options {
+    float: left;
+    text-align: right;
+  }
+
+  .modal-buttons {
+    float: right;
+    text-align: right;
+  }
+}
+
+.modal-field-header {
+  background-color: $light-grey;
+  padding: 0.6em 0.7em;
+  -webkit-border-radius: 0.25em;
+  -moz-border-radius: 0.25em;
+  border-radius: 0.25em;
+  color: #534d64;
+  font-size: 1em;
+  letter-spacing: 0.08em;
+}
+
+.modal-backdrop {
+  background-color: #454c53;
+}
+
+.modal-backdrop.show {
+  opacity: 0.9;
+}
+
+.modal-header .close {
+  margin: -0.3em 0;
+  padding: 0;
+  opacity: 1;
+}
+
+.relate-input-group {
+  display: inline;
+}
+
+.modal-redirect-text {
+  color: $white;
+  font-weight: bold;
+  font-size: 0.8em;
+}
+
+/* width */
+.modal-body::-webkit-scrollbar {
+  width: 0.8em;
+}
+
+/* Track */
+.modal-body::-webkit-scrollbar-track {
+  background: $light-grey;
+}
+
+/* Handle */
+.modal-body::-webkit-scrollbar-thumb {
+  background: $dusty-grey;
+}
+
+/* Handle on hover */
+.modal-body::-webkit-scrollbar-thumb:hover {
+  background: $dusty-grey;
+}
diff --git a/core/app/themes/suite8/css/layout/_navbar.scss b/core/app/themes/suite8/css/layout/_navbar.scss
new file mode 100644
index 000000000..519bb9f2b
--- /dev/null
+++ b/core/app/themes/suite8/css/layout/_navbar.scss
@@ -0,0 +1,206 @@
+/* --------- NAVBAR SECTION ---------- */
+
+.navbar {
+  height: 3.1em;
+  background-color: $midnight-blue;
+  padding: 0 1.6em;
+  margin: 0;
+}
+
+@media only screen and (min-width: $breakpoint-large) {
+  .navbar-nav {
+    .main-grouped:hover .dropdown-menu.main,
+    .global-link-item:hover .dropdown-menu,
+    .non-grouped:hover .dropdown-menu {
+      display: block;
+    }
+  }
+
+  .nav-link-grouped,
+  .nav-link-nongrouped {
+    color: $off-white;
+    line-height: 3.1em;
+    padding: 1em 0.5em 1em 0.5em;
+  }
+
+  .nav-link-grouped:hover,
+  .nav-link-nongrouped:hover {
+    color: $light-grey;
+    border-top: 0.2em solid $salmon-pink;
+    padding: 0.8em 0.5em 1em 0.5em;
+    text-decoration: none;
+  }
+}
+
+.home-nav {
+  line-height: 3.1em;
+}
+
+a.home-nav-link {
+  color: $white;
+  line-height: 3.1em;
+  padding: 1em 0.5em 1em 0.5em;
+}
+
+.recent-link scrm-svg-icon-ui > svg {
+  margin: 0.3em 0.8em 0.8em 0;
+}
+
+.recent-link {
+  display: inline;
+  margin: 0;
+  padding: 0;
+}
+
+.nav-link {
+  color: $light-grey;
+}
+
+.nav-link:hover {
+  color: $salmon-pink;
+}
+
+.global-link-item:hover {
+  color: $salmon-pink;
+}
+
+.submenu,
+.globalactions {
+  background-color: $dusky-blue;
+  color: $light-grey;
+  margin: 0;
+  border: 0;
+}
+
+.submenu li {
+  border: 0;
+  padding: 0 0.3em;
+  -webkit-transition: color 0.5s ease-out;
+  -moz-transition: color 0.5s ease-out;
+  -o-transition: color 0.5s ease-out;
+  transition: color 0.5s ease-out;
+}
+
+.nav-menu-icon {
+  width: 1.5em;
+  height: 1.5em;
+}
+
+.action-btn-icon {
+  width: 1.2em;
+  height: 1.2em;
+}
+
+h4.recently-viewed-header {
+  border-top: 0.05em solid darken($light-grey, 20%);
+  color: darken($light-grey, 20%);
+  font-weight: bold;
+  margin: 0.8em 0 0 0;
+  padding: 0.8em;
+  font-size: 0.9em;
+}
+
+.nav-link:hover svg path,
+.nav-link:hover svg polygon {
+  fill: $salmon-pink;
+}
+
+.navbar-1 {
+  float: left;
+  width: 100%;
+}
+
+.navbar-2 {
+  float: right;
+  padding: 0;
+}
+
+@media only screen and (max-width: $breakpoint-large) {
+  .navbar-1,
+  .navbar-2 {
+    padding: 0;
+    margin: 0;
+    float: left;
+    top: 0;
+    z-index: 3;
+  }
+
+  .top-nav .dropdown-toggle::after {
+    display: none;
+  }
+
+  .navbar-header {
+    padding: 0 0.8em;
+  }
+
+  .navbar-toggler {
+    padding: 0.8em 1.6em;
+  }
+
+  .navbar-nav li {
+    padding: 0 1.6em;
+  }
+
+  .nav-link {
+    font-size: 0.85em;
+    color: $white;
+  }
+
+  .nav-link-grouped,
+  .nav-link-nongrouped {
+    color: $off-white;
+    line-height: 3.1em;
+    padding: 0.8em 0.5em 1em 0.5em;
+    font-size: 0.85em;
+  }
+
+  .nav-link-grouped:hover,
+  .nav-link-nongrouped:hover {
+    color: $light-grey;
+    text-decoration: none;
+  }
+  .navbar-nav,
+  .navbar-nav li {
+    border-bottom: 0.05em solid $off-white;
+  }
+
+  .navbar-nav:last-child,
+  .navbar-nav li:last-child {
+    border: none;
+  }
+
+  .top-nav.nav-item:hover {
+    padding: 0 1.6em;
+  }
+
+  .global-action-icon svg {
+    width: 1.5em;
+    height: 1.5em;
+    margin: 0 0.6em 0 0;
+  }
+
+  .global-links .nav-link {
+    font-size: 0.85em;
+    font-weight: bold;
+  }
+
+  .navbar-nav > li > .dropdown-menu,
+  .collapsenav .navbar-nav > li {
+    background-color: $dusky-blue;
+  }
+}
+
+.navbar-toggler:hover svg path {
+  stroke: $salmon-pink;
+}
+
+scrm-logo-ui img {
+  margin: 0.3em;
+  padding-left: 0.5em;
+}
+
+a.nav-link.dropdown-toggle::after,
+a.nav-link-grouped.dropdown-toggle::after,
+a.nav-link-nongrouped.dropdown-toggle::after {
+  vertical-align: middle;
+}
diff --git a/core/app/themes/suite8/css/style.scss b/core/app/themes/suite8/css/style.scss
new file mode 100644
index 000000000..b08ccf403
--- /dev/null
+++ b/core/app/themes/suite8/css/style.scss
@@ -0,0 +1,19 @@
+@import 'base/reset';
+
+@import 'abstracts/functions';
+@import 'abstracts/typography';
+@import 'abstracts/variables';
+
+@import 'components/button';
+@import 'components/checkbox';
+@import 'components/dropdown';
+@import 'components/input';
+@import 'components/svg';
+
+@import 'layout/actionbar';
+@import 'layout/common';
+@import 'layout/footer';
+@import 'layout/forms';
+@import 'layout/listview';
+@import 'layout/modal';
+@import 'layout/navbar';
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/3d_chart.jpeg b/core/app/themes/suite8/images/3d_chart.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..e6924fe27809c6a3e7174936dcd310d03d2c571b
GIT binary patch
literal 8990
zcmZu%1z20#vQF?)9D)@O6baDc?(W5{xVt;0Ev0C14G<`jqA55w`Q-kSH8)ffBrpt)|%YS-TeR%sVb@{0)RjO0Eqek?iK+NfCpIEghYfO
zLP8R95D0|okrR;)S{rC|G#K^e5ujAOV*4`;AWZ>|^BM_hNvCm{}#{^2lBOu^j{lDu+1EOP~^rI$4
zQ8xlaL&w0uM8m|m*M6@bofw0W2a`lbo0Runea$!-)9bHCvMX31FrSXK_rx(Xzuesd
z01q9dnHZfIAO-kE36Mqu5CL9c02qJ(9AKoSU}~CbI-`b%MsagnjLIk63!4fWpTp}B
zGqaBokt)prPg-j^_3XO@lh@lHTjedM?#gxl&TO_W7*77fHA>SOp-_KJy5_!d2e3WU
zmLs1L>(6GNE#tE7_ELLwJ+wU$Fr8i}sED*wFyu=&YIxw_?$9+vS|L!JAIGWvJo*km
zvi6fcu}Ay(GRsN(`Z{&I`-r(k_G{m-#Nt{p9}0Yv7kdj`qC_^SDv53FSZ;`0#n0Ee
zM*%1P=a9fK^%`@*x?i>XVv>9naxNm?40nIFvUG@-L-UE3uua66R$HuFDh{%e5N
z$oj}Eg!14*aq>o;5{ZcFv=a*Gx4#2;AmgkQea6XLC!ouv(=@+eTRf)0Z70Pa4dX6O
zuCu|Bv9r8&&0;F7Z6hqIsinW(FTVJ&QN~j68bgKg$s00fs@fb-f+8GO7vdP)wuIYA
z{LUd>be55kdlKI`gPCP$Ybt45JL`R~JYJz3Wi$q7IMqXSwUW{Oft6!{(wFWU
z!GVr^B~*UNA%rE~^Uikwo!hQ6O1GA?D*Ez^iH1?+tntAUJ&w
z9=IA~e9dNLH0pNx0K#;%3@Xqk|6)#1YV?M`&<{)5lq$oUis-R@DrHPst-1oxfU?im
zuzHZ#8DeBtT7zo}dt^*mwu#rCwxMY{=5Nzf22pvww7r~yo?=mb2k4Wq*rgHs6`&;-
zv9NR7aB{G6zOnPovg%dvXf!ik3m;RDA0oDZ9N$s&wGBp>
z&qLzJy6kxJFkRcMXe`P;791a1rmomSl%1e`-Y%oq5xdd`G9Jn#LHv>d$G4L9(YhYG
zmD@cj<(0t38#E@PA9XaZRsjc#)em+WebYRzj$GGlwp9b+3(g0{5Sg=Im~m|@vnI8g
z`VFrzKc3vMroc-aXuizi9;en&#;2RdOZ>_g^Ss>`ZT1@am)kd6lqP6p9p7D>!g`nX
z>El+uwXw?ESzr}=Yy
zt#Nj=D>BIECoY=cEuiScZL5x9ilT8|Ur%PldES__&8E$3`r=5qQrmU
zKzENr6j>c
zoO~G`%r0-mvR(C|TY@6D*uIODY!zTzlGs{~rzy`lzZl5(6DRS?qmVK>piihH^tR>@
zk#MC7@@BXoQkID5k8@fgn=YYF^2~r<)64FN9tQ>=3j{YZh%rlmL@
zgSH3aRdh2dPEa9u-}>Dvx`2x}2!WrJc9QYZ>P4YlSP>m{i5#!VF>9OFT#uEDse+&IGRz6+M+7x`phP`b
zzO%c!@iCo3bPYU+oat-TLrf?|s9e
zhac{U2oI4nEmz>%S3JSlc-cor+X#^S0WGU!T~G+nHkMY^Oh0
z;F5*n+|vl1SyBFrqI5qfFY`hOak2Q?rt?Fk_qRsiY83Yjp8>T=*XfOOq;_R%{^HN|
zVCYQHabQkHy~`s@eS6lU(xF>smEs&5SpsiuleR?S&tx-mGaoAtheGDIPV@ZT`Wr9v
zPWY#o-qovijUzO0$IhJYg9#5@>hs?VIwg^W2@m(qnit8f-$#6Rtk$$N
zg5aV?fs>Qww$7bA3yav?QuW`}a5r*miuq`zSO*PKF
zkId9xF;&^=4$!K#2fhPDU%}cF9zt*N&pe+y{BSNUAI#d_?2RL>_D>b%-x0ARbIC2x
za7b?Iblj+NI?Kriev|ZhAueu}Go0mMHp-I1;@X@{f+&P=$LP#ewy>yKXUdnkqKLzl
zWJZi7!}-6s^ud^TX|1$00?P2jW*sk8#tc&Xk0o=Fb$|p0da5aLQUiYxkNTcLrM$)R
z%hVHC&C5m68^Sw)%l0UTVs1vF$=F7<4;>GUQ39v)D#ZdF6C|P;cZFMyg2L#g1B~F7
z71deS@O^7OoBD!TlyqILKvK?7#c=3PD)GuDxPa%4%Iswu_6($Ru-Y&xse2-B|6?X<
z)Nb7-wiy%8CXu?zbSvffncymw`q>Tr(v9+^-%w)I0W*J22)IY7vlm8B&$fh
zq$(4_F+#o){4d()p)03-lS%@
zUaH56Z4$!F3-a}J)D;K2`_=4&JmyK{^&3*GEbw_2t~<
z0KkvO=OB=+_j80$5bviHDqGczZWQxO$?jpUML`@pSg6-1+z++Kch|SMkBvhmPQz0
z>|5m>4y_s@*k$`^k;$@18r8JbiMrumbXGi}T<+#B-_FhWMPLI$U#D-aCc65Jr7(5t
zPPb{9m>~!8M|_(x-)YTg+jYXwEH>65Fz2?XTN~i30Fj`u4c=1IDx9_^Z8WmvR(@v^D^k6F~l=761f3Gad>
z8#-?hV_Swu5DWs0vM3q8NgMd2Y5$p`#Me%Y02$>`WU_Y$2&mZNG@_RJ5p5>kR40?L
z^G@vPrAg-TTtUtm^p)f(rxC})vnLp))VjZQ!&taT5l=po6wWde{fP$Zir1a%0Xys#
zd<$s!bFDLS#ncMZd_@(;xT0Aa8l-iAgW}(%qGqh-vqTId5Fy;ORda)Ji_g9acLoG~
z^lyF=(D^4ps5lE!eNjG#TRl{PUcIiU4wc&XS8HLPaOYK$6)qPpl*Hd$J)o|1hj1
zdWYkjhrFcDZ}5;ne*VijKYWE^?h{5d1(P*;LAZ?dV+K)r?bjq+Q?_LN6dX_4Q#kzw
ziUci-U<`z$4DS_8uhpWerddW;9*Jw38}~2SaXp`2y|xIt1GsY8y4DQ`9j+lI)ezvBnh1c&sCfxxf#%eP3*S;X_Gn*4s{d~TW+4uHtJpQJBQo3wY
zz3`AKXogMkW!TL0iDV|q5szf)%YV=RS+>V*l_S(LHoI`R34&vx7qGYAsD+UMmAq_V
zl4v%06CP#sq;Nx5l?_e7pQEQkJN5Q&JG7I_(=lG02;`p&+B;-06<-f+O?S^!%%&cW
z2ZDVQ8F|ASvnB>3OXvI>*Daj>+9sSq+Y0!@z2D(SN2ZUO7EPmOdu2>mrkxJt)9rB&?c-^@VBIhO^
zTE{k0RyMMgStXf~)MX*Uhwd|}`{(xlp?wO1%Fi>#gOck?R76Xk1+dYfvkkbG8wEDb
zkDVRHyCA{AW>$Yve5AmK@Y38{`U}e&;=W27XJ%LQpjRH<&V7QMo^(%%S49|K_$7Eh
z?_Ynnwb3Y_9oy<}h7jPvhYT2)<1|E#eQcjVyQo?GAsM7D;19=f{JC`K?cx^7&mS^c
zxAgmiTlFW}Qnwn|jfDQm;+9ByW4B=%iMhvO-{$n9zTNNoqRroJ@rMub&0Zc9R(S&Q
zPTPh^t8}W&HF9^;clG!B>#R&w;)v=@)pVJw6FJqB6QlKX_Pqi2TDCR3&r=K?9wN@(
zSaWgv18WTDEy|W(IuR&6Mk?tT9tpM(VwQ^b&?P^@uKlblK|cKT%xlMCCfNT;z*QHb
zF340fRqnmfy|-*o$)2d~bwBx|KvQwsx2{{)3h&sv@jZ0L1WmC1$n-ALSvyok#Jiq_
z{vOE~Sp<1{1Rx0@hs{!~n?cJ-;}SZ4(3Dc8_;Y
z?y$9f5TCVqF2&`&NvN7{@Ew&bUtbRlLztH088a0?u8xRtS;{_|`%K0X^7lKoT4Cr*
zbkBa6w%Wd569H5pZPxN;y2$+^jXt-X|1ecV->aN7El4nK>8WVbUgk0Tv4WJybi&&Z
z5f7_(H#~(8S~~^SFu{RT*mt9@Ah;5vYOhSm8^NV8J6e6qW(ho
z+~?%>NO&5Rs68DU$o4)le!@=XIE7>AhmfIZaft->DE5$-9aTM|6T+SS=iM(GpW_RHYy3yQZhq6ba1Z(!G&?So%^Cw3gBP5eLG
z?Va=J!E1%4>(AnGU{-Wsg_uO8*l}wcx$f%4p5T6R*1$ON9HMphWnNi9?FmZfL)nZ{
z%TSq3Li9x@1f_n${`9#0BP!E}+ImG0Df6DDqKHY+2iwD$lT`~hgIB$y0lq(0tN98}
zIoC!rUpAlNr+;KyLp}&?5b=C@a54K?Cz76|zb}oPEU*8~
zL9rn^9-pE#Qeoi7p&Ggv#(7FuAK}-_hu`h8@=@ZM;AN1ypBJw_E&qW{e%yl5fVN)Q
zlvkp?mgG_>wTM0+f1R+qrdF`#&m6i)y|Ha?)P_Jz0%{3d!?SItLH<}k9a%6*gCs`b
zU-XqHs%VguxeVcT9ama10d~4D+_gKKK4q^m^m9jQ2-3lAG6^Imi{5mofegKzx=+k+
z6GAuNeQC~DVASMaEdbd_lLcq
zbj`x|4zMx$**sustH(L;O&4+UA(Q7qqxvuH3{~wQNr<8dC-&zwHHsd@P!>ra6;mB9
z3T4cxPnr~L$P9>lbyE~{4;V-?H!
z?7&v_2yAs!Y-dAyH5zQA1G}ug(j*vj7moX&c4*brEn=KY$4cPhnsA7nbv?*Fr4RP?
zX4U90uqXQZPW^tn^!-b8>?F%G48TETU#YfHz
zFaC*I^yZeZ;BYRhP?}EH4r2h*eo@lUc-E(pw^;}s^lcfWrhPC~%3gq|2a7AlkY0Ph)`7bj1s;DxJJ(t7;qcP<9_Q!64jW(
zcFb_bB^2o^tx^|L>8!9z#ruDaB+%vUyIY6I`)aeXSMX^?cQ!bHTiv
zcACV$s%O0B`7g9p7if8duiSV7Jdze?*p{4p@(IvuouPUl=tOF2v+*I-x>Toxd+!%t
z?Vb1S4kgyV!t!;>bEBqh52;v4mi(m)db%Tm@QJdf0~=|1!u!dol(SGAZt_dveAI)V
z;;MLzg#z5090m9zvY)h!rVvwGEU2pgJi5HKcGpudm>sDIDry$+yDAv_y2`Oq&XI<2
z*qfUrbK!bMAbr!6aJ6yV#2T40va>U~`{I$^fk46=cfpj|%;4L>kGg(^dm{}Jf8=9E
zGD-}C2YN=zZH>xxxD3@@$eQ7V3TN~d_N|E<1sEsx%M^R_-=7qz1ubp+)Xa^-`5Ub7`brys^D(<{6gyE`!xn@Wwm4;SU*)KomNTemnP
z+_F;BPuOf~WUxxl6O*>YLRf*5T8Qi`!<-9?k30nrH+9SV_b}7c(oLC1*)l2`Rpj3p
zt6A#&kZ^mI;fM+e;p;7ZMmexOW+QIP`NvG<-pn-H29Zj7nUn?|#bBj_T7Dspv`~|bSR^J8f_jA5gM~>=`
zbeQ^1KYMyJT6lRBF?dsO;XmS6gRT@x?0xF{VfYZowEoE0u~|?Uh~9l|DD-NO(Lj6f
zRVsoiAg!{a6bCnH#~x?uC3CdD6LvOJ@lI$H`A0dP-<_
zn0?Gb_{eQwth^2_C4WcSgg4=;eKqTVcwI%FfMyNhxv0)Hb
z+0-Hx>fzw%`=MXKk+Ph0*===S^C7T!PfN4cYoYwdkuC*QM=81kRIiK%u)m>tyCWI6
zw|4`p7+=0BD%*l>RPTcWR|#F$_$`~Cj=KuJAlgksN7P^?&3<)8EPUA?gVmiRWb56%|&
z|t#we4v$rnFZX3#-r
zCt?StB~J9o^&sbhVYU_03q?_#0?
zusY5uX7mRkybSmTU8rzFb^^~~6dYDrVggSeUV=lW8+L{^QkfbM2O`+Mgpq0@wtJPX~K
z%~rAs_P#PIV&RiFadpO7w3BrV)GXoaZd1V2SnT?Hl3PtQ?1OWd}Uy}NQr?`
z71nPomtwaHVlPw9xr=kMYr5D*LM97&bkGD*O$1Nx6%zUYNE3sRqIk@ZL=l)#jI+#F
zh9>kz2iQiPgujN#pm|J^#EOCmzfHRMbz00ywZZe%@?`j;H%ChEH(~$2RBb~W*3jhL
z&kmn}tq;7{c(_3w)g~0+B&+0Ex2}sPF-szWm3sCc!6kh9!U8!G!72;TkIkAZIN@QPfF@~#kaq=U|G9XPP#;XtV;nHTS
zRt((7NlDV5~=&rO7)EU*tk~ELQQK*EWD}0Z3Q{`|WTzUTGw%7Y+b;K*Y4Iamk
z3orcO-$J_I-qU~Fh(UjBAZPr|!uzJ~XO{EYYHfJ)2TF%)*mf|z>`HY^S!CHWFR;tU
zO`C>Kn?B|GaHSx==cxVU_=rl&f3HLS#T9I+_oCppUG@W_B~mW{fc&o3#N-2*^9uW@
z1ie+>duq~Q+YvrhUok38J42*}^Ji1;DX~z#EN9DICG{JqZl_)XEXO_E*LUwFMR0Pt
zmI0Jkv@;|r$ep%1PiOxzy~NcEi9yeLzVDf1KXFEFcWBW^ee>rfL5(Z!!OdWT#+o@k
z#x@l=j@yF|wV#vaOS$njj_&~W3yM|RIxCl)z}f@C%w#@wp8C9IGS!F~Shl!9MEB&M
zL%ONKn6ieK2F5|dJQWWd$MdvPra^iS>|z5VF_IuQXetzeNy-n~l$rl#UyQz-NI%e~
zUxxLI%tk4@1+$wc9MrqGYxT{)36%JgNt;uHZI5Md+kzToS8P#I_UX&-?A1qZGYFfM
z@PiZd5&OKc@ZI;f@lU@DpJ$spXcPqlUsbqNJP(>%PTYC^n)Yg_u2(+;7C>DPQ9|qU
zQ`A-Bfk^~XpUhqVS-IG&d0r6_u{u>12xH2F|DfvsGeBzx12ysw^%Act3@)R`bBl^V
zJx}z!O?>37^sa@2qx{$;(cFp*JdCACSyZ2yC&TRm6)$?qT4fr(+Yi=BnwyVP`3oqjSC#wrV^
kcCrKga3e;8rU68NNogNnsHN1fV?_K@nf&+vW!%mG4^PdL%K!iX

literal 0
HcmV?d00001

diff --git a/core/app/themes/suite8/images/alert_icon.svg b/core/app/themes/suite8/images/alert_icon.svg
new file mode 100644
index 000000000..1d9c12339
--- /dev/null
+++ b/core/app/themes/suite8/images/alert_icon.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    02_alert_icon
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/alert_red.svg b/core/app/themes/suite8/images/alert_red.svg
new file mode 100644
index 000000000..95ba3ccac
--- /dev/null
+++ b/core/app/themes/suite8/images/alert_red.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    08_alert_red
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_down.svg b/core/app/themes/suite8/images/arrow_down.svg
new file mode 100644
index 000000000..2ab0f7e40
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_down.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    05_arrow_down
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_down_filled.svg b/core/app/themes/suite8/images/arrow_down_filled.svg
new file mode 100644
index 000000000..660f04914
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_down_filled.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    12_arrow_down_blue
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_down_red.svg b/core/app/themes/suite8/images/arrow_down_red.svg
new file mode 100644
index 000000000..a75ad6300
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_down_red.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    13_arrow_down_red
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_left_filled.svg b/core/app/themes/suite8/images/arrow_left_filled.svg
new file mode 100644
index 000000000..813d1ea2b
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_left_filled.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    12_arrow_left
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_right.svg b/core/app/themes/suite8/images/arrow_right.svg
new file mode 100644
index 000000000..77d894eeb
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_right.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    07_arrow_right
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_right_filled.svg b/core/app/themes/suite8/images/arrow_right_filled.svg
new file mode 100644
index 000000000..168e77a5d
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_right_filled.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    12_arrow_right
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_separator.svg b/core/app/themes/suite8/images/arrow_separator.svg
new file mode 100644
index 000000000..94303d37d
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_separator.svg
@@ -0,0 +1,12 @@
+
+
+
+
+    12_arrow_separator
+    Created with Sketch.
+    
+
diff --git a/core/app/themes/suite8/images/arrow_up_filled.svg b/core/app/themes/suite8/images/arrow_up_filled.svg
new file mode 100644
index 000000000..a3250869f
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_up_filled.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    12_arrow_up
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/arrow_up_grey.svg b/core/app/themes/suite8/images/arrow_up_grey.svg
new file mode 100644
index 000000000..b1610d218
--- /dev/null
+++ b/core/app/themes/suite8/images/arrow_up_grey.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    02_arrow_up_grey
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bars_blue.svg b/core/app/themes/suite8/images/bars_blue.svg
new file mode 100644
index 000000000..1a2cefacf
--- /dev/null
+++ b/core/app/themes/suite8/images/bars_blue.svg
@@ -0,0 +1,20 @@
+
+
+
+
+    15_bars_blue
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bars_white.svg b/core/app/themes/suite8/images/bars_white.svg
new file mode 100644
index 000000000..8e99a17f7
--- /dev/null
+++ b/core/app/themes/suite8/images/bars_white.svg
@@ -0,0 +1,20 @@
+
+
+
+
+    15_bars_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bug_blue.svg b/core/app/themes/suite8/images/bug_blue.svg
new file mode 100644
index 000000000..1cd4d9621
--- /dev/null
+++ b/core/app/themes/suite8/images/bug_blue.svg
@@ -0,0 +1,45 @@
+
+
+
+
+    15_bug_blue
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bug_white.svg b/core/app/themes/suite8/images/bug_white.svg
new file mode 100644
index 000000000..38ad3b9d3
--- /dev/null
+++ b/core/app/themes/suite8/images/bug_white.svg
@@ -0,0 +1,45 @@
+
+
+
+
+    15_bug_white
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bulb_blue.svg b/core/app/themes/suite8/images/bulb_blue.svg
new file mode 100644
index 000000000..477bf4c8e
--- /dev/null
+++ b/core/app/themes/suite8/images/bulb_blue.svg
@@ -0,0 +1,61 @@
+
+
+
+
+    15_bulb_blue
+    Created with Sketch.
+    
+	
+		
+			
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/bulb_white.svg b/core/app/themes/suite8/images/bulb_white.svg
new file mode 100644
index 000000000..91b098221
--- /dev/null
+++ b/core/app/themes/suite8/images/bulb_white.svg
@@ -0,0 +1,60 @@
+
+
+
+
+    15_bulb_white
+    Created with Sketch.
+    
+	
+		
+			
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar.svg b/core/app/themes/suite8/images/calendar.svg
new file mode 100644
index 000000000..eca6aed64
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar.svg
@@ -0,0 +1,38 @@
+
+
+
+
+    06_calendar
+    Created with Sketch.
+    
+	
+		
+			
+				
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar_dark.svg b/core/app/themes/suite8/images/calendar_dark.svg
new file mode 100644
index 000000000..88ba0fafe
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_dark.svg
@@ -0,0 +1,31 @@
+
+
+
+
+    17_calendar
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar_grey.svg b/core/app/themes/suite8/images/calendar_grey.svg
new file mode 100644
index 000000000..99118a1f5
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_grey.svg
@@ -0,0 +1,40 @@
+
+
+
+
+    01_calendar_grey
+    Created with Sketch.
+    
+	
+		
+			
+				
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+                
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar_hover.svg b/core/app/themes/suite8/images/calendar_hover.svg
new file mode 100644
index 000000000..02f289f87
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_hover.svg
@@ -0,0 +1,20 @@
+
+
+    
+    17_calendar_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/calendar_icon.svg b/core/app/themes/suite8/images/calendar_icon.svg
new file mode 100644
index 000000000..e1c02e98e
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_icon.svg
@@ -0,0 +1,43 @@
+
+
+
+
+    14_calendar_icon
+    Created with Sketch.
+    
+	
+
+    
+    
+    
+    
+	
+		
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar_purple.svg b/core/app/themes/suite8/images/calendar_purple.svg
new file mode 100644
index 000000000..36138d218
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_purple.svg
@@ -0,0 +1,30 @@
+
+
+
+
+    02_calendar_purple
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calendar_purple_hover.svg b/core/app/themes/suite8/images/calendar_purple_hover.svg
new file mode 100644
index 000000000..948598f23
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_purple_hover.svg
@@ -0,0 +1,20 @@
+
+
+    
+    02_calendar_purple_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/calendar_white.svg b/core/app/themes/suite8/images/calendar_white.svg
new file mode 100644
index 000000000..d854fae6e
--- /dev/null
+++ b/core/app/themes/suite8/images/calendar_white.svg
@@ -0,0 +1,36 @@
+
+
+
+
+    12_calendar_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/calls_icon.svg b/core/app/themes/suite8/images/calls_icon.svg
new file mode 100644
index 000000000..5aa58ee0d
--- /dev/null
+++ b/core/app/themes/suite8/images/calls_icon.svg
@@ -0,0 +1,23 @@
+
+
+
+
+    14_calls_icon
+    Created with Sketch.
+    
+	
+
+    
+    
+    
+    
+
diff --git a/core/app/themes/suite8/images/check_1_a.svg b/core/app/themes/suite8/images/check_1_a.svg
new file mode 100644
index 000000000..66dccf823
--- /dev/null
+++ b/core/app/themes/suite8/images/check_1_a.svg
@@ -0,0 +1,15 @@
+
+
+    
+    check_1_a
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_1_b.svg b/core/app/themes/suite8/images/check_1_b.svg
new file mode 100644
index 000000000..137236f7c
--- /dev/null
+++ b/core/app/themes/suite8/images/check_1_b.svg
@@ -0,0 +1,14 @@
+
+
+    
+    check_1_b
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_2_a.svg b/core/app/themes/suite8/images/check_2_a.svg
new file mode 100644
index 000000000..df70e29d5
--- /dev/null
+++ b/core/app/themes/suite8/images/check_2_a.svg
@@ -0,0 +1,15 @@
+
+
+    
+    check_2_a
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_2_b.svg b/core/app/themes/suite8/images/check_2_b.svg
new file mode 100644
index 000000000..7850bd4f5
--- /dev/null
+++ b/core/app/themes/suite8/images/check_2_b.svg
@@ -0,0 +1,14 @@
+
+
+    
+    check_2_b
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_2_c.svg b/core/app/themes/suite8/images/check_2_c.svg
new file mode 100644
index 000000000..e12216721
--- /dev/null
+++ b/core/app/themes/suite8/images/check_2_c.svg
@@ -0,0 +1,15 @@
+
+
+    
+    check_2_c
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_3_a.svg b/core/app/themes/suite8/images/check_3_a.svg
new file mode 100644
index 000000000..82786dfba
--- /dev/null
+++ b/core/app/themes/suite8/images/check_3_a.svg
@@ -0,0 +1,15 @@
+
+
+    
+    check_3_a
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_3_b.svg b/core/app/themes/suite8/images/check_3_b.svg
new file mode 100644
index 000000000..a7a70aaca
--- /dev/null
+++ b/core/app/themes/suite8/images/check_3_b.svg
@@ -0,0 +1,14 @@
+
+
+    
+    check_3_b
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_3_c.svg b/core/app/themes/suite8/images/check_3_c.svg
new file mode 100644
index 000000000..8fb0289fc
--- /dev/null
+++ b/core/app/themes/suite8/images/check_3_c.svg
@@ -0,0 +1,15 @@
+
+
+    
+    check_3_c
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/check_3_d.svg b/core/app/themes/suite8/images/check_3_d.svg
new file mode 100644
index 000000000..b791ebb62
--- /dev/null
+++ b/core/app/themes/suite8/images/check_3_d.svg
@@ -0,0 +1,14 @@
+
+
+    
+    check_3_d
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/clock.svg b/core/app/themes/suite8/images/clock.svg
new file mode 100644
index 000000000..d4b6043af
--- /dev/null
+++ b/core/app/themes/suite8/images/clock.svg
@@ -0,0 +1,39 @@
+
+
+
+
+    12_clock
+    Created with Sketch.
+    
+	
+		
+			
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/clock_large.svg b/core/app/themes/suite8/images/clock_large.svg
new file mode 100644
index 000000000..5c72f28cc
--- /dev/null
+++ b/core/app/themes/suite8/images/clock_large.svg
@@ -0,0 +1,39 @@
+
+
+
+
+    12_clock_large
+    Created with Sketch.
+    
+	
+		
+			
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cross.svg b/core/app/themes/suite8/images/cross.svg
new file mode 100644
index 000000000..16832f46b
--- /dev/null
+++ b/core/app/themes/suite8/images/cross.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    05_cross
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cross_grey.svg b/core/app/themes/suite8/images/cross_grey.svg
new file mode 100644
index 000000000..a0935b8b1
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_grey.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    01_cross_grey
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cross_hover.svg b/core/app/themes/suite8/images/cross_hover.svg
new file mode 100644
index 000000000..fa98e4331
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_hover.svg
@@ -0,0 +1,15 @@
+
+
+    
+    05_cross_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/cross_purple.svg b/core/app/themes/suite8/images/cross_purple.svg
new file mode 100644
index 000000000..d8fd93792
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_purple.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    03_cross_purple
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cross_purple_hover.svg b/core/app/themes/suite8/images/cross_purple_hover.svg
new file mode 100644
index 000000000..74f262710
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_purple_hover.svg
@@ -0,0 +1,15 @@
+
+
+    
+    03_cross_purple_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/cross_thin.svg b/core/app/themes/suite8/images/cross_thin.svg
new file mode 100644
index 000000000..a70e2065a
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_thin.svg
@@ -0,0 +1,20 @@
+
+
+
+
+    06_cross
+    Created with Sketch.
+    
+	
+		
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cross_white.svg b/core/app/themes/suite8/images/cross_white.svg
new file mode 100644
index 000000000..354cf90b1
--- /dev/null
+++ b/core/app/themes/suite8/images/cross_white.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    01_cross_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/cursor_grey.svg b/core/app/themes/suite8/images/cursor_grey.svg
new file mode 100644
index 000000000..235d24a13
--- /dev/null
+++ b/core/app/themes/suite8/images/cursor_grey.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    01_cursor_grey
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/donut_chart.png b/core/app/themes/suite8/images/donut_chart.png
new file mode 100644
index 0000000000000000000000000000000000000000..3081a88611bdd79e3516e937c00564ec3b5c43d4
GIT binary patch
literal 9952
zcmZ{q2{=^m|Myjjtc6f9R6|0tWy_MS$i9p%`@SzjjJ=R)2q6mDGt*c@vQx%BF*G4t
zLKCu%eQW%0-|zKY&+mEu|G&#+=A0Sl+~+>$zCW+``+cMIb?-CMU819+qGHt4P&1^W
zI&l-ce@uG@{IzCRatANe{wkWrwBRR<*6|tGz8Iix7GUJ#91vs&ccOCf_VIGM>F)q{
za`N_f^$A!#)v8EE#Y?5BrfiIOvpm`5&t;zTo$TZ6QNf3Q`=g`{*~`1xl3Ep;kT@NW14HefJ#oH1n0XbY9v!
zaRL@myh{QFu4kj(7Yg{y5zOod;P`uuQ;@FsgntDpN=CjAvtV{{>&Z+%Zb)-F$gE)#tf4<}WX9lp8B9)DWL
z=tdd?-JU!j?k)^w3{y^bqI-JvHGiy|p)k7v+iCSmeF3%`?D6m7qR?&{@Gb1Gy?BgF
z@Na>@#svGy7&}gl6t#T)Pmv~&4zEc&!;%+pq5|x30>yD1S4|;WDKP~C
zY+CBtg%cu$j(Ki^DZ&n8M)y2HTWr(yB|=`=!HCi#+-m~`gez!tUFa^D;IM=!_5cyZAVZ&Plp?_J&SkC&{K
z8u&Kx>Dw=^jp{37J0E;0*+$eJCt+S@uWz*yDAC-G66WczO#Eb)wG#<1w9&F5hrAd9
zTKb~?bRK|aWI(bXr8jkgieE7>wbcnrJcK&?_87`@9o(cSJHx#9o
zqRoF_l4W*n@Kl{8(@Nl$fiSyF#5%1@f9@yy%BF;hyXUNX${Xavk`Hzu>y1-kvBg*}
zneU$qk%fobxfPY17W^zI@^V?DF~oDlgNSHWi6-<9s6<6oo~ZdrvO$vyYs8
zn!dXkWWz#t)9~Ttyb71cHk2Wy6x||MZ@0Y04aMx*P|@dqB3gYB+2p|+_JcAdB_5WI
z@a#L;&62mJe{RdvQ%GJRD~h&({Ot)9a>^-nh&^GGtj_(Ams?u`xaiq=^7`a>fMDOR
zUCE8=c+fkLZRU**m)aLpeZ^#a>pqQQYhdcILZ7RNQ10RE1wS`I&(Im|_;ss}m2yQU
zZrM-wl|p$cMs!q-6e4%kCGv_p-#0qkja$mY{lOds0s*Y^_xXci@wb
z0r9P^+hMzdPR{5#b4yF-K)Lpu#No07-_v&SsDjhKs)AEcQ12xAtUkKCst(+l=;Uv#
z?}|?+jXcHK-A{p5We8&(Gxc3ju9C5b2yJt#a7HHNDXO#BLmSPuVmBGCKsFt9qGV}i
znwp4a4HeWnkPukN
zp<^IiH=!$8ViLUce*6X--PGJQwiu;MEAtQ9y)LGgapICCaedwn3Qf9#Y4?c61&d;I
zdnW@i-0E1$>ryEpCQNqxE5ceu1leH%GBT^Bz^a+T$;CC98JNi*YiFN%E@`2CR!$eg
z`U>Bp7qJg{^+Q2RFGy+9YDbJAHMY~@Qz;t+Co0C^pfz@tcD$o}iTGe%bGXf5xa~an
zUEe!N!@SJLX5kDE%Ut^-x3ju68*t}cS;?qmj#dhEn`hqE&F<-7vZi4V8-2dIGg|en
zVa81l7x^4pCs}RbOD+M3C}Z)yAK_lmRJZh3xYx0o9uHZ|%KEyiVsHz0(;fLcou75F
z2;VG!f6n4Z)i!Ng;QNyP4^ZKS;=PBha&fM(t9qN$L1|sY7L)w%547E4BzO
zHLuZeNsD?vsqwIdHqZQO#A0O2@G}IV{wQk6lgcd~+1`2*Cn~DLYMw5AA#F~f)mZQf
zKK;QF(PX|UJP8@Ddbo>Og|DqCYNzUS-Ae0qsF$K61o_SSS+em?BkwzI8BqqX3RS|b
z$qRR@Je3VDKo|D9YR!ZRTt-fn-48A9p0>MlUfm;0E^vmIJM@uq=gr)hpOvfaFRK(SeqQ`f2rQJ-d^p3eA4
zS;^<6ZMzKh7CSC+&kFcx+Y+z-_u6NsNZFlDve|yCl7ClEk2yDzBAWso92lT_IoC4T
z8kt*ST5)pV`*+%xuZ$O#mq|OVM+#`Suiw9$Wps^4UQDb9cy@!p-$>$XhmL%*e
zId9*-?P?L+{I0T6O!4T@e|UJ9_Dr-{8R=0qKR^HOO#Ce~bMq_bXl<)Usa|Jh&fssg
zI{NvYZ=Fh-^ro?Oc8;xR*^k@X3l3AXar#?YUoTs3)7rneDQR87fvIk)n`&!2DeXOB
zYj1zDc06I+3NqdD;X`|0mh?q#?hX=snv9?V$DhvfX|eP5J%=HpMix)=axwWY4&Q_*
zhCRbgf12Ak@xG;{e|fxiVQ~@XT|2vTaN^m$!mxwo+Re>P&@5W&UadP_vwjT?4f882
z_lS~FpLwakh29BT85kW!6&HW|_KoU=E~egpj;YprQpJGH-NWNVw{vwsP>}y@C!;Vs
z{i8>u$!JjFgI0f#zy-G3SL)l?FuxobUR_w29;@-_uCna8f)lNaJW|Y!*uO!gqob47
zG~Nw%6~pI0N7IDuFJRc{o)&Y3?5Fk7qTUYH7*uJ#v+mRp#K}n
zeR}f=N=I)rpoVFxv$L~dOs_gq}AgDWoUy<#=8@aIoKNeO+)
zkVQ|vqj*pDouIn#1F7O-6F6VCE^%_Q58N^XwxSfFQP1?opw;!Q5gSudFTQF01r1I>
zuPr>Je3IvycP8mku{EEyb#(8pH8~;I6m<%gT3qW8HaiEK(ThM6;#>a&trhGt^C1KM
z%MZoi^Xly~Hvu5B4PyS6A@ZMNr#HO<HX7tsqh-BS|Pc1l1=&h
z$3R%FiFoqNNb5d#;k8t@_@dg$H#)I2UAuis)=r*|>;H0~)$xHj-x^(vdwSAm{rSp)
zT@l=sE?F&ifbvHoCV&^WV-Ku2V#9f30f{g+^ZpBJWo}
zL3H29M-fTyLXOO!{p;}8faQj9i|qw+QjKZJ(`P}g?b3t%1}H@(EF$cG^h1>;B;_y7
z9hu;LfkBNoqYJW3Tx0ijyr>j%Y~gVB#-Rrup%MW093?K!kfD`kZ&)#j_SJ3ylPjMk
z8FjN|`=6+WPIcbDMO&fGR@QZf=HA}Sm`-NqB6+WAg7ObG)&j
zj;iX-P&tc>JlVg-#}yFrB4c+f=2tI6t01Ik=38P43WUk>gQW#m+yeY-a0xO%4wuth
z=9<~Nb;~F9LD60hLGfo#C?g(k2hQXt#|>rCY^e)O9c$n{*sf(wT0F)vOA$TZpL1E4
ztu(6I0fheY4>n21wL8d#Hz&QrG8!6P=FQL$6PJnYTD)R*`6s10g8#a+%%goyta0Yi
zPUKO#Lg=`wySJ^ATN{E&&uq@O*GAFpF$zu(d`mJO@
zotDTwB*GrtLsie|>Vsw_Yg7SJP3`~bJ0|2MkoJIW{WJqE&scDpTqhe!fp+O}IXm%v
zG0ly{b+1u_Eq?X{|M~6+a1&zPG6muQn!OAw*Ef%77i9!k(V?>EEzI)agA}0^`fd6Q5DI$#*V6d|6W@>xy?SgXKo$Ql+)YhpNY1s9rvrxmf;Ruhj54_
z(dV`{%|8^+D9{(6+MfHUMKrb)xgLm2xI2IZM3Qvf)w3AmrAH6?Cms1$wP}ZPy8n&R
z-q$IkbZDswBL@EjPimjru?za{C$m&HA!4a}eIdZPMA1YUaSgQ87zTQ9aErP=3{ukf
zKq|FRU!cHUkiDqs-J8Q*3tbqD4MuA3xpp{Ti2uG!x*&X^BMRr{67XSvB^RpMttWhL
zXVTvNmd|)6$w4mdN}6_|yCCK9t6WMC&9VA;La}R*TTR7t_=Z}(4yzp)$0rKmr)r#L
z$$?ySS84UeV5$(QUmNOG8C+mu^OTB5X&&U5fKdnpW3sLb=RA+fknu@no+?jlNV8|M
zn}-iSdwl8xG(_qC)wF&f?rKZ3QI2tDlDb!HY@OY6%(O8zH7H9dy?nE`MK!3|>rAW+
z=?4{_CX7VUvwgP=gwxGzlB(+7S2-=8k6E@g&2jrXc}rkA~
zG|fI-wuw{$ll0Ek;jVb-PK|`DV)X*&s~>mnOJ&XSP*#FoJ~&fc>`R$(1L`0UKbE2E
zQb!r8JsvRjmF)}FU9vmc%
zt}RuFde7~-2gjq$3l=Gnk!ASj#4gHZrcli}LiVRUTzA=^}HW!$w!@n;}rJ&eQ
zYH^0x7_{5&A;eQksNOTtSTLIC*0sHBI3U^AMbI-8U^8H&_fEQuAu7vdqs;_n0%Qjz
zFDT?3KmOZw`Y+*_7CX+QgHJ67+{6WjQEet9QP+o{8nVjhyON#y;iJ?O=rp;(uQ8jA
zP902W+UT(KdAQsfViG83!89;Z960%zklgC9_ub-v=pDrw(I~=dk-k8RHndWJT^=G0
z%mRg+Pwqp$_1O>i>*?D}#$YZM?D0?cW5?zwjU#iP7dJdJcU-H-1v}iMp_+9H<#44G
zx08lNM?K4dFoluXGKlb>t>BzJN@7>`%w@KYsHxSWqO!BZ!}3Tl2BL0LdXG4BJWIxx
zLz?38zw5JFuKzHFT{t{pGc;?PaFnsk60_`RdZEm83#t1pf|a##hi9IbbCWn=wzI2X
z{WlzMCpK!iYsUhplWv%LjV28CDhb#s$v4}zhp#dtvg^YmR?iEwU!L()J{N;&P7Y^g
zEL;ONiPLF=_teS=_Db`TV=rZ1^gOlQ{qyQt=VG|k+5Rb}1|O)EzZ<9xvVadN!w$(^
zJgrNbV3YwkSozT$FN~)?c_Odr_kMRb?d0Sn6?HVJrylJlE+usg1ZX!yBO@c(;oV&s
zD=Vv)5BQ=!+d3KVw6{}(O*XpIC!bJNS(anKcP8rnk(MGz!dywI>1_!K)u15hg@8-B
z1Z2U>uAct>e)!Ic6$^?QfFKNZ;&pEB+>hqa_E~ZxuZcMd2vnYG~AlUKk8=FbV7TK74
z;88Y`nMYhvF>%Pftn^l{29%SN)7H_ET8FrX=ruwZV%d@)3iht9v@jSsq?rmp^cfl&
zK-BNzT&m4uV`BkKb=g<`+(^Sver*IF?^s+^O?Nt^th42*`9JNTOg2ekr5
z8UWYAhm?ot!OABZgObdIP11zu>FELU0vxtZ69S+(0W^ZIOw$cyNNA|JwRL%K{?HKY
z_`RiNX>Wc_&F%gDecGogS@3s29gL2S7F(k36{c}jje4e8qB`v5!**YwP^jX%@OC@g0UeX<>?l
zwKdV5)v1cO)-OVg!9bl^jcD?xBII*=Z*4hFEC-rKU=x^CMjjnsgnY6_-lCkyEBd4^
zBhB`?j?^A#L;0+)%o;*IO>N@Y_;R3p&MNzqR*~U+Lt>wENgRgg7GPCzc)|xdzcG`c
zea318@TZ_(?(@dUl?OA<)#d?K_tQzmG5yZfP?ob);2eB@{`Fjdu;b=7f&>1NW89N4
zDFcLf4!Y9;Rv0tk88Si;Wi7y_0c8Qt@q~8}-(Y;l)rRs^!W^SEebmg);XUWDCDh3=V=Pw=<`8G}xzNBINU1u93pXq7Yt(gLM6lTp83$`xW=E`Kqoaq?DQnju#0YBFzX
z&(FZd5;)0Rc2nH`%|HI=Jn?ww{tsjNV}t^*MmLs6Djv};X2f?hjZ~Yquu|KZj_(&Z
zz5W%l+B8NnBjj_-F(sNd{=Grlwz3Ye__k5c$hcC4aY56wJQ;B4{LFt(FbY#IF%~?Z
zX#>sB_QGesbQqM`@TZ5eV*d{p4?f_Nu-uz8)z<4b5KQ|K=r47VCu?S-L>dUe&~csf
zFM>2BW@MUNlnex1K
z@VTS=D%ur#PZ)holSN3&?ogR$In+X9UK5S^tpQDulo}$oU```({cVRV9fl}N5dy$<
z;6_nfuYoiAx)Ash%;q~&|++H6(N}u9i
z^e_Ni-R&q&nqBs|o}p1$#f7e~IRU^&FwM@*4|uoOl9DS;4fhmtuc!3_KXc*xcq|&r
zpm3=}QfGU4O4Z+Ec6@K`^z;Q(!Pa-c?^6-}U@8N3?V9Rr%kbt5*PlOUxxo$co_xesb2-C~LFwccSrk3>&i@t7Y%q
z=hrCe_g!gQD9(4qYn41_(z7+teenQYM;z7S{fV3PtNh4r=j@)i6A^H}cD$o`MRA5q
z4f+D~C~zp$3jIPFcx-EJIv2NI46w@o;b~j;n+=eiZ&teNdhGeKv!I~iJ2bBD<-no^
zHrPGn_1)Sdir(2X9lFG}?V6JP57uuROJ0FKCZ{6nH-E^=ZPyGQ**+UMWC108V1h+4
z_m$RawgcgZ6om2lx%dSxg@_ma9J*fz^l^t1Cx!5KDOkx-&&1#9XMWU&#TsJUdmp^s
zPGlEp31ufrW^iU*d4-47TuJR=N#g6CTXz&U2k7u5FG*rf&v$0?ydjn$`qVYG;leNd
zF>8DBZ)78*qLDk(fsNfx{%Y6!z@X8$R)IqFUTD7+xS%y3!h(~OeYDMa?5|xy<#(}K
z)*)hXT}zcg0A8Gig=t@>qnefEbBl3xeRkbTZhzP2v`9MN;=85v!+MYz7v=EqgeB59l2Mw9K6
z&r*khBVEIb*F3t7koN{M3WNc5lOpzmyXoQOQEU9q3QlWOfgFI1E|>u)&;`9n+%2!R
zCK>~uE#+-*f&b^c+--%Mu9^3MxL`si#CFPcc430ywx#MH^90x(%{%RrE4$gXiS44+
zVG?&kCZry#2G4I1)s}P|F
zq#cf!Wp`6+2>Wrqp+W-I?WIeLX0L6WA2}s}rvjuRDe7%=8@2|*unJS-r{MIGIz=rl
zu|$`o%A-#ZclT4SCSHI&dmJ_SiEQ!e>?(L5%(k{_UZYV{tFx0kw|rL)&uZfw?d&e<
zz&=Z!MUH^HBtW5OKO_J@c8zxYbGbZme;+?Czr<56+;}iZ_%YkoAu+MAH2r6_6_~dv
zJ#0W2q05?|J{|aqc6g%@nbQAoXLsojBbV--Sc8^>!1Zs*z&;gEL(i?8iiISwm?xbt
zCHw!`G`PAb28QC*WQ`O8X|VLtzgkFAa@haCS=zsvUW3J~rc9^+fbUXq0VzOsw>ol%
zenzZWaAm6jBnm(h137&x9O}7%XNd%22dWviN!)SsEUsum*OZ~apnURlfTi9N0)x4^
zxqWi4h99=uZG)-C%xJ|$E__7>e3XQdKYKWF=lYFb^xwIGe=4{AaT*-o=bh>Zt4wxa
zX67IAesjQ*2d1n!1D$@)5Gz^cr9-mgtWp#Gc|7dc;-BtBY%(SEkplO_AY4p$GSL8^
z>wL)!{3NaW6$D%(kL9~f?A~8R#lxOPL^y=n?#}rB?HMh;f}?}Trs1DDt2T$G!dnTv
zf5{crI>dI#;EABEVuEzZe#1wVx#dv#rOPv2O5v|m?{A;-l%sTp`n(Zq5f-6UqJ9{O
z=F@cT(*5l5Qe|}Ir&rn9T5(75{@%l>Vf61acdwq?RNC1kgsw^t@&6OTdCT(`)eMaY
zTChi+dujEE)S#(olV>JSU_R7q0*m5(cC#H&sht`I`Tr+?|7r2Wk!F*WD7#L2f@u$8
zRIYS(c0wxXNoPKZGN|OAD=aLeLdZ`gpsmf!Y!L{AQJ9}!^7OPF1MU-GjZW5^H*boG
zi>qLb+ki24=AOu{TM}||5AyZj#Z{D+iUPcq$^w?7UFFL;n)34UW8URY{k#xhGBfS_
znoRZs*r$uB7JqIV9-a+00rv!-P=uZ4WkHDoR4iYFkzFN^UAjs$hOEBWZA7NFFuMaB
zp5iKLaUrQ|R$E7>^5e(YK4+Z!&7`{{kFv2?pua?c&(5L;Wzp8ttFEd7Dd2ZclEDVn
zIBsD9*!!;xU>6!EneNJEJBNg1c64+UBluJ80t3_a1wiH}!^K1ec%-_z`U`z%&H5ZJKIHNy+oX#FRc~X;SY!CRwh;2j!(@Wx!kP
z+1=llV`XK9vY>QiCB?*)Wlo7Z5>E9iKF6ohEa&o+#s^H&MzNn}
ziXi#=_(s8Q=KrXSaiEl&g_iGaU3d&9+VWC=hDiCaEdj$`QYo}H~7+Z(0J`Q#F
z@O2f89AGH`VK|+Sqoy`a)W#!Wccd5*#e0~CQasjjFM+QJ(6b7{m(^Fvef?IEk=rm&
zt=_p9mvNZ7P-+i+BZMP=Po1G~^J7+Z&*nGzTJMP~lC`@Zvp_aATrOxas-2j#5@C{V
zBE~SArG9IVit3E>@mc^7b+c-URD9y~zDwJ-fojI)llO!-N3sS3
z5Zyd$h7UPPODjI)W3iChaZn1tbO%C1;eR|W`+PMotH-uFRFBoJ_N*Je4pU5;S}iPB
z)R0QO1{nb*^E-DSz_?0RE_H)7gynolihZSq;;ZXfeFhJ0qU|d|@YO~QiZYPQKGUfj
zF{an!h8=+0)vUmbQhx*@bH2j%Du8oE`obxFzhn>yo+5ix<=_ny(-Hlb
z>mhfMOsg(OpP4%Ep+WNcY5INYfYG~5pgEygeJoZ<`R;Ucw{oU`<~M@?+|ta>-9EPP
zI#a49=3@EZAF^_@@XB-4ahHifZgO?KWr5(V(L6nOdbC8bRCIaK??>g8WwN!0*F
z3%gk5=fh+0q@UkWIPgvl@rb*&OI;rAP(2PD%=cAn{At=V^t-#G1f_Noys5}X`JA=4
zsTHK98z5ijJ&dcH*RRb{2ivx?tRPUGuV!eA$;fo>Tf79UmHF@zXP9I!z)MheL49Pw
zi5_q7Tf}T>yd)30fpi0zxa1J*mKHi0UN@7E2&V$q6W|`?fA-rB
z_yAx3VgObpv?F<}_yL_aeRzO%+yK|t{udPMs<|^nK8J%j#foAozyte|>o0w-63_^pY8^r=JGp`NNOd-qgL!Fkex}yU(KApeuGkpz@OFZ|-@zp8Ld^B$Ud6H$JAL8w7jNOp
z`fT)+$4R6j(LoI^9iy{-H|;a|y^~6+o_sz7Bd*c>1wbIu8kD#nD_1qjRb+p*L}$Dz
z@HhQw_^AB79^R%Zpu&jXjFXB5x#XLYPSNa$%ZLIffPnDB&CQFtI!yJmC{^piK+E6WiR{uMC>b8+sWZcVHY!eebWHk;Tc^QX3!F_^1@;~%gx;z%vfb1&Ct(e
zR^&qc!Q*nDRpNmDeg4!Ap3O?1qnu-6OSX4(i~=(Nn6xs{aIpFSEECDV1~U+O^RJT+
zn!kOcUfXL1vr0(l83A@JU|oyp!*)Ld&5Cy?$^g1L7EDRuwJhpJTBpD>({UC5{JHiy
zru%C&O-=q}?V{9!wd7MU+=)c4JCE&Na$e$cSQ`{D$-0m`6h1lB6fgsSwc1wm
zQJS@s(YE$gZG`)(>y@mYd^Z4UfS;F?zCR(%DUYz435%aq=rMDrQ#U}&eKkMMQzTig
zRY9&bHN=*7g8}Zp*{*C1BOP`SHv^PxL4x0~f9Xekz!@YCI2lfaA0K;*3McJcj-Dhw
zxXjH&L&LmUSc#=1M9@U7HGB+{&PlObYgMdYw_rsdt-B}{{8+?}_0K1DNcQy(YgMdM
z&~Eme_Z}S)+5a=^1`oG3aUviLq~Z*$>Xn{xS?GGVctPdeE8o{8Zfd5;444rXwO6VY
zZ_lqMEx_W3QVEf)9iQhmzJ48!Aub@ivmDKTn?HgJ#bbCqrF|TyaE>cm`vzQ@u}yeP
z6_9FR3TEmGYJ|~8@k)7shzogs
+
+
+
+    12_dots
+    Created with Sketch.
+    
+	
+		
+        
+	
+
+
diff --git a/core/app/themes/suite8/images/dots_hover.svg b/core/app/themes/suite8/images/dots_hover.svg
new file mode 100644
index 000000000..4fe96091f
--- /dev/null
+++ b/core/app/themes/suite8/images/dots_hover.svg
@@ -0,0 +1,15 @@
+
+
+    
+    12_dots_hover
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/double_arrows.svg b/core/app/themes/suite8/images/double_arrows.svg
new file mode 100644
index 000000000..a9cf6196b
--- /dev/null
+++ b/core/app/themes/suite8/images/double_arrows.svg
@@ -0,0 +1,20 @@
+
+
+
+
+    02_double_arrows
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/down_arrow.svg b/core/app/themes/suite8/images/down_arrow.svg
new file mode 100644
index 000000000..0fa207ca0
--- /dev/null
+++ b/core/app/themes/suite8/images/down_arrow.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    01_down_arrow
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/down_arrow_white.svg b/core/app/themes/suite8/images/down_arrow_white.svg
new file mode 100644
index 000000000..efe423c1c
--- /dev/null
+++ b/core/app/themes/suite8/images/down_arrow_white.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    02_down_arrow_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/download.svg b/core/app/themes/suite8/images/download.svg
new file mode 100644
index 000000000..0ebf05b12
--- /dev/null
+++ b/core/app/themes/suite8/images/download.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    07_download
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/drop_menu_arrow.svg b/core/app/themes/suite8/images/drop_menu_arrow.svg
new file mode 100644
index 000000000..7d84f843b
--- /dev/null
+++ b/core/app/themes/suite8/images/drop_menu_arrow.svg
@@ -0,0 +1,15 @@
+
+
+    
+    12_drop_menu_arrow
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/edit.svg b/core/app/themes/suite8/images/edit.svg
new file mode 100644
index 000000000..2ea0953f7
--- /dev/null
+++ b/core/app/themes/suite8/images/edit.svg
@@ -0,0 +1,19 @@
+
+
+
+
+    06_edit
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/email_purple.svg b/core/app/themes/suite8/images/email_purple.svg
new file mode 100644
index 000000000..fd6974f02
--- /dev/null
+++ b/core/app/themes/suite8/images/email_purple.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    02_email_purple
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/email_purple_hover.svg b/core/app/themes/suite8/images/email_purple_hover.svg
new file mode 100644
index 000000000..b30700950
--- /dev/null
+++ b/core/app/themes/suite8/images/email_purple_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    02_email_purple_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/expand_arrow.svg b/core/app/themes/suite8/images/expand_arrow.svg
new file mode 100644
index 000000000..7ab373da3
--- /dev/null
+++ b/core/app/themes/suite8/images/expand_arrow.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    12_expand_arrow
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/eye.svg b/core/app/themes/suite8/images/eye.svg
new file mode 100644
index 000000000..c0525073c
--- /dev/null
+++ b/core/app/themes/suite8/images/eye.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    12_eye
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/favicon.ico b/core/app/themes/suite8/images/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..b27032fd458d99726232d819ee64f415efd3f3b3
GIT binary patch
literal 5391
zcmZQzU<5)H6$T(sVE7@zz#s->X#g=u$ODKOf#M+001`w4VX3eFkK)lV7)=ACX<#%B
zjHZFnG%%V5M$^D(8lZL>NcIW(PYp~hcTvMFATvhYgFjwJ!)G*nD9LN1>1Q
+
+
+
+    02_filter_icon
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/folder_blue.svg b/core/app/themes/suite8/images/folder_blue.svg
new file mode 100644
index 000000000..0cde7a741
--- /dev/null
+++ b/core/app/themes/suite8/images/folder_blue.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    15_folder_blue
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/folder_white.svg b/core/app/themes/suite8/images/folder_white.svg
new file mode 100644
index 000000000..bb9ce26c1
--- /dev/null
+++ b/core/app/themes/suite8/images/folder_white.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    15_folder_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/graph_white.svg b/core/app/themes/suite8/images/graph_white.svg
new file mode 100644
index 000000000..b756f6624
--- /dev/null
+++ b/core/app/themes/suite8/images/graph_white.svg
@@ -0,0 +1,21 @@
+
+
+
+
+    12_graph_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/hamburger.svg b/core/app/themes/suite8/images/hamburger.svg
new file mode 100644
index 000000000..22e6c5f95
--- /dev/null
+++ b/core/app/themes/suite8/images/hamburger.svg
@@ -0,0 +1,17 @@
+
+
+    
+    hamburger
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/history_icon.svg b/core/app/themes/suite8/images/history_icon.svg
new file mode 100644
index 000000000..64e1f63c7
--- /dev/null
+++ b/core/app/themes/suite8/images/history_icon.svg
@@ -0,0 +1,29 @@
+
+
+
+
+    14_history_icon
+    Created with Sketch.
+    
+	
+		
+	
+        
+        
+        
+		
+            
+	
+        
+
+
diff --git a/core/app/themes/suite8/images/home_icon.svg b/core/app/themes/suite8/images/home_icon.svg
new file mode 100644
index 000000000..d046f80aa
--- /dev/null
+++ b/core/app/themes/suite8/images/home_icon.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    02_home_icon
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/home_icon_red.svg b/core/app/themes/suite8/images/home_icon_red.svg
new file mode 100644
index 000000000..d1afbf38e
--- /dev/null
+++ b/core/app/themes/suite8/images/home_icon_red.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    05_home_icon_red
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/icon_first.svg b/core/app/themes/suite8/images/icon_first.svg
new file mode 100644
index 000000000..538923f6b
--- /dev/null
+++ b/core/app/themes/suite8/images/icon_first.svg
@@ -0,0 +1,15 @@
+
+
+    
+    icon_first
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/icon_last.svg b/core/app/themes/suite8/images/icon_last.svg
new file mode 100644
index 000000000..f7b38bd66
--- /dev/null
+++ b/core/app/themes/suite8/images/icon_last.svg
@@ -0,0 +1,15 @@
+
+
+    
+    icon_last
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/icon_modal_close.svg b/core/app/themes/suite8/images/icon_modal_close.svg
new file mode 100644
index 000000000..099da7f7a
--- /dev/null
+++ b/core/app/themes/suite8/images/icon_modal_close.svg
@@ -0,0 +1,19 @@
+
+
+    
+    icon_modal_close
+    Created with Sketch.
+    
+    
+        
+            
+                +
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/icon_next.svg b/core/app/themes/suite8/images/icon_next.svg
new file mode 100644
index 000000000..65eed16ec
--- /dev/null
+++ b/core/app/themes/suite8/images/icon_next.svg
@@ -0,0 +1,15 @@
+
+
+    
+    icon_next
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/icon_prev.svg b/core/app/themes/suite8/images/icon_prev.svg
new file mode 100644
index 000000000..d74cfb78a
--- /dev/null
+++ b/core/app/themes/suite8/images/icon_prev.svg
@@ -0,0 +1,15 @@
+
+
+    
+    icon_prev
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/info.svg b/core/app/themes/suite8/images/info.svg
new file mode 100644
index 000000000..243ffeea4
--- /dev/null
+++ b/core/app/themes/suite8/images/info.svg
@@ -0,0 +1,21 @@
+
+
+
+
+    01_info
+    Created with Sketch.
+    
+	
+		
+        
+	
+
+
diff --git a/core/app/themes/suite8/images/info_circled.svg b/core/app/themes/suite8/images/info_circled.svg
new file mode 100644
index 000000000..efc95ab34
--- /dev/null
+++ b/core/app/themes/suite8/images/info_circled.svg
@@ -0,0 +1,24 @@
+
+
+
+
+    18_info
+    Created with Sketch.
+    
+	
+		
+			
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/info_dark.svg b/core/app/themes/suite8/images/info_dark.svg
new file mode 100644
index 000000000..7404071b3
--- /dev/null
+++ b/core/app/themes/suite8/images/info_dark.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    17_info
+    Created with Sketch.
+    
+	
+		
+			
+		
+        
+	
+
+
diff --git a/core/app/themes/suite8/images/info_hover.svg b/core/app/themes/suite8/images/info_hover.svg
new file mode 100644
index 000000000..1f222ff42
--- /dev/null
+++ b/core/app/themes/suite8/images/info_hover.svg
@@ -0,0 +1,17 @@
+
+
+    
+    17_info_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/info_hover_dark.svg b/core/app/themes/suite8/images/info_hover_dark.svg
new file mode 100644
index 000000000..0b2434956
--- /dev/null
+++ b/core/app/themes/suite8/images/info_hover_dark.svg
@@ -0,0 +1,19 @@
+
+
+    
+    18_info_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                    
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/kanban.svg b/core/app/themes/suite8/images/kanban.svg
new file mode 100644
index 000000000..13524b22b
--- /dev/null
+++ b/core/app/themes/suite8/images/kanban.svg
@@ -0,0 +1,23 @@
+
+
+
+
+    17_kanban
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+            
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/letter.svg b/core/app/themes/suite8/images/letter.svg
new file mode 100644
index 000000000..7a8c90753
--- /dev/null
+++ b/core/app/themes/suite8/images/letter.svg
@@ -0,0 +1,14 @@
+
+
+    
+    17_letter
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/letter_hover.svg b/core/app/themes/suite8/images/letter_hover.svg
new file mode 100644
index 000000000..1cf76b008
--- /dev/null
+++ b/core/app/themes/suite8/images/letter_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    17_letter_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/list_icon_purple.svg b/core/app/themes/suite8/images/list_icon_purple.svg
new file mode 100644
index 000000000..9c75166c1
--- /dev/null
+++ b/core/app/themes/suite8/images/list_icon_purple.svg
@@ -0,0 +1,21 @@
+
+
+
+
+    02_list_icon_purple
+    Created with Sketch.
+    
+	
+		
+			
+            
+            
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/list_icon_purple_hover.svg b/core/app/themes/suite8/images/list_icon_purple_hover.svg
new file mode 100644
index 000000000..f82b6be98
--- /dev/null
+++ b/core/app/themes/suite8/images/list_icon_purple_hover.svg
@@ -0,0 +1,18 @@
+
+
+    
+    02_list_icon_purple_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/login_password.svg b/core/app/themes/suite8/images/login_password.svg
new file mode 100644
index 000000000..404e58b9f
--- /dev/null
+++ b/core/app/themes/suite8/images/login_password.svg
@@ -0,0 +1,16 @@
+
+
+    
+    login_password
+    Created with Sketch.
+    
+    
+        
+            
+                ***
+            
+        
+    
+
diff --git a/core/app/themes/suite8/images/login_user.svg b/core/app/themes/suite8/images/login_user.svg
new file mode 100644
index 000000000..ea63605f2
--- /dev/null
+++ b/core/app/themes/suite8/images/login_user.svg
@@ -0,0 +1,27 @@
+
+
+    
+    login_user
+    Created with Sketch.
+    
+        
+    
+    
+        
+            
+            
+                
+                    
+                
+                
+                
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mega_blue.svg b/core/app/themes/suite8/images/mega_blue.svg
new file mode 100644
index 000000000..80c442491
--- /dev/null
+++ b/core/app/themes/suite8/images/mega_blue.svg
@@ -0,0 +1,19 @@
+
+
+
+
+    15_mega_blue
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/mega_white.svg b/core/app/themes/suite8/images/mega_white.svg
new file mode 100644
index 000000000..e1840b303
--- /dev/null
+++ b/core/app/themes/suite8/images/mega_white.svg
@@ -0,0 +1,19 @@
+
+
+
+
+    15_mega_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/minimise.svg b/core/app/themes/suite8/images/minimise.svg
new file mode 100644
index 000000000..874abc139
--- /dev/null
+++ b/core/app/themes/suite8/images/minimise.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    13_minimise
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/minimise_circled.svg b/core/app/themes/suite8/images/minimise_circled.svg
new file mode 100644
index 000000000..34094c248
--- /dev/null
+++ b/core/app/themes/suite8/images/minimise_circled.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    03_minimise
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/mobile_collapse_icon.svg b/core/app/themes/suite8/images/mobile_collapse_icon.svg
new file mode 100644
index 000000000..4b4dd3043
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_collapse_icon.svg
@@ -0,0 +1,15 @@
+
+
+    
+    02_mobile_collapse_icon
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_calendar copy.svg b/core/app/themes/suite8/images/mobile_expand_calendar copy.svg
new file mode 100644
index 000000000..7062db0c0
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_calendar copy.svg	
@@ -0,0 +1,20 @@
+
+
+    
+    02_mobile_expand_calendar copy
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_calendar.svg b/core/app/themes/suite8/images/mobile_expand_calendar.svg
new file mode 100644
index 000000000..4895b9a0a
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_calendar.svg
@@ -0,0 +1,20 @@
+
+
+    
+    02_mobile_expand_calendar
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_check_icon.svg b/core/app/themes/suite8/images/mobile_expand_check_icon.svg
new file mode 100644
index 000000000..0fbd3789b
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_check_icon.svg
@@ -0,0 +1,18 @@
+
+
+    
+    02_mobile_expand_check_icon
+    Created with Sketch.
+    
+        
+    
+    
+        
+            
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_icon.svg b/core/app/themes/suite8/images/mobile_expand_icon.svg
new file mode 100644
index 000000000..28133951f
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_icon.svg
@@ -0,0 +1,15 @@
+
+
+    
+    02_mobile_expand_icon
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_letter copy.svg b/core/app/themes/suite8/images/mobile_expand_letter copy.svg
new file mode 100644
index 000000000..0f5a1117c
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_letter copy.svg	
@@ -0,0 +1,14 @@
+
+
+    
+    02_mobile_expand_letter copy
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_letter.svg b/core/app/themes/suite8/images/mobile_expand_letter.svg
new file mode 100644
index 000000000..5da7471ee
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_letter.svg
@@ -0,0 +1,14 @@
+
+
+    
+    02_mobile_expand_letter
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_list copy.svg b/core/app/themes/suite8/images/mobile_expand_list copy.svg
new file mode 100644
index 000000000..3c681cd28
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_list copy.svg	
@@ -0,0 +1,18 @@
+
+
+    
+    02_mobile_expand_list copy
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_list.svg b/core/app/themes/suite8/images/mobile_expand_list.svg
new file mode 100644
index 000000000..8b3b16115
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_list.svg
@@ -0,0 +1,18 @@
+
+
+    
+    02_mobile_expand_list
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_phone copy.svg b/core/app/themes/suite8/images/mobile_expand_phone copy.svg
new file mode 100644
index 000000000..902ef4198
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_phone copy.svg	
@@ -0,0 +1,14 @@
+
+
+    
+    02_mobile_expand_phone copy
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/mobile_expand_phone.svg b/core/app/themes/suite8/images/mobile_expand_phone.svg
new file mode 100644
index 000000000..7bb33f13e
--- /dev/null
+++ b/core/app/themes/suite8/images/mobile_expand_phone.svg
@@ -0,0 +1,14 @@
+
+
+    
+    02_mobile_expand_phone
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/padlock_blue.svg b/core/app/themes/suite8/images/padlock_blue.svg
new file mode 100644
index 000000000..f984dc3a2
--- /dev/null
+++ b/core/app/themes/suite8/images/padlock_blue.svg
@@ -0,0 +1,37 @@
+
+
+
+
+    15_padlock_blue
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/padlock_white.svg b/core/app/themes/suite8/images/padlock_white.svg
new file mode 100644
index 000000000..dee5a0de8
--- /dev/null
+++ b/core/app/themes/suite8/images/padlock_white.svg
@@ -0,0 +1,37 @@
+
+
+
+
+    15_padlock_white
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pencil_grey.svg b/core/app/themes/suite8/images/pencil_grey.svg
new file mode 100644
index 000000000..789f668cf
--- /dev/null
+++ b/core/app/themes/suite8/images/pencil_grey.svg
@@ -0,0 +1,24 @@
+
+
+
+
+    12_pencil_grey
+    Created with Sketch.
+    
+	
+		
+			
+			
+                
+                
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pencil_grey_hover.svg b/core/app/themes/suite8/images/pencil_grey_hover.svg
new file mode 100644
index 000000000..43d2579ea
--- /dev/null
+++ b/core/app/themes/suite8/images/pencil_grey_hover.svg
@@ -0,0 +1,21 @@
+
+
+    
+    12_pencil_grey_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/person_blue.svg b/core/app/themes/suite8/images/person_blue.svg
new file mode 100644
index 000000000..27b4c2091
--- /dev/null
+++ b/core/app/themes/suite8/images/person_blue.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    15_person_blue
+    Created with Sketch.
+    
+    
+    
+
diff --git a/core/app/themes/suite8/images/person_white.svg b/core/app/themes/suite8/images/person_white.svg
new file mode 100644
index 000000000..6e0f28183
--- /dev/null
+++ b/core/app/themes/suite8/images/person_white.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    15_person_white
+    Created with Sketch.
+    
+    
+    
+
diff --git a/core/app/themes/suite8/images/phone.svg b/core/app/themes/suite8/images/phone.svg
new file mode 100644
index 000000000..7a35f1554
--- /dev/null
+++ b/core/app/themes/suite8/images/phone.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    06_phone
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/phone_dark.svg b/core/app/themes/suite8/images/phone_dark.svg
new file mode 100644
index 000000000..351022047
--- /dev/null
+++ b/core/app/themes/suite8/images/phone_dark.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    17_phone
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/phone_hover.svg b/core/app/themes/suite8/images/phone_hover.svg
new file mode 100644
index 000000000..d2d7006ba
--- /dev/null
+++ b/core/app/themes/suite8/images/phone_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    17_phone_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/phone_purple.svg b/core/app/themes/suite8/images/phone_purple.svg
new file mode 100644
index 000000000..4e5102c71
--- /dev/null
+++ b/core/app/themes/suite8/images/phone_purple.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    02_phone_purple
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/phone_purple_hover.svg b/core/app/themes/suite8/images/phone_purple_hover.svg
new file mode 100644
index 000000000..c8fe56e1e
--- /dev/null
+++ b/core/app/themes/suite8/images/phone_purple_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    02_phone_purple_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/pie_blue.svg b/core/app/themes/suite8/images/pie_blue.svg
new file mode 100644
index 000000000..f2428d4af
--- /dev/null
+++ b/core/app/themes/suite8/images/pie_blue.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    15_pie_blue
+    Created with Sketch.
+    
+	
+		
+			
+            
+				
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pie_icon.svg b/core/app/themes/suite8/images/pie_icon.svg
new file mode 100644
index 000000000..597603750
--- /dev/null
+++ b/core/app/themes/suite8/images/pie_icon.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    02_pie_icon
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pie_white.svg b/core/app/themes/suite8/images/pie_white.svg
new file mode 100644
index 000000000..14ad2697a
--- /dev/null
+++ b/core/app/themes/suite8/images/pie_white.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    15_pie_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+				
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pipeline_chart.png b/core/app/themes/suite8/images/pipeline_chart.png
new file mode 100644
index 0000000000000000000000000000000000000000..6cc888b6b4474ab533a5b6984ef7ce0943fbd6ff
GIT binary patch
literal 6731
zcmb_hi91x^8=oU+u4)z{zA#|7l(;d#&H^nGU^7Z;EF
z?w-CY5Slh1Gj3v_YaNjDZ+zjt`1jo9wYi)QQvnRv>k0Nw&Fl6g=WFqumN}XGG*!m8
zAjLK7jyQ>PwR8*nj;bp?0)~&JqrF=@J}C_k!csB
zqUHT2%79eyuhTXuVoSz$$C1pTJaVubioy$Vp@cb|RRnZTi8Ygy!rS@;ou+Xt(P5z|
zeu{vVX@y4V9KvMxfho9l>+EAJyBr!MjUWk0nC1Zrsp
z3A?`VKBb*pb4wy_L6#N5&N3X@>|m9SFkyM;XOr-hEp^=@`(i<#OvK^>dcN^E
zV=`IISoZmOA)o{{)F(0*u;vOFZ&!R=)F><*3}GK|wBkT?o80;t>e4bc9^J&y`ZCh_
zM&Vros#v+|j~q~zNh?$H`w|Kgb{%&Dd50{ZU|Cc^aZWHBT3z;Cu&8lOJ$SCaZuymE
z;^C_y?h(ILrQG&vGhV>1oO4wPBk?AE7YzAv@5^I@<5F^1YuT)Oyd=k?KJ4W-+%skz
zNlfD|T}RthAP?qc0vRN6w{#J2?+0w%nYSxWEw~}Ny=T=3MeK8(D}_z8uOBtE#=HZc
zn6|e059B#J>m+U%KlPfP=Wi>KURFQf;WLA${(f0c8+y18x^uuiANbUJiBLcBY4^!#
z%^w%0XBN5orLGyB64Nb+I2Yv}2nau~Npth$=r12A@T*01DhS?r@atE=V~#Uc0V_L}
zIkwjflmus(J)G^tBJpl
z)8>fj47;a)?^o0YGerNpT<}H3E2Lt;C59hvG&gi6O*J|j)6F
zZ+f&oR(}ZZl}Sd6aXox!eKHYggor{{j2tMugy+>;*K#vh%ra
zZ?%~;LYjzMbXfErtdBMk6l(TRDBZjQbqf)kY^c>iOk(K_d$bB!q8-#5Co2@$%c+_L
z9?(Ur(&Q@gwGzkN+g4Iu#vr;K-F|vCeE`q>e6yby`Qt5#gU_E~Sx4IMWY)p+^VZ3j
zMgC<+gzJ{ZlFm_Fm;`^)@Ti&F+N6#);g$6^Sz?jj$mi@hP%4tI3Hn0Z+S`
zT3ip}QY3`GR*850D}m87x>MzMW~QB&gah{Gu}+v6-6Gz<9Wua+;p@({s~v6(Rf_C}
zQK)4rard*54dQTi{{WmySUlKu3r#*@9a%+!
zwf7$e`W^A#ncZn>@&5$~cuUOBWxu8E#P78zWI=0xN3VbTT{5WYgWybfF7+PV!ek~N*5XZ9tdG(Hh`2{t{;t#Xe)qMfbM7I^|`^@-)Ai51IvPy#)4
z;So>2s%jy_KcLVx{C0Ut*%j}NwPS*JHM0<|33Q~o%9rg+FV9V`>hUyNijkQDO^-HN
zRYD}Ah0*HR>-r+=7OI{gl{X}6udf8j_5SxJ3Y@RTKy-pGkZERCOSa29h)
zp*}@nD|PuB()|<%%$|WwuUFGe4pNg$_Q%TOQR9L97l*IWj8VXBLob1Vjxb+gYH=pM
z1dFPYv1k
ztXQ5DK#y^|LhksBzx)owXGiMoa{=$tXJ&n*fUyexD!(k32^{9zN*oqzzkZw?MV%}%
zlQ3F;n;H)6+5WW$K#!c;KLdKSo=X54X(?7+w$1UxmS;4{1RBAbIUfaH^r
z|I|kN=sSc7Ffc?biLkP=tHpK!&XDux88iI~=+2IQh;W5ywEt{(e+!_;BX8~mM^wtv
zQ!7F-iyfUi+x@LXaiz_vU9FBb2TX%Y=3u?x)N0sErK?F+qw+o{)UgS-(tV4-X){cs
zm}aqZ&lbDs1ACkVt5KD$rj&_xl|)of#YqkTJJH_=ja<2N!OH6~MS`knd{FclPiJ&R
zDkys(2@`@XPm#k@BR&!RT5Ah?_rWKQu;rFh`T_s-46nU6FEFXDcQ|yt$Yad?>My$?
z&xBj5ByQ~ed@*LPC0DVA&69%;pzHLs3iILyg^WaWdyJ}BIAXeQnnsXMaD=98n%-sT
zHYhg@MDG{Z7*+PrRrMQrFhWS(Tl{N6*v3XLD780IJgw<7Qsa
zq2IO53a1FHmC9mXlmL6l5}s=BePT?t(w(&uNb305;OIF_f&m3UyT8wV>rZiKQD
z0)4ot28Zox!7XjxQ#VbapQa{Hb2uVz-@sArIXPJo-F|d$c4`L)dLa#-a7%oB=XTfm
zqYlFG=v2O6a-<-zMT&R-EXBQFm(;s=?0iA3oZet@xxsq0zPzNex281g8g+jkIP-psEQ>$R%dwp%AUr+``_v&
zZ=Od&qxSQh+<=n+rpSg=O8km`+ra%TR!~p)tEN@*+>SuBRX$nf@~LScT=(Ozy=2(50~xNjeW_|S^>`SKLh0dY
zB?vNrJr>>AQc+sTYT{L`AsD^80y5@wPMIFBgM6}=Rk&$}qeA{eG88oOMAW465lhFP
zWMp!#rZ3XgK5AWfF)_&fWxs3YrUei`z>=sYfZF=#2VRfA{>EwVblK_p1wC~*k!2c|{A3DXJ2E;%EKUA-;|6*IN
z>P(kdLN9GYkXY7BsQn0Yd0M!Cxg|7X=KLr2Fd%$W;g=MhX<35CNe_g&%z}@P?W@|c
zRkeHH=}KQl<~BqbIp-Jd+vuI8LRyG^@`BMsgAf+E#E$E!fvh>}KXER{Z_=Ta^5Pm^2T@9ycdR{fge4C%IfAozG$y(f;l7>9h3
zyvl$3KjCOcLSH9p#)Kxb@c60*%kRYpUB@I@Zi|c)X7@R7_4Zo0%8(3YBPf;1w2};L
z0^KpH2wo<$pVy+ON}axQm
zCK%mnufp^e6o$vLC2dmUhM>i8c(Z8N*wDEe#YIH7Bs?W{4<0+X+Jv<~bxIY&^y@5P
zw`W`bTgZDWzDNw~_h4R&rBDzYJ1Pc83^O|rz&u7E>3X^chnSuRQfFC?vcL~`WwZjD
zh-=%w2DpTna4R`>UXX4(2U5Qw;$`5|ZKs>JaFS9tm0*Fi4VE-LGlz{)O4ZXd5CC}^
zZUU@Gz7S4NQI2I!*N391=W!K5u!k=;0&M*jY6w^MG#!tyF3+xhi1FPn8{#YGkB-fc
zn1Y-RY$k3efL^#F`*SwPa8M}mKQB&PLRQyrrSRQ~CnpW_xHSIM_oPjt&=`Y&yqF)_
zP8c#V5>4qGAQ&9jg}o2k*H@(E9thj|agOcZd+wv!DNQ+D9`g~a7(h>`0#4e~k`ucI7-8g_AQi
zQxsCK8otr$?R&NqaPhGrEdA#S!Hnn7Gnn5WayzGSDu^w!Ui~S6?yNcNrLi}f_FGAN
zBBr9@8Cq=3GL*f?0N=U|iZhI@Q-E!j{*lfjv9BK|_-_BaLxa(6yuR$PSG8N7=LzC2joKY2@L7UwLCk>U16_Ja2_Ir?oy2%B#zFIq@lOf`z
zed)*eyM&9)1Wg$!{lN?W2G40uS(y6Yd>)&$(mQJeEC`>KUdIz${{zW#k2q#zL-?jd
z*MlXurpThjpj=Nxjb3IC>^3$kGWI0u32kALQILeE9tgw{@*1J|bCY$R)9mYfxc|{~IL33tIx|E$AAUEQVof*W32Qj#<}2($dY8wa^%1f
zd#<+7>}BK;ekhD&*<(-{C{@}g^4UV;c+mKO{@8DkW)q0h9nrJFO?CO_?VK@tvJzo|
zd&j#ZCr3`t9>Y}}fIFBBjl-;O>O@saVqU*uPimFLDV>1RsrFY=)5p2xwYZBL{unEK
znz`40HQo}HeJ_ntrVvG4SCRz+5nkN&%@M&y<{~29Odc!^lj8|RJ{yZ1nNtn$F`vRluUN8K0
zF(m2wc&~cT!>(fa7-%s_4<8#fsTUbD2bQHfVK{W5v11Rr__SGDBnOn0Y2SG0p63p$
zt{@r1A#O-5iypnwefVA`jZY!f2|1NsVfTf(M8AF~>LMd7Vmr>uMcQYe@N
z{J}~g*X$JpC6<4kOZ!V%!BHY+qt{W}Bl!=1Nh&d}WBJtXz}NqrPM&hy9t89)ec-Xy
z8p7c^_v6UFdV`W4!tp!z{PB>F|EyC!mph*ciU?Z*7vJ+Y%slM-{n&@shbd>U@04Ax
z*)pDx_rA-`kXPNvXYe_=GElJN&tFe%9p+iecgK%=x}8#gl_2%mP2lo>lDwK@_R(km
zcpHjlMck<8O4(1d5JSb*D^lXqKiRbL0!)&x8JSQmGJa3@&1B-nF4y{azYQhnlHo~O
z()i{iqD$N2hf(D^lw2x4pd^K0S4^InXLX|`i4Z
z$?5%D0VRcJq0CuwOdjA-IJEbe}7~mntU?3jGrmVyxuD`YhrgL0XBs
zK9I+hh@^qbg$yu&F=+#F68z7so2t3}bK)ziky_Sbq5IciDte7NVQKmB7mZsP`(lGJChIgxq+06GufyhDj(~
zKZmsmX<0rjf&D=^V~itze-Z6MZN^)yGhCMd5yIW5z%>qbA7YJOefkIRh}@1A?-l~B
z4*cVLo4yN!(N~9m=r&fy`!G``i!74yRP?iv2F)(dkL_N-$3L0?jWd`LfOXrBMyJ8S
zk*()5@-!A0*e}i>PkXaM9Uat}#smn!V&3M8fhHipC(Cn~(a
zbD0%_2b2OkV>%Q5Sywh3$#NA-O}}JUE%Y~ma>}-5WNL&(wLR!F%Uva7);ZDYFXXn2Yic7%
zhboW%kl*G$+F%)Ye}siXQI1_$*B9o}lC;Q$c@qTHzjyGBGe#x{h<^FN7}DXnj4QPd
zu@!jjX2H)|i2~CO68Eb`@H%_hvk}<$-&1%yh*nRGink@&*MkJ(`5b?Uy8laX$K8y=
z3uYLTW`PwMK#Qq&$bY4aqD?%l?=AssA=zmGyy&`EBXkm%Gen9SB4APpq}fwWigWyl
zuRl>xw3s6P4&rc_n5*#DA1beEPFvso>7kUibzP3*0FALfd_w_8hI^YC+Tf3CC6&&L
zwG?6^aqODM66KAkn$@{tceX@ce#939@6$W3&$g(etwt{5
zz=gSQ#)`LhS$d2WHUVb?GViXuT@o;p=NRd0Aw`c^Dq~$*EKjCZ71-~EKve^+B9VrJ
z2X3O_sVLS2Xn3=Fq@H(VIA^4u34jk`bIihs1D
+
+
+
+    04_plus
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/plus_dark.svg b/core/app/themes/suite8/images/plus_dark.svg
new file mode 100644
index 000000000..da0b40381
--- /dev/null
+++ b/core/app/themes/suite8/images/plus_dark.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    15_plus
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/plus_grey.svg b/core/app/themes/suite8/images/plus_grey.svg
new file mode 100644
index 000000000..a8a491afa
--- /dev/null
+++ b/core/app/themes/suite8/images/plus_grey.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    17_plus
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/plus_hover.svg b/core/app/themes/suite8/images/plus_hover.svg
new file mode 100644
index 000000000..0354eb685
--- /dev/null
+++ b/core/app/themes/suite8/images/plus_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    05_plus_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/plus_thin.svg b/core/app/themes/suite8/images/plus_thin.svg
new file mode 100644
index 000000000..ede7a852f
--- /dev/null
+++ b/core/app/themes/suite8/images/plus_thin.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    05_plus
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/plus_white.svg b/core/app/themes/suite8/images/plus_white.svg
new file mode 100644
index 000000000..aaaf1efac
--- /dev/null
+++ b/core/app/themes/suite8/images/plus_white.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    07_plus
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pound_blue.svg b/core/app/themes/suite8/images/pound_blue.svg
new file mode 100644
index 000000000..7440ae604
--- /dev/null
+++ b/core/app/themes/suite8/images/pound_blue.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    15_pound_blue
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/pound_white.svg b/core/app/themes/suite8/images/pound_white.svg
new file mode 100644
index 000000000..18a29d009
--- /dev/null
+++ b/core/app/themes/suite8/images/pound_white.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    15_pound_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/poundbox_blue.svg b/core/app/themes/suite8/images/poundbox_blue.svg
new file mode 100644
index 000000000..e687c41de
--- /dev/null
+++ b/core/app/themes/suite8/images/poundbox_blue.svg
@@ -0,0 +1,26 @@
+
+
+
+
+    15_poundbox_blue
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/poundbox_white.svg b/core/app/themes/suite8/images/poundbox_white.svg
new file mode 100644
index 000000000..14bf718cd
--- /dev/null
+++ b/core/app/themes/suite8/images/poundbox_white.svg
@@ -0,0 +1,26 @@
+
+
+
+
+    15_poundbox_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/purplecross.svg b/core/app/themes/suite8/images/purplecross.svg
new file mode 100644
index 000000000..7274a5684
--- /dev/null
+++ b/core/app/themes/suite8/images/purplecross.svg
@@ -0,0 +1,16 @@
+
+
+    
+    05_purplecross
+    Created with Sketch.
+    
+    
+        
+            
+                +
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/purplecross_hover.svg b/core/app/themes/suite8/images/purplecross_hover.svg
new file mode 100644
index 000000000..b4d01cf3e
--- /dev/null
+++ b/core/app/themes/suite8/images/purplecross_hover.svg
@@ -0,0 +1,16 @@
+
+
+    
+    05_purplecross_hover
+    Created with Sketch.
+    
+    
+        
+            
+                +
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/purplepen.svg b/core/app/themes/suite8/images/purplepen.svg
new file mode 100644
index 000000000..9d461e4bf
--- /dev/null
+++ b/core/app/themes/suite8/images/purplepen.svg
@@ -0,0 +1,36 @@
+
+
+    
+    05_purplepen
+    Created with Sketch.
+    
+        
+        
+    
+    
+        
+            
+                
+                    
+                        
+                    
+                    
+                    
+                
+                
+                
+                    
+                        
+                    
+                    
+                    
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/purplepen_hover.svg b/core/app/themes/suite8/images/purplepen_hover.svg
new file mode 100644
index 000000000..0cbaac32f
--- /dev/null
+++ b/core/app/themes/suite8/images/purplepen_hover.svg
@@ -0,0 +1,36 @@
+
+
+    
+    05_purplepen_hover
+    Created with Sketch.
+    
+        
+        
+    
+    
+        
+            
+                
+                    
+                        
+                    
+                    
+                    
+                
+                
+                
+                    
+                        
+                    
+                    
+                    
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/refresh.svg b/core/app/themes/suite8/images/refresh.svg
new file mode 100644
index 000000000..94b33f783
--- /dev/null
+++ b/core/app/themes/suite8/images/refresh.svg
@@ -0,0 +1,25 @@
+
+
+
+
+    05_refresh
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/refresh_hover.svg b/core/app/themes/suite8/images/refresh_hover.svg
new file mode 100644
index 000000000..010ac5607
--- /dev/null
+++ b/core/app/themes/suite8/images/refresh_hover.svg
@@ -0,0 +1,18 @@
+
+
+    
+    05_refresh_hover
+    Created with Sketch.
+    
+    
+        
+            
+                
+                
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/search.svg b/core/app/themes/suite8/images/search.svg
new file mode 100644
index 000000000..a1dc42d24
--- /dev/null
+++ b/core/app/themes/suite8/images/search.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    02_search
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/settings.svg b/core/app/themes/suite8/images/settings.svg
new file mode 100644
index 000000000..eb6c13541
--- /dev/null
+++ b/core/app/themes/suite8/images/settings.svg
@@ -0,0 +1,20 @@
+
+
+
+
+    05_settings
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/settings_hover.svg b/core/app/themes/suite8/images/settings_hover.svg
new file mode 100644
index 000000000..965749d14
--- /dev/null
+++ b/core/app/themes/suite8/images/settings_hover.svg
@@ -0,0 +1,14 @@
+
+
+    
+    05_settings_hover
+    Created with Sketch.
+    
+    
+        
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/shield_blue.svg b/core/app/themes/suite8/images/shield_blue.svg
new file mode 100644
index 000000000..a99e80199
--- /dev/null
+++ b/core/app/themes/suite8/images/shield_blue.svg
@@ -0,0 +1,35 @@
+
+
+
+
+    15_shield_blue
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/shield_white.svg b/core/app/themes/suite8/images/shield_white.svg
new file mode 100644
index 000000000..854211f40
--- /dev/null
+++ b/core/app/themes/suite8/images/shield_white.svg
@@ -0,0 +1,35 @@
+
+
+
+
+    15_shield_white
+    Created with Sketch.
+    
+	
+		
+			
+			
+            
+				
+					
+				
+			
+            
+				
+					
+				
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/signature_blue.svg b/core/app/themes/suite8/images/signature_blue.svg
new file mode 100644
index 000000000..42d3ebbf4
--- /dev/null
+++ b/core/app/themes/suite8/images/signature_blue.svg
@@ -0,0 +1,29 @@
+
+
+
+
+    15_signature_blue
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/signature_white.svg b/core/app/themes/suite8/images/signature_white.svg
new file mode 100644
index 000000000..b19343d2e
--- /dev/null
+++ b/core/app/themes/suite8/images/signature_white.svg
@@ -0,0 +1,29 @@
+
+
+
+
+    15_signature_white
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/sort.svg b/core/app/themes/suite8/images/sort.svg
new file mode 100644
index 000000000..01e033f90
--- /dev/null
+++ b/core/app/themes/suite8/images/sort.svg
@@ -0,0 +1,16 @@
+
+
+    
+    sort
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/sort_ascend.svg b/core/app/themes/suite8/images/sort_ascend.svg
new file mode 100644
index 000000000..d72def80c
--- /dev/null
+++ b/core/app/themes/suite8/images/sort_ascend.svg
@@ -0,0 +1,16 @@
+
+
+    
+    sort_ascend
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/sort_descend.svg b/core/app/themes/suite8/images/sort_descend.svg
new file mode 100644
index 000000000..09f04263f
--- /dev/null
+++ b/core/app/themes/suite8/images/sort_descend.svg
@@ -0,0 +1,16 @@
+
+
+    
+    sort_descend
+    Created with Sketch.
+    
+    
+        
+            
+            
+        
+    
+
\ No newline at end of file
diff --git a/core/app/themes/suite8/images/spark_blue.svg b/core/app/themes/suite8/images/spark_blue.svg
new file mode 100644
index 000000000..af8543d35
--- /dev/null
+++ b/core/app/themes/suite8/images/spark_blue.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    15_spark_blue
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/spark_white.svg b/core/app/themes/suite8/images/spark_white.svg
new file mode 100644
index 000000000..684314d17
--- /dev/null
+++ b/core/app/themes/suite8/images/spark_white.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    15_spark_white
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/star.svg b/core/app/themes/suite8/images/star.svg
new file mode 100644
index 000000000..18f8b070c
--- /dev/null
+++ b/core/app/themes/suite8/images/star.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    09_star
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/star_icon.svg b/core/app/themes/suite8/images/star_icon.svg
new file mode 100644
index 000000000..c0fc7123a
--- /dev/null
+++ b/core/app/themes/suite8/images/star_icon.svg
@@ -0,0 +1,18 @@
+
+
+
+
+    02_star_icon
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/suitecrm_logo.png b/core/app/themes/suite8/images/suitecrm_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..f16e2fdb2763e20ea4b63653a3521b46b67d780d
GIT binary patch
literal 3335
zcmV+i4fyhjP)aX9$9F?z)P=%IYev
zxUQeNkzLSTMfs4=)lZgP*JC}9bCCdYh5J-a6%g2P1xW}bgxr(4dS5lnFn!FVyJtEq
zrtACq>wfj>)$6XQuCA(AFX8y<)9pq1M_%K3JO=R1V1nTi@UR(X7slg++iLh+b#VfY
zLmoKpGtS=p&$i3T&A(I^1#zvO`HPZRQ@ITkJ~P%gfoD4HIt$BX%WdFnCTo!dvMcP^
zSs5e3nGJ&^!1LoQrdwi=a241dthQlEsY9X1L>VCgvgAy`O{fhCl=wJ&cqtBiZA@m)
z5s-kX-~mw>d$FW67F9lD=P+zzfs2GKX7vZd`4oN5NXw$A05)%^wXr4uMd1nhyaPC3?r}d&uTgEf#
zDo+}J_NQ|Z@iY}&>#v}Zp3;Jm0LNA>2B!BxdPZL~YJ6izR+lc7V&}HKSg|Y{Wo6|7
zI(jLddtp+b9qyu{qLL|7A+pzO#g1*e;q!$KiARqeiuN7ah}e19%krm}X9`Lw>QK=b
zFsL^k`}JrU<$`%xSedn6hF6O)T@nXrdw;!
zAPGYrxF56L{S$iixkJa@0`=;}^_oir3!>P?*VAJ_}8&wL5(ZfmV+_PDrMK|$}lyQ`*gQet|!o_TJ9
z;1Wsu!nJ$c(HSjoX&#P5);BP{x8QckI--Cu6+8+;48`JrQ{ReZhqQJW|M(cevW4PJ
z{x`V662ane=5a8c16v0AN6$tNN{J}xj$&Be$uL)4H7
zG_kP`WDM)4nqDiR{_m&Ond%t5i#_j29mQ03dkiK{8mlO++|y_ApGB)!KzRnm7cU7k
z&2DOfdwTUi`q2B~aMj0>T(c+5u?*(e543+rzmbP5+b+YEXwB^HU`H&XTA#sVBb3B`(=Ry
zS1%E$c7m_05Yce;8vqt7_~IfF-roq<&n49dtf3!+FJ+d_EB=&oaq&Q`!e^J!3H1Jn
zBRJ=}wA+rR$&D31*JpC`@X-egSb<#VH-=JuWZfeHN)sOWF$Z_u(@n&td5fl^wwgxQ
z?j41I^~CYqkmQ3|W{3h?BO$bAsF>A~k_yMTC&1l!#o|;~!@Xu1+#6TRMq6+149EDV
z;NG+b?qv%^{f;M}hoxByRAo*EUsWaQqekqrnZg{Ef0!hDfgF>jz;bhnY>Xe_oc$_%
zXHNT@!r3-pC}R2z5#gxeJAV$&8JRM?9z=mxyMj~J!eWt+TfAUpSmoApf1$?s6bw{Z
zsn{SXjrDjuf*(&VmLEor$-t~P=lYwXb9}ux=2rC;;VLVuH2eD^1_}-R3LX;!$Hd9Z
z@><|p_;0}NhPB7t;F=^WOk*6%yQ^Hr6B>qsxod9*L?q;+a1o0eRL{d*6}@J1l$P^Ua
zpkJV?Q!0vGH>3nE9x$bZUwg_HwU=~9%hkAQ3yPHc1WMY@V58B
z?!X+@w63r+1^4XP37*`g8o--#1m1n$)Ig=LyHxBIsbbRXCb=tc?%a7*VWl#cYn5N73LWB(aIu49nGwg7S72$C3QFtoB`iG`
z1bkV^^aIcG+pOO5
za?{DKCBWzZ#G+7^X<_L?E|KM~uYk3ECm~psrtb%E?X}e-+`@$KK$rI!fI=9hmqEs=Fx4zW0*S^+1D2q)CSOqw&sOmdqxUY7m^)qM)izp5!EH7h3)%)@{uf!=nAJc{icR&~8`tl^
zi-u)Z1?nqt!q!_|K`H^?hN=&p9ne5
zs19qV?uZ%uVBoOz>L0bKl5HBbo6Y>g_eY=SxsW$^urv`{{gN)DD~+%E
z%Zo~A8Ls;8vt&3WgnRiS&|xGrwT38J2s0@KcZ(OS04Y{5kQIMr`V=APql|+R(5{`|
zJ~Ixq8aR{Xol8sE@1YW?c4b5MHqfSnV4%$sl$WMW6nbD2`#KCA-X9Gc-XI%J8!GZu
zEFj4SYDDO^;DLFVQuF03PpU$>17qldE$gdMZqbFc4SbX0;nZsI6aJd}vGZ2Cr4
zHcMHS3+I&!>y&szf-@C766u8*OFJ=J#c21#i6zx;{B_zpEH7RdW`@vR6g)2ca(QTi
z5IyTzdXUO*r9k!FR2`@XsCaAEjJd*s(T42p`0$_ev0$F|d($&FjWHEmujEvW>k{i$
zL8VMWNpwEwGhY%-5&Ct9p4om^Zl&6mTlRxCx_#WqqZ-ns5{kEN21dC;wU~
zJWsf?-|9O*hisSHo1Uu`4
zpNf3&r1}Y{&;BlogH`O2!k3nmD+Y(b#O

literal 0
HcmV?d00001

diff --git a/core/app/themes/suite8/images/tick.svg b/core/app/themes/suite8/images/tick.svg
new file mode 100644
index 000000000..508a1a676
--- /dev/null
+++ b/core/app/themes/suite8/images/tick.svg
@@ -0,0 +1,17 @@
+
+
+
+
+    12_tick
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/user.svg b/core/app/themes/suite8/images/user.svg
new file mode 100644
index 000000000..00ae7f5a6
--- /dev/null
+++ b/core/app/themes/suite8/images/user.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    02_user
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/vert_line.svg b/core/app/themes/suite8/images/vert_line.svg
new file mode 100644
index 000000000..a1e5b489e
--- /dev/null
+++ b/core/app/themes/suite8/images/vert_line.svg
@@ -0,0 +1,16 @@
+
+
+
+
+    14_vert_line
+    Created with Sketch.
+    
+	
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/view.svg b/core/app/themes/suite8/images/view.svg
new file mode 100644
index 000000000..adf6f93de
--- /dev/null
+++ b/core/app/themes/suite8/images/view.svg
@@ -0,0 +1,22 @@
+
+
+
+
+    07_view
+    Created with Sketch.
+    
+	
+		
+			
+            
+		
+	
+
+
diff --git a/core/app/themes/suite8/images/white_pencil.svg b/core/app/themes/suite8/images/white_pencil.svg
new file mode 100644
index 000000000..5d04b20cb
--- /dev/null
+++ b/core/app/themes/suite8/images/white_pencil.svg
@@ -0,0 +1,59 @@
+
+
+
+
+    03_white_pencil
+    Created with Sketch.
+    
+	
+		
+			
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+            
+            
+				
+				
+                
+					
+						
+					
+				
+                
+					
+						
+					
+				
+                
+			
+		
+	
+
+
diff --git a/core/app/themes/suite8/suite8.php b/core/app/themes/suite8/suite8.php
new file mode 100644
index 000000000..9337764ce
--- /dev/null
+++ b/core/app/themes/suite8/suite8.php
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/core/app/ui/components/account/account.component.spec.ts b/core/app/ui/components/account/account.component.spec.ts
new file mode 100644
index 000000000..769bbdf1e
--- /dev/null
+++ b/core/app/ui/components/account/account.component.spec.ts
@@ -0,0 +1,57 @@
+import {async, ComponentFixture, TestBed} from '@angular/core/testing';
+
+import {CommonModule} from '@angular/common';
+
+import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+
+import {RouterTestingModule} from '@angular/router/testing';
+
+import {PluginManagerModule} from '../../../plugin-manager/plugin-manager.module';
+
+import {SharedModule} from '../../shared/shared.module';
+
+import {AccountComponent} from './account.component';
+import {AppModule} from '../../../app.module';
+import {Router} from '@angular/router';
+import {HttpClientModule} from '@angular/common/http';
+
+let mockRouter: any;
+
+class MockRouter {
+    navigate = jasmine.createSpy('navigate');
+}
+
+export const testImports = [
+    CommonModule,
+    RouterTestingModule,
+    HttpClientModule,
+    SharedModule,
+    PluginManagerModule.forChild(AccountComponent),
+];
+
+describe('AccountComponent', () => {
+    let component: AccountComponent;
+    let fixture: ComponentFixture;
+
+    beforeEach(async(() => {
+        TestBed.configureTestingModule({
+            declarations: [
+                AccountComponent,
+            ],
+            imports: testImports,
+            providers: [{provide: Router, useValue: mockRouter}],
+            schemas: [CUSTOM_ELEMENTS_SCHEMA]
+        })
+            .compileComponents();
+    }));
+
+    beforeEach(() => {
+        fixture = TestBed.createComponent(AccountComponent);
+        component = fixture.componentInstance;
+        fixture.detectChanges();
+    });
+
+    it('should create', () => {
+        expect(component).toBeTruthy();
+    });
+});
\ No newline at end of file
diff --git a/core/app/ui/components/account/account.component.ts b/core/app/ui/components/account/account.component.ts
new file mode 100644
index 000000000..1e31eeb2c
--- /dev/null
+++ b/core/app/ui/components/account/account.component.ts
@@ -0,0 +1,16 @@
+import {Component, OnInit} from '@angular/core';
+
+@Component({
+    selector: 'scrm-account-ui',
+    templateUrl: './account.component.html',
+    styleUrls: []
+})
+export class AccountUiComponent implements OnInit {
+
+    constructor() {
+    }
+
+    ngOnInit() {
+    }
+
+}
diff --git a/core/app/ui/components/account/account.module.ts b/core/app/ui/components/account/account.module.ts
new file mode 100644
index 000000000..9ff4a290c
--- /dev/null
+++ b/core/app/ui/components/account/account.module.ts
@@ -0,0 +1,18 @@
+import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
+import {CommonModule} from '@angular/common';
+
+import {AppManagerModule} from '../../../../app-manager/app-manager.module';
+import {AccountUiComponent} from './account.component';
+import {ListViewUiModule} from '../list-view/list-view.module';
+
+@NgModule({
+    declarations: [AccountUiComponent],
+    exports: [AccountUiComponent],
+    imports: [
+        CommonModule,
+        AppManagerModule.forChild(AccountUiComponent),
+        ListViewUiModule
+    ]
+})
+export class AccountUiModule {
+}
\ No newline at end of file
diff --git a/core/app/ui/components/action-bar/action-bar-model.ts b/core/app/ui/components/action-bar/action-bar-model.ts
new file mode 100644
index 000000000..967e94e5c
--- /dev/null
+++ b/core/app/ui/components/action-bar/action-bar-model.ts
@@ -0,0 +1,7 @@
+import {LinkModel} from '../navbar/link-model';
+import {FavoriteRecordModel} from './favorite-record-model';
+
+export interface ActionBarModel {
+    createLinks: Array;
+    favoriteRecords: Array;
+}
diff --git a/core/app/ui/components/action-bar/action-bar.component.html b/core/app/ui/components/action-bar/action-bar.component.html
new file mode 100644
index 000000000..b35fb1a38
--- /dev/null
+++ b/core/app/ui/components/action-bar/action-bar.component.html
@@ -0,0 +1,105 @@
+
+
+
+
+ +
+
+
+ + + +
+
+
+ + \ No newline at end of file diff --git a/core/app/ui/components/action-bar/action-bar.component.spec.ts b/core/app/ui/components/action-bar/action-bar.component.spec.ts new file mode 100644 index 000000000..63b541ef2 --- /dev/null +++ b/core/app/ui/components/action-bar/action-bar.component.spec.ts @@ -0,0 +1,31 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {ActionBarComponent} from './action-bar.component'; + +describe('ActionBarComponent', () => { + let component: ActionBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [ActionBarComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ActionBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (httpClient: HttpTestingController) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/action-bar/action-bar.component.ts b/core/app/ui/components/action-bar/action-bar.component.ts new file mode 100644 index 000000000..5968bd304 --- /dev/null +++ b/core/app/ui/components/action-bar/action-bar.component.ts @@ -0,0 +1,23 @@ +import {Component, OnInit} from '@angular/core'; +import {ActionBarModel} from './action-bar-model'; + +@Component({ + selector: 'scrm-action-bar-ui', + templateUrl: './action-bar.component.html', + styleUrls: [] +}) +export class ActionBarUiComponent implements OnInit { + + actionBar: ActionBarModel = { + createLinks: [], + favoriteRecords: [], + }; + + constructor() { + } + + ngOnInit(): void { + + } + +} diff --git a/core/app/ui/components/action-bar/action-bar.module.ts b/core/app/ui/components/action-bar/action-bar.module.ts new file mode 100644 index 000000000..a5c5c283b --- /dev/null +++ b/core/app/ui/components/action-bar/action-bar.module.ts @@ -0,0 +1,19 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {ActionBarUiComponent} from './action-bar.component'; +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; + + +@NgModule({ + declarations: [ActionBarUiComponent], + exports: [ActionBarUiComponent], + imports: [ + CommonModule, + AppManagerModule.forChild(ActionBarUiComponent), + SvgIconUiModule + ] +}) +export class ActionBarUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/action-bar/favorite-record-model.ts b/core/app/ui/components/action-bar/favorite-record-model.ts new file mode 100644 index 000000000..63d329f24 --- /dev/null +++ b/core/app/ui/components/action-bar/favorite-record-model.ts @@ -0,0 +1,7 @@ +export interface FavoriteRecordModel { + id: string; + icon: string; + itemSummary: string; + itemSummaryShort: string; + moduleName: string; +} diff --git a/core/app/ui/components/chart/chart.component.html b/core/app/ui/components/chart/chart.component.html new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/core/app/ui/components/chart/chart.component.html @@ -0,0 +1 @@ + diff --git a/core/app/ui/components/chart/chart.component.spec.ts b/core/app/ui/components/chart/chart.component.spec.ts new file mode 100644 index 000000000..86afda381 --- /dev/null +++ b/core/app/ui/components/chart/chart.component.spec.ts @@ -0,0 +1,33 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; + +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; + +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {ChartComponent} from './chart.component'; + +describe('ChartComponent', () => { + let component: ChartComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [ChartComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChartComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (httpClient: HttpTestingController) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/chart/chart.component.ts b/core/app/ui/components/chart/chart.component.ts new file mode 100644 index 000000000..f79b3dc26 --- /dev/null +++ b/core/app/ui/components/chart/chart.component.ts @@ -0,0 +1,12 @@ +import {Component, OnInit, ViewChild} from '@angular/core'; + +@Component({ + selector: 'scrm-chart', + templateUrl: './chart.component.html', + styleUrls: [] +}) +export class ChartUiComponent implements OnInit { + + ngOnInit(): void { + } +} diff --git a/core/app/ui/components/classic-view/classic-view.component.html b/core/app/ui/components/classic-view/classic-view.component.html new file mode 100644 index 000000000..a1183290c --- /dev/null +++ b/core/app/ui/components/classic-view/classic-view.component.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/core/app/ui/components/classic-view/classic-view.component.spec.ts b/core/app/ui/components/classic-view/classic-view.component.spec.ts new file mode 100644 index 000000000..48be71d74 --- /dev/null +++ b/core/app/ui/components/classic-view/classic-view.component.spec.ts @@ -0,0 +1,33 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {ClassicViewUiComponent} from './classic-view.component'; +import {ApiService} from '../../services/api/api.service'; + +describe('ClassicViewUiComponent', () => { + let component: ClassicViewUiComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule], + declarations: [ClassicViewUiComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ClassicViewUiComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (router: RouterTestingModule, http: HttpTestingController, api: ApiService) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/classic-view/classic-view.component.ts b/core/app/ui/components/classic-view/classic-view.component.ts new file mode 100644 index 000000000..612b420b0 --- /dev/null +++ b/core/app/ui/components/classic-view/classic-view.component.ts @@ -0,0 +1,16 @@ +import {Component} from '@angular/core'; +import {Router} from '@angular/router'; + +import {AuthService} from '../../services/auth/auth.service'; +import {LoginResponseModel} from '../../services/auth/login-response-model'; +import {MessageService} from '../../services/message/message.service'; +import {ApiService} from '../../services/api/api.service'; + +@Component({ + selector: 'scrm-classic-view-ui', + templateUrl: './classic-view.component.html', + styleUrls: [] +}) +export class ClassicViewUiComponent { + +} diff --git a/core/app/ui/components/classic-view/classic-view.module.ts b/core/app/ui/components/classic-view/classic-view.module.ts new file mode 100644 index 000000000..213db2fe5 --- /dev/null +++ b/core/app/ui/components/classic-view/classic-view.module.ts @@ -0,0 +1,22 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {RouterModule} from '@angular/router'; +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {ClassicViewUiComponent} from './classic-view.component'; +import {ClassicViewUiRoutes} from './classic-view.routes'; + +@NgModule({ + declarations: [ + ClassicViewUiComponent + ], + exports: [ + ClassicViewUiComponent + ], + imports: [ + AppManagerModule.forChild(ClassicViewUiComponent), + RouterModule.forChild(ClassicViewUiRoutes), + CommonModule + ] +}) +export class ClassicViewUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/classic-view/classic-view.routes.ts b/core/app/ui/components/classic-view/classic-view.routes.ts new file mode 100644 index 000000000..2245df65d --- /dev/null +++ b/core/app/ui/components/classic-view/classic-view.routes.ts @@ -0,0 +1,9 @@ +import {Route} from '@angular/router'; +import {ClassicViewUiComponent} from './classic-view.component' + +export const ClassicViewUiRoutes: Route[] = [ + { + path: '', + component: ClassicViewUiComponent + } +]; \ No newline at end of file diff --git a/core/app/ui/components/footer/footer.component.html b/core/app/ui/components/footer/footer.component.html new file mode 100644 index 000000000..51bb866a2 --- /dev/null +++ b/core/app/ui/components/footer/footer.component.html @@ -0,0 +1,101 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/core/app/ui/components/footer/footer.component.spec.ts b/core/app/ui/components/footer/footer.component.spec.ts new file mode 100644 index 000000000..5dc8f5451 --- /dev/null +++ b/core/app/ui/components/footer/footer.component.spec.ts @@ -0,0 +1,31 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {FooterUiComponent} from './footer.component'; + +describe('FooterUiComponent', () => { + let component: FooterUiComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule], + declarations: [FooterUiComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FooterUiComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/footer/footer.component.ts b/core/app/ui/components/footer/footer.component.ts new file mode 100644 index 000000000..828c5d1ec --- /dev/null +++ b/core/app/ui/components/footer/footer.component.ts @@ -0,0 +1,59 @@ +import {Component, OnInit} from '@angular/core'; + +import {NgbModal, ModalDismissReasons} from '@ng-bootstrap/ng-bootstrap'; + +@Component({ + selector: 'scrm-footer-ui', + templateUrl: './footer.component.html', + styleUrls: [] +}) +export class FooterUiComponent implements OnInit { + + closeResult: string; + + constructor(private modalService: NgbModal) { + } + + openSugarCopyright(sugarcopyright) { + this.modalService.open(sugarcopyright, { + ariaLabelledBy: 'modal-basic-title', + centered: true, + size: 'lg' + }).result.then((result) => { + this.closeResult = `Closed with: ${result}`; + }, (reason) => { + this.closeResult = `Dismissed ${this.getDismissReason(reason)}`; + }); + } + + openSuiteCopyright(suitecopyright) { + this.modalService.open(suitecopyright, { + ariaLabelledBy: 'modal-basic-title', + centered: true, + size: 'lg' + }).result.then((result) => { + this.closeResult = `Closed with: ${result}`; + }, (reason) => { + this.closeResult = `Dismissed ${this.getDismissReason(reason)}`; + }); + } + + private getDismissReason(reason: any): string { + if (reason === ModalDismissReasons.ESC) { + return 'by pressing ESC'; + } else if (reason === ModalDismissReasons.BACKDROP_CLICK) { + return 'by clicking on a backdrop'; + } else { + return `with: ${reason}`; + } + } + + backToTop() { + document.body.scrollTop = 0; // For Safari + document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera + } + + ngOnInit() { + } + +} diff --git a/core/app/ui/components/footer/footer.module.ts b/core/app/ui/components/footer/footer.module.ts new file mode 100644 index 000000000..f6b450a5d --- /dev/null +++ b/core/app/ui/components/footer/footer.module.ts @@ -0,0 +1,19 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {FooterUiComponent} from './footer.component'; +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; + + +@NgModule({ + declarations: [FooterUiComponent], + exports: [FooterUiComponent], + imports: [ + CommonModule, + AppManagerModule.forChild(FooterUiComponent), + SvgIconUiModule + ] +}) +export class FooterUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/home/home.component.html b/core/app/ui/components/home/home.component.html new file mode 100644 index 000000000..d19fb188b --- /dev/null +++ b/core/app/ui/components/home/home.component.html @@ -0,0 +1,3 @@ +
+

Home Page

+
\ No newline at end of file diff --git a/core/app/ui/components/home/home.component.spec.ts b/core/app/ui/components/home/home.component.spec.ts new file mode 100644 index 000000000..b895049bc --- /dev/null +++ b/core/app/ui/components/home/home.component.spec.ts @@ -0,0 +1,33 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {HomeUiComponent} from './home.component'; +import {ApiService} from '../../services/api/api.service'; + +describe('HomeUiComponent', () => { + let component: HomeUiComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule], + declarations: [HomeUiComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeUiComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (router: RouterTestingModule, http: HttpTestingController, api: ApiService) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/home/home.component.ts b/core/app/ui/components/home/home.component.ts new file mode 100644 index 000000000..5f8ff5539 --- /dev/null +++ b/core/app/ui/components/home/home.component.ts @@ -0,0 +1,16 @@ +import {Component} from '@angular/core'; +import {Router} from '@angular/router'; + +import {AuthService} from '../../services/auth/auth.service'; +import {LoginResponseModel} from '../../services/auth/login-response-model'; +import {MessageService} from '../../services/message/message.service'; +import {ApiService} from '../../services/api/api.service'; + +@Component({ + selector: 'scrm-home-ui', + templateUrl: './home.component.html', + styleUrls: [] +}) +export class HomeUiComponent { + +} diff --git a/core/app/ui/components/home/home.module.ts b/core/app/ui/components/home/home.module.ts new file mode 100644 index 000000000..e770de6ca --- /dev/null +++ b/core/app/ui/components/home/home.module.ts @@ -0,0 +1,26 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {RouterModule} from '@angular/router'; +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {HomeUiComponent} from './home.component'; +import {HomeUiRoutes} from './home.routes'; +import {NavbarUiModule} from '../navbar/navbar.module'; +import {FooterUiModule} from '../footer/footer.module'; + +@NgModule({ + declarations: [ + HomeUiComponent + ], + exports: [ + HomeUiComponent + ], + imports: [ + AppManagerModule.forChild(HomeUiComponent), + RouterModule.forChild(HomeUiRoutes), + NavbarUiModule, + FooterUiModule, + CommonModule + ] +}) +export class HomeUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/home/home.routes.ts b/core/app/ui/components/home/home.routes.ts new file mode 100644 index 000000000..8f2c9eb21 --- /dev/null +++ b/core/app/ui/components/home/home.routes.ts @@ -0,0 +1,19 @@ +import {Route} from '@angular/router'; +import {HomeUiComponent} from './home.component' +import {NavbarUiComponent} from '../navbar/navbar.component'; +import {FooterUiComponent} from '../footer/footer.component'; + +export const HomeUiRoutes: Route[] = [ + { + path: '', + component: HomeUiComponent + }, + { + path: '', + component: NavbarUiComponent + }, + { + path: '', + component: FooterUiComponent + } +]; \ No newline at end of file diff --git a/core/app/ui/components/list-view/list-view-column-model.ts b/core/app/ui/components/list-view/list-view-column-model.ts new file mode 100644 index 000000000..3713d1b05 --- /dev/null +++ b/core/app/ui/components/list-view/list-view-column-model.ts @@ -0,0 +1,21 @@ +export interface ListViewColumnModel { + key: string; + audited: boolean; + comment: string; + dbType: string; + default: boolean; + fullTextSearch: { + boost: number; + }; + importable: string; + label: string; + len: number; + link: boolean; + mergeFilter: string; + name: string; + required: boolean; + type: string; + unifiedSearch: boolean; + vname: string; + width: number; +} diff --git a/core/app/ui/components/list-view/list-view-data-model.ts b/core/app/ui/components/list-view/list-view-data-model.ts new file mode 100644 index 000000000..ede4a18a1 --- /dev/null +++ b/core/app/ui/components/list-view/list-view-data-model.ts @@ -0,0 +1,27 @@ +import {ListViewColumnModel} from './list-view-column-model'; + +export interface ListViewRowModel { + selected: boolean; + id: string; + data: any; +} + +export interface ListViewDataModel { + module: string; + columns: ListViewColumnModel[]; + orderby?: string; + desc?: boolean; + maxpage: number; + page: number; + rows: ListViewRowModel[]; +} + +export class ListViewData implements ListViewDataModel { + module: string = null; + columns: ListViewColumnModel[]; + orderby = ''; + desc: boolean = null; + maxpage: number; + page = 1; + rows: ListViewRowModel[]; +} diff --git a/core/app/ui/components/list-view/list-view.component.html b/core/app/ui/components/list-view/list-view.component.html new file mode 100644 index 000000000..bbd2fc670 --- /dev/null +++ b/core/app/ui/components/list-view/list-view.component.html @@ -0,0 +1,521 @@ + + +
+ + + +
+ +
+
+
+
+
+ + +
+
+
+
+
+
+

{{ listViewData.module }}

+
+
+
+
+
+
+ + + + + +
+
+
+
+
+
+ +
+
+

{{ listViewData.module }}

+
+
+
+
+
+ + +
+
+
+
+ + + + + +
+
+
+
+
+
+
+ + + + + +
+
+ + + +
+ + + +
+
+ +
+
+ + + + (1- 20 of 200) + + + +
+
+
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + {{ title.label }} + + + + + +
+ + + + + + + +
+ {{ title.label }} + {{ row[title.key] }} + + + + + + + +
+ + {{ title.label }} + + + + + +
+ + + + + + + + + + + + +
+
+ + + + + + +
+ + + + + +
+
+
+

+ Quick Charts + + +

+
+ +
+
+
+ +
+
+
+
+
+ +
+ Pipeline Chart +
+
+
+
+
+ +
+ Donut Chart +
+
+
+
+
+
+ + +
+
+
+
+
+ + + +
+
+ + + +
+ + \ No newline at end of file diff --git a/core/app/ui/components/list-view/list-view.component.spec.ts b/core/app/ui/components/list-view/list-view.component.spec.ts new file mode 100644 index 000000000..f92e0d7d7 --- /dev/null +++ b/core/app/ui/components/list-view/list-view.component.spec.ts @@ -0,0 +1,63 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {CommonModule} from '@angular/common'; + +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; + +import {RouterTestingModule} from '@angular/router/testing'; + +import {PluginManagerModule} from '../../../../plugin-manager/plugin-manager.module'; + +import {SharedModule} from '../../../../themes/shared/shared.module'; + +import {Router} from '@angular/router'; +import {HttpClientModule} from '@angular/common/http'; + +import {ListViewComponent} from './list-view.component'; +import {SvgIconComponent} from '../svg-icon/svg-icon.component'; +import {ModalViewComponent} from '../modal-view/modal-view.component'; + +let mockRouter: any; + +class MockRouter { + navigate = jasmine.createSpy('navigate'); +} + +export const testImports = [ + CommonModule, + RouterTestingModule, + HttpClientModule, + SharedModule, + PluginManagerModule.forChild(ListViewComponent), +]; + +describe('ListViewComponent', () => { + let component: ListViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [], + imports: testImports, + providers: [{provide: Router, useValue: mockRouter}], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ListViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should default to ascending', () => { + expect(component.desc).toBe('ASC'); + }); + + it('should toggle to descending', () => { + component.order('city'); + component.order('city'); + expect(component.desc).toBe('DESC'); + }); +}); diff --git a/core/app/ui/components/list-view/list-view.component.ts b/core/app/ui/components/list-view/list-view.component.ts new file mode 100644 index 000000000..0cfd6ea1a --- /dev/null +++ b/core/app/ui/components/list-view/list-view.component.ts @@ -0,0 +1,131 @@ +import {HttpClient} from "@angular/common/http"; +import {Component, OnInit, Input, HostListener} from "@angular/core"; +import {ListViewData, ListViewDataModel} from "./list-view-data-model"; +import {ApiService} from "../../services/api/api.service"; +import {trigger, style, animate, transition} from "@angular/animations"; + +@Component({ + selector: "scrm-list-view-ui", + templateUrl: "./list-view.component.html", + styleUrls: [], + animations: [ + trigger("widgetFade", [ + transition("void => *", [ + style({transform: "translateX(100%)", opacity: 0}), + animate("500ms", style({transform: "translateX(0)", opacity: 1})) + ]), + transition("* => void", [ + style({transform: "translateX(0)", opacity: 1}), + animate("500ms", style({transform: "translateX(100%)", opacity: 0})) + ]) + ]), + trigger("widgetContentFade", [ + transition("void => *", [ + style({transform: "translateY(-5%)", opacity: 0}), + animate("500ms", style({transform: "translateY(0)", opacity: 1})) + ]), + transition("* => void", [ + style({transform: "translateY(0)", opacity: 1}), + animate("500ms", style({transform: "translateY(-5%)", opacity: 0})) + ]) + ]) + ] +}) +export class ListViewUiComponent implements OnInit { + listViewData: ListViewData = new ListViewData(); + + @Input() set module(module: string) { + this.listViewData.module = module; + } + + displayWidgets: boolean = true; + displayWidgetContent: boolean = true; + displayResponsiveTable: boolean = false; + showCollapsed: boolean = false; + widgetHeaderToggleIcon: string = "minimise_circled.svg"; + tableToggleIcon: string = "mobile_expand_icon.svg"; + listViewFullWidth: boolean = true; + listViewIconUnsorted: string = "sort.svg"; + listViewIconSorted: string = "sort_descend.svg"; + + orderBy: string = "date_entered"; + desc: string = "ASC"; + allSelected: boolean = false; + + @HostListener("window:resize", ["$event"]) + onResize(event: any) { + event.target.innerWidth; + if (innerWidth <= 768) { + this.displayResponsiveTable = true; + } else { + this.displayResponsiveTable = false; + } + } + + expandRow(row) { + row.expanded = !row.expanded; + } + + toggleWidgets() { + this.displayWidgets = !this.displayWidgets; + this.listViewFullWidth = !this.listViewFullWidth; + } + + toggleWidgetContent() { + if (this.widgetHeaderToggleIcon == "minimise_circled.svg") { + this.widgetHeaderToggleIcon = "plus_thin.svg"; + this.displayWidgetContent = false; + } else { + this.widgetHeaderToggleIcon = "minimise_circled.svg"; + this.displayWidgetContent = true; + } + } + + constructor(protected api: ApiService, protected http: HttpClient) { + } + + ngOnInit() { + window.dispatchEvent(new Event("resize")); + + // const options: LegacyEntryUrlOptionsModel = {}; + // this.http.get(this.legacyApi.getLegacyEntryUrl(options)); + // this.loadList(); + } + + loadList() { + this.api.getListViewData( + this.listViewData, + (listViewData: ListViewData) => { + this.listViewData = listViewData; + }, + this.orderBy, + this.desc + ); + } + + order(key: string) { + if (this.orderBy == key) { + this.desc = this.desc == "ASC" ? "DESC" : "ASC"; + } else { + this.desc = "ASC"; + } + + if (this.orderBy == key && this.desc == "DESC") { + this.listViewIconSorted = "sort_ascend.svg"; + } else if (this.orderBy == key && this.desc == "ASC") { + this.listViewIconSorted = "sort_descend.svg"; + } + + this.orderBy = key; + + this.loadList(); + } + + selectAll() { + this.allSelected = true; + } + + deselectAll() { + this.allSelected = false; + } +} diff --git a/core/app/ui/components/list-view/list-view.module.ts b/core/app/ui/components/list-view/list-view.module.ts new file mode 100644 index 000000000..32607d4bd --- /dev/null +++ b/core/app/ui/components/list-view/list-view.module.ts @@ -0,0 +1,22 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {ListViewUiComponent} from './list-view.component'; +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; +import {ModalViewUiModule} from '../modal-view/modal-view.module'; +import {FieldModule} from '../../../fields/field.module'; + +@NgModule({ + declarations: [ListViewUiComponent], + exports: [ListViewUiComponent], + imports: [ + CommonModule, + AppManagerModule.forChild(ListViewUiComponent), + SvgIconUiModule, + FieldModule, + ModalViewUiModule + ] +}) +export class ListViewUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/login/login.component.html b/core/app/ui/components/login/login.component.html new file mode 100644 index 000000000..2ffbcc2f1 --- /dev/null +++ b/core/app/ui/components/login/login.component.html @@ -0,0 +1,30 @@ +
+ + + + + + + +
+ + \ No newline at end of file diff --git a/core/app/ui/components/login/login.component.spec.ts b/core/app/ui/components/login/login.component.spec.ts new file mode 100644 index 000000000..3b59b3037 --- /dev/null +++ b/core/app/ui/components/login/login.component.spec.ts @@ -0,0 +1,33 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {LoginComponent} from './login.component'; +import {ApiService} from '../../services/api/api.service'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule], + declarations: [LoginComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (router: RouterTestingModule, http: HttpTestingController, api: ApiService) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/login/login.component.ts b/core/app/ui/components/login/login.component.ts new file mode 100644 index 000000000..2f57b4edf --- /dev/null +++ b/core/app/ui/components/login/login.component.ts @@ -0,0 +1,50 @@ +import {Component} from '@angular/core'; +import {Router} from '@angular/router'; + +import {AuthService} from '../../services/auth/auth.service'; +import {LoginResponseModel} from '../../services/auth/login-response-model'; +import {MessageService} from '../../services/message/message.service'; +import {ApiService} from '../../services/api/api.service'; + +@Component({ + selector: 'scrm-login-ui', + templateUrl: './login.component.html', + styleUrls: [] +}) +export class LoginUiComponent { + hidden = true; + error = ''; + uname = ''; + passw = ''; + + /** + * + * @param legacyApi LegacyApiService + * @param router Router + * @param auth AuthService + * @param message MessageService + */ + constructor( + protected api: ApiService, + protected router: Router, + protected auth: AuthService, + protected message: MessageService + ) { + this.hidden = false; + } + + doLogin() { + this.auth.doLogin(this, this.uname, this.passw, this.onLoginSuccess, this.onLoginError); + } + + onLoginSuccess(caller: LoginUiComponent, loginResponse: LoginResponseModel) { + caller.message.log('OAuth2 login success'); + caller.router.navigate(['/Home']); + return; + } + + onLoginError(caller: LoginUiComponent, errorResponse: any) { + caller.message.log('OAuth2 login failed'); + caller.message.addDangerMessage('Login credentials incorrect, please try again.'); + } +} diff --git a/core/app/ui/components/login/login.module.ts b/core/app/ui/components/login/login.module.ts new file mode 100644 index 000000000..d57466e9e --- /dev/null +++ b/core/app/ui/components/login/login.module.ts @@ -0,0 +1,29 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {FormsModule, ReactiveFormsModule} from '@angular/forms'; +import {RouterModule} from '@angular/router'; +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {LoginUiComponent} from './login.component'; +import {LogoUiModule} from '../logo/logo.module'; +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; +import {HomeUiModule} from '../home/home.module'; +import {LoginUiRoutes} from './login.routes'; + +@NgModule({ + declarations: [ + LoginUiComponent + ], + exports: [ + LoginUiComponent + ], + imports: [ + FormsModule, + LogoUiModule, + SvgIconUiModule, + AppManagerModule.forChild(LoginUiComponent), + RouterModule.forChild(LoginUiRoutes), + CommonModule, + ] +}) +export class LoginUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/login/login.routes.ts b/core/app/ui/components/login/login.routes.ts new file mode 100644 index 000000000..7ec730a87 --- /dev/null +++ b/core/app/ui/components/login/login.routes.ts @@ -0,0 +1,10 @@ +import {Route} from '@angular/router'; +import {LoginUiComponent} from './login.component' +import {HomeUiComponent} from '../home/home.component'; + +export const LoginUiRoutes: Route[] = [ + { + path: '', + component: LoginUiComponent + } +]; \ No newline at end of file diff --git a/core/app/ui/components/logo/logo.component.html b/core/app/ui/components/logo/logo.component.html new file mode 100644 index 000000000..09372e7d0 --- /dev/null +++ b/core/app/ui/components/logo/logo.component.html @@ -0,0 +1 @@ +SuiteCRM Logo \ No newline at end of file diff --git a/core/app/ui/components/logo/logo.component.spec.ts b/core/app/ui/components/logo/logo.component.spec.ts new file mode 100644 index 000000000..d0bdab4f4 --- /dev/null +++ b/core/app/ui/components/logo/logo.component.spec.ts @@ -0,0 +1,31 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + + +import {LogoComponent} from './logo.component'; + +describe('LogoComponent', () => { + let component: LogoComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [LogoComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LogoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/logo/logo.component.ts b/core/app/ui/components/logo/logo.component.ts new file mode 100644 index 000000000..220d94cc7 --- /dev/null +++ b/core/app/ui/components/logo/logo.component.ts @@ -0,0 +1,10 @@ +import {Component, OnInit} from '@angular/core'; +import {HttpClient} from '@angular/common/http'; + +@Component({ + selector: 'scrm-logo-ui', + templateUrl: './logo.component.html', + styleUrls: [] +}) +export class LogoUiComponent { +} diff --git a/core/app/ui/components/logout/logout.component.html b/core/app/ui/components/logout/logout.component.html new file mode 100644 index 000000000..d7c778310 --- /dev/null +++ b/core/app/ui/components/logout/logout.component.html @@ -0,0 +1,2 @@ +Logout + \ No newline at end of file diff --git a/core/app/ui/components/logout/logout.component.spec.ts b/core/app/ui/components/logout/logout.component.spec.ts new file mode 100644 index 000000000..8f83f3486 --- /dev/null +++ b/core/app/ui/components/logout/logout.component.spec.ts @@ -0,0 +1,30 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {LogoutComponent} from './logout.component'; + +describe('LogoutComponent', () => { + let component: LogoutComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [LogoutComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LogoutComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/logout/logout.component.ts b/core/app/ui/components/logout/logout.component.ts new file mode 100644 index 000000000..774b2460e --- /dev/null +++ b/core/app/ui/components/logout/logout.component.ts @@ -0,0 +1,40 @@ +import {HttpErrorResponse} from '@angular/common/http'; +import {Component, OnInit} from '@angular/core'; +import {Router} from '@angular/router'; +import {AuthService} from '../../services/auth/auth.service'; +import {MessageService} from '../../services/message/message.service'; +import {NavbarUiComponent} from '../navbar/navbar.component'; +import {ApiService} from '../../services/api/api.service'; + +@Component({ + selector: 'scrm-logo-ui-ui', + templateUrl: './logout.component.html', + styleUrls: [] +}) +export class LogoutUiComponent implements OnInit { + + constructor( + public api: ApiService, + public router: Router, + public auth: AuthService, + public message: MessageService + ) { + } + + ngOnInit() { + + } + + doLogout() { + + } + + onLogoutSuccess(caller: LogoutUiComponent) { + caller.message.log('New OAuth2 logout success'); + } + + onLogoutError(caller: LogoutUiComponent, errorResponse: HttpErrorResponse) { + caller.message.log('New OAuth2 logout failed'); + } + +} diff --git a/core/app/ui/components/message/message-type.ts b/core/app/ui/components/message/message-type.ts new file mode 100644 index 000000000..025243ab8 --- /dev/null +++ b/core/app/ui/components/message/message-type.ts @@ -0,0 +1,6 @@ +import {MessageTypes} from "./message-types.enum"; + +export interface MessageType { + type: MessageTypes; + text: string; +} diff --git a/core/app/ui/components/message/message-types.enum.ts b/core/app/ui/components/message/message-types.enum.ts new file mode 100644 index 000000000..e85e97d9c --- /dev/null +++ b/core/app/ui/components/message/message-types.enum.ts @@ -0,0 +1,11 @@ +// bootstrap css alert types +export enum MessageTypes { + primary = 'alert alert-primary', + secondary = 'alert alert-secondary', + success = 'alert alert-success', + danger = 'alert alert-danger', + warning = 'alert alert-warning', + info = 'alert alert-info', + light = 'alert alert-light', + dark = 'alert alert-dark' +} diff --git a/core/app/ui/components/message/message.component.html b/core/app/ui/components/message/message.component.html new file mode 100644 index 000000000..a82f03799 --- /dev/null +++ b/core/app/ui/components/message/message.component.html @@ -0,0 +1,8 @@ +
+ +
\ No newline at end of file diff --git a/core/app/ui/components/message/message.component.spec.ts b/core/app/ui/components/message/message.component.spec.ts new file mode 100644 index 000000000..f006c2591 --- /dev/null +++ b/core/app/ui/components/message/message.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {MessageComponent} from './message.component'; + +describe('MessageComponent', () => { + let component: MessageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [MessageComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MessageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/message/message.component.ts b/core/app/ui/components/message/message.component.ts new file mode 100644 index 000000000..1863deee5 --- /dev/null +++ b/core/app/ui/components/message/message.component.ts @@ -0,0 +1,31 @@ +import {Component, OnInit} from '@angular/core'; +import {MessageService} from '../../services/message/message.service'; +import {MessageType} from './message-type'; + + +@Component({ + selector: 'scrm-message-ui', + templateUrl: './message.component.html', + styleUrls: [] +}) +export class MessageUiComponent implements OnInit { + + messages: Array = []; + + constructor(public messageService: MessageService) { + messageService.subscribe(this); + } + + ngOnInit() { + this.update(this.messageService.messages); + } + + update(messages: Array) { + this.messages = messages; + } + + close(message: MessageType) { + this.messageService.contains(message, true); + } + +} diff --git a/core/app/ui/components/modal-view/modal-view.component.html b/core/app/ui/components/modal-view/modal-view.component.html new file mode 100644 index 000000000..eca386599 --- /dev/null +++ b/core/app/ui/components/modal-view/modal-view.component.html @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/app/ui/components/modal-view/modal-view.component.spec.ts b/core/app/ui/components/modal-view/modal-view.component.spec.ts new file mode 100644 index 000000000..37ccd6d95 --- /dev/null +++ b/core/app/ui/components/modal-view/modal-view.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {ModalViewComponent} from './modal-view.component'; + +describe('ModalViewComponent', () => { + let component: ModalViewComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ModalViewComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ModalViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + // it('should create', () => { + // expect(component).toBeTruthy(); + // }); +}); diff --git a/core/app/ui/components/modal-view/modal-view.component.ts b/core/app/ui/components/modal-view/modal-view.component.ts new file mode 100644 index 000000000..b45ae6fa4 --- /dev/null +++ b/core/app/ui/components/modal-view/modal-view.component.ts @@ -0,0 +1,54 @@ +import {Component, OnInit} from '@angular/core'; + +import {NgbModal, ModalDismissReasons} from '@ng-bootstrap/ng-bootstrap'; + +import { + trigger, + animate, + transition, +} from '@angular/animations'; + +@Component({ + selector: 'scrm-modal-view-ui', + templateUrl: './modal-view.component.html', + animations: [ + trigger('modalFade', [ + transition('void <=> *', [ + animate('800ms') + ]), + ]), + ] +}) + +export class ModalViewUiComponent implements OnInit { + closeResult: string; + + constructor(private modalService: NgbModal) { + } + + open(modal) { + this.modalService.open(modal, { + ariaLabelledBy: 'modal-basic-title', + centered: true, + size: 'lg' + }).result.then((result) => { + this.closeResult = `Closed with: ${result}`; + }, (reason) => { + this.closeResult = `Dismissed ${this.getDismissReason(reason)}`; + }); + } + + private getDismissReason(reason: any): string { + if (reason === ModalDismissReasons.ESC) { + return 'by pressing ESC'; + } else if (reason === ModalDismissReasons.BACKDROP_CLICK) { + return 'by clicking on a backdrop'; + } else { + return `with: ${reason}`; + } + } + + ngOnInit() { + } + +} diff --git a/core/app/ui/components/modal-view/modal-view.module.ts b/core/app/ui/components/modal-view/modal-view.module.ts new file mode 100644 index 000000000..11b220150 --- /dev/null +++ b/core/app/ui/components/modal-view/modal-view.module.ts @@ -0,0 +1,19 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {ModalViewUiComponent} from './modal-view.component'; + +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; + +@NgModule({ + declarations: [ModalViewUiComponent], + exports: [ModalViewUiComponent], + imports: [ + CommonModule, + AppManagerModule.forChild(ModalViewUiComponent), + SvgIconUiModule + ] +}) +export class ModalViewUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/navbar/action-link-model.ts b/core/app/ui/components/navbar/action-link-model.ts new file mode 100644 index 000000000..4f19ac8d4 --- /dev/null +++ b/core/app/ui/components/navbar/action-link-model.ts @@ -0,0 +1,8 @@ +import {LinkModel} from './link-model'; +import {RecentRecordModel} from "./recent-record-model"; + +export interface ActionLinkModel { + link: LinkModel; + submenu?: Array; + recentRecords?: Array; +} diff --git a/core/app/ui/components/navbar/all-menu-model.ts b/core/app/ui/components/navbar/all-menu-model.ts new file mode 100644 index 000000000..1f3b61bf0 --- /dev/null +++ b/core/app/ui/components/navbar/all-menu-model.ts @@ -0,0 +1,6 @@ +import {ActionLinkModel} from './action-link-model'; + +export interface AllMenuModel { + modules: Array; + extra: Array; +} diff --git a/core/app/ui/components/navbar/current-user-model.ts b/core/app/ui/components/navbar/current-user-model.ts new file mode 100644 index 000000000..bcc0605f0 --- /dev/null +++ b/core/app/ui/components/navbar/current-user-model.ts @@ -0,0 +1,4 @@ +export interface CurrentUserModel { + id: string; + name: string; +} diff --git a/core/app/ui/components/navbar/link-model.ts b/core/app/ui/components/navbar/link-model.ts new file mode 100644 index 000000000..19e8c261c --- /dev/null +++ b/core/app/ui/components/navbar/link-model.ts @@ -0,0 +1,9 @@ +import {IconRefModel} from '../svg-icon/icon-ref-model'; +import {LinkTarget} from './link-target'; + +export class LinkModel { + iconRef?: IconRefModel; + label: string | undefined; + url: string | undefined; + target?: LinkTarget = LinkTarget.none; +} diff --git a/core/app/ui/components/navbar/link-target.ts b/core/app/ui/components/navbar/link-target.ts new file mode 100644 index 000000000..920526721 --- /dev/null +++ b/core/app/ui/components/navbar/link-target.ts @@ -0,0 +1,7 @@ +export enum LinkTarget { + none = '', + blank = '_blank', + parent = '_parent', + self = '_self', + top = '_top' +} diff --git a/core/app/ui/components/navbar/navbar.component.html b/core/app/ui/components/navbar/navbar.component.html new file mode 100644 index 000000000..0391949c3 --- /dev/null +++ b/core/app/ui/components/navbar/navbar.component.html @@ -0,0 +1,191 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/app/ui/components/navbar/navbar.component.spec.ts b/core/app/ui/components/navbar/navbar.component.spec.ts new file mode 100644 index 000000000..d8c9d63e5 --- /dev/null +++ b/core/app/ui/components/navbar/navbar.component.spec.ts @@ -0,0 +1,31 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {NavbarComponent} from './navbar.component'; + +describe('NavbarComponent', () => { + let component: NavbarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [NavbarComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NavbarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it(`should create`, async(inject([HttpTestingController], + (httpClient: HttpTestingController) => { + expect(component).toBeTruthy(); + }))); +}); diff --git a/core/app/ui/components/navbar/navbar.component.ts b/core/app/ui/components/navbar/navbar.component.ts new file mode 100644 index 000000000..c3848b4fa --- /dev/null +++ b/core/app/ui/components/navbar/navbar.component.ts @@ -0,0 +1,21 @@ +import {Component, OnInit} from '@angular/core'; +import {Router, NavigationEnd} from '@angular/router'; +import {ApiService} from '../../services/api/api.service'; + +@Component({ + selector: 'scrm-navbar-ui', + templateUrl: './navbar.component.html', + styleUrls: [] +}) +export class NavbarUiComponent implements OnInit { + protected navbar: any = {}; + + protected loaded = true; + + constructor(protected api: ApiService, protected router: Router) { + } + + ngOnInit(): void { + this.navbar.authenticated = false; + } +} diff --git a/core/app/ui/components/navbar/navbar.module.ts b/core/app/ui/components/navbar/navbar.module.ts new file mode 100644 index 000000000..2c1270000 --- /dev/null +++ b/core/app/ui/components/navbar/navbar.module.ts @@ -0,0 +1,26 @@ +import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {CommonModule} from '@angular/common'; + +import {AppManagerModule} from '../../../../app-manager/app-manager.module'; +import {NavbarUiComponent} from './navbar.component'; + +import {LogoUiModule} from '../logo/logo.module'; +import {LogoutUiModule} from '../logout/logout.module'; +import {ActionBarUiModule} from '../action-bar/action-bar.module'; +import {SvgIconUiModule} from '../svg-icon/svg-icon.module'; + + +@NgModule({ + declarations: [NavbarUiComponent], + exports: [NavbarUiComponent], + imports: [ + CommonModule, + AppManagerModule.forChild(NavbarUiComponent), + SvgIconUiModule, + LogoUiModule, + LogoutUiModule, + ActionBarUiModule + ] +}) +export class NavbarUiModule { +} \ No newline at end of file diff --git a/core/app/ui/components/navbar/recent-record-model.ts b/core/app/ui/components/navbar/recent-record-model.ts new file mode 100644 index 000000000..3e1c0038d --- /dev/null +++ b/core/app/ui/components/navbar/recent-record-model.ts @@ -0,0 +1,10 @@ +export interface RecentRecordModel { + dateModified: string; + id: string; + icon: string; + itemId: string; + itemSummary: string; + itemSummaryShort: string; + moduleName: string; + monitorId: string; +} diff --git a/core/app/ui/components/svg-icon/icon-ref-model.ts b/core/app/ui/components/svg-icon/icon-ref-model.ts new file mode 100644 index 000000000..f43bdac0e --- /dev/null +++ b/core/app/ui/components/svg-icon/icon-ref-model.ts @@ -0,0 +1,4 @@ +export interface IconRefModel { + resolved: string; + origin: string; +} diff --git a/core/app/ui/components/svg-icon/svg-filename-map-model.ts b/core/app/ui/components/svg-icon/svg-filename-map-model.ts new file mode 100644 index 000000000..38857c114 --- /dev/null +++ b/core/app/ui/components/svg-icon/svg-filename-map-model.ts @@ -0,0 +1,4 @@ +export interface SvgFilenameMapModel { + iconId: string; + fileName: string; +} diff --git a/core/app/ui/components/svg-icon/svg-icon.component.html b/core/app/ui/components/svg-icon/svg-icon.component.html new file mode 100644 index 000000000..7fefda9c3 --- /dev/null +++ b/core/app/ui/components/svg-icon/svg-icon.component.html @@ -0,0 +1,3370 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/app/ui/components/svg-icon/svg-icon.component.spec.ts b/core/app/ui/components/svg-icon/svg-icon.component.spec.ts new file mode 100644 index 000000000..1db17e794 --- /dev/null +++ b/core/app/ui/components/svg-icon/svg-icon.component.spec.ts @@ -0,0 +1,25 @@ +import {async, ComponentFixture, TestBed} from '@angular/core/testing'; + +import {SvgIconComponent} from './svg-icon.component'; + +describe('SvgiconComponent', () => { + let component: SvgIconComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [SvgIconComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SvgIconComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/svg-icon/svg-icon.component.ts b/core/app/ui/components/svg-icon/svg-icon.component.ts new file mode 100644 index 000000000..6cecd69c1 --- /dev/null +++ b/core/app/ui/components/svg-icon/svg-icon.component.ts @@ -0,0 +1,17 @@ +import {Component, OnInit, Input, ViewEncapsulation} from '@angular/core'; + +@Component({ + selector: 'scrm-svg-icon-ui', + templateUrl: './svg-icon.component.html', + styleUrls: [] +}) +export class SvgIconUiComponent implements OnInit { + @Input() file: string = ""; + + constructor() { + } + + ngOnInit() { + + } +} diff --git a/core/app/ui/components/user-action-menu/user-action-menu.component.html b/core/app/ui/components/user-action-menu/user-action-menu.component.html new file mode 100644 index 000000000..3c2d40f2a --- /dev/null +++ b/core/app/ui/components/user-action-menu/user-action-menu.component.html @@ -0,0 +1,4 @@ +

+ user-action-menu works! +

+
{{ model | json }}
diff --git a/core/app/ui/components/user-action-menu/user-action-menu.component.spec.ts b/core/app/ui/components/user-action-menu/user-action-menu.component.spec.ts new file mode 100644 index 000000000..73b77e636 --- /dev/null +++ b/core/app/ui/components/user-action-menu/user-action-menu.component.spec.ts @@ -0,0 +1,30 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; + +import {UserActionMenuComponent} from './user-action-menu.component'; + +describe('UserActionMenuComponent', () => { + let component: UserActionMenuComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule], + declarations: [UserActionMenuComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(UserActionMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/core/app/ui/components/user-action-menu/user-action-menu.component.ts b/core/app/ui/components/user-action-menu/user-action-menu.component.ts new file mode 100644 index 000000000..573432a13 --- /dev/null +++ b/core/app/ui/components/user-action-menu/user-action-menu.component.ts @@ -0,0 +1,19 @@ +import {Component, OnInit} from '@angular/core'; +import {HttpClient, HttpErrorResponse} from '@angular/common/http'; + +@Component({ + selector: 'scrm-user-action-menu-ui', + templateUrl: './user-action-menu.component.html', + styleUrls: [] +}) +export class UserActionMenuUiComponent implements OnInit { + + model = null; + + constructor(protected http: HttpClient) { + } + + ngOnInit() { + } + +} diff --git a/core/app/ui/pipes/keys.pipe.spec.ts b/core/app/ui/pipes/keys.pipe.spec.ts new file mode 100644 index 000000000..02f4aa50b --- /dev/null +++ b/core/app/ui/pipes/keys.pipe.spec.ts @@ -0,0 +1,8 @@ +import {KeysPipe} from './keys.pipe'; + +describe('KeysPipe', () => { + it('create an instance', () => { + const pipe = new KeysPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/core/app/ui/pipes/keys.pipe.ts b/core/app/ui/pipes/keys.pipe.ts new file mode 100644 index 000000000..16a4ebcb7 --- /dev/null +++ b/core/app/ui/pipes/keys.pipe.ts @@ -0,0 +1,16 @@ +import {Pipe, PipeTransform} from '@angular/core'; + +@Pipe({ + name: 'keys' +}) +export class KeysPipe implements PipeTransform { + + transform(value: any, args?: any): any { + let keys = []; + for (let key in value) { + keys.push({key: key, value: value[key]}); + } + return keys; + } + +} diff --git a/core/app/ui/pipes/safe.pipe.ts b/core/app/ui/pipes/safe.pipe.ts new file mode 100644 index 000000000..49eb07a02 --- /dev/null +++ b/core/app/ui/pipes/safe.pipe.ts @@ -0,0 +1,12 @@ +import {PipeTransform, Pipe} from '@angular/core'; +import {DomSanitizer} from '@angular/platform-browser'; + +@Pipe({name: 'safe'}) +export class SafePipe implements PipeTransform { + constructor(private sanitizer: DomSanitizer) { + } + + transform(url) { + return this.sanitizer.bypassSecurityTrustResourceUrl(url); + } +} diff --git a/core/app/ui/services/api/api-access-token-response-empty.ts b/core/app/ui/services/api/api-access-token-response-empty.ts new file mode 100644 index 000000000..b672ececb --- /dev/null +++ b/core/app/ui/services/api/api-access-token-response-empty.ts @@ -0,0 +1,9 @@ +import {ApiAccessTokenResponseModel} from './api-access-token-response-model'; + +export class ApiAccessTokenResponseEmpty implements ApiAccessTokenResponseModel { + accessToken = ''; + expiresIn = 0; + tokenType = ''; + refreshToken = ''; + scope?: string[] = []; +} diff --git a/core/app/ui/services/api/api-access-token-response-model.ts b/core/app/ui/services/api/api-access-token-response-model.ts new file mode 100644 index 000000000..c955f5963 --- /dev/null +++ b/core/app/ui/services/api/api-access-token-response-model.ts @@ -0,0 +1,7 @@ +export interface ApiAccessTokenResponseModel { + accessToken: string; + expiresIn: number; + tokenType: string; + refreshToken: string; + scope?: string[]; +} diff --git a/core/app/ui/services/api/api-response-error-model.ts b/core/app/ui/services/api/api-response-error-model.ts new file mode 100644 index 000000000..735f20c7e --- /dev/null +++ b/core/app/ui/services/api/api-response-error-model.ts @@ -0,0 +1,3 @@ +export interface ApiResponseErrorModel { + message: string; +} diff --git a/core/app/ui/services/api/api-response-model.ts b/core/app/ui/services/api/api-response-model.ts new file mode 100644 index 000000000..bbc8c1dd4 --- /dev/null +++ b/core/app/ui/services/api/api-response-model.ts @@ -0,0 +1,8 @@ +import {ApiResponseErrorModel} from './api-response-error-model'; + +export interface ApiResponseModel { + error?: ApiResponseErrorModel; + meta?: any; + list?: any[]; + data?: any; +} diff --git a/core/app/ui/services/api/api-subscription-model.ts b/core/app/ui/services/api/api-subscription-model.ts new file mode 100644 index 000000000..0cf8cfca7 --- /dev/null +++ b/core/app/ui/services/api/api-subscription-model.ts @@ -0,0 +1,7 @@ +import {HttpErrorResponse} from '@angular/common/http'; +import {ApiResponseModel} from './api-response-model'; + +export interface ApiSubscriptionModel { + onSuccess: (response: ApiResponseModel) => void; + onError?: (error: HttpErrorResponse) => void; +} diff --git a/core/app/ui/services/api/api.service.spec.ts b/core/app/ui/services/api/api.service.spec.ts new file mode 100644 index 000000000..34b48436e --- /dev/null +++ b/core/app/ui/services/api/api.service.spec.ts @@ -0,0 +1,18 @@ +import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing'; +import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {RouterTestingModule} from '@angular/router/testing'; +import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; +import {ApiService} from './api.service'; + +describe('ApiService', () => { + beforeEach(() => TestBed.configureTestingModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [RouterTestingModule, HttpClientTestingModule, FormsModule] + })); + + it('should be created', () => { + const service: ApiService = TestBed.get(ApiService); + expect(service).toBeTruthy(); + }); +}); diff --git a/core/app/ui/services/api/api.service.ts b/core/app/ui/services/api/api.service.ts new file mode 100644 index 000000000..35d016043 --- /dev/null +++ b/core/app/ui/services/api/api.service.ts @@ -0,0 +1,335 @@ +import {Injectable} from '@angular/core'; +import {KeyValue} from '@angular/common'; +import {HttpClient, HttpErrorResponse} from '@angular/common/http'; +import {Router} from '@angular/router'; +import {Observable} from 'rxjs'; +import * as hash from 'object-hash'; +import {MessageService} from '../message/message.service'; +import {SvgFilenameMapModel} from '../../components/svg-icon/svg-filename-map-model'; +import {ApiAccessTokenResponseModel} from './api-access-token-response-model'; +import {ApiResponseModel} from './api-response-model'; +import {ApiSubscriptionModel} from './api-subscription-model'; +import {LoginResponseModel} from '../auth/login-response-model'; +import {ApiAccessTokenResponseEmpty} from './api-access-token-response-empty'; +import {ListViewData, ListViewDataModel} from '../../components/list-view/list-view-data-model'; + +@Injectable({ + providedIn: 'root' +}) +export class ApiService { + + protected useCache: boolean = true; + + constructor( + protected router: Router, + protected http: HttpClient, + protected message: MessageService + ) { + + } + + protected static observables: KeyValue>[] = []; + protected static subscriptions: KeyValue[] = []; + + protected static accessTokenResponse: ApiAccessTokenResponseModel = new ApiAccessTokenResponseEmpty(); + + reset(response?: LoginResponseModel) { + ApiService.observables = []; + ApiService.subscriptions = []; + ApiService.accessTokenResponse = new ApiAccessTokenResponseEmpty(); + + if (response) { + ApiService.accessTokenResponse.accessToken = response.access_token; + ApiService.accessTokenResponse.expiresIn = response.expires_in; + ApiService.accessTokenResponse.tokenType = response.token_type; + ApiService.accessTokenResponse.refreshToken = response.refresh_token; + ApiService.accessTokenResponse.scope = response.scope ? response.scope : []; + } + } + + protected getObservablePending(hashKey: string): Observable | null { + for (const i in ApiService.observables) { + if (ApiService.observables[i].key === hashKey) { + return ApiService.observables[i].value; + } + } + return null; + } + + protected addObservable(hashKey: string, post: Observable): number { + if (this.getObservablePending(hashKey)) { + throw new Error('Post request is already pending'); + } + return ApiService.observables.push({key: hashKey, value: post}); + } + + protected addSubscribtion(hashKey: string, subscription: ApiSubscriptionModel): number { + return ApiService.subscriptions.push({key: hashKey, value: subscription}); + } + + protected resolveSubscribtionsOnSuccess(hashKey: string, response: ApiResponseModel): number { + let resolved = 0; + ApiService.subscriptions.forEach((subscription: KeyValue) => { + if (subscription.key === hashKey) { + subscription.value.onSuccess(response); + resolved++; + } + }); + return resolved; + } + + protected resolveSubscribtionsOnError(hashKey: string, error: HttpErrorResponse): number { + let resolved = 0; + ApiService.subscriptions.forEach((subscription: KeyValue) => { + if (subscription.key === hashKey) { + if (subscription.value.onError) { + subscription.value.onError(error); + resolved++; + } + } + }); + return resolved; + } + + protected httpRequest( + params: { + url: string, + type?: string, + body?: any, + options?: any + }, + onSuccess: (response: any) => void, + onError?: (error: HttpErrorResponse) => void): boolean { + let ok = true; + + if (!params.options) { + params.options = {}; + } + + params.options.withCredentials = true; + const hsh = this.useCache ? hash(params, {algorithm: 'md5'}) : hash(Math.random(), {algorithm: 'md5'}); + let req: Observable = this.getObservablePending(hsh); + + if (!req) { + + switch (params.type) { + case 'POST': + req = this.http.post(params.url, params.body, params.options); + break; + case 'GET': + req = this.http.get(params.url, params.options); + break; + default: + throw new Error('Invalid request type should be "POST" or "GET", ' + params.type + ' given'); + } + + let resolved = 0; + + req.subscribe( + (response: ApiResponseModel) => { + resolved = this.resolveSubscribtionsOnSuccess(hsh, response); + if (!resolved) { + console.warn('Unhandled HTTP response', {params, response}); + } + }, + (error: HttpErrorResponse) => { + resolved = this.resolveSubscribtionsOnError(hsh, error); + if (!resolved) { + console.error('Unhandled HTTP error', {params, error}); + } + } + ); + + if (!this.addSubscribtion(hsh, {onSuccess, onError})) { + console.warn('Unable to subscribe for an HTTP request', params); + ok = false; + } + + if (!this.addObservable(hsh, req)) { + console.warn('Unable to observe an HTTP request', params); + ok = false; + } + } else { + (response: ApiResponseModel) => { + let resolved = this.resolveSubscribtionsOnSuccess(hsh, response); + if (!resolved) { + console.warn('Unhandled HTTP response', {params, response}); + } + } + } + + return ok; + } + + protected getAccessToken( + onSuccess?: (response: ApiAccessTokenResponseModel) => void, + onError?: (error: HttpErrorResponse) => void + ): boolean { + const params = { + grant_type: 'refresh_token', + client_id: 'scrmfe', + client_secret: 'scrmfe', + scope: '' + }; + return this.httpRequest( + {type: 'POST', url: 'index.php?module=Users&controller=Oauth&action=AccessToken', body: params}, + (response: ApiAccessTokenResponseModel) => { + ApiService.accessTokenResponse = response; + if (onSuccess) { + onSuccess(response); + } + }, + (error: HttpErrorResponse) => { + if (onError) { + onError(error); + } else { + console.error('Api auth error', error); + } + } + ); + } + + protected httpRequestAuthorized( + params: { + url: string, + type?: string, + body?: any, + options?: any + }, + onSuccess: (response: ApiResponseModel) => void, + onError?: (error: HttpErrorResponse) => void, + onUnauthorized?: (error: HttpErrorResponse) => void + ): boolean { + + if (!params.options) { + params.options = {}; + } + + params.options.headers = {Authorization: ApiService.accessTokenResponse.tokenType + ' ' + ApiService.accessTokenResponse.tokenType}; + params.options.withCredentials = true; + + return this.httpRequest( + params, + (response: ApiResponseModel) => { + onSuccess(response); + }, + (error: HttpErrorResponse) => { + if (error.status === 401) { + // API Request is unauthorized, trying to get a new access_token... + this.getAccessToken(() => { + if (!onUnauthorized) { + this.message.addDangerMessage('API access_token renewed, repeat the request'); + } else { + onUnauthorized(error); + } + }); + } else { + if (!onError) { + this.message.addDangerMessage('API response error occured.'); + } else { + onError(error); + } + } + } + ); + } + + protected request( + params: { + url: string, + type?: string, + body?: any, + options?: any + }, + onSuccess: (response: ApiResponseModel) => void, + onError?: (error: HttpErrorResponse) => void, + onUnauthorized?: (error: HttpErrorResponse) => void + ): boolean { + if (!ApiService.accessTokenResponse) { + this.message.log('API is trying to call an http POST request, but first it needs an access token..'); + return this.getAccessToken((results) => { + + this.message.log('API given an access token results', results); + + if (!this.httpRequestAuthorized(params, onSuccess, onError, onUnauthorized)) { + this.message.error('Authorization error', params); + } + }); + } else { + return this.httpRequestAuthorized(params, onSuccess, onError, onUnauthorized); + } + } + + protected post( + url: string, body: any, + onSuccess: (response: ApiResponseModel) => void, + onError?: (error: HttpErrorResponse) => void + ): boolean { + return this.request({type: 'POST', url, body}, onSuccess, onError); + } + + protected get( + url: string, + onSuccess: (response: ApiResponseModel) => void, + onError?: (error: HttpErrorResponse) => void + ): boolean { + return this.request({type: 'GET', url}, onSuccess, onError); + } + + getSvgFilenameMap(callback: (response: SvgFilenameMapModel[]) => void): boolean { + return false; + + // return this.get(this.config.apiBaseUrl + 'module=Template&controller=Index&action=GetSvgIcon', (response: ApiResponseModel) => { + // if (response.error) { throw new Error('Api response error: ' + response.error.message); } + // callback(response.list); + // }); + } + + getListViewData( + listViewData: ListViewData, + callback: (listViewData: ListViewDataModel) => void, + orderBy: string, + desc: string + ) { + // this.useCache = false; + // const ret = this.get(this.config.apiBaseUrl + 'module=PluralNames&controller=Index&action=List', (apiResponse: ApiResponseModel) => { + // let modulePlural = ''; + // for (const k in apiResponse) { + // if (apiResponse[k].singular === listViewData.module) { + // modulePlural = apiResponse[k].plural; + // break; + // } + // if (apiResponse[k].plural === listViewData.module) { + // modulePlural = apiResponse[k].plural; + // break; + // } + // } + // if (!modulePlural) { + // throw new Error('No plural for ' + listViewData.module); + // } + + // return this.get( + // this.config.apiBaseUrl + 'moule=' + modulePlural + '&controller=Index&action=List&orderBy=' + orderBy + '&desc=' + desc, + // (response: ApiResponseModel) => { + + // if (response.error) { + // throw new Error('Api ressponse error: ' + response.error.message); + // } + + // this.useCache = true; + + // callback({ + // module: response.data.module, + // columns: response.data.columns, + // rows: response.list, + // page: response.data.page, + // maxpage: response.data.maxpage, + // }); + // }); + // }); + // return ret; + + return false; + } + +} diff --git a/core/app/ui/services/auth/auth-guard.service.ts b/core/app/ui/services/auth/auth-guard.service.ts new file mode 100644 index 000000000..94ff64f6d --- /dev/null +++ b/core/app/ui/services/auth/auth-guard.service.ts @@ -0,0 +1,17 @@ +import {Injectable} from '@angular/core'; +import {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} from '@angular/router'; +import {MessageService} from '../message/message.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthGuard implements CanActivate { + + constructor(protected message: MessageService, protected router: Router) { + } + + canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { + return true; + } + +} diff --git a/core/app/ui/services/auth/auth.service.ts b/core/app/ui/services/auth/auth.service.ts new file mode 100644 index 000000000..973d4d519 --- /dev/null +++ b/core/app/ui/services/auth/auth.service.ts @@ -0,0 +1,99 @@ +import {Injectable} from '@angular/core'; +import {HttpClient, HttpErrorResponse, HttpParams, HttpHeaders} from '@angular/common/http'; +import {Router} from '@angular/router'; +import {LoginUiComponent} from '../../components/login/login.component'; +import {LogoutUiComponent} from '../../components/logout/logout.component'; +import {LoginResponseModel} from './login-response-model'; +import {MessageService} from '../message/message.service'; +import {ApiService} from '../api/api.service'; + +@Injectable({ + providedIn: 'root' +}) +export class AuthService { + protected loginResponse: LoginResponseModel = null; + + protected user = null; + + constructor( + protected api: ApiService, + protected router: Router, + protected message: MessageService, + protected http: HttpClient + ) { + } + + isLoggedIn(): boolean { + return this.user != null && !this.user.expired; + } + + doLogin( + caller: LoginUiComponent, + username: string, + password: string, + onSuccess: (caller: LoginUiComponent, loginResponse: LoginResponseModel) => void, + onError: (caller: LoginUiComponent, error: HttpErrorResponse) => void + ) { + const loginUrl = 'index.php?module=users&controller=oauth&action=login'; + + const body = new HttpParams() + .set('username', username) + .set('password', password) + .set('grant_type', 'password') + .set('client_id', 'scrmfe') + .set('client_secret', 'scrmfe'); + + return this.http.post(loginUrl, + body.toString(), + { + headers: new HttpHeaders() + .set('Content-Type', 'application/x-www-form-urlencoded') + } + ).subscribe((response: LoginResponseModel) => { + this.api.reset(response); + this.loginResponse = response; + onSuccess(caller, this.loginResponse); + }, (error: HttpErrorResponse) => { + onError(caller, error); + }); + } + + getLoginResponse(): LoginResponseModel | null { + if (!this.loginResponse) { + return null; + } + return this.loginResponse; + } + + doLogout( + caller: LogoutUiComponent, + onSuccess: (caller: LogoutUiComponent, resp: any) => void, + onError: (caller: LogoutUiComponent, error: HttpErrorResponse) => void + ) { + + const loginResponse = this.getLoginResponse(); + + if (!loginResponse) { + this.router.navigateByUrl('Login'); + return; + } + + const logoutUrl = 'index.php?module=users&controller=oauth&action=logout'; + + const body = new HttpParams() + .set('access_token', loginResponse.access_token) + .set('refresh_token', loginResponse.refresh_token); + + return this.http.post(logoutUrl, + body.toString(), + { + headers: new HttpHeaders() + .set('Content-Type', 'application/x-www-form-urlencoded') + } + ).subscribe((resp) => { + onSuccess(caller, resp); + }, (error: HttpErrorResponse) => { + onError(caller, error); + }); + } +} diff --git a/core/app/ui/services/auth/login-response-model.ts b/core/app/ui/services/auth/login-response-model.ts new file mode 100644 index 000000000..150f0d0e7 --- /dev/null +++ b/core/app/ui/services/auth/login-response-model.ts @@ -0,0 +1,7 @@ +export interface LoginResponseModel { + access_token: string; + expires_in: number; + refresh_token: string; + scope?: string[]; + token_type: string; +} diff --git a/core/app/ui/services/auth/logout-response-model.ts b/core/app/ui/services/auth/logout-response-model.ts new file mode 100644 index 000000000..c9b011aaa --- /dev/null +++ b/core/app/ui/services/auth/logout-response-model.ts @@ -0,0 +1,3 @@ +export interface LogoutResponseModel { + +} diff --git a/core/app/ui/services/auth/user-model.ts b/core/app/ui/services/auth/user-model.ts new file mode 100644 index 000000000..d557418cc --- /dev/null +++ b/core/app/ui/services/auth/user-model.ts @@ -0,0 +1,8 @@ +export interface UserModel { + name: string; + id: string; + userName: string; + salutation?: string; + status: string; + isAdmin: boolean; +} diff --git a/core/app/ui/services/message/message.service.spec.ts b/core/app/ui/services/message/message.service.spec.ts new file mode 100644 index 000000000..e088534ef --- /dev/null +++ b/core/app/ui/services/message/message.service.spec.ts @@ -0,0 +1,12 @@ +import {TestBed} from '@angular/core/testing'; + +import {MessageService} from './message.service'; + +describe('MessageService', () => { + beforeEach(() => TestBed.configureTestingModule({})); + + it('should be created', () => { + const service: MessageService = TestBed.get(MessageService); + expect(service).toBeTruthy(); + }); +}); diff --git a/core/app/ui/services/message/message.service.ts b/core/app/ui/services/message/message.service.ts new file mode 100644 index 000000000..be6862ad3 --- /dev/null +++ b/core/app/ui/services/message/message.service.ts @@ -0,0 +1,112 @@ +import {Injectable} from '@angular/core'; +import {MessageType} from '../../components/message/message-type'; +import {MessageTypes} from '../../components/message/message-types.enum'; +import {MessageUiComponent} from '../../components/message/message.component'; + +@Injectable({ + providedIn: 'root' +}) +export class MessageService { + messages: Array = []; + messageComponent?: MessageUiComponent; + + constructor() { + } + + subscribe(messageComponent: MessageUiComponent) { + this.messageComponent = messageComponent; + this.messageComponent.update(this.messages); + } + + removeMessages() { + this.messages = []; + if (this.messageComponent) { + this.messageComponent.update(this.messages); + } + } + + contains(message: MessageType, remove: boolean = false): boolean { + let found = false; + for (let i = 0; i < this.messages.length; i++) { + if (message.text === this.messages[i].text) { + found = true; + if (remove) { + this.messages.splice(i, 1); + } + break; + } + } + return found; + } + + addMessage(message: MessageType): number { + // push message only if it does not contains already... + let ret = -1; + if (!this.contains(message)) { + ret = this.messages.push(message); + if (this.messageComponent) { + this.messageComponent.update(this.messages); + } + } + return ret; + } + + addPrimaryMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.primary, + text + }); + } + + addSecondaryMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.secondary, + text + }); + } + + addSuccessMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.success, + text + }); + } + + addDangerMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.danger, + text + }); + } + + addWarningMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.warning, + text + }); + } + + addInfoMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.info, + text + }); + } + + addDarkMessage(text: string): number { + return this.addMessage({ + type: MessageTypes.dark, + text + }); + } + + // --- LOG --- + + log(...args: any[]) { + console.log.apply(console, arguments); + } + + error(...args: any[]) { + console.error.apply(console, arguments); + } +} diff --git a/core/app/views/create/create.php b/core/app/views/create/create.php new file mode 100644 index 000000000..f40decdec --- /dev/null +++ b/core/app/views/create/create.php @@ -0,0 +1,3 @@ +fileHelper = $file; + + try { + $this->configParameters = $config->loadFiles($config_path); + } catch (\Exception $e) { + trigger_error('Config failed to load files: ' . $e); + } + + $this->enabledModules = $this->configParameters->get('modules.enabled'); + } + + public function getAllModules(): void + { + $modules = (new ModuleManager($this->configParameters, $this->fileHelper))->getAllModules(); + + $this->enabledModules = $modules; + } + + /** + * @return array + */ + public function getAllCommands(): array + { + $commandClasses = []; + + $filePaths = []; + + if (empty($this->enabledModules)) { + $this->getAllModules(); + } + + if (!empty($this->enabledModules)) { + foreach ($this->enabledModules as $module) { + $filePaths[] = APP_PATH . '/' . $module . '/Cli'; + } + } + + $files = $this->fileHelper->findFiles($filePaths, '/Command.php$/'); + + if (!empty($files)) { + foreach ($files as $file) { + $parts = explode('/', $file); + + $key = array_search('modules', $parts, true); + + $parts = array_splice($parts, ($key + 1), count($parts)); + + $filename = end($parts); + $classname = rtrim($filename, '.php'); + + $keys = array_keys($parts); + $key = end($keys); + + $parts[$key] = $classname; + + $commandClass = 'SuiteCRM\\Core\\Modules\\' . implode('\\', $parts); + + $commandClasses[] = new $commandClass($this->configParameters); + } + } + + return $commandClasses; + } + +} diff --git a/core/base/Cli/SuiteCommand.php b/core/base/Cli/SuiteCommand.php new file mode 100644 index 000000000..37c210f9e --- /dev/null +++ b/core/base/Cli/SuiteCommand.php @@ -0,0 +1,19 @@ +locate($path); + } + + $loaderResolver = new LoaderResolver([new YamlLoader($fileLocator)]); + + $delegatingLoader = new DelegatingLoader($loaderResolver); + + // All config parameters + $allParameters = []; + + if ($configPaths !== false) { + foreach ($configPaths as $path) { + // Load the parameters from the path resource + $parameters = $delegatingLoader->load($path); + + // Merge parameters together + if (!empty($parameters)) { + $allParameters = array_merge($allParameters, $parameters); + } + } + } + + return new ParameterCollection($allParameters); + } +} + diff --git a/core/base/Config/ParameterCollection.php b/core/base/Config/ParameterCollection.php new file mode 100644 index 000000000..ae70c0e03 --- /dev/null +++ b/core/base/Config/ParameterCollection.php @@ -0,0 +1,13 @@ +load($data); + } + + /** + * Recursive function to collect the collection data + * + * @param array $data The collection data + * @param string $parent_key The parent keys attached to the child array + * @return bool + */ + public function load($data, $parent_key = ''): bool + { + if (empty($data)) { + return false; + } + + $parentKey = ($parent_key !== '') ? $parent_key . '.' : ''; + + foreach ($data as $key => $val) { + if (is_array($val)) { + $this->load($data[$key], $parentKey . $key); + } + + $this->data[$parentKey . $key] = $val; + } + + return true; + } + + /** + * Get all config variable + * + * @return array + */ + public function getAll(): array + { + return $this->data; + } + + /** + * Get collection data + * + * @param string $key + * @return bool|mixed + */ + public function get($key) + { + return ($this->has($key)) ? $this->data[$key] : false; + } + + /** + * Set collection data + * + * @param string $key Name of parameter to set + * @param mixed $value Value to set + */ + public function set($key, $value): void + { + $this->data[$key] = $value; + } + + /** + * Find out if parameter exists + * + * @param string $key Name to find out + * @return bool + */ + public function has($key): bool + { + return isset($this->data[$key]); + } + + /** + * Count collection entry for key + * + * @param string|null $key The config key you want to count + * @return int + */ + public function count($key = null): int + { + return ($key === null) ? count($this->data) : count($this->data[$key]); + } + + /** + * Check if the collection key is empty + * + * @param string $key + * @return bool true if empty - false - if not + */ + public function isEmpty($key): bool + { + $has = $this->has($key); + + if ($has) { + $count = $this->count($key); + + if ($count > 0) { + return false; + } + } + + return true; + } +} diff --git a/core/base/Helper/Data/CollectionInterface.php b/core/base/Helper/Data/CollectionInterface.php new file mode 100644 index 000000000..f9740f35d --- /dev/null +++ b/core/base/Helper/Data/CollectionInterface.php @@ -0,0 +1,50 @@ +isDot()) { + continue; + } + + if ($fileInfo->isDir()) { + $directories[] = $fileInfo->getFilename(); + } + } + } + + return $directories; + } + + /** + * Make directory + * + * @param string $path + * @param int $permissions octal + * @return bool + */ + public function makeDir($path, $permissions = 0777): bool + { + return is_dir($path) || mkdir($path, $permissions, true) || is_dir($path); + } + + /** + * Delete a directory and all files + * + * @param string $dir The directory path you want to delete + * @param array $files_to_leave + * @return bool True - successfully deleted False - issue with deletion + */ + public function deleteDirectory(string $dir, array $files_to_leave = []): bool + { + $di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS); + + $ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST); + + if (empty($files_to_leave)) { + foreach ($ri as $file) { + $file->isDir() ? rmdir($file) : unlink($file); + } + } else { + foreach ($ri as $file) { + if (strpos($file->getPathName(), $files_to_leave[0]) === false) { + $file->isDir() ? rmdir($file) : unlink($file); + } + } + } + + return (!$this->isDirectoryEmpty($dir)) ?: rmdir($dir); + } + + /** + * Check to see if directory is empty + * + * @param string $dir + * @return bool + */ + public function isDirectoryEmpty($dir): bool + { + if (!is_readable($dir)) { + return null; + } + + return (count(scandir($dir)) == 2); + } + + /** + * File files + * + * @param string|array $directories The directory to look in + * @param string $search The pattern to find the files + * @return array + */ + public function findFiles($directories, $search): array + { + $foundFiles = []; + + // Convert to array if string given + if (is_string($directories)) { + $directories = [$directories]; + } + + foreach ($directories as $directory) { + $directory = realpath($directory); + + $objDirectory = new RecursiveDirectoryIterator($directory, RecursiveDirectoryIterator::SKIP_DOTS); + + $iterator = new RecursiveIteratorIterator($objDirectory); + + $files = new \RegexIterator($iterator, $search, \RecursiveRegexIterator::GET_MATCH); + + if ($files !== null) { + foreach ($files as $key => $value) { + $foundFiles[] = $key; + } + } + } + + return $foundFiles; + } + + /** + * Copy files recursively + * @param $src + * @param $dst + */ + public function recurseCopy($src, $dst): void + { + $dir = \opendir($src); + + if (!is_dir($dst)) { + try { + if (!mkdir($dst) && !is_dir($dst)) { + throw new \RuntimeException(sprintf('Directory "%s" was not created', $dst)); + } + } catch (\Exception $e) { + throw new \RuntimeException(sprintf('Directory "%s" was not created', $dst)); + } + } + + chmod($dst, 0777); + + while (false !== ($file = \readdir($dir))) { + if (($file !== '.') && ($file !== '..')) { + if (\is_dir($src . '/' . $file)) { + $this->recurseCopy($src . '/' . $file, $dst . '/' . $file); + } else { + \copy($src . '/' . $file, $dst . '/' . $file); + } + } + } + + \closedir($dir); + } +} diff --git a/core/base/Helper/File/FileMapperInterface.php b/core/base/Helper/File/FileMapperInterface.php new file mode 100644 index 000000000..144badf2d --- /dev/null +++ b/core/base/Helper/File/FileMapperInterface.php @@ -0,0 +1,18 @@ +modules = $modules; + $this->config = $config; + $this->route = $route; + } + + /** + * Run the Application + * + * @return mixed + */ + public function run() + { + return $this; + } + + /** + * Get all routes from enabled modules + * + * @return array + */ + public function getAllRoutes(): ?array + { + $allRoutes = []; + + foreach ($this->modules as $module) { + $allRoutes = array_merge($allRoutes, $module); + } + + return $allRoutes; + } + + /** + * Get the route of the instance call + * + * @return mixed + * @throws \Exception + */ + public function getRoute() + { + if ($this->route === null) { + throw new \RuntimeException('Route was not configured'); + } + + return $this->route; + } + + /** + * Get all services + * + * @return array + */ + public function getAllServices(): array + { + $allServices = []; + + foreach ($this->modules as $module) { + $allServices = array_merge($allServices, $module); + } + + return $allServices; + } + +} diff --git a/core/base/Module/Controller.php b/core/base/Module/Controller.php new file mode 100644 index 000000000..21bc961cf --- /dev/null +++ b/core/base/Module/Controller.php @@ -0,0 +1,294 @@ +config = $config; + $this->requestObj = $request; + $this->responseObj = $response; + $this->view = $view; + $this->services = $services; + + if ($this->config->has('storage.mysql.driver')) { + $connectionParams = $this->config->get('storage.mysql'); + $namespaces = $this->config->get('entity.namespaces'); + + $realNamespaces = []; + + foreach ($namespaces as $path => $namespace) { + $realPath = realpath($path); + if ($realPath !== false) { + $realNamespaces[$realPath] = $namespace; + } + } + + $driver = new SimplifiedYamlDriver($realNamespaces); + + + $realNamespaces = []; + + foreach ($namespaces as $path => $namespace) { + $realPath = realpath($path); + if ($realPath !== false) { + $realNamespaces[$realPath] = $namespace; + } + } + + $driver = new SimplifiedYamlDriver($realNamespaces); + + $isDevMode = false; + + if ($this->config->has('server.environment') && $this->config->get('server.environment') === 'develop') { + $isDevMode = true; + } + + $config = Setup::createYAMLMetadataConfiguration( + (array)$namespaces, + $isDevMode + ); + + $cache = new ArrayCache(); + + $config->setMetadataCacheImpl($cache); + $config->setQueryCacheImpl($cache); + $config->setMetadataDriverImpl($driver); + + // Table Prefix + $evm = new EventManager(); + $tablePrefix = new TablePrefix('suite8_'); + $evm->addEventListener(Events::loadClassMetadata, $tablePrefix); + + try { + $entityManager = EntityManager::create($connectionParams, $config, $evm); + } catch (ORMException $e) { + trigger_error('Failed to get create entity manager instance: ' . $e); + } + + //-- This I had to add to support the Mysql enum type. + try { + $platform = $entityManager->getConnection()->getDatabasePlatform(); + } catch (DBALException $e) { + trigger_error('Failed to get DB platform: ' . $e); + } + + try { + $platform->registerDoctrineTypeMapping('enum', 'string'); + } catch (DBALException $e) { + trigger_error('Failed to get register doctrine type mapping: ' . $e); + } + + $this->em = $entityManager; + } + } + + /** + * Get a storage class + * + * @param $namespace + * @return object + */ + public function getStorage($namespace) + { + [$module, $entityName] = explode('.', $namespace); + + return $this->em->getRepository( + 'SuiteCRM\Core\Modules\\' . ucfirst($module) . '\Entity\\' . ucfirst($entityName) + ); + } + + /** + * Get a service class + * + * @param $serviceName + * @return object + * @throws Exception + */ + public function getService($serviceName) + { + if (!$this->services->has($serviceName)) { + throw new \RuntimeException('No Service Found: ' . $serviceName); + } + + return $this->services->get($serviceName); + } + + /** + * Quick function to allow for $this->render + * + * @param $view + * @param array $params + * @param string $template + * @return string + */ + public function render($view, $params = [], $template = 'default.html.php'): string + { + return $this->view->render($view, $params, $template); + } + + /** + * Redirect to URL + * + * @param mixed $url Array or string + * @param mixed $params Params too be sent + * @param int $statusCode + * @todo Get Base URL, Concat the Base URL with Route (Controller, Action), Test Array and String + * + */ + public function redirect($url, $params = [], $statusCode = 303): void + { + $this->session->set('redirectPost', $params); + + if (is_array($url)) { + $url = implode('/', $url); + } + + $urlHelper = new Url(); + + header('Location: ' . $urlHelper->baseUrl() . $url, true, $statusCode); + die(); + } + + /** + * Redirect to URL + * + * @param mixed $url URL to redirect to + * @param int $statusCode Forces the HTTP response code to the specified value. Note that this parameter only has an effect if the header is not empty. + */ + public function redirectToUrl($url, $statusCode = 303): void + { + header('Location: ' . $url, true, $statusCode); + die(); + } + + /** + * Create a flash message. + * + * @param string $message Flash Message + * @param string $type Type of Message + * @return void + * @todo create one time session var for flash_msg, + * + */ + public function flashMsg($message, $type = 'default'): void + { + $this->session->set('flashMsg', ['message' => $message, 'type' => $type], 1); + } + + /** + * @param $template + * @param $params + */ + public function renderTemplate($template, $params): void + { + $response = [ + 'template' => ' +
+ +
+ ', + 'scripts' => [ + 'https://code.jquery.com/jquery-3.4.1.min.js' + ] + ]; + + header('Content-Type: application/json'); + + echo json_encode($response); + } +} diff --git a/core/base/Module/Manager.php b/core/base/Module/Manager.php new file mode 100644 index 000000000..2ab36b565 --- /dev/null +++ b/core/base/Module/Manager.php @@ -0,0 +1,134 @@ +config = $config; + $this->fileHelper = $file_helper; + } + + /** + * Get Module Paths + * + * @return array + */ + public function getModulePaths(): array + { + // Get config module paths if set + + if (!$this->config->isEmpty('modules.paths')) { + $modulePaths = []; + $configModulePaths = $this->config->get('modules.paths'); + + foreach ($configModulePaths as $modulePath) { + $modulePaths[] = realpath(__DIR__ . $modulePath); + } + + return $modulePaths; + } + + // Return default module paths + return [ + realpath(BASE_PATH . '/core/modules') + ]; + } + + /** + * Get an array of all modules + * + * @return array + */ + public function getAllModules(): array + { + $modulePaths = $this->getModulePaths(); + + return (new ModuleMapper($modulePaths, $this->fileHelper, $this->config))->getAllModuleFolders(); + } + + /** + * Get a list of the enabled modules + * + * @return array + */ + public function listEnabled(): array + { + $modulePaths = $this->getModulePaths(); + $moduleMapper = new ModuleMapper($modulePaths, $this->fileHelper, $this->config); + $modules = []; + + if ($this->config->has('modules.enabled')) { + $foundModules = []; + + $enabledModules = $this->config->get('modules.enabled'); + $modules = $moduleMapper->checkModulesExist($enabledModules); + + return $moduleMapper->getModuleClassesFromFileName($modules); + } + + $moduleNames = $this->getAllModules(); + $modules = $moduleMapper->checkModulesExist($moduleNames); + + return $moduleMapper->getModuleClassesFromFileName($modules); + } + + /** + * Get Module Services + * + * @return array + */ + public function getModuleServices(): ?array + { + $modules = $this->getEnabled(); + + $moduleServices = []; + + foreach ($modules as $module) { + $moduleServices[] = $module->getServices; + } + } + + /** + * Get Module Command + * + * @return array + */ + public function getModuleCommands(): ?array + { + $modules = $this->getEnabled(); + + $moduleCommands = []; + + foreach ($modules as $module) { + //$moduleCommands + } + } +} diff --git a/core/base/Module/ModuleCollection.php b/core/base/Module/ModuleCollection.php new file mode 100644 index 000000000..efcd32c4c --- /dev/null +++ b/core/base/Module/ModuleCollection.php @@ -0,0 +1,22 @@ +filePaths = $file_paths; + $this->fileHelper = $file; + $this->moduleConfigParameters = $module_config_params; + $this->enabledModules = $this->moduleConfigParameters->get('modules.enabled'); + } + + + /** + * Get All Module Folders + * + * @return array + */ + public function getAllModuleFolders(): array + { + return $this->fileHelper->findDirectories($this->filePaths); + } + + + /** + * Check modules exist out of an array input modules + * + * @param array $modules array of module names to check + * @return array List if found modules + */ + public function checkModulesExist($modules): array + { + $foundModules = []; + + if (!empty($modules)) { + foreach ($modules as $module) { + foreach ($this->filePaths as $path) { + if (file_exists($path . '/' . $module . '/' . $module . '.php')) { + $foundModules[] = $path . '/' . $module . '/' . $module . '.php'; + } + } + } + } + + return $foundModules; + } + + /** + * Get all module classes from file name + * + * @param $files + * @return array|bool + */ + public function getModuleClassesFromFileName($files) + { + if (empty($files)) { + return false; + } + + $moduleClasses = []; + + foreach ($files as $file) { + $file = str_replace('suitecrm/', '', $file); + $parts = explode('/', $file); + $parts = array_splice($parts, 4, count($parts)); + + $filename = end($parts); + $classname = rtrim($filename, '.php'); + + $keys = array_keys($parts); + $key = end($keys); + + $parts[$key] = $classname; + + $parts = array_map('ucfirst', $parts); + + $commandClass = 'SuiteCRM\\' . implode('\\', $parts); + + $moduleClasses[] = new $commandClass(); + } + + return $moduleClasses; + } + +} diff --git a/core/base/Module/Service/Manager.php b/core/base/Module/Service/Manager.php new file mode 100644 index 000000000..773a9f2f8 --- /dev/null +++ b/core/base/Module/Service/Manager.php @@ -0,0 +1,34 @@ +listEnabled() as $module) { + $file = new FileLocator(); + + $service = new $module(); + } + + return (new ServiceCollection())->load(); + } + + +} diff --git a/core/base/Module/Service/ServiceCollection.php b/core/base/Module/Service/ServiceCollection.php new file mode 100644 index 000000000..43360832b --- /dev/null +++ b/core/base/Module/Service/ServiceCollection.php @@ -0,0 +1,22 @@ +fileHelper = $file; + $this->moduleManager = $moduleManager; + $this->config = $config; + } + + /** + * Get all services enabled in the system + * + * @return ServiceCollection + */ + public function getAllServices(): ServiceCollection + { + $serviceClasses = []; + + $filePaths = []; + + $enabledModules = $this->moduleManager->getAllModules(); + + // Get Application Service + if (!empty($enabledModules)) { + foreach ($enabledModules as $module) { + $path = APP_PATH . 'Modules/' . $module . '/Service'; + if (file_exists($path)) { + $filePaths[] = $path; + } + } + } + + $files = $this->fileHelper->findFiles($filePaths, '/Service.php$/'); + + if (!empty($files)) { + foreach ($files as $file) { + $parts = explode('/', $file); + + $key = array_search('Modules', $parts, true); + + $parts = array_splice($parts, $key, count($parts)); + + $filename = end($parts); + $classname = rtrim($filename, '.php'); + + $keys = array_keys($parts); + $key = end($keys); + + $parts[$key] = $classname; + + $serviceClass = 'SuiteCRM\\App\\' . implode('\\', $parts); + + $service = new $serviceClass(); + $serviceName = $service->getName(); + + $serviceClasses[$serviceName] = $service->createService(); + } + } + + // Load in configuration services if they're available + if ($this->config->has('services')) { + foreach ($this->config->get('services') as $serviceName => $serviceFactory) { + $serviceFactory = new $serviceFactory(); + $service = $serviceFactory->createService(); + $serviceClasses[$serviceName] = $service; + } + } + + return new ServiceCollection($serviceClasses); + } +} diff --git a/core/base/Module/Storage/DataCollectionManager.php b/core/base/Module/Storage/DataCollectionManager.php new file mode 100644 index 000000000..eaea1c2d4 --- /dev/null +++ b/core/base/Module/Storage/DataCollectionManager.php @@ -0,0 +1,58 @@ +dataProviders = $dataProviders; + } + + /** + * Get the Collection Object + * + * @param string $resourceClass + * @param string $operationName + * @param array $context + * @return array + */ + public function getCollection(string $resourceClass, string $operationName = null, array $context = []): array + { + foreach ($this->dataProviders as $dataProvider) { + try { + if ($dataProvider instanceof RestrictedDataProviderInterface + && !$dataProvider->supports($resourceClass, $operationName, $context)) { + continue; + } + + return $dataProvider->getCollection($resourceClass, $operationName, $context); + } catch (ResourceClassNotSupportedException $e) { + @trigger_error( + sprintf( + 'Throwing a "%s" in a data provider is deprecated in favor of implementing "%s"', + ResourceClassNotSupportedException::class, + RestrictedDataProviderInterface::class + ), + E_USER_DEPRECATED + ); + } + } + + return []; + } +} diff --git a/core/base/Module/Storage/DoctrineCommands.php b/core/base/Module/Storage/DoctrineCommands.php new file mode 100644 index 000000000..0041dd713 --- /dev/null +++ b/core/base/Module/Storage/DoctrineCommands.php @@ -0,0 +1,37 @@ +getApplication()->getKernel()->getContainer()->get('doctrine'); + + $em = $doctrine->getEntityManager(); + $db = $em->getConnection(); + + $helperSet = $this->getHelperSet(); + $helperSet->set(new ConnectionHelper($db), 'db'); + $helperSet->set(new EntityManagerHelper($em), 'em'); + + parent::execute($input, $output); + } + +} diff --git a/core/base/Module/Storage/Manager.php b/core/base/Module/Storage/Manager.php new file mode 100644 index 000000000..435e1d816 --- /dev/null +++ b/core/base/Module/Storage/Manager.php @@ -0,0 +1,25 @@ +addEventListener(\Doctrine\ORM\Events::loadClassMetadata, $tablePrefix); + + $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config, $evm); + + parent::__construct(); + } +} \ No newline at end of file diff --git a/core/base/Module/Storage/TablePrefix.php b/core/base/Module/Storage/TablePrefix.php new file mode 100644 index 000000000..864b5d2ff --- /dev/null +++ b/core/base/Module/Storage/TablePrefix.php @@ -0,0 +1,49 @@ +prefix = (string)$prefix; + } + + /** + * @param LoadClassMetadataEventArgs $eventArgs + */ + public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void + { + $classMetadata = $eventArgs->getClassMetadata(); + + if (!$classMetadata->isInheritanceTypeSingleTable() || $classMetadata->getName( + ) === $classMetadata->rootEntityName) { + $classMetadata->setPrimaryTable( + [ + 'name' => $this->prefix . $classMetadata->getTableName() + ] + ); + } + + foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { + if ($mapping['type'] === ClassMetadataInfo::MANY_TO_MANY && $mapping['isOwningSide']) { + $mappedTableName = $mapping['joinTable']['name']; + $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName; + } + } + } + +} diff --git a/core/base/Module/View/Handler.php b/core/base/Module/View/Handler.php new file mode 100644 index 000000000..256cead8f --- /dev/null +++ b/core/base/Module/View/Handler.php @@ -0,0 +1,39 @@ +requestObj = $request; + $this->config = $config; + } + + /** + * @return object + * @throws \Exception + */ + public function load() + { + // Check the correct controller and action is going to load based on the URI + + $module = ($this->requestObj->query->has('module')) ? $this->requestObj->query->get('module') : ''; + $controller = ($this->requestObj->query->has('controller')) ? $this->requestObj->query->get('controller') : ''; + $action = ($this->requestObj->query->has('action')) ? $this->requestObj->query->get('action') : ''; + + // Run Installer if database config hasn't been configured + + if (empty($module)) { + // Check mandatory parameters are set + + if (!$this->config->has('app.default_route.module')) { + throw new \RuntimeException('Default module has not been configured.'); + } + + $module = $this->config->get('app.default_route.module'); + } + + if (empty($controller)) { + // Check mandatory parameters are set + if (!$this->config->has('app.default_route.controller')) { + throw new \RuntimeException('Default controller has not been configured.'); + } + + $controller = $this->config->get('app.default_route.controller'); + } + + if (empty($action)) { + // Check mandatory parameters are set + if (!$this->config->has('app.default_route.action')) { + throw new \RuntimeException('Default action has not been configured.'); + } + + $action = $this->config->get('app.default_route.action'); + } + + $format = 'SuiteCRM\Core\Modules\%s\Controller\%s'; + + $controller = sprintf($format, ucfirst($module), ucfirst($controller)); + + // run the controller action + return (object)[ + 'module' => $module, + 'controller' => $controller, + 'action' => 'action' . ucfirst($action) + ]; + } +} diff --git a/core/base/Route/ModRewriteRouter.php b/core/base/Route/ModRewriteRouter.php new file mode 100644 index 000000000..4f15d7cd4 --- /dev/null +++ b/core/base/Route/ModRewriteRouter.php @@ -0,0 +1,99 @@ +requestObj = $request; + $this->config = $config; + } + + /** + * @return object + * @throws \Exception + */ + public function load() + { + // Check the correct controller and action is going to load based on the URI + if ($this->requestObj->query->has('query_string')) { + $uri = explode('/', $this->requestObj->query->get('query_string')); + + if (count($uri) === 1) { + array_push($uri, '', ''); + } elseif (count($uri) === 2) { + $uri[] = ''; + } + + [$module, $controller, $action] = $uri; + } + + // Run Installer if database config hasn't been configured + + if (empty($module)) { + // Check mandatory parameters are set + + if (!$this->config->has('app.default_route.module')) { + throw new \RuntimeException('Default module has not been configured.'); + } + + $module = $this->config->get('app.default_route.module'); + } + + if (empty($controller)) { + // Check mandatory parameters are set + if (!$this->config->has('app.default_route.controller')) { + throw new \RuntimeException('Default controller has not been configured.'); + } + + $controller = $this->config->get('app.default_route.controller'); + } + + if (empty($action)) { + // Check mandatory parameters are set + if (!$this->config->has('app.default_route.action')) { + throw new \RuntimeException('Default action has not been configured.'); + } + + $action = $this->config->get('app.default_route.action'); + } + + $format = 'SuiteCRM\Core\Modules\%s\Controller\%s'; + + $controller = sprintf($format, ucfirst($module), ucfirst($controller)); + + // run the controller action + return (object)[ + 'module' => $module, + 'controller' => $controller, + 'action' => 'action' . ucfirst($action) + ]; + } +} diff --git a/core/base/Route/RouterInterface.php b/core/base/Route/RouterInterface.php new file mode 100644 index 000000000..97a1998ae --- /dev/null +++ b/core/base/Route/RouterInterface.php @@ -0,0 +1,15 @@ +config = $config; + + return $this; + } + + /** + * Legacy login + * + * @param $username + * @param $password + * @param $grant_type + * + * @return boolean + * @throws \Exception + */ + public function login($username, $password, $grant_type = 'password'): bool + { + if ($this->runLegacyEntryPoint()) { + $authController = new \AuthenticationController(); + + $PARAMS = []; + + return $authController->login($username, $password, $PARAMS); + } + + throw new \RuntimeException('Running legacy entry point failed'); + } +} diff --git a/core/legacy/AuthenticationService.php b/core/legacy/AuthenticationService.php new file mode 100644 index 000000000..51ed794eb --- /dev/null +++ b/core/legacy/AuthenticationService.php @@ -0,0 +1,38 @@ +config !== null) { + // Set up sugarEntry + if (!defined('sugarEntry')) { + define('sugarEntry', true); + } + + // Set working directory for legacy + chdir(BASE_PATH . '/legacy'); + + // Load in legacy + require_once 'include/MVC/preDispatch.php'; + require_once 'include/entryPoint.php'; + + return true; + } + + return false; + } +} diff --git a/core/modules/Administration/Administration.php b/core/modules/Administration/Administration.php new file mode 100644 index 000000000..987576722 --- /dev/null +++ b/core/modules/Administration/Administration.php @@ -0,0 +1,28 @@ +config = $config; + $this->file = new File(); + } + + protected function configure(): void + { + $this + ->setName('app:rebuild') + ->setDescription('Rebuild the application') + ->setHelp('This command will rebuild the Application and Plugins') + ->addOption( + 'hard', + '', + InputOption::VALUE_NONE, + 'Run "npm install" during rebuild process' + ); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return bool|int|null + * @throws \Exception + */ + public function execute(InputInterface $input, OutputInterface $output) + { + $filesToLeave = []; + + $optionValue = $input->getOption('hard'); + $hardRebuild = ($optionValue !== false); + + $optionValue = $input->getOption('verbose'); + $verboseOutput = ($optionValue !== false); + + $rebuildPath = BASE_PATH . 'cache/app'; + + $this->file->makeDir($rebuildPath, 0777); + + $rebuildEnginePath = $rebuildPath . '/engine'; + + $this->file->makeDir($rebuildEnginePath, 0777); + + if ($hardRebuild === false) { + $filesToLeave = [$rebuildEnginePath . '/node_modules']; + } + + $appPath = BASE_PATH . 'core/app/'; + + $enginePath = $appPath . 'engine'; + + $themesPath = BASE_PATH . 'core/app/themes'; + + $assetsPath = $rebuildPath . '/engine/src/assets/themes/'; + + $appFilesPath = [ + 'fields' => $appPath . 'fields', + 'ui' => $appPath . 'ui', + 'views' => $appPath . 'views' + ]; + + // Get modules path + $modulesPath = APP_PATH; + + // Field components + $fields = []; + + // UI components + $ui = []; + + // View components + $views = []; + + // Get the ui app-files path + $uiFilesPath = $rebuildEnginePath . '/src/app/app-files'; + + // Delete ui stored files + chmod($rebuildPath, 0777); + + if (!$this->file->deleteDirectory($rebuildEnginePath, $filesToLeave)) { + throw new \RuntimeException('System can\'t delete cached application engine files'); + } + + // Copy all engine files to rebuild path + $this->file->recurseCopy($enginePath, $rebuildEnginePath); + + // Copy all theme files to assets path + $this->file->recurseCopy($themesPath, $assetsPath); + + // Copy all core app files to ui app-files + foreach ($appFilesPath as $dir => $path) { + if (!file_exists($uiFilesPath . '/' . $dir) && !mkdir( + $concurrentDirectory = $uiFilesPath . '/' . $dir, + 0777 + ) && !is_dir($concurrentDirectory)) { + throw new \RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory)); + } + + $this->file->recurseCopy($path . '/', $uiFilesPath . '/' . $dir); + } + + // Find all Ng components + $ngComponents = $this->file->findFiles($uiFilesPath . '/', '/(.*).component.ts/'); + + $componentList = ''; + $moduleList = ''; + $componentImportList = ''; + $moduleImportList = ''; + + foreach ($ngComponents as $filepath) { + $moduleTemplate = ''; + $fullComponentName = ''; + + $pos = strrpos($filepath, '/'); + $pathLength = (strlen($filepath) - 1); + + if ($pathLength > $pos) { + $folderPath = substr($filepath, 0, $pos) . '/'; + + $parts = str_replace($uiFilesPath . '/', '', $filepath); + $parts = explode('/', $parts); + + if (count($parts) < 4) { + continue; + } + + $type = current($parts); + + if ($type === 'fields') { + [$type, $componentName, , $viewName, $componentFileName] = $parts; + + $ufType = ucfirst($type); + $ufViewName = ucfirst($viewName); + + // Create component name + $ufComponentName = implode('', array_map('ucfirst', explode('-', $componentName))); + + $fullComponentName = $ufComponentName . $ufViewName . $ufType . 'Component'; + $fullModuleName = $ufComponentName . $ufViewName . $ufType . 'Module'; + + $appManagerPath = '../../../../../app-manager/app-manager.module'; + $componentFileName = str_replace('.ts', '', $componentFileName); + $componentImportList .= 'import { ' . $fullComponentName . " } from '../app-files/fields/" . $componentName . '/templates/' . $viewName . '/' . $componentFileName . "'; \n"; + + $moduleImportList .= 'import { ' . $fullModuleName . " } from '../app-files/fields/" . $componentName . '/templates/' . $viewName . '/' . $componentName . ".module'; \n"; + } elseif ($type === 'ui') { + [$type, $viewName, $componentName, $componentFileName] = $parts; + + $ufType = ucfirst($type); + $ufViewName = ucfirst($viewName); + + // Create component name + $ufComponentName = implode('', array_map('ucfirst', explode('-', $componentName))); + + $fullComponentName = $ufComponentName . $ufType . 'Component'; + $fullModuleName = $ufComponentName . $ufType . 'Module'; + + $appManagerPath = '../../../../app-manager/app-manager.module'; + + $componentFileName = str_replace('.ts', '', $componentFileName); + //$componentImportList .= "import { " . $fullComponentName . " } from '../app-files/ui/components/" . $componentName . "/" . $componentFileName . "'; \n"; + $moduleImportList .= 'import { ' . $fullModuleName . " } from '../app-files/ui/components/" . $componentName . '/' . $componentName . ".module'; \n"; + } elseif ($type === 'views') { + // Placeholder for view components + } else { + // Continue if type doesn't exist + continue; + } + + if (!file_exists($folderPath . $componentName . '.module.ts')) { + $moduleTemplate = << $type, + 'viewName' => $viewName, + 'componentName' => $componentName, + 'componentFileName' => $componentFileName, + 'fullComponentName' => $fullComponentName, + 'fullModuleName' => $fullModuleName, + ]; + + $componentList .= $fullComponentName . ",\n"; + $moduleList .= $fullModuleName . ",\n"; + + file_put_contents($folderPath . $componentName . '.module.ts', $moduleTemplate); + } else { + $componentList .= $fullComponentName . ",\n"; + $moduleList .= $fullModuleName . ",\n"; + } + } + } + + $fullManifest = ''; + + foreach ($fields as $field) { + $manifestTemplate = " + { + componentId: 'scrm-{type}-{view}', + path: 'scrm-{type}-{view}', + loadChildren: '../app-files/fields/{type}/templates/{view}/{type}.module#{module_name}' + }, + "; + + $manifestTemplate = str_replace('{type}', $field['componentName'], $manifestTemplate); + $manifestTemplate = str_replace('{view}', $field['viewName'], $manifestTemplate); + $manifestTemplate = str_replace('{module_name}', $field['fullModuleName'], $manifestTemplate); + $fullManifest .= $manifestTemplate . "\n"; + } + + $manifestModule = ''; + $manifestModule .= " + import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; + import { CommonModule } from '@angular/common'; + import { AppManifest, AppManagerModule } from '../app-manager/app-manager.module'; + import { FormsModule, ReactiveFormsModule } from '@angular/forms'; + \n\n + " . $moduleImportList . ' + '; + + foreach ($ui as $uiComponent) { + $manifestTemplate = " + { + componentId: 'scrm-{component_name}-ui', + path: 'scrm-{component_name}-ui', + loadChildren: '../app-files/ui/components/{component_name}/{component_name}.module#{module_name}' + }, + "; + + $manifestTemplate = str_replace('{component_name}', $uiComponent['componentName'], $manifestTemplate); + $manifestTemplate = str_replace('{ui_type}', $uiComponent['viewName'], $manifestTemplate); + $manifestTemplate = str_replace('{module_name}', $uiComponent['fullModuleName'], $manifestTemplate); + + $fullManifest .= $manifestTemplate; + } + + $manifestModule .= 'const manifest: AppManifest[] = ['; + $manifestModule .= $fullManifest; + $manifestModule .= '];'; + + $manifestModule .= ' + @NgModule({ + declarations: [], + exports: [ + FormsModule, + ReactiveFormsModule + ], + imports: [ + CommonModule, + AppManagerModule.forRoot(manifest), + ' . $moduleList . ' + ] + }) + export class ManifestModule {} + '; + + // Create manafest module + if (file_put_contents($rebuildEnginePath . '/src/app/app-manifest/manifest.module.ts', $manifestModule)) { + $appDir = getcwd(); + + chdir($rebuildEnginePath); + + // If node_modules isn't present of --hard was option - run npm install + if (!file_exists($rebuildEnginePath . '/node_modules')) { + echo "Updating npm...\n\n"; + $npmCmd = 'npm update'; + shell_exec($npmCmd); + + $npmCmd = 'npm rebuild'; + shell_exec($npmCmd); + + echo "Installing npm...\n\n"; + + if (!$verboseOutput) { + $silentOptions = ' --no-optional --ignore-scripts --silent'; + } + + $npmCmd = 'npm install' . $silentOptions; + shell_exec($npmCmd); + } + + $compileThemeCommand = $this->getApplication()->find('app:theme:rebuild'); + + $arguments = [ + 'command' => 'app:theme:rebuild' + ]; + + $compileThemeInput = new ArrayInput($arguments); + $returnCode = $compileThemeCommand->run($compileThemeInput, $output); + + $cmd = 'ng build --deploy-url public/'; + + shell_exec($cmd); + chdir($appDir); + + if (file_exists($rebuildEnginePath . '/dist/')) { + $this->file->makeDir(BASE_PATH . 'public/', 0777); + $this->file->deleteDirectory(BASE_PATH . 'public/'); + $this->file->recurseCopy($rebuildEnginePath . '/dist/', BASE_PATH . 'public/'); + } + + return true; + } + } +} diff --git a/core/modules/Administration/Cli/App/AppThemeRebuildCommand.php b/core/modules/Administration/Cli/App/AppThemeRebuildCommand.php new file mode 100644 index 000000000..889c928fe --- /dev/null +++ b/core/modules/Administration/Cli/App/AppThemeRebuildCommand.php @@ -0,0 +1,82 @@ +config = $config; + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return void + * @throws \Exception + */ + + public function execute(InputInterface $input, OutputInterface $output) + { + if (!file_exists(BASE_PATH . '/cache/app/engine/')) { + throw new \RuntimeException( + 'Can\'t find application engine folder, Please run bin/cli app:rebuild' + ); + } + + $watchCompiler = ''; + + $optionValue = $input->getOption('watch'); + + if ($optionValue === true) { + $watchCompiler = '--watch'; + } + + chdir(BASE_PATH . '/cache/app/engine/'); + + shell_exec( + "./node_modules/.bin/node-sass $watchCompiler --output-style compressed src/assets/themes/suite8/css/style.scss > src/assets/themes/suite8/css/style.min.css" + ); + + $compiledThemeDir = 'src/assets/themes/*/css/'; + $compiledThemeFile = 'style.min.css'; + + $compiledFilesCheck = shell_exec("find $compiledThemeDir -name '$compiledThemeFile' -print"); + + if ($compiledFilesCheck === null) { + throw new \RuntimeException( + 'Compiled theme files have failed to create. Check that the SuiteCRM 8 source theme files exist.' + ); + } + } + + protected function configure(): void + { + $this + ->setName('app:theme:rebuild') + ->setDescription('Rebuild the theme') + ->setHelp('This command will rebuild the theme') + ->addOption( + 'watch', + '', + InputOption::VALUE_NONE, + 'Option to allow developers to watch SASS files during compile' + ); + } +} diff --git a/core/modules/Administration/Cli/Composer/ComposerInstallCommand.php b/core/modules/Administration/Cli/Composer/ComposerInstallCommand.php new file mode 100644 index 000000000..d383669bc --- /dev/null +++ b/core/modules/Administration/Cli/Composer/ComposerInstallCommand.php @@ -0,0 +1,71 @@ +config = $config; + $this->file = new File(); + } + + protected function configure(): void + { + $this + ->setName('composer:install') + ->setDescription('Install core composer dependencies') + ->setHelp('This command will install all required project dependencies') + ->addOption( + 'nodev', + '', + InputOption::VALUE_NONE, + 'Install without dev packages' + ); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void|null + */ + public function execute(InputInterface $input, OutputInterface $output) + { + $currentDir = __DIR__ . '/../../../../../'; + + $optionValue = $input->getOption('nodev'); + $noDev = ($optionValue !== false); + + if ($noDev === true) { + shell_exec('composer install --no-dev'); + chdir($currentDir . 'legacy'); + + shell_exec('composer install --no-dev'); + chdir($currentDir); + } + + shell_exec('composer install'); + chdir($currentDir . 'legacy'); + + shell_exec('composer install'); + chdir($currentDir); + } +} diff --git a/core/modules/Administration/Cli/Composer/ComposerUpdateCommand.php b/core/modules/Administration/Cli/Composer/ComposerUpdateCommand.php new file mode 100644 index 000000000..3b808131e --- /dev/null +++ b/core/modules/Administration/Cli/Composer/ComposerUpdateCommand.php @@ -0,0 +1,53 @@ +config = $config; + $this->file = new File(); + } + + protected function configure(): void + { + $this + ->setName('composer:update') + ->setDescription('Update core composer dependencies') + ->setHelp('This command will install all required project dependencies'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void|null + */ + public function execute(InputInterface $input, OutputInterface $output) + { + $currentDir = __DIR__ . '/../../../../../'; + + shell_exec('composer update'); + chdir($currentDir . 'legacy'); + + shell_exec('composer update'); + chdir($currentDir); + } +} diff --git a/core/modules/Administration/Cli/Modules/ListModulesCommand.php b/core/modules/Administration/Cli/Modules/ListModulesCommand.php new file mode 100644 index 000000000..f117996f6 --- /dev/null +++ b/core/modules/Administration/Cli/Modules/ListModulesCommand.php @@ -0,0 +1,63 @@ +setName('core:modules:list-all') + ->setDescription('List Application Modules') + ->setHelp('This command will list the possible Application Modules.'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void|null + * @throws \Exception + */ + public function execute(InputInterface $input, OutputInterface $output) + { + $io = new SymfonyStyle($input, $output); + + $io->success('List of all modules.'); + + $parameterCollection = (new ConfigManager())->loadFiles( + [ + BASE_PATH . '/core/base/Config/modules.config.yml' + ] + ); + + $fileHelper = new File(); + + $modules = (new ModuleManager($parameterCollection, $fileHelper))->listEnabled(); + + $tableHeaders = [ + ['Module Name', 'Module Description'] + ]; + + for ($i = 0, $iMax = count($modules); $i < $iMax; $i++) { + $moduleData[$i] = [ + $modules[$i]->getName(), + $modules[$i]->getDescription() + ]; + } + + $io->table($tableHeaders, $moduleData); + } +} diff --git a/core/modules/Administration/Cli/Repair/QuickRepairRebuildCommand.php b/core/modules/Administration/Cli/Repair/QuickRepairRebuildCommand.php new file mode 100644 index 000000000..66332393d --- /dev/null +++ b/core/modules/Administration/Cli/Repair/QuickRepairRebuildCommand.php @@ -0,0 +1,33 @@ +setName('admin:repair:quick-repair-rebuild') + ->setDescription('Run Quick Repair and Rebuild') + ->setHelp('This command allows you to run the repair and rebuild.'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void|null + */ + public function execute(InputInterface $input, OutputInterface $output) + { + } +} diff --git a/core/modules/Administration/Cli/Users/AddNewUserCommand.php b/core/modules/Administration/Cli/Users/AddNewUserCommand.php new file mode 100644 index 000000000..5bdc646b9 --- /dev/null +++ b/core/modules/Administration/Cli/Users/AddNewUserCommand.php @@ -0,0 +1,36 @@ +setName('admin:add-new-user') + ->setDescription('Add new user to the system') + ->setHelp('This command allows you to run the add new user to the system.'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return int|void + */ + public function execute(InputInterface $input, OutputInterface $output) + { + /** + * @todo : Create input for user before creating + */ + } +} diff --git a/core/modules/Users/Config/orm/OAuthAccessToken.orm.yml b/core/modules/Users/Config/orm/OAuthAccessToken.orm.yml new file mode 100644 index 000000000..e807c6d7d --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthAccessToken.orm.yml @@ -0,0 +1,37 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthAccessToken: + type: entity + table: oauth_access_tokens + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthAccessTokenStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + token: + type: string + max_length: 40 + unique: true + client_id: + type: integer + user_id: + type: integer + nullable: true + expires: + type: datetime + #columnDefinition: TIMESTAMP + scope: + type: string + max_length: 50 + nullable: true + manyToOne: + client: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthClient + joinColumn: + name: client_id + referencedColumnName: id + user: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthUser + joinColumn: + name: user_id + referencedColumnName: id diff --git a/core/modules/Users/Config/orm/OAuthAuthorizationCode.orm.yml b/core/modules/Users/Config/orm/OAuthAuthorizationCode.orm.yml new file mode 100644 index 000000000..4794ab0f5 --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthAuthorizationCode.orm.yml @@ -0,0 +1,42 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthAuthorizationCode: + type: entity + table: oauth_authorisation_codes + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthAuthorizationCodeStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + code: + type: string + max_length: 40 + unique: true + client_id: + type: integer + user_id: + type: integer + nullable: true + expires: + type: datetime + redirect_uri: + type: string + max_length: 200 + scope: + type: string + max_length: 50 + nullable: true + id_token: + type: string + length: 1000 + manyToOne: + client: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthClient + joinColumn: + name: client_id + referencedColumnName: id + user: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthUser + joinColumn: + name: user_id + referencedColumnName: id diff --git a/core/modules/Users/Config/orm/OAuthClient.orm.yml b/core/modules/Users/Config/orm/OAuthClient.orm.yml new file mode 100644 index 000000000..acdae338b --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthClient.orm.yml @@ -0,0 +1,22 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthClient: + type: entity + table: oauth_client + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthClientStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + client_identifier: + type: string + max_length: 50 + unique: true + client_secret: + type: string + max_length: 20 + default: "" + redirect_uri: + type: string + max_length: 255 + default: "" \ No newline at end of file diff --git a/core/modules/Users/Config/orm/OAuthPublicKey.orm.yml b/core/modules/Users/Config/orm/OAuthPublicKey.orm.yml new file mode 100644 index 000000000..276a8125e --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthPublicKey.orm.yml @@ -0,0 +1,22 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthPublicKey: + type: entity + table: oauth_public_key + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthPublicKeyStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + public_key: + type: string + length: 2000 + private_key: + type: string + length: 2000 + manyToOne: + client: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthClient + joinColumn: + name: client_id + referencedColumnName: id diff --git a/core/modules/Users/Config/orm/OAuthRefreshToken.orm.yml b/core/modules/Users/Config/orm/OAuthRefreshToken.orm.yml new file mode 100644 index 000000000..db8331982 --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthRefreshToken.orm.yml @@ -0,0 +1,37 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthRefreshToken: + type: entity + table: oauth_refresh_tokens + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthRefreshTokenStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + refresh_token: + refresh_token: string + max_length: 40 + unique: true + client_id: + type: integer + user_id: + type: integer + nullable: true + expires: + type: datetime + column: expires + scope: + type: string + max_length: 50 + nullable: true + manyToOne: + client: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthClient + joinColumn: + name: client_id + referencedColumnName: id + user: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthUser + joinColumn: + name: user_id + referencedColumnName: id diff --git a/core/modules/Users/Config/orm/OAuthUser.orm.yml b/core/modules/Users/Config/orm/OAuthUser.orm.yml new file mode 100644 index 000000000..fe53ea1a3 --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthUser.orm.yml @@ -0,0 +1,20 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthUser: + type: entity + table: oauth_users + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthUserStorage + id: + id: + type: integer + generator: + strategy: AUTO + fields: + username: + unique: true + type: string + column: user_name + password: + type: string + column: user_hash + indexes: + user_name_index: + columns: [ user_name ] diff --git a/core/modules/Users/Config/orm/OAuthUserClaims.orm.yml b/core/modules/Users/Config/orm/OAuthUserClaims.orm.yml new file mode 100644 index 000000000..114270d2c --- /dev/null +++ b/core/modules/Users/Config/orm/OAuthUserClaims.orm.yml @@ -0,0 +1,15 @@ +SuiteCRM\Core\Modules\Users\Entity\OAuthUserClaims: + type: entity + table: oauth_user_claims + repositoryClass: SuiteCRM\Core\Modules\Users\Storage\OAuthUserClaimsStorage + id: + id: + type: integer + generator: + strategy: AUTO + manyToOne: + user: + targetEntity: SuiteCRM\Core\Modules\Users\Entity\OAuthUser + joinColumn: + name: user_id + referencedColumnName: id diff --git a/core/modules/Users/Controller/Oauth.php b/core/modules/Users/Controller/Oauth.php new file mode 100644 index 000000000..1880f9b5a --- /dev/null +++ b/core/modules/Users/Controller/Oauth.php @@ -0,0 +1,213 @@ +requestObj); + $response = new OAuth2Response(); + // Load authentication service + $authenticationService = $this->getService('users.authentication'); + + // Load config parameters + $authenticationService->setConfig($this->config); + + // Get params + $username = $this->requestObj->request->get('username'); + $password = $this->requestObj->request->get('password'); + + if ($authenticationService->login($username, $password)) { + // Get storage classes + $clientStorage = $this->getStorage('users.oAuthClient'); + $userStorage = $this->getStorage('users.oAuthUser'); + $accessTokenStorage = $this->getStorage('users.oAuthAccessToken'); + $authorizationCodeStorage = $this->getStorage('users.oAuthAuthorizationCode'); + $refreshTokenStorage = $this->getStorage('users.oAuthRefreshToken'); + + $storage = [ + 'client_credentials' => $clientStorage, + 'user_credentials' => $userStorage, + 'access_token' => $accessTokenStorage, + 'authorization_code' => $authorizationCodeStorage, + 'refresh_token' => $refreshTokenStorage, + ]; + + $config = []; + + // Set up oauth2 server + $server = new OAuth2Server( + $storage, + $config + ); + + // Grant token with client details are in system + if (!$token = $server->grantAccessToken($request, $response)) { + $response->send(); + die(); + } + + // Output token in json format + $this->responseObj->headers->set('Content-Type', 'application/json'); + + return $this->responseObj + ->setContent( + json_encode($token) + ) + ->send(); + } + + // Response with unauthorised. + $this->responseObj->headers->set('Content-Type', 'application/json'); + + return $this->responseObj + ->setContent( + json_encode( + [ + 'message' => 'Authentication: Unauthorised', + 'code' => '401', + ] + ) + ) + ->setStatusCode(401) + ->send(); + } + + public function actionLogout(): void + { + $request = \OAuth2\HttpFoundationBridge\Request::createFromRequest($this->requestObj); + + $clientStorage = $this->getStorage('users.oAuthClient'); + $userStorage = $this->getStorage('users.oAuthUser'); + $accessTokenStorage = $this->getStorage('users.oAuthAccessToken'); + $authorizationCodeStorage = $this->getStorage('users.oAuthAuthorizationCode'); + $refreshTokenStorage = $this->getStorage('users.oAuthRefreshToken'); + + $storage = [ + 'client_credentials' => $clientStorage, + 'user_credentials' => $userStorage, + 'access_token' => $accessTokenStorage, + 'authorization_code' => $authorizationCodeStorage, + 'refresh_token' => $refreshTokenStorage, + ]; + + $config = []; + + $server = new OAuth2Server( + $storage, + $config + ); + + // Handle a request to a resource and authenticate the access token + if (!$server->verifyResourceRequest($request)) { + var_dump($server->getResponse()); + die(); + } + + $accessToken = $this->requestObj->request->get('access_token'); + $refreshAccessToken = $this->requestObj->request->get('refresh_token'); + + $accessTokenStorage->expireToken($accessToken); + $refreshTokenStorage->expireToken($refreshAccessToken); + + echo json_encode(['success' => true, 'message' => 'Logout Success']); + } + + public function refreshToken(): void + { + } + + public function actionAccessToken(): void + { +// $config = array(); +// +// $requestObj = \OAuth2\HttpFoundationBridge\Request::createFromRequest($this->requestObj); +// +// $clientStorage = $this->getStorage('users.oAuthClient'); +// $userStorage = $this->getStorage('users.oAuthUser'); +// $accessTokenStorage = $this->getStorage('users.oAuthAccessToken'); +// $authorizationCodeStorage = $this->getStorage('users.oAuthAuthorizationCode'); +// $refreshTokenStorage = $this->getStorage('users.oAuthRefreshToken'); +// $publicKeyStorage = $this->getStorage('users.oAuthPublicKey'); +// +// $storage = array( +// 'client_credentials' => $clientStorage, +// 'user_credentials' => $userStorage, +// 'access_token' => $accessTokenStorage, +// 'authorization_code' => $authorizationCodeStorage, +// 'refresh_token' => $refreshTokenStorage +// ); +// +// $grantType = $requestObj->request->get('grant_type'); +// +// if ($grantType == 'refresh_token') { +// // Set default refresh token parameters +// $refreshTokenLifetime = 10; +// $alwaysIssueNewRefreshToken = false; +// +// // Get config refresh token parameters if set +// if ($this->config->has('app.refresh_token_lifetime')) { +// $refreshAccessToken = (int) $this->config->get('app.refresh_token_lifetime'); +// } +// +// if ($this->config->has('app.always_issue_new_refresh_token')) { +// $alwaysIssueNewRefreshToken = (boolean) $this->config->get('app.always_issue_new_refresh_token'); +// } +// +// $config = array( +// 'always_issue_new_refresh_token' => $alwaysIssueNewRefreshToken, +// 'refresh_token_lifetime' => $refreshTokenLifetime, +// ); +// } +// +// $server = new OAuth2Server($storage, $config); +// +// if ($grantType == 'password') { +//// $username = $params['user_name']; +//// $password = $params['user_hash']; +// +// // Add the grant type to your OAuth server +// $server->addGrantType(new OAuth2GrantTypeUserCredentials($userStorage)); +// +// $config = array(); +// } elseif ($grantType == "refresh_token") { +// // Add the grant type to your OAuth server +// +// $objectGrantType = new OAuth2GrantTypeRefreshToken($refreshTokenStorage); +// +// $server->addGrantType($objectGrantType); +// +// // The refresh token +// $accessToken = new OAuth2ResponseTypeAccessToken($accessTokenStorage, $refreshTokenStorage, array( +// 'refresh_token_lifetime' => $refreshTokenLifetime, +// )); +// +// $server = new OAuth2Server($storage, $config, [$objectGrantType], array($accessToken)); +// } else { +// throw new \Exception('Grant type - not supported.'); +// } +// +// $tokenResponse = $server->handleTokenRequest($requestObj); +// +// $statusCode = $tokenResponse->getStatusCode(); +// $parameters = $tokenResponse->getParameters(); +// +// return $tokenResponse->send(); + } +} diff --git a/core/modules/Users/Entity/EncryptableField.php b/core/modules/Users/Entity/EncryptableField.php new file mode 100644 index 000000000..aa6403767 --- /dev/null +++ b/core/modules/Users/Entity/EncryptableField.php @@ -0,0 +1,31 @@ + 11]; + + /** + * @param $value + * @return mixed + */ + protected function encryptField($value) + { + return $value; + + // return password_hash( + // $value, PASSWORD_BCRYPT, $this->hashOptions); + } + + /** + * @param $encryptedValue + * @param $value + * @return bool + */ + protected function verifyEncryptedFieldValue($encryptedValue, $value): bool + { + return ($encryptedValue == $value); + //return password_verify($value, $encryptedValue); + } +} diff --git a/core/modules/Users/Entity/OAuthAccessToken.php b/core/modules/Users/Entity/OAuthAccessToken.php new file mode 100644 index 000000000..083096e93 --- /dev/null +++ b/core/modules/Users/Entity/OAuthAccessToken.php @@ -0,0 +1,248 @@ +id; + } + + /** + * Set token + * + * @param string $token + * @return OAuthAccessToken + */ + public function setToken($token): OAuthAccessToken + { + $this->token = $token; + + return $this; + } + + /** + * Get token + * + * @return string + */ + public function getToken(): string + { + return $this->token; + } + + /** + * Set client_id + * + * @param string $clientId + * @return OAuthAccessToken + */ + public function setClientId($clientId): OAuthAccessToken + { + $this->client_id = $clientId; + + return $this; + } + + /** + * Get client_id + * + * @return string + */ + public function getClientId(): string + { + return $this->client_id; + } + + /** + * Set user_id + * + * @param $userId + * @return OAuthAccessToken + */ + public function setUserId($userId): OAuthAccessToken + { + $this->user_id = $userId; + + return $this; + } + + /** + * Get user_identifier + * + * @return string + */ + public function getUserId(): string + { + return $this->user_id; + } + + /** + * Set expires + * + * @param \DateTime $expires + * @return OAuthAccessToken + */ + public function setExpires($expires): OAuthAccessToken + { + $this->expires = $expires; + + return $this; + } + + /** + * Get expires + * + * @return \DateTime + */ + public function getExpires(): \DateTime + { + return $this->expires; + } + + /** + * Set scope + * + * @param string $scope + * @return OAuthAccessToken + */ + public function setScope($scope): OAuthAccessToken + { + $this->scope = $scope; + + return $this; + } + + /** + * Get scope + * + * @return string + */ + public function getScope(): string + { + return $this->scope; + } + + /** + * Set client + * + * @param SuiteCRM\Core\Modules\Users\Entity\OAuthClient $client + * @return OAuthAccessToken + */ + public function setClient(SuiteCRM\Core\Modules\Users\Entity\OAuthClient $client = null): OAuthAccessToken + { + $this->client = $client; + + return $this; + } + + /** + * Get client + * + * @return SuiteCRM\Core\Modules\Users\Entity\OAuthClient + */ + public function getClient(): SuiteCRM\Core\Modules\Users\Entity\OAuthClient + { + return $this->client; + } + + /** + * @param $params + * @return OAuthAccessToken + */ + public static function fromArray($params): OAuthAccessToken + { + $token = new self(); + foreach ($params as $property => $value) { + $token->$property = $value; + } + + return $token; + } + + /** + * Set user + * + * @param SuiteCRM\Core\Modules\Users\Entity\OAuthUser $user + * @return OAuthRefreshToken + */ + public function setUser(SuiteCRM\Core\Modules\Users\Entity\OAuthUser $user = null): OAuthRefreshToken + { + $this->user = $user; + + return $this; + } + + /** + * Get user + * + * @return SuiteCRM\Core\Modules\Users\Entity\OAuthUser + */ + public function getUser(): SuiteCRM\Core\Modules\Users\Entity\OAuthUser + { + return $this->client; + } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'token' => $this->token, + 'client_id' => $this->client_id, + 'user_id' => $this->user_id, + 'expires' => $this->expires, + 'scope' => $this->scope, + ]; + } +} diff --git a/core/modules/Users/Entity/OAuthAuthorizationCode.php b/core/modules/Users/Entity/OAuthAuthorizationCode.php new file mode 100644 index 000000000..4bd8b4e47 --- /dev/null +++ b/core/modules/Users/Entity/OAuthAuthorizationCode.php @@ -0,0 +1,303 @@ +id; + } + + /** + * Set code + * + * @param string $code + * @return OAuthAuthorizationCode + */ + public function setCode($code): OAuthAuthorizationCode + { + $this->code = $code; + + return $this; + } + + /** + * Get code + * + * @return string + */ + public function getCode(): string + { + return $this->code; + } + + /** + * Set client_id + * + * @param string $clientId + * @return OAuthAuthorizationCode + */ + public function setClientId($clientId): OAuthAuthorizationCode + { + $this->client_id = $clientId; + + return $this; + } + + /** + * Get client_id + * + * @return string + */ + public function getClientId(): string + { + return $this->client_id; + } + + /** + * Set user_id + * + * @param $userId + * @return OAuthAuthorizationCode + */ + public function setUserId($userId): OAuthAuthorizationCode + { + $this->user_id = $userId; + + return $this; + } + + /** + * Get user_identifier + * + * @return string + */ + public function getUserId(): string + { + return $this->user_id; + } + + /** + * Set expires + * + * @param \DateTime $expires + * @return OAuthAuthorizationCode + */ + public function setExpires($expires): OAuthAuthorizationCode + { + $this->expires = $expires; + + return $this; + } + + /** + * Get expires + * + * @return \DateTime + */ + public function getExpires(): \DateTime + { + return $this->expires; + } + + /** + * Set redirect_uri + * + * @param string $redirectUri + * @return OAuthAuthorizationCode + */ + public function setRedirectUri($redirectUri): OAuthAuthorizationCode + { + $this->redirect_uri = $redirectUri; + + return $this; + } + + /** + * Get redirect_uri + * + * @return string + */ + public function getRedirectUri(): string + { + return $this->redirect_uri; + } + + /** + * Set scope + * + * @param string $scope + * @return OAuthAuthorizationCode + */ + public function setScope($scope): OAuthAuthorizationCode + { + $this->scope = $scope; + + return $this; + } + + /** + * Get scope + * + * @return string + */ + public function getScope(): string + { + return $this->scope; + } + + /** + * Set client + * + * @param OAuthClient $client + * @return OAuthAuthorizationCode + */ + public function setClient(OAuthClient $client = null): OAuthAuthorizationCode + { + $this->client = $client; + + return $this; + } + + /** + * Get client + * + * @return OAuthClient + */ + public function getClient(): OAuthClient + { + return $this->client; + } + + /** + * Set user + * + * @param OAuthUser $user + * @return OAuthRefreshToken + */ + public function setUser(OAuthUser $user = null): OAuthRefreshToken + { + $this->user = $user; + + return $this; + } + + /** + * Get user + * + * @return \YourNamespace\Entity\OAuthUser + */ + public function getUser(): \YourNamespace\Entity\OAuthUser + { + return $this->client; + } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'code' => $this->code, + 'client_id' => $this->client_id, + 'user_id' => $this->user_id, + 'expires' => $this->expires, + 'scope' => $this->scope, + ]; + } + + /** + * @param $params + * @return OAuthAuthorizationCode + */ + public static function fromArray($params): OAuthAuthorizationCode + { + $code = new self(); + foreach ($params as $property => $value) { + $code->$property = $value; + } + + return $code; + } + + /** + * Get the value of Id Token + * + * @return string + */ + public function getIdToken(): string + { + return $this->id_token; + } + + /** + * Set the value of Id Token + * + * @param string id_token + * + * @return self + */ + public function setIdToken($id_token): self + { + $this->id_token = $id_token; + + return $this; + } + +} diff --git a/core/modules/Users/Entity/OAuthClient.php b/core/modules/Users/Entity/OAuthClient.php new file mode 100644 index 000000000..4a827d8b8 --- /dev/null +++ b/core/modules/Users/Entity/OAuthClient.php @@ -0,0 +1,195 @@ + $val) { + if (property_exists($this, $key)) { + $this->{$key} = $val; + } + } + + if ($this->id == 0) { + $this->created_date = new \DateTime(); + } + + $this->modified_date = new \DateTime(); + } + + /** + * Get id + * + * @return int + */ + public function getId(): int + { + return $this->id; + } + + /** + * Set client_identifier + * + * @param string $clientIdentifier + * @return OAuthClient + */ + public function setClientIdentifier($clientIdentifier): OAuthClient + { + $this->client_identifier = $clientIdentifier; + + return $this; + } + + /** + * Get client_identifier + * + * @return string + */ + public function getClientIdentifier(): string + { + return $this->client_identifier; + } + + /** + * Set client_secret + * + * @param string $clientSecret + * @return OAuthClient + */ + public function setClientSecret($clientSecret): OAuthClient + { + $this->client_secret = $this->encryptField($clientSecret); + + return $this; + } + + /** + * Get client_secret + * + * @return string + */ + public function getClientSecret(): string + { + return $this->client_secret; + } + + /** + * Verify client's secret + * + * @param $clientSecret + * @return Boolean + */ + public function verifyClientSecret($clientSecret): bool + { + return $this->verifyEncryptedFieldValue($this->getClientSecret(), $clientSecret); + } + + /** + * Set redirect_uri + * + * @param string $redirectUri + * @return OAuthClient + */ + public function setRedirectUri($redirectUri): OAuthClient + { + $this->redirect_uri = $redirectUri; + + return $this; + } + + /** + * Get redirect_uri + * + * @return string + */ + public function getRedirectUri(): string + { + return $this->redirect_uri; + } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'client_id' => $this->client_identifier, + 'client_secret' => $this->client_secret, + 'redirect_uri' => $this->redirect_uri, + ]; + } + + /** + * Set the value of Id + * + * @param int id + * + * @return self + */ + public function setId($id): self + { + $this->id = $id; + + return $this; + } + + /** + * Get the value of Status + * + * @return mixed + */ + public function getStatus() + { + return $this->status; + } + + /** + * Set the value of Status + * + * @param mixed status + * + * @return self + */ + public function setStatus($status): self + { + $this->status = $status; + + return $this; + } + +} diff --git a/core/modules/Users/Entity/OAuthPublicKey.php b/core/modules/Users/Entity/OAuthPublicKey.php new file mode 100644 index 000000000..dbb328f4e --- /dev/null +++ b/core/modules/Users/Entity/OAuthPublicKey.php @@ -0,0 +1,127 @@ +id; + } + + /** + * Set the value of Id + * + * @param integar id + * + * @return self + */ + public function setId(integar $id): self + { + $this->id = $id; + + return $this; + } + + /** + * Get the value of Public Key + * + * @return string + */ + public function getPublicKey(): string + { + return $this->public_key; + } + + /** + * Set the value of Public Key + * + * @param string public_key + * + * @return self + */ + public function setPublicKey($public_key): self + { + $this->public_key = $public_key; + + return $this; + } + + /** + * Get the value of Private Key + * + * @return string + */ + public function getPrivateKey(): string + { + return $this->private_key; + } + + /** + * Set the value of Private Key + * + * @param string private_key + * + * @return self + */ + public function setPrivateKey($private_key): self + { + $this->private_key = $private_key; + + return $this; + } + + /** + * Set client + * + * @param OAuthClient $client + * @return OAuthAuthorizationCode + */ + public function setClient(OAuthClient $client = null): OAuthAuthorizationCode + { + $this->client = $client; + + return $this; + } + + /** + * Get client + * + * @return \YourNamespace\Entity\OAuthClient + */ + public function getClient(): \YourNamespace\Entity\OAuthClient + { + return $this->client; + } + +} diff --git a/core/modules/Users/Entity/OAuthRefreshToken.php b/core/modules/Users/Entity/OAuthRefreshToken.php new file mode 100644 index 000000000..43f99ee06 --- /dev/null +++ b/core/modules/Users/Entity/OAuthRefreshToken.php @@ -0,0 +1,245 @@ +id; + } + + /** + * Set refresh_token + * + * @param string $refresh_token + * @return OAuthRefreshToken + */ + public function setRefreshToken($refresh_token): OAuthRefreshToken + { + $this->refresh_token = $refresh_token; + + return $this; + } + + /** + * Get refresh_token + * + * @return string + */ + public function getRefreshToken(): string + { + return $this->refresh_token; + } + + /** + * Set client_id + * + * @param string $clientId + * @return OAuthRefreshToken + */ + public function setClientId($clientId): OAuthRefreshToken + { + $this->client_id = $clientId; + + return $this; + } + + /** + * Get client_id + * + * @return string + */ + public function getClientId(): string + { + return $this->client_id; + } + + /** + * Set user_id + * + * @param $userId + * @return OAuthRefreshToken + */ + public function setUserId($userId): OAuthRefreshToken + { + $this->user_id = $userId; + + return $this; + } + + /** + * Get user_identifier + * + * @return string + */ + public function getUserId(): string + { + return $this->user_id; + } + + /** + * Set expires + * + * @param \DateTime $expires + * @return OAuthRefreshToken + */ + public function setExpires($expires): OAuthRefreshToken + { + $this->expires = $expires; + + return $this; + } + + /** + * Get expires + * + * @return \DateTime + */ + public function getExpires(): \DateTime + { + return $this->expires; + } + + /** + * Set scope + * + * @param string $scope + * @return OAuthRefreshToken + */ + public function setScope($scope): OAuthRefreshToken + { + $this->scope = $scope; + + return $this; + } + + /** + * Get scope + * + * @return string + */ + public function getScope(): string + { + return $this->scope; + } + + /** + * Set client + * + * @param SuiteCRM\Core\Modules\Users\Entity\OAuthClient $client + * @return OAuthRefreshToken + */ + public function setClient(SuiteCRM\Core\Modules\Users\Entity\OAuthClient $client = null): OAuthRefreshToken + { + $this->client = $client; + + return $this; + } + + /** + * Get client + * + * @return SuiteCRM\Core\Modules\Users\Entity\OAuthClient + */ + public function getClient(): SuiteCRM\Core\Modules\Users\Entity\OAuthClient + { + return $this->client; + } + + /** + * Set user + * + * @param SuiteCRM\Core\Modules\Users\Entity\OAuthUser $user + * @return OAuthRefreshToken + */ + public function setUser(SuiteCRM\Core\Modules\Users\Entity\OAuthUser $user = null): OAuthRefreshToken + { + $this->user = $user; + + return $this; + } + + /** + * Get user + * + * @return SuiteCRM\Core\Modules\Users\Entity\OAuthUser + */ + public function getUser(): SuiteCRM\Core\Modules\Users\Entity\OAuthUser + { + return $this->client; + } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'refresh_token' => $this->refresh_token, + 'client_id' => $this->client_id, + 'user_id' => $this->user_id, + 'expires' => $this->expires, + 'scope' => $this->scope, + ]; + } + + /** + * @param $params + * @return OAuthRefreshToken + */ + public static function fromArray($params): OAuthRefreshToken + { + $token = new self(); + foreach ($params as $property => $value) { + $token->$property = $value; + } + + return $token; + } +} diff --git a/core/modules/Users/Entity/OAuthUser.php b/core/modules/Users/Entity/OAuthUser.php new file mode 100644 index 000000000..b1774e936 --- /dev/null +++ b/core/modules/Users/Entity/OAuthUser.php @@ -0,0 +1,108 @@ +id; + } + + /** + * Set username + * + * @param $username + * @return User + */ + public function setUsername($username): User + { + $this->username = $username; + + return $this; + } + + /** + * Get username + * + * @return string + */ + public function getUsername(): string + { + return $this->username; + } + + /** + * Set password + * + * @param string $password + * @return User + */ + public function setPassword($password): User + { + $this->password = $this->encryptField($password); + + return $this; + } + + /** + * Get password + * + * @return string + */ + public function getPassword(): string + { + return $this->password; + } + + /** + * Verify user's password + * + * @param string $password + * @return Boolean + */ + public function verifyPassword($password): bool + { + return $this->verifyEncryptedFieldValue($this->getPassword(), $password); + } + + /** + * Get OAuthUser object in array format + * + * @return array + */ + public function toArray(): array + { + return [ + 'user_id' => $this->id, + 'scope' => null, + ]; + } +} diff --git a/core/modules/Users/Entity/OAuthUserClaims.php b/core/modules/Users/Entity/OAuthUserClaims.php new file mode 100644 index 000000000..22b6db699 --- /dev/null +++ b/core/modules/Users/Entity/OAuthUserClaims.php @@ -0,0 +1,99 @@ +id; + } + + /** + * Set the value of Id + * + * @param string id + * + * @return self + */ + public function setId($id): self + { + $this->id = $id; + + return $this; + } + + /** + * Get the value of Id Token + * + * @return string + */ + public function getIdToken(): string + { + return $this->id_token; + } + + /** + * Set the value of Id Token + * + * @param string id_token + * + * @return self + */ + public function setIdToken($id_token): self + { + $this->id_token = $id_token; + + return $this; + } + + /** + * Get the value of User Id + * + * @return string + */ + public function getUserId(): string + { + return $this->user_id; + } + + /** + * Set the value of User Id + * + * @param string user_id + * + * @return self + */ + public function setUserId($user_id): self + { + $this->user_id = $user_id; + + return $this; + } + +} diff --git a/core/modules/Users/Entity/UserProfile.php b/core/modules/Users/Entity/UserProfile.php new file mode 100644 index 000000000..a441297f4 --- /dev/null +++ b/core/modules/Users/Entity/UserProfile.php @@ -0,0 +1,13 @@ +findOneBy(['token' => $oauthToken]); + + if ($token) { + $token = $token->toArray(); + $token['expires'] = $token['expires']->getTimestamp(); + } + + return $token; + } + + /** + * @param string $oauthToken + * @param mixed $clientIdentifier + * @param mixed $user_id + * @param int $expires + * @param null $scope + * @throws \Doctrine\ORM\ORMException + * @throws \Doctrine\ORM\OptimisticLockException + */ + public function setAccessToken($oauthToken, $clientIdentifier, $user_id, $expires, $scope = null) + { + $client = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthClient') + ->findOneBy(['client_identifier' => $clientIdentifier]); + + $user = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthUser') + ->findOneBy(['id' => $user_id]); + + $client_id = $client->getId(); + + $token = OAuthAccessToken::fromArray( + [ + 'token' => $oauthToken, + 'client_id' => $client_id, + 'user_id' => $user_id, + 'expires' => (new \DateTime())->setTimestamp($expires), + 'scope' => $scope, + 'user' => $user, + 'client' => $client, + ] + ); + + $this->_em->persist($token); + $this->_em->flush(); + } + + /** + * Delete a row + * + * @param string $token + * @return bool + * @throws \Doctrine\ORM\ORMException + * @throws \Doctrine\ORM\OptimisticLockException + */ + public function expireToken($token): bool + { + $token = $this->findOneBy(['token' => $token]); + + if (!empty($token)) { + $ts = time(); + + $datetime = new \DateTime(); + $datetime->setTimestamp($ts); + + $token->setExpires($datetime); + + $this->_em->merge($token); + + return $this->_em->flush(); + } + + throw new \RuntimeException('No Token Found.'); + } + +} diff --git a/core/modules/Users/Storage/OAuthAuthorizationCodeStorage.php b/core/modules/Users/Storage/OAuthAuthorizationCodeStorage.php new file mode 100644 index 000000000..d196d519c --- /dev/null +++ b/core/modules/Users/Storage/OAuthAuthorizationCodeStorage.php @@ -0,0 +1,82 @@ +findOneBy(['code' => $code]); + + if ($authCode) { + $authCode = $authCode->toArray(); + $authCode['expires'] = $authCode['expires']->getTimestamp(); + } + + return $authCode; + } + + /** + * @param string $code + * @param mixed $client_id + * @param mixed $user_id + * @param string $redirect_uri + * @param int $expires + * @param null $scope + * @param null $id_token + * @throws \Doctrine\ORM\ORMException + * @throws \Doctrine\ORM\OptimisticLockException + */ + public function setAuthorizationCode( + $code, + $client_id, + $user_id, + $redirect_uri, + $expires, + $scope = null, + $id_token = null + ) { + $client = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthClient') + ->findOneBy(['client_identifier' => $client_id]); + + $user = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthUser') + ->findOneBy(['user_name' => $user_id]); + + $authCode = OAuthAuthorizationCode::fromArray( + [ + 'code' => $code, + 'client' => $client, + 'user' => $user, + 'redirect_uri' => $redirect_uri, + 'expires' => (new \DateTime())->setTimestamp($expires), + 'scope' => $scope, + 'id_token' => $id_token + ] + ); + + $this->_em->persist($authCode); + $this->_em->flush(); + } + + /** + * @param $code + * @throws \Doctrine\ORM\ORMException + * @throws \Doctrine\ORM\OptimisticLockException + */ + public function expireAuthorizationCode($code) + { + $authCode = $this->findOneBy(['code' => $code]); + $this->_em->remove($authCode); + $this->_em->flush(); + } +} diff --git a/core/modules/Users/Storage/OAuthClientStorage.php b/core/modules/Users/Storage/OAuthClientStorage.php new file mode 100644 index 000000000..bbfbc5538 --- /dev/null +++ b/core/modules/Users/Storage/OAuthClientStorage.php @@ -0,0 +1,102 @@ +getEntity($client); + + if (empty($clientEntity->getId())) { + $this->_em->persist($clientEntity); + } else { + $this->_em->merge($clientEntity); + } + + $this->_em->flush(); + } + + /** + * @param $clientIdentifier + * @return array|object|null + */ + public function getClientDetails($clientIdentifier) + { + $client = $this->findOneBy(['client_identifier' => $clientIdentifier]); + if ($client) { + $client = $client->toArray(); + } + + return $client; + } + + /** + * @param $clientIdentifier + * @param null $clientSecret + * @return bool + */ + public function checkClientCredentials($clientIdentifier, $clientSecret = null) + { + $client = $this->findOneBy(['client_identifier' => $clientIdentifier]); + if ($client) { + return $client->verifyClientSecret($clientSecret); + } + + return false; + } + + /** + * @param $clientId + * @param $grantType + * @return bool + */ + public function checkRestrictedGrantType($clientId, $grantType) + { + // we do not support different grant types per client in this example + return true; + } + + /** + * @param $clientId + * @return bool + */ + public function isPublicClient($clientId) + { + return false; + } + + /** + * @param $clientId + * @return null |null + */ + public function getClientScope($clientId) + { + return null; + } + + /** + * Get Contact Entity + * + * @param array $entityData + * @return \Mvc\Entity\Contact + * @throws \Exception + */ + public function getEntity($entityData = []): \Mvc\Entity\Contact + { + return new OAuthClient($entityData); + } + +} diff --git a/core/modules/Users/Storage/OAuthPublicKeyStorage.php b/core/modules/Users/Storage/OAuthPublicKeyStorage.php new file mode 100644 index 000000000..32ccb898b --- /dev/null +++ b/core/modules/Users/Storage/OAuthPublicKeyStorage.php @@ -0,0 +1,33 @@ +findOneBy(['refresh_token' => $refreshToken]); + + if ($refreshToken) { + $refreshToken = $refreshToken->toArray(); + $refreshToken['expires'] = $refreshToken['expires']->getTimestamp(); + } + + return $refreshToken; + } + + /** + * @param $refreshToken + * @param $clientIdentifier + * @param $user_id + * @param $expires + * @param null $scope + * @throws ORMException + * @throws OptimisticLockException + */ + public function setRefreshToken($refreshToken, $clientIdentifier, $user_id, $expires, $scope = null) + { + $client = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthClient') + ->findOneBy(['client_identifier' => $clientIdentifier]); + + $client_id = $client->getId(); + + $user = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\OAuthUser') + ->findOneBy(['id' => $user_id]); + + $refreshToken = OAuthRefreshToken::fromArray( + [ + 'refresh_token' => $refreshToken, + 'client' => $client, + 'user' => $user, + 'expires' => (new \DateTime())->setTimestamp($expires), + 'scope' => $scope, + 'client_id' => $client_id, + 'user_id' => $user_id, + ] + ); + + $this->_em->persist($refreshToken); + $this->_em->flush(); + } + + /** + * @param $refreshToken + * @throws ORMException + * @throws OptimisticLockException + */ + public function unsetRefreshToken($refreshToken) + { + $refreshToken = $this->findOneBy(['refresh_token' => $refreshToken]); + $this->_em->remove($refreshToken); + $this->_em->flush(); + } + + /** + * Delete a row + * + * @param string $token + * @return bool + * @throws ORMException + * @throws OptimisticLockException + */ + public function expireToken($token): bool + { + $token = $this->findOneBy(['refresh_token' => $token]); + + if (!empty($token)) { + $ts = time(); + + $datetime = new \DateTime(); + $datetime->setTimestamp($ts); + + $token->setExpires($datetime); + + $this->_em->merge($token); + + return $this->_em->flush(); + } + + throw new \RuntimeException('No Token Found.'); + } +} diff --git a/core/modules/Users/Storage/OAuthUserClaimsStorage.php b/core/modules/Users/Storage/OAuthUserClaimsStorage.php new file mode 100644 index 000000000..1edf1acdf --- /dev/null +++ b/core/modules/Users/Storage/OAuthUserClaimsStorage.php @@ -0,0 +1,80 @@ +getUserDetails($user_id)) { + return false; + } + + $claims = explode(' ', trim($claims)); + + $userClaims = []; + // for each requested claim, if the user has the claim, set it in the response + $validClaims = explode(' ', self::VALID_CLAIMS); + + foreach ($validClaims as $validClaim) { + if (in_array($validClaim, $claims, true)) { + if ($validClaim == 'address') { + // address is an object with subfields + $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails); + } else { + $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails)); + } + } + } + + return $userClaims; + } + + /** + * @param $claim + * @param $userDetails + * @return array + */ + protected function getUserClaim($claim, $userDetails) + { + $userClaims = []; + $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim))); + $claimValues = explode(' ', $claimValuesString); + foreach ($claimValues as $value) { + $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null; + } + + return $userClaims; + } + + /** + * @param $username + * @return array|bool + */ + public function getUserDetails($username) + { + if (!isset($this->userCredentials[$username])) { + return false; + } + + return array_merge( + [ + 'user_id' => $username, + 'password' => null, + 'first_name' => null, + 'last_name' => null, + ], + $this->userCredentials[$username] + ); + } +} diff --git a/core/modules/Users/Storage/OAuthUserStorage.php b/core/modules/Users/Storage/OAuthUserStorage.php new file mode 100644 index 000000000..b72b31a6d --- /dev/null +++ b/core/modules/Users/Storage/OAuthUserStorage.php @@ -0,0 +1,68 @@ +findOneBy(['user_name' => $username]); +// +// if ($user) { +// return $user->verifyPassword($password); +// } +// +// return false; + + return true; + } + + /** + * @param $username + * @return object|null ARRAY the associated "user_id" and optional "scope" values + * ARRAY the associated "user_id" and optional "scope" values + * This function MUST return FALSE if the requested user does not exist or is + * invalid. "scope" is a space-separated list of restricted scopes. + * @code + * return array( + * "user_id" => USER_ID, // REQUIRED user_id to be stored with the authorization code or access token + * "scope" => SCOPE // OPTIONAL space-separated list of restricted scopes + * ); + * @endcode + */ + public function getUserDetails($username) + { + $user = $this->findOneBy(['username' => $username]); + + if ($user) { + $user = $user->toArray(); + } + + return $user; + } + +// public function setSessionId($accesstoken, $session_id) +// { +// $tokenEntity = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\oAuthAccessToken') +// ->findOneBy(['token' => $accesstoken]); +// +// $userId = $tokenEntity->getUserId(); +// +// $userEntity = $this->_em->getRepository('SuiteCRM\Core\Modules\Users\Entity\oAuthUser') +// ->findOneBy(['id' => $userId]); +// +// $userEntity->setSessionId($session_id); +// +// $this->_em->merge($userEntity); +// +// $this->_em->flush(); +// } +} diff --git a/core/modules/Users/Users.php b/core/modules/Users/Users.php new file mode 100644 index 000000000..f5ec6590d --- /dev/null +++ b/core/modules/Users/Users.php @@ -0,0 +1,24 @@ +template->get('template/default.json'); diff --git a/core/tests/phpunit.sh b/core/tests/phpunit.sh new file mode 100644 index 000000000..4bc389f78 --- /dev/null +++ b/core/tests/phpunit.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +php "$PWD"/../../vendor/bin/phpunit --coverage-html coverage/html $@ diff --git a/core/tests/phpunit.xml.dist b/core/tests/phpunit.xml.dist new file mode 100644 index 000000000..a6e2962f2 --- /dev/null +++ b/core/tests/phpunit.xml.dist @@ -0,0 +1,39 @@ + + + + + ./unit/phpunit + + + + + + ../base + ../modules + ../legacy + + + + + + + + + + + + + diff --git a/core/tests/testdata/CommandMapperTest/config.yml b/core/tests/testdata/CommandMapperTest/config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/CommandMapperTest/config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/CommandMapperTest/noenabledmodules.config.yml b/core/tests/testdata/CommandMapperTest/noenabledmodules.config.yml new file mode 100644 index 000000000..3df56a9db --- /dev/null +++ b/core/tests/testdata/CommandMapperTest/noenabledmodules.config.yml @@ -0,0 +1,13 @@ +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +modules: + paths: + - /../../modules/ \ No newline at end of file diff --git a/core/tests/testdata/ConfigTest/LoadEmpty/config.yml b/core/tests/testdata/ConfigTest/LoadEmpty/config.yml new file mode 100644 index 000000000..e69de29bb diff --git a/core/tests/testdata/ConfigTest/LoadMultiple/config_1.yml b/core/tests/testdata/ConfigTest/LoadMultiple/config_1.yml new file mode 100644 index 000000000..0f4f2564b --- /dev/null +++ b/core/tests/testdata/ConfigTest/LoadMultiple/config_1.yml @@ -0,0 +1,9 @@ +config_1: + data_1: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' + data_2: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' \ No newline at end of file diff --git a/core/tests/testdata/ConfigTest/LoadMultiple/config_2.yml b/core/tests/testdata/ConfigTest/LoadMultiple/config_2.yml new file mode 100644 index 000000000..a6dffc263 --- /dev/null +++ b/core/tests/testdata/ConfigTest/LoadMultiple/config_2.yml @@ -0,0 +1,9 @@ +config_2: + data_1: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' + data_2: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' \ No newline at end of file diff --git a/core/tests/testdata/ConfigTest/LoadMultiple/config_3.yml b/core/tests/testdata/ConfigTest/LoadMultiple/config_3.yml new file mode 100644 index 000000000..dcab3c758 --- /dev/null +++ b/core/tests/testdata/ConfigTest/LoadMultiple/config_3.yml @@ -0,0 +1,9 @@ +config_3: + data_1: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' + data_2: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' \ No newline at end of file diff --git a/core/tests/testdata/ConfigTest/LoadSingle/config.yml b/core/tests/testdata/ConfigTest/LoadSingle/config.yml new file mode 100644 index 000000000..b166a039b --- /dev/null +++ b/core/tests/testdata/ConfigTest/LoadSingle/config.yml @@ -0,0 +1,9 @@ +config: + data_1: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' + data_2: + param_1: 'param_1_value' + param_2: 'param_2_value' + param_3: 'param_3_value' \ No newline at end of file diff --git a/core/tests/testdata/InstanceTest/config.yml b/core/tests/testdata/InstanceTest/config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/InstanceTest/config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/ModuleMapper/config.yml b/core/tests/testdata/ModuleMapper/config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/ModuleMapper/config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/ModuleMapper/noenabledmodules.config.yml b/core/tests/testdata/ModuleMapper/noenabledmodules.config.yml new file mode 100644 index 000000000..3df56a9db --- /dev/null +++ b/core/tests/testdata/ModuleMapper/noenabledmodules.config.yml @@ -0,0 +1,13 @@ +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +modules: + paths: + - /../../modules/ \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/DefaultRouter/config.yml b/core/tests/testdata/RouterTest/DefaultRouter/config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/RouterTest/DefaultRouter/config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/DefaultRouter/defaultaction.config.yml b/core/tests/testdata/RouterTest/DefaultRouter/defaultaction.config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/RouterTest/DefaultRouter/defaultaction.config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/DefaultRouter/defaultcontroller.config.yml b/core/tests/testdata/RouterTest/DefaultRouter/defaultcontroller.config.yml new file mode 100644 index 000000000..33bde2a67 --- /dev/null +++ b/core/tests/testdata/RouterTest/DefaultRouter/defaultcontroller.config.yml @@ -0,0 +1,20 @@ +app: + default_route: + controller: "Oauth" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/DefaultRouter/defaultmodule.config.yml b/core/tests/testdata/RouterTest/DefaultRouter/defaultmodule.config.yml new file mode 100644 index 000000000..e151e8c3e --- /dev/null +++ b/core/tests/testdata/RouterTest/DefaultRouter/defaultmodule.config.yml @@ -0,0 +1,20 @@ +app: + default_route: + module: "Users" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/ModRewriteRouter/config.yml b/core/tests/testdata/RouterTest/ModRewriteRouter/config.yml new file mode 100644 index 000000000..5948e1a00 --- /dev/null +++ b/core/tests/testdata/RouterTest/ModRewriteRouter/config.yml @@ -0,0 +1,17 @@ +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/ModRewriteRouter/defaultaction.config.yml b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultaction.config.yml new file mode 100644 index 000000000..570a7f650 --- /dev/null +++ b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultaction.config.yml @@ -0,0 +1,20 @@ +app: + default_route: + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/ModRewriteRouter/defaultcontroller.config.yml b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultcontroller.config.yml new file mode 100644 index 000000000..a86a8b8c1 --- /dev/null +++ b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultcontroller.config.yml @@ -0,0 +1,21 @@ +app: + default_route: + controller: "Oauth" + action: "login" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/testdata/RouterTest/ModRewriteRouter/defaultmodule.config.yml b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultmodule.config.yml new file mode 100644 index 000000000..e151e8c3e --- /dev/null +++ b/core/tests/testdata/RouterTest/ModRewriteRouter/defaultmodule.config.yml @@ -0,0 +1,20 @@ +app: + default_route: + module: "Users" +server: + environment: 'develop' +storage: + mysql: + driver: 'pdo_mysql' + host: 'mariadb' + dbname: 'suitecrm_8_app' + user: 'root' + password: '' + io: 'both' +entity: + namespaces: + core/modules/Users/Config/orm: 'SuiteCRM\Core\Modules\Users\Entity' +modules: + enabled: + - Users + - Administration \ No newline at end of file diff --git a/core/tests/unit/phpunit/base/Cli/CommandMapperTest.php b/core/tests/unit/phpunit/base/Cli/CommandMapperTest.php new file mode 100644 index 000000000..7576b450d --- /dev/null +++ b/core/tests/unit/phpunit/base/Cli/CommandMapperTest.php @@ -0,0 +1,78 @@ +file = new SuiteCRM\Core\Base\Helper\File\File(); + + $this->configParameters = new SuiteCRM\Core\Base\Config\Manager(); + } + + public function testCommandMapper(): void + { + $configPath = BASE_PATH . '/tests/testdata/CommandMapperTest/config.yml'; + + $this->commandMapper = new CommandMapper($this->file, $this->configParameters, $configPath); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Cli\CommandMapper', $this->commandMapper); + } + + public function testCommandMapperWithoutConfig(): void + { + $this->expectException(Error::class); + + $configPath = ''; + + $this->commandMapper = new CommandMapper($this->file, $this->configParameters, $configPath); + } + + public function testGetAllCommands(): void + { + $configPath = BASE_PATH . '/tests/testdata/CommandMapperTest/config.yml'; + + $this->commandMapper = new CommandMapper($this->file, $this->configParameters, $configPath); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Cli\CommandMapper', $this->commandMapper); + + $modules = $this->commandMapper->getAllCommands(); + + $this->assertTrue(true); + } + + public function testNoEnabledModulesWithinConfig(): void + { + $configPath = BASE_PATH . '/tests/testdata/CommandMapperTest/noenabledmodules.config.yml'; + + $this->commandMapper = new CommandMapper($this->file, $this->configParameters, $configPath); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Cli\CommandMapper', $this->commandMapper); + + $modules = $this->commandMapper->getAllCommands(); + + $this->assertTrue(true); + } +} \ No newline at end of file diff --git a/core/tests/unit/phpunit/base/Cli/SuiteCommand.php b/core/tests/unit/phpunit/base/Cli/SuiteCommand.php new file mode 100644 index 000000000..31386f14e --- /dev/null +++ b/core/tests/unit/phpunit/base/Cli/SuiteCommand.php @@ -0,0 +1,13 @@ +assertTrue(true); + } +} \ No newline at end of file diff --git a/core/tests/unit/phpunit/base/Config/ConfigTest.php b/core/tests/unit/phpunit/base/Config/ConfigTest.php new file mode 100644 index 000000000..d86509a71 --- /dev/null +++ b/core/tests/unit/phpunit/base/Config/ConfigTest.php @@ -0,0 +1,92 @@ +loadFiles( + BASE_PATH . '/tests/testdata/ConfigTest/LoadSingle/config.yml' + ); + + $this->assertTrue(true); + } + + public function testLoadFileNotFound(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Config paths need to be set up correctly'); + + $configManager = new ConfigManager(); + + // Loading file that does not exist + $configParameters = $configManager->loadFiles( + realpath( + BASE_PATH . '/tests/testdata/ConfigTest/LoadFileNotFound/config.yml' + ) + ); + } + + public function testLoadEmpty(): void + { + $configManager = new ConfigManager(); + + $configParameters = $configManager->loadFiles( + realpath( + BASE_PATH . '/tests/testdata/ConfigTest/LoadEmpty/config.yml' + ) + ); + + $params = $configParameters->getAll(); + + $this->assertCount(0, $params); + } + + public function testLoadSingle(): void + { + $configManager = new ConfigManager(); + + $configParameters = $configManager->loadFiles( + realpath( + BASE_PATH . '/tests/testdata/ConfigTest/LoadSingle/config.yml' + ) + ); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Config\ParameterCollection', $configParameters); + $this->assertTrue($configParameters->has('config.data_1')); + } + + public function testLoadMultiple(): void + { + $files = [ + realpath(BASE_PATH . '/tests/testdata/ConfigTest/LoadMultiple/config_1.yml'), + realpath(BASE_PATH . '/tests/testdata/ConfigTest/LoadMultiple/config_2.yml'), + realpath(BASE_PATH . '/tests/testdata/ConfigTest/LoadMultiple/config_3.yml') + ]; + + $configManager = new ConfigManager(); + + $configParameters = $configManager->loadFiles($files); + + $this->assertTrue($configParameters->has('config_1.data_1.param_1')); + $this->assertTrue($configParameters->has('config_2.data_2.param_1')); + $this->assertTrue($configParameters->has('config_3.data_1.param_3')); + } +} diff --git a/core/tests/unit/phpunit/base/Helper/DataCollectionTest.php b/core/tests/unit/phpunit/base/Helper/DataCollectionTest.php new file mode 100644 index 000000000..100a8acea --- /dev/null +++ b/core/tests/unit/phpunit/base/Helper/DataCollectionTest.php @@ -0,0 +1,146 @@ + 'value_1', + 'key_2' => 'value_2', + 'key_3' => [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + 'key_3' => 'value_3', + ], + 'key_4' => 'value_4', + 'key_5' => 'value_5', + 'key_6' => 'value_6', + 'key_7' => 'value_7', + 'key_8' => 'value_8', + ]; + + $collection = new Collection($data); + + $actual = $collection->getAll(); + + $expected = [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + 'key_3.key_1' => 'value_1', + 'key_3.key_2' => 'value_2', + 'key_3.key_3' => 'value_3', + 'key_3' => [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + 'key_3' => 'value_3' + ], + 'key_4' => 'value_4', + 'key_5' => 'value_5', + 'key_6' => 'value_6', + 'key_7' => 'value_7', + 'key_8' => 'value_8', + ]; + + $this->assertEquals($expected, $actual); + } + + public function testSetParamToCollection(): void + { + $data = [ + 'key_1' => [] + ]; + + $sub_data = [ + 'sub_1' => 'value_1', + 'sub_2' => 'value_2', + 'sub_3' => 'value_3' + ]; + + $collection = new Collection($data); + + $collection->set('key_1', $sub_data); + + $key_1 = $collection->get('key_1'); + + $this->assertEquals($sub_data, $key_1); + } + + public function testIsEmptyCollection(): void + { + $data_1 = [ + 'array_to_count' => [] + ]; + + $collection_1 = new Collection($data_1); + + $result_1 = $collection_1->isEmpty('array_to_count'); + + $this->assertTrue($result_1); + + $data_2 = [ + 'array_to_count' => [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + 'key_3' => 'value_3', + ] + ]; + + $collection_2 = new Collection($data_2); + + $result_2 = $collection_2->isEmpty('array_to_count'); + + $this->assertFalse($result_2); + } + + public function testGetParamFromCollection(): void + { + $data = [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + ]; + + $collection = new Collection($data); + + // Get a value from key + $value = $collection->get('key_1'); + $this->assertEquals('value_1', $value); + + // Test key not found + $value = $collection->get('key_3'); + $this->assertFalse($value); + } + + public function testCountCollection(): void + { + $data_1 = [ + 'array_to_count' => [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + 'key_3' => 'value_3' + ] + ]; + + $collection_1 = new Collection($data_1); + + $count_1 = $collection_1->count('array_to_count'); + + $this->assertEquals(3, $count_1); + + $data_2 = [ + 'key_1' => 'value_1', + 'key_2' => 'value_2', + ]; + + $collection_2 = new Collection($data_2); + + $count_2 = $collection_2->count(); + + $this->assertEquals(2, $count_2); + } +} diff --git a/core/tests/unit/phpunit/base/Helper/FileHelperTest.php b/core/tests/unit/phpunit/base/Helper/FileHelperTest.php new file mode 100644 index 000000000..8bb040ed5 --- /dev/null +++ b/core/tests/unit/phpunit/base/Helper/FileHelperTest.php @@ -0,0 +1,262 @@ +fileHelper = new FileHelper(); + + $startPath = __DIR__ . '/../../../../'; + + $folder1 = $startPath . 'testdata/FileHelperTest/Directories/Directory1'; + + $rFolder1 = realpath($folder1); + + if ($rFolder1 !== false) { + $this->fileHelper->deleteDirectory($rFolder1); + } + + if (mkdir($folder1, 0777, true)) { + $folder1SubDirectory1 = $folder1 . '/Directory1'; + $folder1SubDirectory2 = $folder1 . '/Directory2'; + $folder1SubDirectory3 = $folder1 . '/Directory3'; + + if (mkdir($folder1SubDirectory1, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder1SubDirectory1 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + + if (mkdir($folder1SubDirectory2, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder1SubDirectory2 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + + if (mkdir($folder1SubDirectory3, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder1SubDirectory3 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + } + + $folder2 = $startPath . 'testdata/FileHelperTest/Directories/Directory2'; + + $rFolder2 = realpath($folder2); + + if ($rFolder2 !== false) { + $this->fileHelper->deleteDirectory($rFolder2); + } + + if (mkdir($folder2, 0777, true)) { + $folder2SubDirectory1 = $folder2 . '/Directory1'; + + if (mkdir($folder2SubDirectory1, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder2SubDirectory1 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + } + + $folder3 = $startPath . 'testdata/FileHelperTest/Directories/Directory3'; + + $rFolder3 = realpath($folder3); + + if ($rFolder3 !== false) { + $this->fileHelper->deleteDirectory($rFolder3); + } + + if (mkdir($folder3, 0777, true)) { + $folder3SubDirectory1 = $folder3 . '/Directory1'; + + if (mkdir($folder3SubDirectory1, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder3SubDirectory1 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + } + + $folder4 = $startPath . 'testdata/FileHelperTest/Directories/Directory4'; + + $rFolder4 = realpath($folder4); + + if ($rFolder4 !== false) { + $this->fileHelper->deleteDirectory($rFolder4); + } + + if (mkdir($folder4, 0777, true)) { + $folder4SubDirectory1 = $folder4 . '/Directory1'; + + if (mkdir($folder4SubDirectory1, 0777, true)) { + $my_file = 'file.txt'; + $handle = fopen($folder4SubDirectory1 . '/' . $my_file, 'wb'); + $data = 'Test file'; + fwrite($handle, $data); + fclose($handle); + } + } + } + + public function tearDown() + { + $startPath = __DIR__ . '/../../../../'; + + $rFolder1 = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory1'); + + if ($rFolder1 !== false) { + $this->fileHelper->deleteDirectory($rFolder1); + } + + $rFolder2 = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory2'); + + if ($rFolder2 !== false) { + $this->fileHelper->deleteDirectory($rFolder2); + } + + $rFolder3 = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory3'); + + if ($rFolder3 !== false) { + $this->fileHelper->deleteDirectory($rFolder3); + } + + $rFolder4 = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory4'); + + if ($rFolder4 !== false) { + $this->fileHelper->deleteDirectory($rFolder4); + } + } + + public function testFindDirectories(): void + { + $paths = [ + __DIR__ . '/../../../../testdata/FileHelperTest/Directories' + ]; + + $files = $this->fileHelper->findDirectories($paths); + + $this->assertCount(4, $files); + + $this->assertContains('Directory1', $files); + $this->assertContains('Directory2', $files); + $this->assertContains('Directory3', $files); + $this->assertContains('Directory4', $files); + } + + public function testRecursiveCopy(): void + { + $path = realpath(__DIR__ . '/../../../../testdata/FileHelperTest/Directories'); + + $this->assertNotFalse($path); + + $src = $path . '/Directory2'; + $dst = $path . '/Directory4/Directory2'; + + + $this->fileHelper->recurseCopy($src, $dst); + + $this->assertFileExists($path . '/Directory4/Directory2'); + } + + public function testRecursiveCopyNotFolder(): void + { + $this->expectException('RuntimeException'); + + $startPath = realpath(__DIR__ . '/../../../../'); + + $path = $startPath . '/testdata/FileHelperTest/Directories'; + + $src = $path . '/Directory2'; + + $dst = $path . '/Directory4/Directory1/file.txt'; + + $this->fileHelper->recurseCopy($src, $dst); + } + + public function testDeleteDirectories(): void + { + $startPath = __DIR__ . '/../../../../'; + + $parentFolder = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory1'); + + $folderToDelete = realpath($parentFolder . '/Directory1'); + + $this->assertTrue($this->fileHelper->deleteDirectory($folderToDelete)); + $this->assertFalse(realpath($parentFolder . '/Directory1')); + } + + public function testDeleteDirectoryApartFrom(): void + { + $startPath = __DIR__ . '/../../../../'; + + $parentFolder = realpath($startPath . '/testdata/FileHelperTest/Directories/Directory1'); + + $folderToDelete = $parentFolder; + + $files = $this->fileHelper->findDirectories($parentFolder); + + $leaveFolders = [ + $parentFolder . '/Directory2' + ]; + + $this->assertCount(3, $files); + + $this->assertSame(['Directory1', 'Directory2', 'Directory3'], $files); + + $this->assertTrue($this->fileHelper->deleteDirectory($folderToDelete, $leaveFolders)); + + $files = $this->fileHelper->findDirectories($parentFolder); + + $this->assertSame(['Directory2'], $files); + + $folder2 = $startPath . '/testdata/FileHelperTest/Directories/Directory2'; + + $this->assertCount(1, $files); + } + + public function testFindFiles(): void + { + $startPath = realpath(__DIR__ . '/../../../../'); + + $path = $startPath . '/testdata/FileHelperTest/Directories'; + + $files = $this->fileHelper->findFiles((array)$path, '/(.*)(\/FileHelperTest\/Directories\/Directory3)/'); + + $this->assertCount(1, $files); + $this->assertEquals($files[0], $path . '/Directory3/Directory1/file.txt'); + } + + public function testFindFilesAsString(): void + { + $startPath = realpath(__DIR__ . '/../../../../'); + + $path = $startPath . '/testdata/FileHelperTest/Directories'; + + $files = $this->fileHelper->findFiles($path, '/(.*)(\/FileHelperTest\/Directories\/Directory3)/'); + + $this->assertCount(1, $files); + $this->assertEquals($files[0], $path . '/Directory3/Directory1/file.txt'); + } + +} diff --git a/core/tests/unit/phpunit/base/LoadInstanceTest.php b/core/tests/unit/phpunit/base/LoadInstanceTest.php new file mode 100644 index 000000000..541eef8f6 --- /dev/null +++ b/core/tests/unit/phpunit/base/LoadInstanceTest.php @@ -0,0 +1,120 @@ +loadFiles( + [ + BASE_PATH . '/tests/testdata/InstanceTest/config.yml' + ] + ); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + $route = null; + $this->instance = new Instance($configParameters, $route, $moduleManager); + } + + public function setUp() + { + // Get the Application Path + + // Get the Base Path + if (!defined('BASE_PATH')) { + define('BASE_PATH', realpath(__DIR__ . '/../../../../')); + } + + // Get the Application Path + if (!defined('APP_PATH')) { + define('APP_PATH', BASE_PATH . '/modules'); + } + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/InstanceTest/config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = 'Oauth'; + $_GET['action'] = 'login'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + } + + public function testRunInstance(): void + { + $run = $this->instance->run(); + + $this->assertInstanceOf(Instance::class, $run); + } + + public function testGetAllRoutes(): void + { + $route = $this->instance->getAllRoutes(); + + $this->assertTrue(true); + } + + public function testGetRoute(): void + { + $route = $this->instance->getRoute(); + + $this->assertSame('Users', $route->module); + $this->assertSame('SuiteCRM\Core\Modules\Users\Controller\Oauth', $route->controller); + $this->assertSame('actionLogin', $route->action); + } + + public function testGetAllServices(): void + { + $services = $this->instance->getAllServices(); + + $this->assertTrue(true); + } + + public function testGetRouteButRoutesUndefined(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Route was not configured'); + + $this->unsetRoute(); + + $route = $this->instance->getRoute(); + } +} diff --git a/core/tests/unit/phpunit/base/Module/ModuleMapperTest.php b/core/tests/unit/phpunit/base/Module/ModuleMapperTest.php new file mode 100644 index 000000000..b98f01786 --- /dev/null +++ b/core/tests/unit/phpunit/base/Module/ModuleMapperTest.php @@ -0,0 +1,76 @@ +fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + } + + public function testCheckModulesExist(): void + { + $config = new ConfigManager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/ModuleMapper/config.yml' + ] + ); + + $filePaths = [ + __DIR__ . '/../../../../../modules' + ]; + + $moduleMapper = new ModuleMapper($filePaths, $this->fileHelper, $configParameters); + + $this->assertCount(1, count($moduleMapper->checkModulesExist(['Users']))); + } + + public function testGetModuleClassesFromFileName(): void + { + $config = new ConfigManager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/ModuleMapper/config.yml' + ] + ); + + $filePaths = [ + __DIR__ . '/../../../../../modules' + ]; + + $moduleMapper = new ModuleMapper($filePaths, $this->fileHelper, $configParameters); + + $moduleClasses = $moduleMapper->getModuleClassesFromFileName( + [ + realpath(__DIR__ . '/../../../../../modules/Users/Users.php') + ] + ); + + $this->assertInstanceOf('SuiteCRM\Core\Modules\Users\Users', $moduleClasses[0]); + } +} \ No newline at end of file diff --git a/core/tests/unit/phpunit/base/Router/DefaultRouterTest.php b/core/tests/unit/phpunit/base/Router/DefaultRouterTest.php new file mode 100644 index 000000000..b19881dfa --- /dev/null +++ b/core/tests/unit/phpunit/base/Router/DefaultRouterTest.php @@ -0,0 +1,260 @@ +fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + } + + public function testNoModule(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Default module has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultModule(): void + { + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/defaultmodule.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = ''; + $_GET['controller'] = 'Oauth'; + $_GET['action'] = 'login'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('Users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } + + public function testNoController(): void + { + $this->expectException('Exception'); + $this->expectExceptionMessage('Default controller has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultController(): void + { + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/defaultcontroller.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = ''; + $_GET['action'] = 'login'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('Users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } + + public function testNoAction(): void + { + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = 'Oauth'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultAction(): void + { + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/DefaultRouter/defaultaction.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = 'Oauth'; + $_GET['action'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('Users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } + +} \ No newline at end of file diff --git a/core/tests/unit/phpunit/base/Router/ModRewriteRouterTest.php b/core/tests/unit/phpunit/base/Router/ModRewriteRouterTest.php new file mode 100644 index 000000000..25400aa05 --- /dev/null +++ b/core/tests/unit/phpunit/base/Router/ModRewriteRouterTest.php @@ -0,0 +1,278 @@ +fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + } + + + public function testNoAction(): void + { + $_GET['query_string'] = 'users/oauth'; + + $this->expectException('Exception'); + $this->expectExceptionMessage('Default action has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = 'Oauth'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultAction(): void + { + $_GET['query_string'] = 'users/oauth'; + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/defaultaction.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = 'Oauth'; + $_GET['action'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } + + public function testNoController(): void + { + $_GET['query_string'] = 'users/'; + + $this->expectException('Exception'); + $this->expectExceptionMessage('Default controller has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultController(): void + { + $_GET['query_string'] = 'users/'; + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/defaultcontroller.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = 'Users'; + $_GET['controller'] = ''; + $_GET['action'] = 'login'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } + + public function testNoModule(): void + { + $_GET['query_string'] = ''; + + $this->expectException('Exception'); + $this->expectExceptionMessage('Default module has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/config.yml' + ] + ); + + $route = new stdClass(); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Helper\File\File', $this->fileHelper); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $this->fileHelper); + + // Set get variables + $_GET['module'] = ''; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + } + + public function testDefaultModule(): void + { + $_GET['query_string'] = ''; + + $this->expectException('Exception'); + $this->expectExceptionMessage('Default controller has not been configured.'); + + $config = new SuiteCRM\Core\Base\Config\Manager(); + + $fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + + $configParameters = $config->loadFiles( + [ + BASE_PATH . '/tests/testdata/RouterTest/ModRewriteRouter/defaultmodule.config.yml' + ] + ); + + $route = new stdClass(); + + $moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); + + // Set get variables + $_GET['module'] = ''; + $_GET['controller'] = 'Oauth'; + $_GET['action'] = 'login'; + + $request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER + ); + + $router = new SuiteCRM\Core\Base\Route\ModRewriteRouter($request, $configParameters); + $route = $router->load(); + + $this->assertSame('users', $route->module); + + $this->instance = new Instance($configParameters, $route, $moduleManager); + + $this->assertInstanceOf('SuiteCRM\Core\Base\Instance', $this->instance); + } +} \ No newline at end of file diff --git a/core/tests/unit/phpunit/legacy/AuthenticationServiceTest.php b/core/tests/unit/phpunit/legacy/AuthenticationServiceTest.php new file mode 100644 index 000000000..0011ad9e4 --- /dev/null +++ b/core/tests/unit/phpunit/legacy/AuthenticationServiceTest.php @@ -0,0 +1,40 @@ +authenticationService = new AuthenticationService(); + } + + public function testGetName(): void + { + $this->assertSame('users.authentication', $this->authenticationService->getName()); + } + + public function testGetDescription(): void + { + $this->assertSame( + 'This service will deal with legacy authentication', + $this->authenticationService->getDescription() + ); + } + + public function testCreateService(): void + { + $this->assertInstanceOf(Authentication::class, $this->authenticationService->createService()); + } +} + + + diff --git a/core/tests/unit/phpunit/legacy/AuthenticationTest.php b/core/tests/unit/phpunit/legacy/AuthenticationTest.php new file mode 100644 index 000000000..e69de29bb diff --git a/extentions/.gitkeep b/extentions/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/index.php b/index.php new file mode 100755 index 000000000..cb6c758b2 --- /dev/null +++ b/index.php @@ -0,0 +1,79 @@ +loadFiles( + [ + BASE_PATH . '/config/config.yml', + BASE_PATH . '/core/base/Config/modules.config.yml', + BASE_PATH . '/core/base/Config/services.config.yml', + ] + ); +} catch (Exception $e) { + trigger_error('Config failed to load files: ' . $e); +} + +$request = new SuiteCRM\Core\Base\Http\Request( + $_GET, + $_POST, + [], + $_COOKIE, + $_FILES, + $_SERVER +); + +$response = new SuiteCRM\Core\Base\Http\Response(); +$fileHelper = new SuiteCRM\Core\Base\Helper\File\File(); + +$moduleManager = new SuiteCRM\Core\Base\Module\Manager($configParameters, $fileHelper); +$router = new SuiteCRM\Core\Base\Route\DefaultRouter($request, $configParameters); +try { + $route = $router->load(); +} catch (Exception $e) { + trigger_error('Router failed to load: ' . $e); +} + +// Create an Instance of SuiteCRM +$instance = new SuiteCRM\Core\Base\Instance($configParameters, $route, $moduleManager); + +// Run the Application +$route = $instance->run()->getRoute(); + +$view = new SuiteCRM\Core\Base\Module\View\Handler(); + +$serviceMapper = new SuiteCRM\Core\Base\Module\Service\ServiceMapper($fileHelper, $moduleManager, $configParameters); + +$services = $serviceMapper->getAllServices(); + +$controller = new $route->controller($configParameters, $request, $response, $view, $services); + +$customController = 'Custom\\' . $route->controller; + +// Check the custom +if (class_exists($customController)) { + $controller = new $customController(); +} + +$params = []; + +call_user_func_array([$controller, $route->action], $params); diff --git a/logs/.gitkeep b/logs/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/public/.gitkeep b/public/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/robots.txt b/robots.txt new file mode 100755 index 000000000..3b5afa4e8 --- /dev/null +++ b/robots.txt @@ -0,0 +1,5 @@ +User-agent: * +Disallow: / + +User-agent: Googlebot +Allow: /ical_server.php