ngx-hana-nameserver-history-viewer 1.1.1 → 1.1.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -6
- package/esm2020/ngx-hana-nameserver-history-viewer.mjs +5 -0
- package/esm2020/public-api.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/alert/alert.component.mjs +68 -0
- package/esm2020/src/nameserver-history-viewer/components/alert/alert.module.mjs +22 -0
- package/esm2020/src/nameserver-history-viewer/components/alert/index.mjs +3 -0
- package/esm2020/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.mjs +112 -0
- package/esm2020/src/nameserver-history-viewer/components/file-drop-input/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/index.mjs +9 -0
- package/esm2020/src/nameserver-history-viewer/components/instruction/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/instruction/instruction.component.mjs +42 -0
- package/esm2020/src/nameserver-history-viewer/components/nameserver-history.component.mjs +550 -0
- package/esm2020/src/nameserver-history-viewer/components/port-selector/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.component.mjs +69 -0
- package/esm2020/src/nameserver-history-viewer/components/port-selector/port-selector.service.mjs +41 -0
- package/esm2020/src/nameserver-history-viewer/components/progress-bar/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.mjs +40 -0
- package/esm2020/src/nameserver-history-viewer/components/time-range-selector/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.mjs +70 -0
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.mjs +90 -0
- package/esm2020/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.mjs +49 -0
- package/esm2020/src/nameserver-history-viewer/index.mjs +3 -0
- package/esm2020/src/nameserver-history-viewer/nameserver-history.module.mjs +63 -0
- package/esm2020/src/nameserver-history-viewer/services/chart.service.mjs +323 -0
- package/esm2020/src/nameserver-history-viewer/services/file.service.mjs +390 -0
- package/esm2020/src/nameserver-history-viewer/services/index.mjs +4 -0
- package/esm2020/src/nameserver-history-viewer/services/ui.service.mjs +557 -0
- package/esm2020/src/nameserver-history-viewer/types/abort.types.mjs +6 -0
- package/esm2020/src/nameserver-history-viewer/types/alert.types.mjs +8 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-data-item.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-data.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-header.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content-time.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/chart-content.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/color-rgba.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/html-element.type.mjs +9 -0
- package/esm2020/src/nameserver-history-viewer/types/index.mjs +28 -0
- package/esm2020/src/nameserver-history-viewer/types/item.types.mjs +14 -0
- package/esm2020/src/nameserver-history-viewer/types/legend-color.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-backup.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-columnstore.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-host.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-item.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-persistence.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-rowstore.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-server.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-sql.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info-threads.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/load-history-info.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/port.types.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/types/scale-group.types.mjs +17 -0
- package/esm2020/src/nameserver-history-viewer/types/unit-category.types.mjs +10 -0
- package/esm2020/src/nameserver-history-viewer/types/unit.types.mjs +14 -0
- package/esm2020/src/nameserver-history-viewer/utils/chart-util.mjs +25 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.mjs +57 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.mjs +139 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/index.mjs +41 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.mjs +106 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.mjs +168 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-downsample/utils.mjs +114 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.mjs +527 -0
- package/esm2020/src/nameserver-history-viewer/utils/chartjs-zoom/index.mjs +2 -0
- package/esm2020/src/nameserver-history-viewer/utils/file-util.mjs +154 -0
- package/esm2020/src/nameserver-history-viewer/utils/index.mjs +5 -0
- package/esm2020/src/nameserver-history-viewer/utils/time-util.mjs +101 -0
- package/esm2020/src/nameserver-history-viewer/utils/ui-util.mjs +162 -0
- package/fesm2015/ngx-hana-nameserver-history-viewer.mjs +4081 -0
- package/fesm2015/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
- package/fesm2020/ngx-hana-nameserver-history-viewer.mjs +4081 -0
- package/fesm2020/ngx-hana-nameserver-history-viewer.mjs.map +1 -0
- package/ngx-hana-nameserver-history-viewer.d.ts +1 -1
- package/package.json +36 -61
- package/src/nameserver-history-viewer/components/alert/alert.component.d.ts +4 -1
- package/src/nameserver-history-viewer/components/alert/alert.module.d.ts +6 -0
- package/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.d.ts +3 -0
- package/src/nameserver-history-viewer/components/instruction/instruction.component.d.ts +3 -0
- package/src/nameserver-history-viewer/components/nameserver-history.component.d.ts +33 -14
- package/src/nameserver-history-viewer/components/port-selector/port-selector.component.d.ts +4 -1
- package/src/nameserver-history-viewer/components/port-selector/port-selector.service.d.ts +3 -0
- package/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.d.ts +3 -0
- package/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.d.ts +3 -0
- package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.d.ts +3 -0
- package/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.d.ts +3 -0
- package/src/nameserver-history-viewer/index.d.ts +1 -0
- package/src/nameserver-history-viewer/nameserver-history.module.d.ts +17 -0
- package/src/nameserver-history-viewer/services/chart.service.d.ts +4 -1
- package/src/nameserver-history-viewer/services/file.service.d.ts +4 -0
- package/src/nameserver-history-viewer/services/ui.service.d.ts +5 -2
- package/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.d.ts +3 -0
- package/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.d.ts +1 -1
- package/src/nameserver-history-viewer/utils/file-util.d.ts +11 -0
- package/bundles/ngx-hana-nameserver-history-viewer.umd.js +0 -6298
- package/bundles/ngx-hana-nameserver-history-viewer.umd.js.map +0 -1
- package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js +0 -2
- package/bundles/ngx-hana-nameserver-history-viewer.umd.min.js.map +0 -1
- package/esm2015/ngx-hana-nameserver-history-viewer.js +0 -10
- package/esm2015/public-api.js +0 -6
- package/esm2015/src/nameserver-history-viewer/components/alert/alert.component.js +0 -108
- package/esm2015/src/nameserver-history-viewer/components/alert/alert.module.js +0 -21
- package/esm2015/src/nameserver-history-viewer/components/alert/index.js +0 -7
- package/esm2015/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -141
- package/esm2015/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
- package/esm2015/src/nameserver-history-viewer/components/index.js +0 -13
- package/esm2015/src/nameserver-history-viewer/components/instruction/index.js +0 -6
- package/esm2015/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -62
- package/esm2015/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -742
- package/esm2015/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
- package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
- package/esm2015/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -56
- package/esm2015/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
- package/esm2015/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -35
- package/esm2015/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
- package/esm2015/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -68
- package/esm2015/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
- package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -135
- package/esm2015/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -72
- package/esm2015/src/nameserver-history-viewer/index.js +0 -6
- package/esm2015/src/nameserver-history-viewer/nameserver-history.module.js +0 -42
- package/esm2015/src/nameserver-history-viewer/services/chart.service.js +0 -423
- package/esm2015/src/nameserver-history-viewer/services/file.service.js +0 -447
- package/esm2015/src/nameserver-history-viewer/services/index.js +0 -8
- package/esm2015/src/nameserver-history-viewer/services/ui.service.js +0 -817
- package/esm2015/src/nameserver-history-viewer/types/abort.types.js +0 -13
- package/esm2015/src/nameserver-history-viewer/types/alert.types.js +0 -13
- package/esm2015/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
- package/esm2015/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
- package/esm2015/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
- package/esm2015/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
- package/esm2015/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
- package/esm2015/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
- package/esm2015/src/nameserver-history-viewer/types/html-element.type.js +0 -19
- package/esm2015/src/nameserver-history-viewer/types/index.js +0 -32
- package/esm2015/src/nameserver-history-viewer/types/item.types.js +0 -19
- package/esm2015/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -19
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
- package/esm2015/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
- package/esm2015/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
- package/esm2015/src/nameserver-history-viewer/types/port.types.js +0 -17
- package/esm2015/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
- package/esm2015/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
- package/esm2015/src/nameserver-history-viewer/types/unit.types.js +0 -19
- package/esm2015/src/nameserver-history-viewer/utils/chart-util.js +0 -38
- package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
- package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
- package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -213
- package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
- package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -158
- package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -295
- package/esm2015/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -130
- package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -733
- package/esm2015/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
- package/esm2015/src/nameserver-history-viewer/utils/file-util.js +0 -149
- package/esm2015/src/nameserver-history-viewer/utils/index.js +0 -9
- package/esm2015/src/nameserver-history-viewer/utils/time-util.js +0 -135
- package/esm2015/src/nameserver-history-viewer/utils/ui-util.js +0 -203
- package/esm5/ngx-hana-nameserver-history-viewer.js +0 -10
- package/esm5/public-api.js +0 -6
- package/esm5/src/nameserver-history-viewer/components/alert/alert.component.js +0 -140
- package/esm5/src/nameserver-history-viewer/components/alert/alert.module.js +0 -25
- package/esm5/src/nameserver-history-viewer/components/alert/index.js +0 -7
- package/esm5/src/nameserver-history-viewer/components/file-drop-input/file-drop-input.component.js +0 -155
- package/esm5/src/nameserver-history-viewer/components/file-drop-input/index.js +0 -6
- package/esm5/src/nameserver-history-viewer/components/index.js +0 -13
- package/esm5/src/nameserver-history-viewer/components/instruction/index.js +0 -6
- package/esm5/src/nameserver-history-viewer/components/instruction/instruction.component.js +0 -67
- package/esm5/src/nameserver-history-viewer/components/nameserver-history.component.js +0 -990
- package/esm5/src/nameserver-history-viewer/components/port-selector/index.js +0 -6
- package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.component.js +0 -93
- package/esm5/src/nameserver-history-viewer/components/port-selector/port-selector.service.js +0 -81
- package/esm5/src/nameserver-history-viewer/components/progress-bar/index.js +0 -6
- package/esm5/src/nameserver-history-viewer/components/progress-bar/progress-bar.component.js +0 -26
- package/esm5/src/nameserver-history-viewer/components/time-range-selector/index.js +0 -6
- package/esm5/src/nameserver-history-viewer/components/time-range-selector/time-range-selector.component.js +0 -58
- package/esm5/src/nameserver-history-viewer/components/timezone-selector/index.js +0 -6
- package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.component.js +0 -164
- package/esm5/src/nameserver-history-viewer/components/timezone-selector/timezone-selector.service.js +0 -102
- package/esm5/src/nameserver-history-viewer/index.js +0 -6
- package/esm5/src/nameserver-history-viewer/nameserver-history.module.js +0 -46
- package/esm5/src/nameserver-history-viewer/services/chart.service.js +0 -578
- package/esm5/src/nameserver-history-viewer/services/file.service.js +0 -566
- package/esm5/src/nameserver-history-viewer/services/index.js +0 -8
- package/esm5/src/nameserver-history-viewer/services/ui.service.js +0 -1036
- package/esm5/src/nameserver-history-viewer/types/abort.types.js +0 -13
- package/esm5/src/nameserver-history-viewer/types/alert.types.js +0 -13
- package/esm5/src/nameserver-history-viewer/types/chart-content-data-item.types.js +0 -15
- package/esm5/src/nameserver-history-viewer/types/chart-content-data.types.js +0 -9
- package/esm5/src/nameserver-history-viewer/types/chart-content-header.types.js +0 -15
- package/esm5/src/nameserver-history-viewer/types/chart-content-time.types.js +0 -9
- package/esm5/src/nameserver-history-viewer/types/chart-content.types.js +0 -21
- package/esm5/src/nameserver-history-viewer/types/color-rgba.types.js +0 -19
- package/esm5/src/nameserver-history-viewer/types/html-element.type.js +0 -19
- package/esm5/src/nameserver-history-viewer/types/index.js +0 -32
- package/esm5/src/nameserver-history-viewer/types/item.types.js +0 -19
- package/esm5/src/nameserver-history-viewer/types/legend-color.types.js +0 -9
- package/esm5/src/nameserver-history-viewer/types/load-history-info-backup.types.js +0 -19
- package/esm5/src/nameserver-history-viewer/types/load-history-info-columnstore.types.js +0 -19
- package/esm5/src/nameserver-history-viewer/types/load-history-info-host.types.js +0 -35
- package/esm5/src/nameserver-history-viewer/types/load-history-info-item.types.js +0 -31
- package/esm5/src/nameserver-history-viewer/types/load-history-info-persistence.types.js +0 -27
- package/esm5/src/nameserver-history-viewer/types/load-history-info-rowstore.types.js +0 -15
- package/esm5/src/nameserver-history-viewer/types/load-history-info-server.types.js +0 -25
- package/esm5/src/nameserver-history-viewer/types/load-history-info-session-admission-control.types.js +0 -19
- package/esm5/src/nameserver-history-viewer/types/load-history-info-sql.types.js +0 -37
- package/esm5/src/nameserver-history-viewer/types/load-history-info-sync-primitives.types.js +0 -15
- package/esm5/src/nameserver-history-viewer/types/load-history-info-threads.types.js +0 -23
- package/esm5/src/nameserver-history-viewer/types/load-history-info.types.js +0 -31
- package/esm5/src/nameserver-history-viewer/types/port.types.js +0 -17
- package/esm5/src/nameserver-history-viewer/types/scale-group.types.js +0 -35
- package/esm5/src/nameserver-history-viewer/types/unit-category.types.js +0 -21
- package/esm5/src/nameserver-history-viewer/types/unit.types.js +0 -19
- package/esm5/src/nameserver-history-viewer/utils/chart-util.js +0 -39
- package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/chartjs_ext.js +0 -100
- package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_culling.js +0 -88
- package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/data_mipmap.js +0 -307
- package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/index.js +0 -46
- package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/lttb_data_mipmap.js +0 -232
- package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/responsive_downsample_plugin.js +0 -350
- package/esm5/src/nameserver-history-viewer/utils/chartjs-downsample/utils.js +0 -142
- package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/chart.zoom.js +0 -733
- package/esm5/src/nameserver-history-viewer/utils/chartjs-zoom/index.js +0 -6
- package/esm5/src/nameserver-history-viewer/utils/file-util.js +0 -150
- package/esm5/src/nameserver-history-viewer/utils/index.js +0 -9
- package/esm5/src/nameserver-history-viewer/utils/time-util.js +0 -135
- package/esm5/src/nameserver-history-viewer/utils/ui-util.js +0 -205
- package/fesm2015/ngx-hana-nameserver-history-viewer.js +0 -5223
- package/fesm2015/ngx-hana-nameserver-history-viewer.js.map +0 -1
- package/fesm5/ngx-hana-nameserver-history-viewer.js +0 -6295
- package/fesm5/ngx-hana-nameserver-history-viewer.js.map +0 -1
- package/ngx-hana-nameserver-history-viewer.metadata.json +0 -1
|
@@ -1,566 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
4
|
-
*/
|
|
5
|
-
import { Injectable } from '@angular/core';
|
|
6
|
-
import { calculateValue, getDefaultPort, getPort, getTimeFromTimeZone, isSamePort, isValidPort, printProcessedTime, validateData } from '../utils';
|
|
7
|
-
import { parse } from 'papaparse';
|
|
8
|
-
import { Abort } from '../types';
|
|
9
|
-
/**
|
|
10
|
-
* prevent browser from crashing, set the max rows limitation.
|
|
11
|
-
* This could be overwritten by the input:maxRowsLimitation of the component.
|
|
12
|
-
* @type {?}
|
|
13
|
-
*/
|
|
14
|
-
var _DEFAULT_MAX_ROWS_IN_MEMORY = 100000;
|
|
15
|
-
var FileService = /** @class */ (function () {
|
|
16
|
-
function FileService() {
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* prevent browser from crashing, set the max rows limitation.
|
|
20
|
-
* @param limitation if this parameter is not null, the default value will be overwritten by this one.
|
|
21
|
-
*/
|
|
22
|
-
/**
|
|
23
|
-
* prevent browser from crashing, set the max rows limitation.
|
|
24
|
-
* @private
|
|
25
|
-
* @param {?=} limitation if this parameter is not null, the default value will be overwritten by this one.
|
|
26
|
-
* @return {?}
|
|
27
|
-
*/
|
|
28
|
-
FileService._getMaxRowsLimitation = /**
|
|
29
|
-
* prevent browser from crashing, set the max rows limitation.
|
|
30
|
-
* @private
|
|
31
|
-
* @param {?=} limitation if this parameter is not null, the default value will be overwritten by this one.
|
|
32
|
-
* @return {?}
|
|
33
|
-
*/
|
|
34
|
-
function (limitation) {
|
|
35
|
-
if (limitation === void 0) { limitation = null; }
|
|
36
|
-
if (limitation == null || isNaN(limitation) || limitation.length === 0) {
|
|
37
|
-
return _DEFAULT_MAX_ROWS_IN_MEMORY;
|
|
38
|
-
}
|
|
39
|
-
return Number(limitation);
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* get all available ports from data
|
|
43
|
-
*/
|
|
44
|
-
/**
|
|
45
|
-
* get all available ports from data
|
|
46
|
-
* @private
|
|
47
|
-
* @param {?} data
|
|
48
|
-
* @param {?} firstChunk
|
|
49
|
-
* @param {?} ports
|
|
50
|
-
* @return {?}
|
|
51
|
-
*/
|
|
52
|
-
FileService._getPorts = /**
|
|
53
|
-
* get all available ports from data
|
|
54
|
-
* @private
|
|
55
|
-
* @param {?} data
|
|
56
|
-
* @param {?} firstChunk
|
|
57
|
-
* @param {?} ports
|
|
58
|
-
* @return {?}
|
|
59
|
-
*/
|
|
60
|
-
function (data, firstChunk, ports) {
|
|
61
|
-
/** @type {?} */
|
|
62
|
-
var line = 0;
|
|
63
|
-
if (firstChunk) {
|
|
64
|
-
// start from line 3
|
|
65
|
-
line = 2;
|
|
66
|
-
}
|
|
67
|
-
for (; line < data.length; line++) {
|
|
68
|
-
/** @type {?} */
|
|
69
|
-
var dataItem = data[line][1];
|
|
70
|
-
if (dataItem != null && dataItem.length > 0) {
|
|
71
|
-
if (isValidPort(dataItem) && ports.indexOf(dataItem) === -1) {
|
|
72
|
-
ports.push(dataItem);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
/**
|
|
78
|
-
* get the time column from the analyzed data
|
|
79
|
-
* @param data the analyzed data
|
|
80
|
-
* @param firstChunk whether it's first chunk or not
|
|
81
|
-
* @param startTime selected starting time. It's millisecond, need to be converted second.
|
|
82
|
-
* @param endTime selected ending time. It's millisecond, need to be converted second.
|
|
83
|
-
* @param lastProcessedTime last processed time form last chunk
|
|
84
|
-
* @param time time object which contains the time data for all ports
|
|
85
|
-
* @param selectedPort if the selected port is empty (did not select any port), all ports info are needed
|
|
86
|
-
* @param isMDC flag for MDC system
|
|
87
|
-
* @param maxRowsLimitation prevent browser from crashing, set the max rows limitation.
|
|
88
|
-
* This comes from the input: maxRowsLimitation of the component.
|
|
89
|
-
*/
|
|
90
|
-
/**
|
|
91
|
-
* get the time column from the analyzed data
|
|
92
|
-
* @private
|
|
93
|
-
* @param {?} data the analyzed data
|
|
94
|
-
* @param {?} firstChunk whether it's first chunk or not
|
|
95
|
-
* @param {?} startTime selected starting time. It's millisecond, need to be converted second.
|
|
96
|
-
* @param {?} endTime selected ending time. It's millisecond, need to be converted second.
|
|
97
|
-
* @param {?} lastProcessedTime last processed time form last chunk
|
|
98
|
-
* @param {?} time time object which contains the time data for all ports
|
|
99
|
-
* @param {?} selectedPort if the selected port is empty (did not select any port), all ports info are needed
|
|
100
|
-
* @param {?} isMDC flag for MDC system
|
|
101
|
-
* @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
|
|
102
|
-
* This comes from the input: maxRowsLimitation of the component.
|
|
103
|
-
* @return {?}
|
|
104
|
-
*/
|
|
105
|
-
FileService._getTimeColumn = /**
|
|
106
|
-
* get the time column from the analyzed data
|
|
107
|
-
* @private
|
|
108
|
-
* @param {?} data the analyzed data
|
|
109
|
-
* @param {?} firstChunk whether it's first chunk or not
|
|
110
|
-
* @param {?} startTime selected starting time. It's millisecond, need to be converted second.
|
|
111
|
-
* @param {?} endTime selected ending time. It's millisecond, need to be converted second.
|
|
112
|
-
* @param {?} lastProcessedTime last processed time form last chunk
|
|
113
|
-
* @param {?} time time object which contains the time data for all ports
|
|
114
|
-
* @param {?} selectedPort if the selected port is empty (did not select any port), all ports info are needed
|
|
115
|
-
* @param {?} isMDC flag for MDC system
|
|
116
|
-
* @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
|
|
117
|
-
* This comes from the input: maxRowsLimitation of the component.
|
|
118
|
-
* @return {?}
|
|
119
|
-
*/
|
|
120
|
-
function (data, firstChunk, startTime, endTime, lastProcessedTime, time, selectedPort, isMDC, maxRowsLimitation) {
|
|
121
|
-
// convert millisecond to second for startTime and endTime.
|
|
122
|
-
startTime = startTime / 1000;
|
|
123
|
-
endTime = endTime / 1000;
|
|
124
|
-
/** @type {?} */
|
|
125
|
-
var timeColumn = 2;
|
|
126
|
-
/** @type {?} */
|
|
127
|
-
var startLine = 0;
|
|
128
|
-
/** @type {?} */
|
|
129
|
-
var iStart = -1;
|
|
130
|
-
/** @type {?} */
|
|
131
|
-
var iEnd = -1;
|
|
132
|
-
/** @type {?} */
|
|
133
|
-
var curTime = lastProcessedTime;
|
|
134
|
-
/** @type {?} */
|
|
135
|
-
var lastProcessedTimeReturn;
|
|
136
|
-
/** @type {?} */
|
|
137
|
-
var totalNum = 0;
|
|
138
|
-
/** @type {?} */
|
|
139
|
-
var mdcFlag = isMDC;
|
|
140
|
-
/** @type {?} */
|
|
141
|
-
var defaultPort = getDefaultPort();
|
|
142
|
-
/** @type {?} */
|
|
143
|
-
var maxRowNum = this._getMaxRowsLimitation(maxRowsLimitation);
|
|
144
|
-
if (firstChunk) {
|
|
145
|
-
if (curTime >= startTime && curTime <= endTime) {
|
|
146
|
-
iStart = 1; // start from first line
|
|
147
|
-
// start from first line
|
|
148
|
-
// get port for the line 1.
|
|
149
|
-
/**
|
|
150
|
-
* Modified at 2018/10/10,
|
|
151
|
-
* in some case, eg: the nameserver history trace gets modified by Kook, Jin Young's python script,
|
|
152
|
-
* the port show in the first line as well, and does not like the non-mdc system, this kind of file has
|
|
153
|
-
* one port in it. The history for non-mdc system doesn't have port info in the port column.
|
|
154
|
-
* @type {?}
|
|
155
|
-
*/
|
|
156
|
-
var firstLinePort = getPort(data[1][1]);
|
|
157
|
-
// init time array for the first line.
|
|
158
|
-
if (!selectedPort || selectedPort.length === 0 || isSamePort(firstLinePort, selectedPort, mdcFlag)) {
|
|
159
|
-
// does not select any port or
|
|
160
|
-
// it's non-mdc (mdcFlag is false at the beginning) system and the selected port is the first line port
|
|
161
|
-
time[firstLinePort] = [];
|
|
162
|
-
time[firstLinePort][0] = curTime * 1000;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
lastProcessedTimeReturn = curTime;
|
|
166
|
-
startLine = 2;
|
|
167
|
-
}
|
|
168
|
-
// get current total number
|
|
169
|
-
Object.keys(time).forEach(function (key) {
|
|
170
|
-
if (time[key]) {
|
|
171
|
-
totalNum += time[key].length;
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
if (curTime == null) {
|
|
175
|
-
console.error('getTimeColumn', 'Can not get the time from the file, internal error!');
|
|
176
|
-
return { indexStart: null, indexEnd: null, lastProcessedTime: null, isMDC: null };
|
|
177
|
-
}
|
|
178
|
-
for (var i = startLine; i < data.length; i++) {
|
|
179
|
-
// sometime the last line is empty, need to be skipped.
|
|
180
|
-
if (data[i] == null || data[i].length === 0 || (data[i].length === 1 && data[i][0].length === 0)) {
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
// get port number and initialize the relative port array in time
|
|
184
|
-
/** @type {?} */
|
|
185
|
-
var port = getPort(data[i][1]);
|
|
186
|
-
if (!(port in time)) {
|
|
187
|
-
// add undefined port to time, then we can find all ports in time
|
|
188
|
-
time[port] = void 0;
|
|
189
|
-
}
|
|
190
|
-
if (time[port] == null && isSamePort(port, selectedPort, mdcFlag)) {
|
|
191
|
-
time[port] = [];
|
|
192
|
-
// if other ports exists in this file, default port will be set to undefined.
|
|
193
|
-
if (!mdcFlag && port !== defaultPort && time[defaultPort]) {
|
|
194
|
-
// update the total num;
|
|
195
|
-
totalNum -= time[defaultPort].length;
|
|
196
|
-
time[defaultPort].length = 0;
|
|
197
|
-
time[defaultPort] = void 0;
|
|
198
|
-
mdcFlag = true;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
curTime = calculateValue(curTime, data[i][timeColumn]);
|
|
202
|
-
if (curTime > endTime) {
|
|
203
|
-
if (iEnd < 0) {
|
|
204
|
-
iEnd = i - 1;
|
|
205
|
-
}
|
|
206
|
-
break;
|
|
207
|
-
}
|
|
208
|
-
if (iStart >= 0) {
|
|
209
|
-
if (time[port]) {
|
|
210
|
-
// not null means it's the selected port
|
|
211
|
-
time[port][time[port].length] = curTime * 1000;
|
|
212
|
-
totalNum++;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
if (curTime >= startTime && curTime <= endTime) {
|
|
217
|
-
if (time[port]) {
|
|
218
|
-
// only selected port counted in
|
|
219
|
-
if (iStart < 0) {
|
|
220
|
-
iStart = i;
|
|
221
|
-
}
|
|
222
|
-
time[port][time[port].length] = curTime * 1000;
|
|
223
|
-
totalNum++;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
// last processed time need to be recorded anyway
|
|
228
|
-
lastProcessedTimeReturn = curTime;
|
|
229
|
-
if (totalNum >= maxRowNum) {
|
|
230
|
-
iEnd = i;
|
|
231
|
-
break;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
return { indexStart: iStart, indexEnd: iEnd, lastProcessedTime: lastProcessedTimeReturn, isMDC: mdcFlag };
|
|
235
|
-
};
|
|
236
|
-
/**
|
|
237
|
-
* Get data for all columns
|
|
238
|
-
* @param columnNum the total number of columns. For mdc system,
|
|
239
|
-
* the length of each row is different. Host relative data does not exist in tenant line.
|
|
240
|
-
* Needs to use column number from the first line.
|
|
241
|
-
* @param data data parsed by papa
|
|
242
|
-
* @param firstChunk the flag which identifies whether it's the first chunk or not.
|
|
243
|
-
* @param time
|
|
244
|
-
* @param indexStart
|
|
245
|
-
* @param indexEnd
|
|
246
|
-
* @param lastProcessedLine
|
|
247
|
-
* @param resultData the result data after analyzed
|
|
248
|
-
* @param selectedPort
|
|
249
|
-
* @param isMDC
|
|
250
|
-
*/
|
|
251
|
-
/**
|
|
252
|
-
* Get data for all columns
|
|
253
|
-
* @private
|
|
254
|
-
* @param {?} columnNum the total number of columns. For mdc system,
|
|
255
|
-
* the length of each row is different. Host relative data does not exist in tenant line.
|
|
256
|
-
* Needs to use column number from the first line.
|
|
257
|
-
* @param {?} data data parsed by papa
|
|
258
|
-
* @param {?} firstChunk the flag which identifies whether it's the first chunk or not.
|
|
259
|
-
* @param {?} time
|
|
260
|
-
* @param {?} indexStart
|
|
261
|
-
* @param {?} indexEnd
|
|
262
|
-
* @param {?} lastProcessedLine
|
|
263
|
-
* @param {?} resultData the result data after analyzed
|
|
264
|
-
* @param {?} selectedPort
|
|
265
|
-
* @param {?} isMDC
|
|
266
|
-
* @return {?}
|
|
267
|
-
*/
|
|
268
|
-
FileService._getDataColumns = /**
|
|
269
|
-
* Get data for all columns
|
|
270
|
-
* @private
|
|
271
|
-
* @param {?} columnNum the total number of columns. For mdc system,
|
|
272
|
-
* the length of each row is different. Host relative data does not exist in tenant line.
|
|
273
|
-
* Needs to use column number from the first line.
|
|
274
|
-
* @param {?} data data parsed by papa
|
|
275
|
-
* @param {?} firstChunk the flag which identifies whether it's the first chunk or not.
|
|
276
|
-
* @param {?} time
|
|
277
|
-
* @param {?} indexStart
|
|
278
|
-
* @param {?} indexEnd
|
|
279
|
-
* @param {?} lastProcessedLine
|
|
280
|
-
* @param {?} resultData the result data after analyzed
|
|
281
|
-
* @param {?} selectedPort
|
|
282
|
-
* @param {?} isMDC
|
|
283
|
-
* @return {?}
|
|
284
|
-
*/
|
|
285
|
-
function (columnNum, data, firstChunk, time, indexStart, indexEnd, lastProcessedLine, resultData, selectedPort, isMDC) {
|
|
286
|
-
/** @type {?} */
|
|
287
|
-
var startLine = 0;
|
|
288
|
-
// for mdc system, the length is not correct (host relative data only exists in the "empty" port line).
|
|
289
|
-
// Needs to use header from the first line.
|
|
290
|
-
// const columnNum = data[0].length;
|
|
291
|
-
if (firstChunk) {
|
|
292
|
-
// get port for the line 1.
|
|
293
|
-
/**
|
|
294
|
-
* Modified at 2018/10/10,
|
|
295
|
-
* in some case, eg: the nameserver history trace gets modified by Kook, Jin Young's python script,
|
|
296
|
-
* the port show in the first line as well, and does not like the non-mdc system, this kind of file has
|
|
297
|
-
* one port in it. The history for non-mdc system doesn't have port info in the port column.
|
|
298
|
-
* @type {?}
|
|
299
|
-
*/
|
|
300
|
-
var firstLinePort = getPort(data[1][1]);
|
|
301
|
-
// Initialize data column with default 'DEFAULT' port if it's not MDC system. MDC system, 'DEFAULT' gets ignored
|
|
302
|
-
if (!isMDC && time[firstLinePort]) {
|
|
303
|
-
resultData[firstLinePort] = [];
|
|
304
|
-
// removed below logic, because first line is the real number, do not need to do the convert.
|
|
305
|
-
// curLine = data[1].slice(3).map(Number);
|
|
306
|
-
for (var j = 3; j < columnNum; j++) {
|
|
307
|
-
/** @type {?} */
|
|
308
|
-
var index = j - 3;
|
|
309
|
-
// initialize data array for all columns of the default '0000' port
|
|
310
|
-
resultData[firstLinePort][index] = [];
|
|
311
|
-
// get the first line data of the column if it's included
|
|
312
|
-
if (indexStart === 1) {
|
|
313
|
-
resultData[firstLinePort][index][0] = { x: time[firstLinePort][0], y: lastProcessedLine[index] };
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
startLine = 2;
|
|
318
|
-
}
|
|
319
|
-
for (var j = 3; j < columnNum; j++) {
|
|
320
|
-
/** @type {?} */
|
|
321
|
-
var index = j - 3;
|
|
322
|
-
for (var i = startLine; i < data.length; i++) {
|
|
323
|
-
// sometime the last line is empty, need to be skipped.
|
|
324
|
-
if (data[i] == null || data[i].length === 0 || (data[i].length === 1 && data[i][0].length === 0)) {
|
|
325
|
-
continue;
|
|
326
|
-
}
|
|
327
|
-
// get port number and initialize the relative port array in data
|
|
328
|
-
/** @type {?} */
|
|
329
|
-
var port = getPort(data[i][1]);
|
|
330
|
-
if (resultData[port] == null && isSamePort(port, selectedPort, isMDC)) {
|
|
331
|
-
resultData[port] = [];
|
|
332
|
-
}
|
|
333
|
-
if (resultData[port] && resultData[port][index] == null) {
|
|
334
|
-
resultData[port][index] = [];
|
|
335
|
-
}
|
|
336
|
-
lastProcessedLine[index] = calculateValue(lastProcessedLine[index], data[i][j]);
|
|
337
|
-
if (i >= indexStart && (i <= indexEnd || indexEnd < 0) && indexStart >= 0) {
|
|
338
|
-
if (resultData[port]) {
|
|
339
|
-
/** @type {?} */
|
|
340
|
-
var length_1 = resultData[port][index].length;
|
|
341
|
-
resultData[port][index][length_1] = { x: time[port][length_1], y: lastProcessedLine[index] };
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
else if (indexEnd > 0 && i > indexEnd) {
|
|
345
|
-
break;
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
};
|
|
350
|
-
/**
|
|
351
|
-
* Get Chart data from provided file.
|
|
352
|
-
* @param file the nameserver history file
|
|
353
|
-
* @param startTime
|
|
354
|
-
* @param endTime
|
|
355
|
-
* @param port
|
|
356
|
-
* @param timezone
|
|
357
|
-
* @param maxRowsLimitation prevent browser from crashing, set the max rows limitation.
|
|
358
|
-
* @param progress call back function for updating progress
|
|
359
|
-
*/
|
|
360
|
-
/**
|
|
361
|
-
* Get Chart data from provided file.
|
|
362
|
-
* @param {?} file the nameserver history file
|
|
363
|
-
* @param {?} startTime
|
|
364
|
-
* @param {?} endTime
|
|
365
|
-
* @param {?} port
|
|
366
|
-
* @param {?} timezone
|
|
367
|
-
* @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
|
|
368
|
-
* @param {?} progress call back function for updating progress
|
|
369
|
-
* @return {?}
|
|
370
|
-
*/
|
|
371
|
-
FileService.prototype.getChartContentFromFile = /**
|
|
372
|
-
* Get Chart data from provided file.
|
|
373
|
-
* @param {?} file the nameserver history file
|
|
374
|
-
* @param {?} startTime
|
|
375
|
-
* @param {?} endTime
|
|
376
|
-
* @param {?} port
|
|
377
|
-
* @param {?} timezone
|
|
378
|
-
* @param {?} maxRowsLimitation prevent browser from crashing, set the max rows limitation.
|
|
379
|
-
* @param {?} progress call back function for updating progress
|
|
380
|
-
* @return {?}
|
|
381
|
-
*/
|
|
382
|
-
function (file, startTime, endTime, port, timezone, maxRowsLimitation, progress) {
|
|
383
|
-
// load done, beginning parsing
|
|
384
|
-
/** @type {?} */
|
|
385
|
-
var beginTime = new Date();
|
|
386
|
-
/** @type {?} */
|
|
387
|
-
var firstChunk = true;
|
|
388
|
-
// save last processed data just for the later calculation
|
|
389
|
-
/** @type {?} */
|
|
390
|
-
var lastProcessedData;
|
|
391
|
-
// save last processed time just for the later calculation
|
|
392
|
-
/** @type {?} */
|
|
393
|
-
var lastProcessedTime;
|
|
394
|
-
// save last processed cursor position for progress calculation.
|
|
395
|
-
// let lastProcessedCursor = 0;
|
|
396
|
-
/** @type {?} */
|
|
397
|
-
var indexStart = -1;
|
|
398
|
-
/** @type {?} */
|
|
399
|
-
var indexEnd = -1;
|
|
400
|
-
/** @type {?} */
|
|
401
|
-
var time = {};
|
|
402
|
-
/** @type {?} */
|
|
403
|
-
var data = {};
|
|
404
|
-
/** @type {?} */
|
|
405
|
-
var header;
|
|
406
|
-
/** @type {?} */
|
|
407
|
-
var host;
|
|
408
|
-
/** @type {?} */
|
|
409
|
-
var isMDC = false;
|
|
410
|
-
/** @type {?} */
|
|
411
|
-
var columnNum;
|
|
412
|
-
/** @type {?} */
|
|
413
|
-
var abortType;
|
|
414
|
-
/** @type {?} */
|
|
415
|
-
var rejectAndAbort = function (reject, parser) {
|
|
416
|
-
if (progress) {
|
|
417
|
-
progress(100);
|
|
418
|
-
}
|
|
419
|
-
reject(file.name + " is empty or the format is not correct.");
|
|
420
|
-
parser.abort();
|
|
421
|
-
};
|
|
422
|
-
return new Promise(function (resolve, reject) {
|
|
423
|
-
parse(file, {
|
|
424
|
-
chunk: function (results, parser) {
|
|
425
|
-
var _a;
|
|
426
|
-
// the progress increment of this step
|
|
427
|
-
// let analyzeStepProgress = (results.meta.cursor - lastProcessedCursor) / file.size * 100;
|
|
428
|
-
printProcessedTime(beginTime, 'step1');
|
|
429
|
-
if (indexEnd >= 0) {
|
|
430
|
-
// already finished, quite.
|
|
431
|
-
return;
|
|
432
|
-
}
|
|
433
|
-
else {
|
|
434
|
-
// reset start point
|
|
435
|
-
indexStart = -1;
|
|
436
|
-
}
|
|
437
|
-
// get time column
|
|
438
|
-
if (firstChunk) {
|
|
439
|
-
if (!validateData(results.data)) {
|
|
440
|
-
return rejectAndAbort(reject, parser);
|
|
441
|
-
}
|
|
442
|
-
// initialize the header
|
|
443
|
-
header = results.data[0].slice(3);
|
|
444
|
-
// get column number
|
|
445
|
-
columnNum = results.data[0].length;
|
|
446
|
-
// get host name
|
|
447
|
-
host = results.data[1][0];
|
|
448
|
-
// get the first line time info from first line, it is a real number, do not need to do the convert with ">,<".
|
|
449
|
-
lastProcessedTime = getTimeFromTimeZone(parseFloat(results.data[1][2]), timezone);
|
|
450
|
-
// get the first line data info from first line, it is a real number, do not need to do the convert with ">,<".
|
|
451
|
-
lastProcessedData = results.data[1].slice(3).map(Number);
|
|
452
|
-
}
|
|
453
|
-
printProcessedTime(beginTime, 'step2');
|
|
454
|
-
if (!lastProcessedData) {
|
|
455
|
-
return rejectAndAbort(reject, parser);
|
|
456
|
-
}
|
|
457
|
-
// get time column
|
|
458
|
-
(_a = FileService._getTimeColumn(results.data, firstChunk, startTime, endTime, lastProcessedTime, time, port, isMDC, maxRowsLimitation), indexStart = _a.indexStart, indexEnd = _a.indexEnd, lastProcessedTime = _a.lastProcessedTime, isMDC = _a.isMDC);
|
|
459
|
-
printProcessedTime(beginTime, 'step3');
|
|
460
|
-
if (indexStart == null && indexEnd == null && lastProcessedTime == null && isMDC == null) {
|
|
461
|
-
return rejectAndAbort(reject, parser);
|
|
462
|
-
}
|
|
463
|
-
// get all other data columns
|
|
464
|
-
FileService._getDataColumns(columnNum, results.data, firstChunk, time, indexStart, indexEnd, lastProcessedData, data, port, isMDC);
|
|
465
|
-
if (firstChunk) {
|
|
466
|
-
firstChunk = false;
|
|
467
|
-
}
|
|
468
|
-
printProcessedTime(beginTime, 'step4');
|
|
469
|
-
if (indexEnd >= 0) {
|
|
470
|
-
// do not need to process the left parts, manually trigger complete
|
|
471
|
-
/** @type {?} */
|
|
472
|
-
var processedLines = Object.keys(time).reduce(function (total, curKey) { return time[curKey] ? total + time[curKey].length : total; }, 0);
|
|
473
|
-
if (processedLines >= FileService._getMaxRowsLimitation(maxRowsLimitation)) {
|
|
474
|
-
abortType = Abort.maxLineNumReached;
|
|
475
|
-
}
|
|
476
|
-
else {
|
|
477
|
-
abortType = Abort.maxTimeRangeReached;
|
|
478
|
-
}
|
|
479
|
-
if (progress) {
|
|
480
|
-
progress(100);
|
|
481
|
-
}
|
|
482
|
-
parser.abort();
|
|
483
|
-
return;
|
|
484
|
-
}
|
|
485
|
-
else {
|
|
486
|
-
// the overall progress if this step is finished
|
|
487
|
-
if (progress) {
|
|
488
|
-
progress(Math.round(results.meta.cursor / file.size * 100));
|
|
489
|
-
}
|
|
490
|
-
// lastProcessedCursor = results.meta.cursor;
|
|
491
|
-
}
|
|
492
|
-
},
|
|
493
|
-
complete: function () {
|
|
494
|
-
printProcessedTime(beginTime, 'step_complete');
|
|
495
|
-
resolve({ header: header, host: host, time: time, data: data, aborted: abortType });
|
|
496
|
-
}
|
|
497
|
-
});
|
|
498
|
-
});
|
|
499
|
-
};
|
|
500
|
-
/**
|
|
501
|
-
* Get all ports from the name server history file
|
|
502
|
-
* @param file the name server history file
|
|
503
|
-
* @param progress call back for updating the progress
|
|
504
|
-
*/
|
|
505
|
-
/**
|
|
506
|
-
* Get all ports from the name server history file
|
|
507
|
-
* @param {?} file the name server history file
|
|
508
|
-
* @param {?} progress call back for updating the progress
|
|
509
|
-
* @return {?}
|
|
510
|
-
*/
|
|
511
|
-
FileService.prototype.getPortsFromFile = /**
|
|
512
|
-
* Get all ports from the name server history file
|
|
513
|
-
* @param {?} file the name server history file
|
|
514
|
-
* @param {?} progress call back for updating the progress
|
|
515
|
-
* @return {?}
|
|
516
|
-
*/
|
|
517
|
-
function (file, progress) {
|
|
518
|
-
/** @type {?} */
|
|
519
|
-
var beginTime = new Date();
|
|
520
|
-
/** @type {?} */
|
|
521
|
-
var firstChunk = true;
|
|
522
|
-
/** @type {?} */
|
|
523
|
-
var ports = [];
|
|
524
|
-
/** @type {?} */
|
|
525
|
-
var defaultPort = getDefaultPort();
|
|
526
|
-
return new Promise(function (resolve, reject) {
|
|
527
|
-
parse(file, {
|
|
528
|
-
chunk: function (results, parser) {
|
|
529
|
-
// get time column
|
|
530
|
-
if (firstChunk) {
|
|
531
|
-
if (!validateData(results.data)) {
|
|
532
|
-
if (progress) {
|
|
533
|
-
progress(100);
|
|
534
|
-
}
|
|
535
|
-
reject(file.name + " is empty or the format is not correct.");
|
|
536
|
-
parser.abort();
|
|
537
|
-
return;
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
printProcessedTime(beginTime, 'port.step1');
|
|
541
|
-
FileService._getPorts(results.data, firstChunk, ports);
|
|
542
|
-
if (firstChunk) {
|
|
543
|
-
firstChunk = false;
|
|
544
|
-
}
|
|
545
|
-
if (progress) {
|
|
546
|
-
progress(Math.round(results.meta.cursor / file.size * 100));
|
|
547
|
-
}
|
|
548
|
-
},
|
|
549
|
-
complete: function () {
|
|
550
|
-
// parsing done
|
|
551
|
-
printProcessedTime(beginTime, 'step_complete');
|
|
552
|
-
if (ports.length === 0) {
|
|
553
|
-
ports[0] = defaultPort;
|
|
554
|
-
}
|
|
555
|
-
resolve(ports);
|
|
556
|
-
}
|
|
557
|
-
});
|
|
558
|
-
});
|
|
559
|
-
};
|
|
560
|
-
FileService.decorators = [
|
|
561
|
-
{ type: Injectable }
|
|
562
|
-
];
|
|
563
|
-
return FileService;
|
|
564
|
-
}());
|
|
565
|
-
export { FileService };
|
|
566
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWhhbmEtbmFtZXNlcnZlci1oaXN0b3J5LXZpZXdlci8iLCJzb3VyY2VzIjpbInNyYy9uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyL3NlcnZpY2VzL2ZpbGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLGNBQWMsRUFDZCxPQUFPLEVBQ1AsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFlBQVksRUFDYixNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxLQUFLLEVBQW1ELE1BQU0sVUFBVSxDQUFDOzs7Ozs7SUFNM0UsMkJBQTJCLEdBQUcsTUFBTTtBQUUxQztJQUFBO0lBMGFBLENBQUM7SUF4YUM7OztPQUdHOzs7Ozs7O0lBQ1ksaUNBQXFCOzs7Ozs7SUFBcEMsVUFBcUMsVUFBc0I7UUFBdEIsMkJBQUEsRUFBQSxpQkFBc0I7UUFDekQsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN0RSxPQUFPLDJCQUEyQixDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHOzs7Ozs7Ozs7SUFDWSxxQkFBUzs7Ozs7Ozs7SUFBeEIsVUFBeUIsSUFBZ0IsRUFBRSxVQUFtQixFQUFFLEtBQWU7O1lBQ3pFLElBQUksR0FBRyxDQUFDO1FBQ1osSUFBSSxVQUFVLEVBQUU7WUFDZCxvQkFBb0I7WUFDcEIsSUFBSSxHQUFHLENBQUMsQ0FBQztTQUNWO1FBRUQsT0FBTyxJQUFJLEdBQUcs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Q3RCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUM7cUJBQ3hCO29CQUNELE9BQU8sQ0FBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0JBemFGLFVBQVU7O0lBMGFYLGtCQUFDO0NBQUEsQUExYUQsSUEwYUM7U0F6YVksV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgY2FsY3VsYXRlVmFsdWUsXHJcbiAgZ2V0RGVmYXVsdFBvcnQsXHJcbiAgZ2V0UG9ydCxcclxuICBnZXRUaW1lRnJvbVRpbWVab25lLFxyXG4gIGlzU2FtZVBvcnQsXHJcbiAgaXNWYWxpZFBvcnQsXHJcbiAgcHJpbnRQcm9jZXNzZWRUaW1lLFxyXG4gIHZhbGlkYXRlRGF0YVxyXG59IGZyb20gJy4uL3V0aWxzJztcclxuaW1wb3J0IHtwYXJzZX0gZnJvbSAncGFwYXBhcnNlJztcclxuaW1wb3J0IHtBYm9ydCwgQ2hhcnRDb250ZW50LCBDaGFydENvbnRlbnREYXRhLCBDaGFydENvbnRlbnRUaW1lfSBmcm9tICcuLi90eXBlcyc7XHJcblxyXG4vKipcclxuICogcHJldmVudCBicm93c2VyIGZyb20gY3Jhc2hpbmcsIHNldCB0aGUgbWF4IHJvd3MgbGltaXRhdGlvbi5cclxuICogVGhpcyBjb3VsZCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgaW5wdXQ6bWF4Um93c0xpbWl0YXRpb24gb2YgdGhlIGNvbXBvbmVudC5cclxuICovXHJcbmNvbnN0IF9ERUZBVUxUX01BWF9ST1dTX0lOX01FTU9SWSA9IDEwMDAwMDtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZpbGVTZXJ2aWNlIHtcclxuICAvKipcclxuICAgKiBwcmV2ZW50IGJyb3dzZXIgZnJvbSBjcmFzaGluZywgc2V0IHRoZSBtYXggcm93cyBsaW1pdGF0aW9uLlxyXG4gICAqIEBwYXJhbSBsaW1pdGF0aW9uIGlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBudWxsLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoaXMgb25lLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZXRNYXhSb3dzTGltaXRhdGlvbihsaW1pdGF0aW9uOiBhbnkgPSBudWxsKSB7XHJcbiAgICBpZiAobGltaXRhdGlvbiA9PSBudWxsIHx8IGlzTmFOKGxpbWl0YXRpb24pIHx8IGxpbWl0YXRpb24ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBfREVGQVVMVF9NQVhfUk9XU19JTl9NRU1PUlk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTnVtYmVyKGxpbWl0YXRpb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogZ2V0IGFsbCBhdmFpbGFibGUgcG9ydHMgZnJvbSBkYXRhXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgX2dldFBvcnRzKGRhdGE6IHN0cmluZ1tdW10sIGZpcnN0Q2h1bms6IGJvb2xlYW4sIHBvcnRzOiBzdHJpbmdbXSkge1xyXG4gICAgbGV0IGxpbmUgPSAwO1xyXG4gICAgaWYgKGZpcnN0Q2h1bmspIHtcclxuICAgICAgLy8gc3RhcnQgZnJvbSBsaW5lIDNcclxuICAgICAgbGluZSA9IDI7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yICg7IGxpbmUgPCBkYXRhLmxlbmd0aDsgbGluZSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGFJdGVtID0gZGF0YVtsaW5lXVsxXTtcclxuICAgICAgaWYgKGRhdGFJdGVtICE9IG51bGwgJiYgZGF0YUl0ZW0ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGlmIChpc1ZhbGlkUG9ydChkYXRhSXRlbSkgJiYgcG9ydHMuaW5kZXhPZihkYXRhSXRlbSkgPT09IC0xKSB7XHJcbiAgICAgICAgICBwb3J0cy5wdXNoKGRhdGFJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGdldCB0aGUgdGltZSBjb2x1bW4gZnJvbSB0aGUgYW5hbHl6ZWQgZGF0YVxyXG4gICAqIEBwYXJhbSBkYXRhIHRoZSBhbmFseXplZCBkYXRhXHJcbiAgICogQHBhcmFtIGZpcnN0Q2h1bmsgd2hldGhlciBpdCdzIGZpcnN0IGNodW5rIG9yIG5vdFxyXG4gICAqIEBwYXJhbSBzdGFydFRpbWUgc2VsZWN0ZWQgc3RhcnRpbmcgdGltZS4gSXQncyBtaWxsaXNlY29uZCwgbmVlZCB0byBiZSBjb252ZXJ0ZWQgc2Vjb25kLlxyXG4gICAqIEBwYXJhbSBlbmRUaW1lIHNlbGVjdGVkIGVuZGluZyB0aW1lLiBJdCdzIG1pbGxpc2Vjb25kLCBuZWVkIHRvIGJlIGNvbnZlcnRlZCBzZWNvbmQuXHJcbiAgICogQHBhcmFtIGxhc3RQcm9jZXNzZWRUaW1lIGxhc3QgcHJvY2Vzc2VkIHRpbWUgZm9ybSBsYXN0IGNodW5rXHJcbiAgICogQHBhcmFtIHRpbWUgdGltZSBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIHRpbWUgZGF0YSBmb3IgYWxsIHBvcnRzXHJcbiAgICogQHBhcmFtIHNlbGVjdGVkUG9ydCBpZiB0aGUgc2VsZWN0ZWQgcG9ydCBpcyBlbXB0eSAoZGlkIG5vdCBzZWxlY3QgYW55IHBvcnQpLCBhbGwgcG9ydHMgaW5mbyBhcmUgbmVlZGVkXHJcbiAgICogQHBhcmFtIGlzTURDIGZsYWcgZm9yIE1EQyBzeXN0ZW1cclxuICAgKiBAcGFyYW0gbWF4Um93c0xpbWl0YXRpb24gcHJldmVudCBicm93c2VyIGZyb20gY3Jhc2hpbmcsIHNldCB0aGUgbWF4IHJvd3MgbGltaXRhdGlvbi5cclxuICAgKiBUaGlzIGNvbWVzIGZyb20gdGhlIGlucHV0OiBtYXhSb3dzTGltaXRhdGlvbiBvZiB0aGUgY29tcG9uZW50LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZXRUaW1lQ29sdW1uKGRhdGE6IHN0cmluZ1tdW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaHVuazogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFByb2Nlc3NlZFRpbWU6IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiBDaGFydENvbnRlbnRUaW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUG9ydDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTURDOiBib29sZWFuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd3NMaW1pdGF0aW9uOiBhbnkpIHtcclxuICAgIC8vIGNvbnZlcnQgbWlsbGlzZWNvbmQgdG8gc2Vjb25kIGZvciBzdGFydFRpbWUgYW5kIGVuZFRpbWUuXHJcbiAgICBzdGFydFRpbWUgPSBzdGFydFRpbWUgLyAxMDAwO1xyXG4gICAgZW5kVGltZSA9IGVuZFRpbWUgLyAxMDAwO1xyXG4gICAgY29uc3QgdGltZUNvbHVtbiA9IDI7XHJcbiAgICBsZXQgc3RhcnRMaW5lID0gMDtcclxuICAgIGxldCBpU3RhcnQgPSAtMTtcclxuICAgIGxldCBpRW5kID0gLTE7XHJcblxyXG4gICAgbGV0IGN1clRpbWUgPSBsYXN0UHJvY2Vzc2VkVGltZTtcclxuICAgIGxldCBsYXN0UHJvY2Vzc2VkVGltZVJldHVybjtcclxuICAgIGxldCB0b3RhbE51bSA9IDA7XHJcbiAgICBsZXQgbWRjRmxhZyA9IGlzTURDO1xyXG4gICAgY29uc3QgZGVmYXVsdFBvcnQgPSBnZXREZWZhdWx0UG9ydCgpO1xyXG4gICAgY29uc3QgbWF4Um93TnVtID0gdGhpcy5fZ2V0TWF4Um93c0xpbWl0YXRpb24obWF4Um93c0xpbWl0YXRpb24pO1xyXG5cclxuICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgIGlmIChjdXJUaW1lID49IHN0YXJ0VGltZSAmJiBjdXJUaW1lIDw9IGVuZFRpbWUpIHtcclxuICAgICAgICBpU3RhcnQgPSAxOyAvLyBzdGFydCBmcm9tIGZpcnN0IGxpbmVcclxuXHJcbiAgICAgICAgLyoqIE1vZGlmaWVkIGF0IDIwMTgvMTAvMTAsXHJcbiAgICAgICAgICogaW4gc29tZSBjYXNlLCBlZzogdGhlIG5hbWVzZXJ2ZXIgaGlzdG9yeSB0cmFjZSBnZXRzIG1vZGlmaWVkIGJ5IEtvb2ssIEppbiBZb3VuZydzIHB5dGhvbiBzY3JpcHQsXHJcbiAgICAgICAgICogdGhlIHBvcnQgc2hvdyBpbiB0aGUgZmlyc3QgbGluZSBhcyB3ZWxsLCBhbmQgZG9lcyBub3QgbGlrZSB0aGUgbm9uLW1kYyBzeXN0ZW0sIHRoaXMga2luZCBvZiBmaWxlIGhhc1xyXG4gICAgICAgICAqIG9uZSBwb3J0IGluIGl0LiBUaGUgaGlzdG9yeSBmb3Igbm9uLW1kYyBzeXN0ZW0gZG9lc24ndCBoYXZlIHBvcnQgaW5mbyBpbiB0aGUgcG9ydCBjb2x1bW4uKi9cclxuXHJcbiAgICAgICAgICAvLyBnZXQgcG9ydCBmb3IgdGhlIGxpbmUgMS5cclxuICAgICAgICBjb25zdCBmaXJzdExpbmVQb3J0ID0gZ2V0UG9ydChkYXRhWzFdWzFdKTtcclxuICAgICAgICAvLyBpbml0IHRpbWUgYXJyYXkgZm9yIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAgICAgIGlmICghc2VsZWN0ZWRQb3J0IHx8IHNlbGVjdGVkUG9ydC5sZW5ndGggPT09IDAgfHwgaXNTYW1lUG9ydChmaXJzdExpbmVQb3J0LCBzZWxlY3RlZFBvcnQsIG1kY0ZsYWcpKSB7XHJcbiAgICAgICAgICAvLyBkb2VzIG5vdCBzZWxlY3QgYW55IHBvcnQgb3JcclxuICAgICAgICAgIC8vIGl0J3Mgbm9uLW1kYyAobWRjRmxhZyBpcyBmYWxzZSBhdCB0aGUgYmVnaW5uaW5nKSBzeXN0ZW0gYW5kIHRoZSBzZWxlY3RlZCBwb3J0IGlzIHRoZSBmaXJzdCBsaW5lIHBvcnRcclxuICAgICAgICAgIHRpbWVbZmlyc3RMaW5lUG9ydF0gPSBbXTtcclxuICAgICAgICAgIHRpbWVbZmlyc3RMaW5lUG9ydF1bMF0gPSBjdXJUaW1lICogMTAwMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGFzdFByb2Nlc3NlZFRpbWVSZXR1cm4gPSBjdXJUaW1lO1xyXG4gICAgICBzdGFydExpbmUgPSAyO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldCBjdXJyZW50IHRvdGFsIG51bWJlclxyXG4gICAgT2JqZWN0LmtleXModGltZSkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBpZiAodGltZVtrZXldKSB7XHJcbiAgICAgICAgdG90YWxOdW0gKz0gdGltZVtrZXldLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGN1clRpbWUgPT0gbnVsbCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdnZXRUaW1lQ29sdW1uJywgJ0NhbiBub3QgZ2V0IHRoZSB0aW1lIGZyb20gdGhlIGZpbGUsIGludGVybmFsIGVycm9yIScpO1xyXG4gICAgICByZXR1cm4ge2luZGV4U3RhcnQ6IG51bGwsIGluZGV4RW5kOiBudWxsLCBsYXN0UHJvY2Vzc2VkVGltZTogbnVsbCwgaXNNREM6IG51bGx9O1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGkgPSBzdGFydExpbmU7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vIHNvbWV0aW1lIHRoZSBsYXN0IGxpbmUgaXMgZW1wdHksIG5lZWQgdG8gYmUgc2tpcHBlZC5cclxuICAgICAgaWYgKGRhdGFbaV0gPT0gbnVsbCB8fCBkYXRhW2ldLmxlbmd0aCA9PT0gMCB8fCAoZGF0YVtpXS5sZW5ndGggPT09IDEgJiYgZGF0YVtpXVswXS5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGdldCBwb3J0IG51bWJlciBhbmQgaW5pdGlhbGl6ZSB0aGUgcmVsYXRpdmUgcG9ydCBhcnJheSBpbiB0aW1lXHJcbiAgICAgIGNvbnN0IHBvcnQgPSBnZXRQb3J0KGRhdGFbaV1bMV0pOyAvLyBkYXRhW2ldWzFdID09IG51bGwgfHwgZGF0YVtpXVsxXS5sZW5ndGggPT0gMCA/IF9fREVGQVVMVF9QT1JUIDogZGF0YVtpXVsxXTtcclxuICAgICAgaWYgKCEocG9ydCBpbiB0aW1lKSkge1xyXG4gICAgICAgIC8vIGFkZCB1bmRlZmluZWQgcG9ydCB0byB0aW1lLCB0aGVuIHdlIGNhbiBmaW5kIGFsbCBwb3J0cyBpbiB0aW1lXHJcbiAgICAgICAgdGltZVtwb3J0XSA9IHZvaWQgMDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGltZVtwb3J0XSA9PSBudWxsICYmIGlzU2FtZVBvcnQocG9ydCwgc2VsZWN0ZWRQb3J0LCBtZGNGbGFnKSkge1xyXG4gICAgICAgIHRpbWVbcG9ydF0gPSBbXTtcclxuICAgICAgICAvLyBpZiBvdGhlciBwb3J0cyBleGlzdHMgaW4gdGhpcyBmaWxlLCBkZWZhdWx0IHBvcnQgd2lsbCBiZSBzZXQgdG8gdW5kZWZpbmVkLlxyXG4gICAgICAgIGlmICghbWRjRmxhZyAmJiBwb3J0ICE9PSBkZWZhdWx0UG9ydCAmJiB0aW1lW2RlZmF1bHRQb3J0XSkge1xyXG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSB0b3RhbCBudW07XHJcbiAgICAgICAgICB0b3RhbE51bSAtPSB0aW1lW2RlZmF1bHRQb3J0XS5sZW5ndGg7XHJcbiAgICAgICAgICB0aW1lW2RlZmF1bHRQb3J0XS5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgdGltZVtkZWZhdWx0UG9ydF0gPSB2b2lkIDA7XHJcbiAgICAgICAgICBtZGNGbGFnID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY3VyVGltZSA9IGNhbGN1bGF0ZVZhbHVlKGN1clRpbWUsIGRhdGFbaV1bdGltZUNvbHVtbl0pO1xyXG4gICAgICBpZiAoY3VyVGltZSA+IGVuZFRpbWUpIHtcclxuICAgICAgICBpZiAoaUVuZCA8IDApIHtcclxuICAgICAgICAgIGlFbmQgPSBpIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlTdGFydCA+PSAwKSB7XHJcbiAgICAgICAgaWYgKHRpbWVbcG9ydF0pIHtcclxuICAgICAgICAgIC8vIG5vdCBudWxsIG1lYW5zIGl0J3MgdGhlIHNlbGVjdGVkIHBvcnRcclxuICAgICAgICAgIHRpbWVbcG9ydF1bdGltZVtwb3J0XS5sZW5ndGhdID0gY3VyVGltZSAqIDEwMDA7XHJcbiAgICAgICAgICB0b3RhbE51bSArKztcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGN1clRpbWUgPj0gc3RhcnRUaW1lICYmIGN1clRpbWUgPD0gZW5kVGltZSkge1xyXG4gICAgICAgICAgaWYgKHRpbWVbcG9ydF0pIHtcclxuICAgICAgICAgICAgLy8gb25seSBzZWxlY3RlZCBwb3J0IGNvdW50ZWQgaW5cclxuICAgICAgICAgICAgaWYgKGlTdGFydCA8IDApIHtcclxuICAgICAgICAgICAgICBpU3RhcnQgPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRpbWVbcG9ydF1bdGltZVtwb3J0XS5sZW5ndGhdID0gY3VyVGltZSAqIDEwMDA7XHJcbiAgICAgICAgICAgIHRvdGFsTnVtICsrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBsYXN0IHByb2Nlc3NlZCB0aW1lIG5lZWQgdG8gYmUgcmVjb3JkZWQgYW55d2F5XHJcbiAgICAgIGxhc3RQcm9jZXNzZWRUaW1lUmV0dXJuID0gY3VyVGltZTtcclxuXHJcbiAgICAgIGlmICh0b3RhbE51bSA+PSBtYXhSb3dOdW0pIHtcclxuICAgICAgICBpRW5kID0gaTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtpbmRleFN0YXJ0OiBpU3RhcnQsIGluZGV4RW5kOiBpRW5kLCBsYXN0UHJvY2Vzc2VkVGltZTogbGFzdFByb2Nlc3NlZFRpbWVSZXR1cm4sIGlzTURDOiBtZGNGbGFnfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBkYXRhIGZvciBhbGwgY29sdW1uc1xyXG4gICAqIEBwYXJhbSBjb2x1bW5OdW0gdGhlIHRvdGFsIG51bWJlciBvZiBjb2x1bW5zLiBGb3IgbWRjIHN5c3RlbSxcclxuICAgKiAgICAgICAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgZWFjaCByb3cgaXMgZGlmZmVyZW50LiBIb3N0IHJlbGF0aXZlIGRhdGEgZG9lcyBub3QgZXhpc3QgaW4gdGVuYW50IGxpbmUuXHJcbiAgICogICAgICAgICAgICAgICAgICBOZWVkcyB0byB1c2UgY29sdW1uIG51bWJlciBmcm9tIHRoZSBmaXJzdCBsaW5lLlxyXG4gICAqIEBwYXJhbSBkYXRhICAgICAgZGF0YSBwYXJzZWQgYnkgcGFwYVxyXG4gICAqIEBwYXJhbSBmaXJzdENodW5rIHRoZSBmbGFnIHdoaWNoIGlkZW50aWZpZXMgd2hldGhlciBpdCdzIHRoZSBmaXJzdCBjaHVuayBvciBub3QuXHJcbiAgICogQHBhcmFtIHRpbWVcclxuICAgKiBAcGFyYW0gaW5kZXhTdGFydFxyXG4gICAqIEBwYXJhbSBpbmRleEVuZFxyXG4gICAqIEBwYXJhbSBsYXN0UHJvY2Vzc2VkTGluZVxyXG4gICAqIEBwYXJhbSByZXN1bHREYXRhICAgdGhlIHJlc3VsdCBkYXRhIGFmdGVyIGFuYWx5emVkXHJcbiAgICogQHBhcmFtIHNlbGVjdGVkUG9ydFxyXG4gICAqIEBwYXJhbSBpc01EQ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIF9nZXREYXRhQ29sdW1ucyhjb2x1bW5OdW06IG51bWJlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogc3RyaW5nW11bXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaHVuazogYm9vbGVhbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogQ2hhcnRDb250ZW50VGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTdGFydDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEVuZDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UHJvY2Vzc2VkTGluZTogbnVtYmVyW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdERhdGE6IENoYXJ0Q29udGVudERhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUG9ydDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01EQzogYm9vbGVhbikge1xyXG4gICAgbGV0IHN0YXJ0TGluZSA9IDA7XHJcbiAgICAvLyBmb3IgbWRjIHN5c3RlbSwgdGhlIGxlbmd0aCBpcyBub3QgY29ycmVjdCAoaG9zdCByZWxhdGl2ZSBkYXRhIG9ubHkgZXhpc3RzIGluIHRoZSBcImVtcHR5XCIgcG9ydCBsaW5lKS5cclxuICAgIC8vIE5lZWRzIHRvIHVzZSBoZWFkZXIgZnJvbSB0aGUgZmlyc3QgbGluZS5cclxuICAgIC8vIGNvbnN0IGNvbHVtbk51bSA9IGRhdGFbMF0ubGVuZ3RoO1xyXG5cclxuICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBNb2RpZmllZCBhdCAyMDE4LzEwLzEwLFxyXG4gICAgICAgKiBpbiBzb21lIGNhc2UsIGVnOiB0aGUgbmFtZXNlcnZlciBoaXN0b3J5IHRyYWNlIGdldHMgbW9kaWZpZWQgYnkgS29vaywgSmluIFlvdW5nJ3MgcHl0aG9uIHNjcmlwdCxcclxuICAgICAgICogdGhlIHBvcnQgc2hvdyBpbiB0aGUgZmlyc3QgbGluZSBhcyB3ZWxsLCBhbmQgZG9lcyBub3QgbGlrZSB0aGUgbm9uLW1kYyBzeXN0ZW0sIHRoaXMga2luZCBvZiBmaWxlIGhhc1xyXG4gICAgICAgKiBvbmUgcG9ydCBpbiBpdC4gVGhlIGhpc3RvcnkgZm9yIG5vbi1tZGMgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBwb3J0IGluZm8gaW4gdGhlIHBvcnQgY29sdW1uLlxyXG4gICAgICAgKi9cclxuXHJcbiAgICAgIC8vIGdldCBwb3J0IGZvciB0aGUgbGluZSAxLlxyXG4gICAgICBjb25zdCBmaXJzdExpbmVQb3J0ID0gZ2V0UG9ydChkYXRhWzFdWzFdKTtcclxuICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRhIGNvbHVtbiB3aXRoIGRlZmF1bHQgJ0RFRkFVTFQnIHBvcnQgaWYgaXQncyBub3QgTURDIHN5c3RlbS4gTURDIHN5c3RlbSwgJ0RFRkFVTFQnIGdldHMgaWdub3JlZFxyXG4gICAgICBpZiAoIWlzTURDICYmIHRpbWVbZmlyc3RMaW5lUG9ydF0pIHtcclxuICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdID0gW107XHJcbiAgICAgICAgLy8gcmVtb3ZlZCBiZWxvdyBsb2dpYywgYmVjYXVzZSBmaXJzdCBsaW5lIGlzIHRoZSByZWFsIG51bWJlciwgZG8gbm90IG5lZWQgdG8gZG8gdGhlIGNvbnZlcnQuXHJcbiAgICAgICAgLy8gY3VyTGluZSA9IGRhdGFbMV0uc2xpY2UoMykubWFwKE51bWJlcik7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDM7IGogPCBjb2x1bW5OdW07IGorKykge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSBqIC0gMztcclxuXHJcbiAgICAgICAgICAvLyBpbml0aWFsaXplIGRhdGEgYXJyYXkgZm9yIGFsbCBjb2x1bW5zIG9mIHRoZSBkZWZhdWx0ICcwMDAwJyBwb3J0XHJcbiAgICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdW2luZGV4XSA9IFtdO1xyXG4gICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBsaW5lIGRhdGEgb2YgdGhlIGNvbHVtbiBpZiBpdCdzIGluY2x1ZGVkXHJcbiAgICAgICAgICBpZiAoaW5kZXhTdGFydCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXN1bHREYXRhW2ZpcnN0TGluZVBvcnRdW2luZGV4XVswXSA9IHt4OiB0aW1lW2ZpcnN0TGluZVBvcnRdWzBdLCB5OiBsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF19O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzdGFydExpbmUgPSAyO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAobGV0IGogPSAzOyBqIDwgY29sdW1uTnVtOyBqKyspIHtcclxuICAgICAgY29uc3QgaW5kZXggPSBqIC0gMztcclxuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZTsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAvLyBzb21ldGltZSB0aGUgbGFzdCBsaW5lIGlzIGVtcHR5LCBuZWVkIHRvIGJlIHNraXBwZWQuXHJcbiAgICAgICAgaWYgKGRhdGFbaV0gPT0gbnVsbCB8fCBkYXRhW2ldLmxlbmd0aCA9PT0gMCB8fCAoZGF0YVtpXS5sZW5ndGggPT09IDEgJiYgZGF0YVtpXVswXS5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGdldCBwb3J0IG51bWJlciBhbmQgaW5pdGlhbGl6ZSB0aGUgcmVsYXRpdmUgcG9ydCBhcnJheSBpbiBkYXRhXHJcbiAgICAgICAgY29uc3QgcG9ydCA9IGdldFBvcnQoZGF0YVtpXVsxXSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdERhdGFbcG9ydF0gPT0gbnVsbCAmJiBpc1NhbWVQb3J0KHBvcnQsIHNlbGVjdGVkUG9ydCwgaXNNREMpKSB7XHJcbiAgICAgICAgICByZXN1bHREYXRhW3BvcnRdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyZXN1bHREYXRhW3BvcnRdICYmIHJlc3VsdERhdGFbcG9ydF1baW5kZXhdID09IG51bGwpIHtcclxuICAgICAgICAgIHJlc3VsdERhdGFbcG9ydF1baW5kZXhdID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF0gPSBjYWxjdWxhdGVWYWx1ZShsYXN0UHJvY2Vzc2VkTGluZVtpbmRleF0sIGRhdGFbaV1bal0pO1xyXG4gICAgICAgIGlmIChpID49IGluZGV4U3RhcnQgJiYgKGkgPD0gaW5kZXhFbmQgfHwgaW5kZXhFbmQgPCAwKSAmJiBpbmRleFN0YXJ0ID49IDApIHtcclxuICAgICAgICAgIGlmIChyZXN1bHREYXRhW3BvcnRdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHJlc3VsdERhdGFbcG9ydF1baW5kZXhdLmxlbmd0aDtcclxuICAgICAgICAgICAgcmVzdWx0RGF0YVtwb3J0XVtpbmRleF1bbGVuZ3RoXSA9IHt4OiB0aW1lW3BvcnRdW2xlbmd0aF0sIHk6IGxhc3RQcm9jZXNzZWRMaW5lW2luZGV4XX07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChpbmRleEVuZCA+IDAgJiYgaSA+IGluZGV4RW5kKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBDaGFydCBkYXRhIGZyb20gcHJvdmlkZWQgZmlsZS5cclxuICAgKiBAcGFyYW0gZmlsZSB0aGUgbmFtZXNlcnZlciBoaXN0b3J5IGZpbGVcclxuICAgKiBAcGFyYW0gc3RhcnRUaW1lXHJcbiAgICogQHBhcmFtIGVuZFRpbWVcclxuICAgKiBAcGFyYW0gcG9ydFxyXG4gICAqIEBwYXJhbSB0aW1lem9uZVxyXG4gICAqIEBwYXJhbSBtYXhSb3dzTGltaXRhdGlvbiBwcmV2ZW50IGJyb3dzZXIgZnJvbSBjcmFzaGluZywgc2V0IHRoZSBtYXggcm93cyBsaW1pdGF0aW9uLlxyXG4gICAqIEBwYXJhbSBwcm9ncmVzcyBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHVwZGF0aW5nIHByb2dyZXNzXHJcbiAgICovXHJcbiAgcHVibGljIGdldENoYXJ0Q29udGVudEZyb21GaWxlKGZpbGU6IEZpbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogbnVtYmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lOiBudW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXpvbmU6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93c0xpbWl0YXRpb246IGFueSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M6IGFueSk6IFByb21pc2U8Q2hhcnRDb250ZW50PiB7XHJcbiAgICAvLyBsb2FkIGRvbmUsIGJlZ2lubmluZyBwYXJzaW5nXHJcbiAgICBjb25zdCBiZWdpblRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgbGV0IGZpcnN0Q2h1bmsgPSB0cnVlO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCBkYXRhIGp1c3QgZm9yIHRoZSBsYXRlciBjYWxjdWxhdGlvblxyXG4gICAgbGV0IGxhc3RQcm9jZXNzZWREYXRhO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCB0aW1lIGp1c3QgZm9yIHRoZSBsYXRlciBjYWxjdWxhdGlvblxyXG4gICAgbGV0IGxhc3RQcm9jZXNzZWRUaW1lO1xyXG4gICAgLy8gc2F2ZSBsYXN0IHByb2Nlc3NlZCBjdXJzb3IgcG9zaXRpb24gZm9yIHByb2dyZXNzIGNhbGN1bGF0aW9uLlxyXG4gICAgLy8gbGV0IGxhc3RQcm9jZXNzZWRDdXJzb3IgPSAwO1xyXG4gICAgbGV0IGluZGV4U3RhcnQgPSAtMSwgaW5kZXhFbmQgPSAtMTtcclxuICAgIGNvbnN0IHRpbWU6IENoYXJ0Q29udGVudFRpbWUgPSB7fTtcclxuICAgIGNvbnN0IGRhdGE6IENoYXJ0Q29udGVudERhdGEgPSB7fTtcclxuICAgIGxldCBoZWFkZXI7XHJcbiAgICBsZXQgaG9zdDtcclxuICAgIGxldCBpc01EQyA9IGZhbHNlO1xyXG4gICAgbGV0IGNvbHVtbk51bTtcclxuICAgIGxldCBhYm9ydFR5cGU6IEFib3J0O1xyXG5cclxuICAgIGNvbnN0IHJlamVjdEFuZEFib3J0ID0gKHJlamVjdCwgcGFyc2VyKSA9PiB7XHJcbiAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgIHByb2dyZXNzKDEwMCk7XHJcbiAgICAgIH1cclxuICAgICAgcmVqZWN0KGAke2ZpbGUubmFtZX0gaXMgZW1wdHkgb3IgdGhlIGZvcm1hdCBpcyBub3QgY29ycmVjdC5gKTtcclxuICAgICAgcGFyc2VyLmFib3J0KCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgcGFyc2UoZmlsZSwge1xyXG4gICAgICAgIGNodW5rOiAocmVzdWx0cywgcGFyc2VyKSA9PiB7XHJcbiAgICAgICAgICAvLyB0aGUgcHJvZ3Jlc3MgaW5jcmVtZW50IG9mIHRoaXMgc3RlcFxyXG4gICAgICAgICAgLy8gbGV0IGFuYWx5emVTdGVwUHJvZ3Jlc3MgPSAocmVzdWx0cy5tZXRhLmN1cnNvciAtIGxhc3RQcm9jZXNzZWRDdXJzb3IpIC8gZmlsZS5zaXplICogMTAwO1xyXG4gICAgICAgICAgcHJpbnRQcm9jZXNzZWRUaW1lKGJlZ2luVGltZSwgJ3N0ZXAxJyk7XHJcbiAgICAgICAgICBpZiAoaW5kZXhFbmQgPj0gMCkge1xyXG4gICAgICAgICAgICAvLyBhbHJlYWR5IGZpbmlzaGVkLCBxdWl0ZS5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gcmVzZXQgc3RhcnQgcG9pbnRcclxuICAgICAgICAgICAgaW5kZXhTdGFydCA9IC0xO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGdldCB0aW1lIGNvbHVtblxyXG4gICAgICAgICAgaWYgKGZpcnN0Q2h1bmspIHtcclxuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZURhdGEocmVzdWx0cy5kYXRhKSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZWplY3RBbmRBYm9ydChyZWplY3QsIHBhcnNlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGhlYWRlclxyXG4gICAgICAgICAgICBoZWFkZXIgPSByZXN1bHRzLmRhdGFbMF0uc2xpY2UoMyk7XHJcbiAgICAgICAgICAgIC8vIGdldCBjb2x1bW4gbnVtYmVyXHJcbiAgICAgICAgICAgIGNvbHVtbk51bSA9IHJlc3VsdHMuZGF0YVswXS5sZW5ndGg7XHJcbiAgICAgICAgICAgIC8vIGdldCBob3N0IG5hbWVcclxuICAgICAgICAgICAgaG9zdCA9IHJlc3VsdHMuZGF0YVsxXVswXTtcclxuICAgICAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBsaW5lIHRpbWUgaW5mbyBmcm9tIGZpcnN0IGxpbmUsIGl0IGlzIGEgcmVhbCBudW1iZXIsIGRvIG5vdCBuZWVkIHRvIGRvIHRoZSBjb252ZXJ0IHdpdGggXCI+LDxcIi5cclxuICAgICAgICAgICAgbGFzdFByb2Nlc3NlZFRpbWUgPSBnZXRUaW1lRnJvbVRpbWVab25lKHBhcnNlRmxvYXQocmVzdWx0cy5kYXRhWzFdWzJdKSwgdGltZXpvbmUpO1xyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGZpcnN0IGxpbmUgZGF0YSBpbmZvIGZyb20gZmlyc3QgbGluZSwgaXQgaXMgYSByZWFsIG51bWJlciwgZG8gbm90IG5lZWQgdG8gZG8gdGhlIGNvbnZlcnQgd2l0aCBcIj4sPFwiLlxyXG4gICAgICAgICAgICBsYXN0UHJvY2Vzc2VkRGF0YSA9IHJlc3VsdHMuZGF0YVsxXS5zbGljZSgzKS5tYXAoTnVtYmVyKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcDInKTtcclxuXHJcbiAgICAgICAgICBpZiAoIWxhc3RQcm9jZXNzZWREYXRhKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWplY3RBbmRBYm9ydChyZWplY3QsIHBhcnNlcik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZ2V0IHRpbWUgY29sdW1uXHJcbiAgICAgICAgICAoe2luZGV4U3RhcnQsIGluZGV4RW5kLCBsYXN0UHJvY2Vzc2VkVGltZSwgaXNNREN9ID0gRmlsZVNlcnZpY2UuX2dldFRpbWVDb2x1bW4oXHJcbiAgICAgICAgICAgIHJlc3VsdHMuZGF0YSwgZmlyc3RDaHVuaywgc3RhcnRUaW1lLCBlbmRUaW1lLCBsYXN0UHJvY2Vzc2VkVGltZSwgdGltZSwgcG9ydCwgaXNNREMsIG1heFJvd3NMaW1pdGF0aW9uKSk7XHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcDMnKTtcclxuXHJcbiAgICAgICAgICBpZiAoaW5kZXhTdGFydCA9PSBudWxsICYmIGluZGV4RW5kID09IG51bGwgJiYgbGFzdFByb2Nlc3NlZFRpbWUgPT0gbnVsbCAmJiBpc01EQyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWplY3RBbmRBYm9ydChyZWplY3QsIHBhcnNlcik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gZ2V0IGFsbCBvdGhlciBkYXRhIGNvbHVtbnNcclxuICAgICAgICAgIEZpbGVTZXJ2aWNlLl9nZXREYXRhQ29sdW1ucyhcclxuICAgICAgICAgICAgY29sdW1uTnVtLCByZXN1bHRzLmRhdGEsIGZpcnN0Q2h1bmssIHRpbWUsIGluZGV4U3RhcnQsIGluZGV4RW5kLCBsYXN0UHJvY2Vzc2VkRGF0YSwgZGF0YSwgcG9ydCwgaXNNREMpO1xyXG5cclxuICAgICAgICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgICAgICAgIGZpcnN0Q2h1bmsgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwcmludFByb2Nlc3NlZFRpbWUoYmVnaW5UaW1lLCAnc3RlcDQnKTtcclxuXHJcbiAgICAgICAgICBpZiAoaW5kZXhFbmQgPj0gMCkge1xyXG4gICAgICAgICAgICAvLyBkbyBub3QgbmVlZCB0byBwcm9jZXNzIHRoZSBsZWZ0IHBhcnRzLCBtYW51YWxseSB0cmlnZ2VyIGNvbXBsZXRlXHJcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZExpbmVzID0gT2JqZWN0LmtleXModGltZSkucmVkdWNlKCh0b3RhbCwgY3VyS2V5KSA9PiB0aW1lW2N1cktleV0gPyB0b3RhbCArIHRpbWVbY3VyS2V5XS5sZW5ndGggOiB0b3RhbCwgMCk7XHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzZWRMaW5lcyA+PSBGaWxlU2VydmljZS5fZ2V0TWF4Um93c0xpbWl0YXRpb24obWF4Um93c0xpbWl0YXRpb24pKSB7XHJcbiAgICAgICAgICAgICAgYWJvcnRUeXBlID0gQWJvcnQubWF4TGluZU51bVJlYWNoZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgYWJvcnRUeXBlID0gQWJvcnQubWF4VGltZVJhbmdlUmVhY2hlZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgcHJvZ3Jlc3MoMTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJzZXIuYWJvcnQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdGhlIG92ZXJhbGwgcHJvZ3Jlc3MgaWYgdGhpcyBzdGVwIGlzIGZpbmlzaGVkXHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgIHByb2dyZXNzKE1hdGgucm91bmQocmVzdWx0cy5tZXRhLmN1cnNvciAvIGZpbGUuc2l6ZSAqIDEwMCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGxhc3RQcm9jZXNzZWRDdXJzb3IgPSByZXN1bHRzLm1ldGEuY3Vyc29yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIHByaW50UHJvY2Vzc2VkVGltZShiZWdpblRpbWUsICdzdGVwX2NvbXBsZXRlJyk7XHJcbiAgICAgICAgICByZXNvbHZlICh7aGVhZGVyOiBoZWFkZXIsIGhvc3Q6IGhvc3QsIHRpbWU6IHRpbWUsIGRhdGE6IGRhdGEsIGFib3J0ZWQ6IGFib3J0VHlwZX0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgcG9ydHMgZnJvbSB0aGUgbmFtZSBzZXJ2ZXIgaGlzdG9yeSBmaWxlXHJcbiAgICogQHBhcmFtIGZpbGUgdGhlIG5hbWUgc2VydmVyIGhpc3RvcnkgZmlsZVxyXG4gICAqIEBwYXJhbSBwcm9ncmVzcyBjYWxsIGJhY2sgZm9yIHVwZGF0aW5nIHRoZSBwcm9ncmVzc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRQb3J0c0Zyb21GaWxlKGZpbGU6IEZpbGUsIHByb2dyZXNzOiBhbnkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XHJcbiAgICBjb25zdCBiZWdpblRpbWUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgbGV0IGZpcnN0Q2h1bmsgPSB0cnVlO1xyXG4gICAgY29uc3QgcG9ydHMgPSBbXTtcclxuICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gZ2V0RGVmYXVsdFBvcnQoKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHBhcnNlKGZpbGUsIHtcclxuICAgICAgICBjaHVuazogKHJlc3VsdHMsIHBhcnNlcikgPT4ge1xyXG4gICAgICAgICAgLy8gZ2V0IHRpbWUgY29sdW1uXHJcbiAgICAgICAgICBpZiAoZmlyc3RDaHVuaykge1xyXG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlRGF0YShyZXN1bHRzLmRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9ncmVzcygxMDApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZWplY3QoYCR7ZmlsZS5uYW1lfSBpcyBlbXB0eSBvciB0aGUgZm9ybWF0IGlzIG5vdCBjb3JyZWN0LmApO1xyXG4gICAgICAgICAgICAgIHBhcnNlci5hYm9ydCgpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcHJpbnRQcm9jZXNzZWRUaW1lKGJlZ2luVGltZSwgJ3BvcnQuc3RlcDEnKTtcclxuICAgICAgICAgIEZpbGVTZXJ2aWNlLl9nZXRQb3J0cyhyZXN1bHRzLmRhdGEsIGZpcnN0Q2h1bmssIHBvcnRzKTtcclxuICAgICAgICAgIGlmIChmaXJzdENodW5rKSB7XHJcbiAgICAgICAgICAgIGZpcnN0Q2h1bmsgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChwcm9ncmVzcykge1xyXG4gICAgICAgICAgICBwcm9ncmVzcyhNYXRoLnJvdW5kKHJlc3VsdHMubWV0YS5jdXJzb3IgLyBmaWxlLnNpemUgKiAxMDApKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAvLyBwYXJzaW5nIGRvbmVcclxuICAgICAgICAgIHByaW50UHJvY2Vzc2VkVGltZShiZWdpblRpbWUsICdzdGVwX2NvbXBsZXRlJyk7XHJcbiAgICAgICAgICBpZiAocG9ydHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHBvcnRzWzBdID0gZGVmYXVsdFBvcnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNvbHZlIChwb3J0cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
4
|
-
*/
|
|
5
|
-
export { ChartService } from './chart.service';
|
|
6
|
-
export { FileService } from './file.service';
|
|
7
|
-
export { UIService } from './ui.service';
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtaGFuYS1uYW1lc2VydmVyLWhpc3Rvcnktdmlld2VyLyIsInNvdXJjZXMiOlsic3JjL25hbWVzZXJ2ZXItaGlzdG9yeS12aWV3ZXIvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZCQUFjLGlCQUFpQixDQUFDO0FBQ2hDLDRCQUFjLGdCQUFnQixDQUFDO0FBQy9CLDBCQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2hhcnQuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi91aS5zZXJ2aWNlJztcclxuIl19
|