ngx-sfc-common 0.0.1

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.
Files changed (114) hide show
  1. package/README.md +460 -0
  2. package/esm2020/lib/components/button/button-type.enum.mjs +9 -0
  3. package/esm2020/lib/components/button/button.component.mjs +38 -0
  4. package/esm2020/lib/components/checkmark/checkmark.component.mjs +27 -0
  5. package/esm2020/lib/components/delimeter/delimeter.component.mjs +11 -0
  6. package/esm2020/lib/components/dots/dots.component.mjs +30 -0
  7. package/esm2020/lib/components/hamburger/hamburger.component.mjs +24 -0
  8. package/esm2020/lib/components/index.mjs +20 -0
  9. package/esm2020/lib/components/loader/bounce/bounce-loader.component.mjs +13 -0
  10. package/esm2020/lib/components/loader/circle/circle-loader-type.enum.mjs +6 -0
  11. package/esm2020/lib/components/loader/circle/circle-loader.component.mjs +20 -0
  12. package/esm2020/lib/components/loader/loader-base.component.mjs +51 -0
  13. package/esm2020/lib/components/loader/loader.constants.mjs +6 -0
  14. package/esm2020/lib/components/loader/loader.event.mjs +2 -0
  15. package/esm2020/lib/components/loader/service/loader.service.mjs +76 -0
  16. package/esm2020/lib/components/modal/directive/modal-open-on-click.directive.mjs +50 -0
  17. package/esm2020/lib/components/modal/footer/default/default-modal-footer.component.mjs +48 -0
  18. package/esm2020/lib/components/modal/footer/default/default-modal-footer.model.mjs +2 -0
  19. package/esm2020/lib/components/modal/header/default/default-modal-header.component.mjs +31 -0
  20. package/esm2020/lib/components/modal/header/default/default-modal-header.model.mjs +2 -0
  21. package/esm2020/lib/components/modal/modal-template.enum.mjs +7 -0
  22. package/esm2020/lib/components/modal/modal.component.mjs +107 -0
  23. package/esm2020/lib/components/modal/service/modal.service.mjs +26 -0
  24. package/esm2020/lib/components/toggle-switcher/toggle-switcher.component.mjs +31 -0
  25. package/esm2020/lib/components/toggle-switcher/toggle-switcher.model.mjs +2 -0
  26. package/esm2020/lib/components/tooltip/tooltip-type.enum.mjs +6 -0
  27. package/esm2020/lib/components/tooltip/tooltip.component.mjs +69 -0
  28. package/esm2020/lib/constants/common.constants.mjs +6 -0
  29. package/esm2020/lib/constants/date-time.constants.mjs +8 -0
  30. package/esm2020/lib/constants/index.mjs +4 -0
  31. package/esm2020/lib/constants/ui.constants.mjs +16 -0
  32. package/esm2020/lib/directives/click-outside/click-outside.directive.mjs +65 -0
  33. package/esm2020/lib/directives/click-outside/click-outside.event.mjs +2 -0
  34. package/esm2020/lib/directives/component-size/component-size.directive.mjs +46 -0
  35. package/esm2020/lib/directives/index.mjs +7 -0
  36. package/esm2020/lib/directives/mouse-down/mouse-down.directive.mjs +37 -0
  37. package/esm2020/lib/directives/show-hide-element/show-hide-element.directive.mjs +42 -0
  38. package/esm2020/lib/directives/template-reference/template-reference.directive.mjs +21 -0
  39. package/esm2020/lib/directives/throw-element-on-hover/throw-element-on-hover.directive.mjs +38 -0
  40. package/esm2020/lib/enums/common.enums.mjs +69 -0
  41. package/esm2020/lib/enums/index.mjs +2 -0
  42. package/esm2020/lib/ngx-sfc-common.module.mjs +135 -0
  43. package/esm2020/lib/services/document-ref.service.mjs +70 -0
  44. package/esm2020/lib/services/index.mjs +4 -0
  45. package/esm2020/lib/services/resize.service.mjs +42 -0
  46. package/esm2020/lib/services/window-ref.service.mjs +70 -0
  47. package/esm2020/lib/utils/collections.utils.mjs +244 -0
  48. package/esm2020/lib/utils/common.utils.mjs +86 -0
  49. package/esm2020/lib/utils/date-time.utils.mjs +208 -0
  50. package/esm2020/lib/utils/file.utils.mjs +52 -0
  51. package/esm2020/lib/utils/index.mjs +7 -0
  52. package/esm2020/lib/utils/string.utils.mjs +31 -0
  53. package/esm2020/lib/utils/ui.utils.mjs +39 -0
  54. package/esm2020/ngx-sfc-common.mjs +5 -0
  55. package/esm2020/public-api.mjs +11 -0
  56. package/fesm2015/ngx-sfc-common.mjs +1908 -0
  57. package/fesm2015/ngx-sfc-common.mjs.map +1 -0
  58. package/fesm2020/ngx-sfc-common.mjs +1900 -0
  59. package/fesm2020/ngx-sfc-common.mjs.map +1 -0
  60. package/lib/components/button/button-type.enum.d.ts +7 -0
  61. package/lib/components/button/button.component.d.ts +13 -0
  62. package/lib/components/checkmark/checkmark.component.d.ts +8 -0
  63. package/lib/components/delimeter/delimeter.component.d.ts +5 -0
  64. package/lib/components/dots/dots.component.d.ts +9 -0
  65. package/lib/components/hamburger/hamburger.component.d.ts +7 -0
  66. package/lib/components/index.d.ts +21 -0
  67. package/lib/components/loader/bounce/bounce-loader.component.d.ts +6 -0
  68. package/lib/components/loader/circle/circle-loader-type.enum.d.ts +4 -0
  69. package/lib/components/loader/circle/circle-loader.component.d.ts +8 -0
  70. package/lib/components/loader/loader-base.component.d.ts +27 -0
  71. package/lib/components/loader/loader.constants.d.ts +5 -0
  72. package/lib/components/loader/loader.event.d.ts +4 -0
  73. package/lib/components/loader/service/loader.service.d.ts +33 -0
  74. package/lib/components/modal/directive/modal-open-on-click.directive.d.ts +17 -0
  75. package/lib/components/modal/footer/default/default-modal-footer.component.d.ts +19 -0
  76. package/lib/components/modal/footer/default/default-modal-footer.model.d.ts +6 -0
  77. package/lib/components/modal/header/default/default-modal-header.component.d.ts +14 -0
  78. package/lib/components/modal/header/default/default-modal-header.model.d.ts +5 -0
  79. package/lib/components/modal/modal-template.enum.d.ts +5 -0
  80. package/lib/components/modal/modal.component.d.ts +25 -0
  81. package/lib/components/modal/service/modal.service.d.ts +12 -0
  82. package/lib/components/toggle-switcher/toggle-switcher.component.d.ts +11 -0
  83. package/lib/components/toggle-switcher/toggle-switcher.model.d.ts +4 -0
  84. package/lib/components/tooltip/tooltip-type.enum.d.ts +4 -0
  85. package/lib/components/tooltip/tooltip.component.d.ts +22 -0
  86. package/lib/constants/common.constants.d.ts +5 -0
  87. package/lib/constants/date-time.constants.d.ts +7 -0
  88. package/lib/constants/index.d.ts +3 -0
  89. package/lib/constants/ui.constants.d.ts +15 -0
  90. package/lib/directives/click-outside/click-outside.directive.d.ts +23 -0
  91. package/lib/directives/click-outside/click-outside.event.d.ts +4 -0
  92. package/lib/directives/component-size/component-size.directive.d.ts +13 -0
  93. package/lib/directives/index.d.ts +7 -0
  94. package/lib/directives/mouse-down/mouse-down.directive.d.ts +12 -0
  95. package/lib/directives/show-hide-element/show-hide-element.directive.d.ts +13 -0
  96. package/lib/directives/template-reference/template-reference.directive.d.ts +9 -0
  97. package/lib/directives/throw-element-on-hover/throw-element-on-hover.directive.d.ts +13 -0
  98. package/lib/enums/common.enums.d.ts +61 -0
  99. package/lib/enums/index.d.ts +1 -0
  100. package/lib/ngx-sfc-common.module.d.ts +27 -0
  101. package/lib/services/document-ref.service.d.ts +43 -0
  102. package/lib/services/index.d.ts +3 -0
  103. package/lib/services/resize.service.d.ts +32 -0
  104. package/lib/services/window-ref.service.d.ts +43 -0
  105. package/lib/utils/collections.utils.d.ts +135 -0
  106. package/lib/utils/common.utils.d.ts +50 -0
  107. package/lib/utils/date-time.utils.d.ts +131 -0
  108. package/lib/utils/file.utils.d.ts +25 -0
  109. package/lib/utils/index.d.ts +6 -0
  110. package/lib/utils/string.utils.d.ts +19 -0
  111. package/lib/utils/ui.utils.d.ts +24 -0
  112. package/ngx-sfc-common.d.ts +5 -0
  113. package/package.json +53 -0
  114. package/public-api.d.ts +7 -0
@@ -0,0 +1,135 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
4
+ import { DOCUMENT_PROVIDERS, WINDOW_PROVIDERS } from './services';
5
+ import { ClickOutsideDirective, ShowHideElementDirective, ThrowElementOnHoverDirective, TemplateReferenceDirective, MouseDownDirective, ComponentSizeDirective } from './directives';
6
+ import { ButtonComponent, TooltipComponent, DelimeterComponent, BounceLoaderComponent, CircleLoaderComponent, ModalComponent, ModalOpenOnClickDirective, DefaultModalHeaderComponent, DefaultModalFooterComponent, HamburgerComponent, DotsComponent, ToggleSwitcherComponent, CheckmarkComponent } from './components';
7
+ import * as i0 from "@angular/core";
8
+ export class NgxSfcCommonModule {
9
+ }
10
+ NgxSfcCommonModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: NgxSfcCommonModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
11
+ NgxSfcCommonModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: NgxSfcCommonModule, declarations: [
12
+ // directives
13
+ ClickOutsideDirective,
14
+ ShowHideElementDirective,
15
+ ThrowElementOnHoverDirective,
16
+ TemplateReferenceDirective,
17
+ MouseDownDirective,
18
+ ComponentSizeDirective,
19
+ // components
20
+ ButtonComponent,
21
+ TooltipComponent,
22
+ DelimeterComponent,
23
+ // loaders
24
+ BounceLoaderComponent,
25
+ CircleLoaderComponent,
26
+ // modal
27
+ ModalComponent,
28
+ ModalOpenOnClickDirective,
29
+ DefaultModalHeaderComponent,
30
+ DefaultModalFooterComponent,
31
+ // hamburger
32
+ HamburgerComponent,
33
+ // dots
34
+ DotsComponent,
35
+ //toggle
36
+ ToggleSwitcherComponent,
37
+ CheckmarkComponent], imports: [CommonModule,
38
+ BrowserAnimationsModule], exports: [
39
+ // directives
40
+ ClickOutsideDirective,
41
+ ShowHideElementDirective,
42
+ ThrowElementOnHoverDirective,
43
+ TemplateReferenceDirective,
44
+ MouseDownDirective,
45
+ ComponentSizeDirective,
46
+ // components
47
+ ButtonComponent,
48
+ TooltipComponent,
49
+ DelimeterComponent,
50
+ // loaders
51
+ BounceLoaderComponent,
52
+ CircleLoaderComponent,
53
+ // modal
54
+ ModalComponent,
55
+ ModalOpenOnClickDirective,
56
+ DefaultModalHeaderComponent,
57
+ DefaultModalFooterComponent,
58
+ // hamburger
59
+ HamburgerComponent,
60
+ // dots
61
+ DotsComponent,
62
+ //toggle
63
+ ToggleSwitcherComponent,
64
+ CheckmarkComponent] });
65
+ NgxSfcCommonModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: NgxSfcCommonModule, providers: [DOCUMENT_PROVIDERS, WINDOW_PROVIDERS], imports: [[
66
+ CommonModule,
67
+ BrowserAnimationsModule
68
+ ]] });
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: NgxSfcCommonModule, decorators: [{
70
+ type: NgModule,
71
+ args: [{
72
+ declarations: [
73
+ // directives
74
+ ClickOutsideDirective,
75
+ ShowHideElementDirective,
76
+ ThrowElementOnHoverDirective,
77
+ TemplateReferenceDirective,
78
+ MouseDownDirective,
79
+ ComponentSizeDirective,
80
+ // components
81
+ ButtonComponent,
82
+ TooltipComponent,
83
+ DelimeterComponent,
84
+ // loaders
85
+ BounceLoaderComponent,
86
+ CircleLoaderComponent,
87
+ // modal
88
+ ModalComponent,
89
+ ModalOpenOnClickDirective,
90
+ DefaultModalHeaderComponent,
91
+ DefaultModalFooterComponent,
92
+ // hamburger
93
+ HamburgerComponent,
94
+ // dots
95
+ DotsComponent,
96
+ //toggle
97
+ ToggleSwitcherComponent,
98
+ CheckmarkComponent
99
+ ],
100
+ imports: [
101
+ CommonModule,
102
+ BrowserAnimationsModule
103
+ ],
104
+ exports: [
105
+ // directives
106
+ ClickOutsideDirective,
107
+ ShowHideElementDirective,
108
+ ThrowElementOnHoverDirective,
109
+ TemplateReferenceDirective,
110
+ MouseDownDirective,
111
+ ComponentSizeDirective,
112
+ // components
113
+ ButtonComponent,
114
+ TooltipComponent,
115
+ DelimeterComponent,
116
+ // loaders
117
+ BounceLoaderComponent,
118
+ CircleLoaderComponent,
119
+ // modal
120
+ ModalComponent,
121
+ ModalOpenOnClickDirective,
122
+ DefaultModalHeaderComponent,
123
+ DefaultModalFooterComponent,
124
+ // hamburger
125
+ HamburgerComponent,
126
+ // dots
127
+ DotsComponent,
128
+ //toggle
129
+ ToggleSwitcherComponent,
130
+ CheckmarkComponent
131
+ ],
132
+ providers: [DOCUMENT_PROVIDERS, WINDOW_PROVIDERS]
133
+ }]
134
+ }] });
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNmYy1jb21tb24ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNmYy1jb21tb24vc3JjL2xpYi9uZ3gtc2ZjLWNvbW1vbi5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDL0UsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDakIsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsNEJBQTRCLEVBQzVCLDBCQUEwQixFQUMxQixrQkFBa0IsRUFDbEIsc0JBQXNCLEVBQ3ZCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCx5QkFBeUIsRUFDekIsMkJBQTJCLEVBQzNCLDJCQUEyQixFQUMzQixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbkIsTUFBTSxjQUFjLENBQUM7O0FBaUV0QixNQUFNLE9BQU8sa0JBQWtCOzsrR0FBbEIsa0JBQWtCO2dIQUFsQixrQkFBa0I7UUE3RDNCLGFBQWE7UUFDYixxQkFBcUI7UUFDckIsd0JBQXdCO1FBQ3hCLDRCQUE0QjtRQUM1QiwwQkFBMEI7UUFDMUIsa0JBQWtCO1FBQ2xCLHNCQUFzQjtRQUN0QixhQUFhO1FBQ2IsZUFBZTtRQUNmLGdCQUFnQjtRQUNoQixrQkFBa0I7UUFDbEIsVUFBVTtRQUNWLHFCQUFxQjtRQUNyQixxQkFBcUI7UUFDckIsUUFBUTtRQUNSLGNBQWM7UUFDZCx5QkFBeUI7UUFDekIsMkJBQTJCO1FBQzNCLDJCQUEyQjtRQUMzQixZQUFZO1FBQ1osa0JBQWtCO1FBQ2xCLE9BQU87UUFDUCxhQUFhO1FBQ2IsUUFBUTtRQUNSLHVCQUF1QjtRQUN2QixrQkFBa0IsYUFHbEIsWUFBWTtRQUNaLHVCQUF1QjtRQUd2QixhQUFhO1FBQ2IscUJBQXFCO1FBQ3JCLHdCQUF3QjtRQUN4Qiw0QkFBNEI7UUFDNUIsMEJBQTBCO1FBQzFCLGtCQUFrQjtRQUNsQixzQkFBc0I7UUFDdEIsYUFBYTtRQUNiLGVBQWU7UUFDZixnQkFBZ0I7UUFDaEIsa0JBQWtCO1FBQ2xCLFVBQVU7UUFDVixxQkFBcUI7UUFDckIscUJBQXFCO1FBQ3JCLFFBQVE7UUFDUixjQUFjO1FBQ2QseUJBQXlCO1FBQ3pCLDJCQUEyQjtRQUMzQiwyQkFBMkI7UUFDM0IsWUFBWTtRQUNaLGtCQUFrQjtRQUNsQixPQUFPO1FBQ1AsYUFBYTtRQUNiLFFBQVE7UUFDUix1QkFBdUI7UUFDdkIsa0JBQWtCO2dIQUlULGtCQUFrQixhQUZsQixDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLFlBaEN4QztZQUNQLFlBQVk7WUFDWix1QkFBdUI7U0FDeEI7MkZBK0JVLGtCQUFrQjtrQkEvRDlCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFO3dCQUNaLGFBQWE7d0JBQ2IscUJBQXFCO3dCQUNyQix3QkFBd0I7d0JBQ3hCLDRCQUE0Qjt3QkFDNUIsMEJBQTBCO3dCQUMxQixrQkFBa0I7d0JBQ2xCLHNCQUFzQjt3QkFDdEIsYUFBYTt3QkFDYixlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsa0JBQWtCO3dCQUNsQixVQUFVO3dCQUNWLHFCQUFxQjt3QkFDckIscUJBQXFCO3dCQUNyQixRQUFRO3dCQUNSLGNBQWM7d0JBQ2QseUJBQXlCO3dCQUN6QiwyQkFBMkI7d0JBQzNCLDJCQUEyQjt3QkFDM0IsWUFBWTt3QkFDWixrQkFBa0I7d0JBQ2xCLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixRQUFRO3dCQUNSLHVCQUF1Qjt3QkFDdkIsa0JBQWtCO3FCQUNuQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWix1QkFBdUI7cUJBQ3hCO29CQUNELE9BQU8sRUFBRTt3QkFDUCxhQUFhO3dCQUNiLHFCQUFxQjt3QkFDckIsd0JBQXdCO3dCQUN4Qiw0QkFBNEI7d0JBQzVCLDBCQUEwQjt3QkFDMUIsa0JBQWtCO3dCQUNsQixzQkFBc0I7d0JBQ3RCLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGtCQUFrQjt3QkFDbEIsVUFBVTt3QkFDVixxQkFBcUI7d0JBQ3JCLHFCQUFxQjt3QkFDckIsUUFBUTt3QkFDUixjQUFjO3dCQUNkLHlCQUF5Qjt3QkFDekIsMkJBQTJCO3dCQUMzQiwyQkFBMkI7d0JBQzNCLFlBQVk7d0JBQ1osa0JBQWtCO3dCQUNsQixPQUFPO3dCQUNQLGFBQWE7d0JBQ2IsUUFBUTt3QkFDUix1QkFBdUI7d0JBQ3ZCLGtCQUFrQjtxQkFDbkI7b0JBQ0QsU0FBUyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUM7aUJBQ2xEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQge1xyXG4gIERPQ1VNRU5UX1BST1ZJREVSUyxcclxuICBXSU5ET1dfUFJPVklERVJTXHJcbn0gZnJvbSAnLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7XHJcbiAgQ2xpY2tPdXRzaWRlRGlyZWN0aXZlLFxyXG4gIFNob3dIaWRlRWxlbWVudERpcmVjdGl2ZSxcclxuICBUaHJvd0VsZW1lbnRPbkhvdmVyRGlyZWN0aXZlLFxyXG4gIFRlbXBsYXRlUmVmZXJlbmNlRGlyZWN0aXZlLFxyXG4gIE1vdXNlRG93bkRpcmVjdGl2ZSxcclxuICBDb21wb25lbnRTaXplRGlyZWN0aXZlXHJcbn0gZnJvbSAnLi9kaXJlY3RpdmVzJztcclxuaW1wb3J0IHtcclxuICBCdXR0b25Db21wb25lbnQsXHJcbiAgVG9vbHRpcENvbXBvbmVudCxcclxuICBEZWxpbWV0ZXJDb21wb25lbnQsXHJcbiAgQm91bmNlTG9hZGVyQ29tcG9uZW50LFxyXG4gIENpcmNsZUxvYWRlckNvbXBvbmVudCxcclxuICBNb2RhbENvbXBvbmVudCxcclxuICBNb2RhbE9wZW5PbkNsaWNrRGlyZWN0aXZlLFxyXG4gIERlZmF1bHRNb2RhbEhlYWRlckNvbXBvbmVudCxcclxuICBEZWZhdWx0TW9kYWxGb290ZXJDb21wb25lbnQsXHJcbiAgSGFtYnVyZ2VyQ29tcG9uZW50LFxyXG4gIERvdHNDb21wb25lbnQsXHJcbiAgVG9nZ2xlU3dpdGNoZXJDb21wb25lbnQsXHJcbiAgQ2hlY2ttYXJrQ29tcG9uZW50XHJcbn0gZnJvbSAnLi9jb21wb25lbnRzJztcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICAvLyBkaXJlY3RpdmVzXHJcbiAgICBDbGlja091dHNpZGVEaXJlY3RpdmUsXHJcbiAgICBTaG93SGlkZUVsZW1lbnREaXJlY3RpdmUsXHJcbiAgICBUaHJvd0VsZW1lbnRPbkhvdmVyRGlyZWN0aXZlLFxyXG4gICAgVGVtcGxhdGVSZWZlcmVuY2VEaXJlY3RpdmUsXHJcbiAgICBNb3VzZURvd25EaXJlY3RpdmUsXHJcbiAgICBDb21wb25lbnRTaXplRGlyZWN0aXZlLFxyXG4gICAgLy8gY29tcG9uZW50c1xyXG4gICAgQnV0dG9uQ29tcG9uZW50LFxyXG4gICAgVG9vbHRpcENvbXBvbmVudCxcclxuICAgIERlbGltZXRlckNvbXBvbmVudCxcclxuICAgIC8vIGxvYWRlcnNcclxuICAgIEJvdW5jZUxvYWRlckNvbXBvbmVudCxcclxuICAgIENpcmNsZUxvYWRlckNvbXBvbmVudCxcclxuICAgIC8vIG1vZGFsXHJcbiAgICBNb2RhbENvbXBvbmVudCxcclxuICAgIE1vZGFsT3Blbk9uQ2xpY2tEaXJlY3RpdmUsXHJcbiAgICBEZWZhdWx0TW9kYWxIZWFkZXJDb21wb25lbnQsXHJcbiAgICBEZWZhdWx0TW9kYWxGb290ZXJDb21wb25lbnQsXHJcbiAgICAvLyBoYW1idXJnZXJcclxuICAgIEhhbWJ1cmdlckNvbXBvbmVudCxcclxuICAgIC8vIGRvdHNcclxuICAgIERvdHNDb21wb25lbnQsXHJcbiAgICAvL3RvZ2dsZVxyXG4gICAgVG9nZ2xlU3dpdGNoZXJDb21wb25lbnQsXHJcbiAgICBDaGVja21hcmtDb21wb25lbnRcclxuICBdLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlXHJcbiAgXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICAvLyBkaXJlY3RpdmVzXHJcbiAgICBDbGlja091dHNpZGVEaXJlY3RpdmUsXHJcbiAgICBTaG93SGlkZUVsZW1lbnREaXJlY3RpdmUsXHJcbiAgICBUaHJvd0VsZW1lbnRPbkhvdmVyRGlyZWN0aXZlLFxyXG4gICAgVGVtcGxhdGVSZWZlcmVuY2VEaXJlY3RpdmUsXHJcbiAgICBNb3VzZURvd25EaXJlY3RpdmUsXHJcbiAgICBDb21wb25lbnRTaXplRGlyZWN0aXZlLFxyXG4gICAgLy8gY29tcG9uZW50c1xyXG4gICAgQnV0dG9uQ29tcG9uZW50LFxyXG4gICAgVG9vbHRpcENvbXBvbmVudCxcclxuICAgIERlbGltZXRlckNvbXBvbmVudCxcclxuICAgIC8vIGxvYWRlcnNcclxuICAgIEJvdW5jZUxvYWRlckNvbXBvbmVudCxcclxuICAgIENpcmNsZUxvYWRlckNvbXBvbmVudCxcclxuICAgIC8vIG1vZGFsXHJcbiAgICBNb2RhbENvbXBvbmVudCxcclxuICAgIE1vZGFsT3Blbk9uQ2xpY2tEaXJlY3RpdmUsXHJcbiAgICBEZWZhdWx0TW9kYWxIZWFkZXJDb21wb25lbnQsXHJcbiAgICBEZWZhdWx0TW9kYWxGb290ZXJDb21wb25lbnQsXHJcbiAgICAvLyBoYW1idXJnZXJcclxuICAgIEhhbWJ1cmdlckNvbXBvbmVudCxcclxuICAgIC8vIGRvdHNcclxuICAgIERvdHNDb21wb25lbnQsXHJcbiAgICAvL3RvZ2dsZVxyXG4gICAgVG9nZ2xlU3dpdGNoZXJDb21wb25lbnQsXHJcbiAgICBDaGVja21hcmtDb21wb25lbnRcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW0RPQ1VNRU5UX1BST1ZJREVSUywgV0lORE9XX1BST1ZJREVSU11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5neFNmY0NvbW1vbk1vZHVsZSB7fVxyXG4iXX0=
@@ -0,0 +1,70 @@
1
+ import { isPlatformBrowser } from '@angular/common';
2
+ import { InjectionToken, PLATFORM_ID, Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Create a new injection token for injecting the Document into a component.
6
+ */
7
+ export const DOCUMENT = new InjectionToken('DocumentToken');
8
+ /**
9
+ * Define abstract class for obtaining reference to the global Document object.
10
+ */
11
+ export class DocumentRef {
12
+ get nativeDocument() {
13
+ throw new Error('Not implemented.');
14
+ }
15
+ }
16
+ /**
17
+ * Define class that implements the abstract class and returns the native Document object.
18
+ */
19
+ export class BrowserDocumentRef extends DocumentRef {
20
+ constructor() {
21
+ super();
22
+ }
23
+ /**
24
+ * @returns Document object
25
+ */
26
+ get nativeDocument() {
27
+ return document;
28
+ }
29
+ }
30
+ BrowserDocumentRef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: BrowserDocumentRef, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
31
+ BrowserDocumentRef.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: BrowserDocumentRef });
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: BrowserDocumentRef, decorators: [{
33
+ type: Injectable
34
+ }], ctorParameters: function () { return []; } });
35
+ /**
36
+ * Create an factory function that returns the native Document object.
37
+ * @param browserDocumentRef Native Document object
38
+ * @param platformId id of platform
39
+ * @returns type of platform of empty object
40
+ */
41
+ export function documentFactory(browserDocumentRef, platformId) {
42
+ if (isPlatformBrowser(platformId)) {
43
+ return browserDocumentRef.nativeDocument;
44
+ }
45
+ const doc = {
46
+ hidden: false,
47
+ visibilityState: 'visible'
48
+ };
49
+ return doc;
50
+ }
51
+ /**
52
+ * Create a injectable provider for the DocumentRef token that uses the BrowserDocumentRef class.
53
+ */
54
+ export const browserDocumentProvider = {
55
+ provide: DocumentRef,
56
+ useClass: BrowserDocumentRef
57
+ };
58
+ /**
59
+ * Create an injectable provider that uses the DocumentFactory function for returning the native Document object.
60
+ */
61
+ export const documentProvider = {
62
+ provide: DOCUMENT,
63
+ useFactory: documentFactory,
64
+ deps: [DocumentRef, PLATFORM_ID]
65
+ };
66
+ /**
67
+ * Create an array of providers.
68
+ */
69
+ export const DOCUMENT_PROVIDERS = [browserDocumentProvider, documentProvider];
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtcmVmLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ZjLWNvbW1vbi9zcmMvbGliL3NlcnZpY2VzL2RvY3VtZW50LXJlZi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBa0MsY0FBYyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRXhHOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksY0FBYyxDQUFXLGVBQWUsQ0FBQyxDQUFDO0FBQ3RFOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixXQUFXO0lBQy9CLElBQUksY0FBYztRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFFSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsV0FBVztJQUNqRDtRQUNFLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYSxjQUFjO1FBQ3pCLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7OytHQVZVLGtCQUFrQjttSEFBbEIsa0JBQWtCOzJGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVU7O0FBY1g7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixrQkFBc0MsRUFDdEMsVUFBa0I7SUFFbEIsSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUNqQyxPQUFPLGtCQUFrQixDQUFDLGNBQWMsQ0FBQztLQUMxQztJQUNELE1BQU0sR0FBRyxHQUFHO1FBQ1YsTUFBTSxFQUFFLEtBQUs7UUFDYixlQUFlLEVBQUUsU0FBUztLQUMzQixDQUFBO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBa0I7SUFDcEQsT0FBTyxFQUFFLFdBQVc7SUFDcEIsUUFBUSxFQUFFLGtCQUFrQjtDQUM3QixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBb0I7SUFDL0MsT0FBTyxFQUFFLFFBQVE7SUFDakIsVUFBVSxFQUFFLGVBQWU7SUFDM0IsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztDQUNqQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLHVCQUF1QixFQUFFLGdCQUFnQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENsYXNzUHJvdmlkZXIsIEZhY3RvcnlQcm92aWRlciwgSW5qZWN0aW9uVG9rZW4sIFBMQVRGT1JNX0lELCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgbmV3IGluamVjdGlvbiB0b2tlbiBmb3IgaW5qZWN0aW5nIHRoZSBEb2N1bWVudCBpbnRvIGEgY29tcG9uZW50LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IERPQ1VNRU5UID0gbmV3IEluamVjdGlvblRva2VuPERvY3VtZW50PignRG9jdW1lbnRUb2tlbicpO1xyXG4vKipcclxuICogRGVmaW5lIGFic3RyYWN0IGNsYXNzIGZvciBvYnRhaW5pbmcgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgRG9jdW1lbnQgb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERvY3VtZW50UmVmIHtcclxuICBnZXQgbmF0aXZlRG9jdW1lbnQoKTogRG9jdW1lbnQgfCBPYmplY3Qge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRGVmaW5lIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgYWJzdHJhY3QgY2xhc3MgYW5kIHJldHVybnMgdGhlIG5hdGl2ZSBEb2N1bWVudCBvYmplY3QuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCcm93c2VyRG9jdW1lbnRSZWYgZXh0ZW5kcyBEb2N1bWVudFJlZiB7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHJldHVybnMgRG9jdW1lbnQgb2JqZWN0XHJcbiAgICovXHJcbiAgb3ZlcnJpZGUgZ2V0IG5hdGl2ZURvY3VtZW50KCk6IERvY3VtZW50IHwgT2JqZWN0IHtcclxuICAgIHJldHVybiBkb2N1bWVudDtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW4gZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5hdGl2ZSBEb2N1bWVudCBvYmplY3QuXHJcbiAqIEBwYXJhbSBicm93c2VyRG9jdW1lbnRSZWYgTmF0aXZlIERvY3VtZW50IG9iamVjdFxyXG4gKiBAcGFyYW0gcGxhdGZvcm1JZCBpZCBvZiBwbGF0Zm9ybVxyXG4gKiBAcmV0dXJucyB0eXBlIG9mIHBsYXRmb3JtIG9mIGVtcHR5IG9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRvY3VtZW50RmFjdG9yeShcclxuICBicm93c2VyRG9jdW1lbnRSZWY6IEJyb3dzZXJEb2N1bWVudFJlZixcclxuICBwbGF0Zm9ybUlkOiBPYmplY3RcclxuKTogRG9jdW1lbnQgfCBPYmplY3Qge1xyXG4gIGlmIChpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSkge1xyXG4gICAgcmV0dXJuIGJyb3dzZXJEb2N1bWVudFJlZi5uYXRpdmVEb2N1bWVudDtcclxuICB9XHJcbiAgY29uc3QgZG9jID0ge1xyXG4gICAgaGlkZGVuOiBmYWxzZSxcclxuICAgIHZpc2liaWxpdHlTdGF0ZTogJ3Zpc2libGUnXHJcbiAgfVxyXG4gIHJldHVybiBkb2M7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBpbmplY3RhYmxlIHByb3ZpZGVyIGZvciB0aGUgRG9jdW1lbnRSZWYgdG9rZW4gdGhhdCB1c2VzIHRoZSBCcm93c2VyRG9jdW1lbnRSZWYgY2xhc3MuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgYnJvd3NlckRvY3VtZW50UHJvdmlkZXI6IENsYXNzUHJvdmlkZXIgPSB7XHJcbiAgcHJvdmlkZTogRG9jdW1lbnRSZWYsXHJcbiAgdXNlQ2xhc3M6IEJyb3dzZXJEb2N1bWVudFJlZlxyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBpbmplY3RhYmxlIHByb3ZpZGVyIHRoYXQgdXNlcyB0aGUgRG9jdW1lbnRGYWN0b3J5IGZ1bmN0aW9uIGZvciByZXR1cm5pbmcgdGhlIG5hdGl2ZSBEb2N1bWVudCBvYmplY3QuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZG9jdW1lbnRQcm92aWRlcjogRmFjdG9yeVByb3ZpZGVyID0ge1xyXG4gIHByb3ZpZGU6IERPQ1VNRU5ULFxyXG4gIHVzZUZhY3Rvcnk6IGRvY3VtZW50RmFjdG9yeSxcclxuICBkZXBzOiBbRG9jdW1lbnRSZWYsIFBMQVRGT1JNX0lEXVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBhcnJheSBvZiBwcm92aWRlcnMuXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgRE9DVU1FTlRfUFJPVklERVJTID0gW2Jyb3dzZXJEb2N1bWVudFByb3ZpZGVyLCBkb2N1bWVudFByb3ZpZGVyXTsiXX0=
@@ -0,0 +1,4 @@
1
+ export * from './document-ref.service';
2
+ export * from './window-ref.service';
3
+ export * from './resize.service';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ZjLWNvbW1vbi9zcmMvbGliL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLGNBQWMsd0JBQXdCLENBQUE7QUFDdEMsY0FBYyxzQkFBc0IsQ0FBQTtBQUNwQyxjQUFjLGtCQUFrQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmV4cG9ydCAqIGZyb20gJy4vZG9jdW1lbnQtcmVmLnNlcnZpY2UnXHJcbmV4cG9ydCAqIGZyb20gJy4vd2luZG93LXJlZi5zZXJ2aWNlJ1xyXG5leHBvcnQgKiBmcm9tICcuL3Jlc2l6ZS5zZXJ2aWNlJ1xyXG4iXX0=
@@ -0,0 +1,42 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/platform-browser";
5
+ export class ResizeService {
6
+ constructor(eventManager) {
7
+ this.eventManager = eventManager;
8
+ this.resizeSubject = new Subject();
9
+ this.eventManager.addGlobalEventListener('window', 'resize', this.onResize.bind(this));
10
+ this.eventManager.addGlobalEventListener('window', 'onload', this.onLoaded.bind(this));
11
+ }
12
+ /**
13
+ * Makes resizeSubject become Observable
14
+ * @returns Observable of resizeSubject
15
+ */
16
+ get onResize$() {
17
+ return this.resizeSubject.asObservable();
18
+ }
19
+ /**
20
+ * Handler of 'resize' event. Passes data throw resizeSubject
21
+ * @param event Event Object of 'resize' event
22
+ */
23
+ onResize(event) {
24
+ this.resizeSubject.next(event.target);
25
+ }
26
+ /**
27
+ * Handler of 'onload' event. Defines the width of window
28
+ * @param event Event Object of 'onload' event
29
+ */
30
+ onLoaded(event) {
31
+ this.windowWidth = event.target;
32
+ }
33
+ }
34
+ ResizeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: ResizeService, deps: [{ token: i1.EventManager }], target: i0.ɵɵFactoryTarget.Injectable });
35
+ ResizeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: ResizeService, providedIn: 'root' });
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: ResizeService, decorators: [{
37
+ type: Injectable,
38
+ args: [{
39
+ providedIn: 'root'
40
+ }]
41
+ }], ctorParameters: function () { return [{ type: i1.EventManager }]; } });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ZjLWNvbW1vbi9zcmMvbGliL3NlcnZpY2VzL3Jlc2l6ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBSzNDLE1BQU0sT0FBTyxhQUFhO0lBbUJ4QixZQUFvQixZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUM1QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FDdEMsUUFBUSxFQUNSLFFBQVEsRUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDekIsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQ3RDLFFBQVEsRUFDUixRQUFRLEVBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3pCLENBQUM7SUFDSixDQUFDO0lBekJEOzs7T0FHRztJQUNILElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBcUJEOzs7T0FHRztJQUNLLFFBQVEsQ0FBQyxLQUFjO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFTLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssUUFBUSxDQUFDLEtBQWM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBVyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzFDLENBQUM7OzBHQS9DVSxhQUFhOzhHQUFiLGFBQWEsY0FGWixNQUFNOzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFdmVudE1hbmFnZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVzaXplU2VydmljZSB7XHJcbiAgLyoqXHJcbiAgICAgKiBXaWR0aCBvZiB3aW5kb3dcclxuICAgICAqL1xyXG4gIHB1YmxpYyB3aW5kb3dXaWR0aDogYW55O1xyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyByZXNpemVTdWJqZWN0IGJlY29tZSBPYnNlcnZhYmxlXHJcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiByZXNpemVTdWJqZWN0XHJcbiAgICovXHJcbiAgZ2V0IG9uUmVzaXplJCgpOiBPYnNlcnZhYmxlPFdpbmRvdz4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzaXplU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YmplY3Qgb2YgJ3Jlc2l6ZScgZXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIHJlc2l6ZVN1YmplY3Q6IFN1YmplY3Q8V2luZG93PjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBldmVudE1hbmFnZXI6IEV2ZW50TWFuYWdlcikge1xyXG4gICAgdGhpcy5yZXNpemVTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTtcclxuICAgIHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEdsb2JhbEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICd3aW5kb3cnLFxyXG4gICAgICAncmVzaXplJyxcclxuICAgICAgdGhpcy5vblJlc2l6ZS5iaW5kKHRoaXMpXHJcbiAgICApO1xyXG4gICAgdGhpcy5ldmVudE1hbmFnZXIuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcihcclxuICAgICAgJ3dpbmRvdycsXHJcbiAgICAgICdvbmxvYWQnLFxyXG4gICAgICB0aGlzLm9uTG9hZGVkLmJpbmQodGhpcylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVyIG9mICdyZXNpemUnIGV2ZW50LiBQYXNzZXMgZGF0YSB0aHJvdyByZXNpemVTdWJqZWN0XHJcbiAgICogQHBhcmFtIGV2ZW50IEV2ZW50IE9iamVjdCBvZiAncmVzaXplJyBldmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25SZXNpemUoZXZlbnQ6IFVJRXZlbnQpIHtcclxuICAgIHRoaXMucmVzaXplU3ViamVjdC5uZXh0KDxXaW5kb3c+ZXZlbnQudGFyZ2V0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXIgb2YgJ29ubG9hZCcgZXZlbnQuIERlZmluZXMgdGhlIHdpZHRoIG9mIHdpbmRvd1xyXG4gICAqIEBwYXJhbSBldmVudCBFdmVudCBPYmplY3Qgb2YgJ29ubG9hZCcgZXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIG9uTG9hZGVkKGV2ZW50OiBVSUV2ZW50KSB7XHJcbiAgICB0aGlzLndpbmRvd1dpZHRoID0gPFdpbmRvdz5ldmVudC50YXJnZXQ7XHJcbiAgfVxyXG59Il19
@@ -0,0 +1,70 @@
1
+ import { isPlatformBrowser } from '@angular/common';
2
+ import { InjectionToken, PLATFORM_ID, Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Create a new injection token for injecting the window into a component.
6
+ */
7
+ export const WINDOW = new InjectionToken('WindowToken');
8
+ /**
9
+ * Define abstract class for obtaining reference to the global window object.
10
+ */
11
+ export class WindowRef {
12
+ get nativeWindow() {
13
+ throw new Error('Not implemented.');
14
+ }
15
+ }
16
+ /**
17
+ * Define class that implements the abstract class and returns the native window object.
18
+ */
19
+ export class BrowserWindowRef extends WindowRef {
20
+ constructor() {
21
+ super();
22
+ }
23
+ /**
24
+ * @returns window object
25
+ */
26
+ get nativeWindow() {
27
+ return window;
28
+ }
29
+ }
30
+ BrowserWindowRef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: BrowserWindowRef, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
31
+ BrowserWindowRef.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: BrowserWindowRef });
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImport: i0, type: BrowserWindowRef, decorators: [{
33
+ type: Injectable
34
+ }], ctorParameters: function () { return []; } });
35
+ /**
36
+ * Create an factory function that returns the native window object.
37
+ * @param browserWindowRef Native window object
38
+ * @param platformId id of platform
39
+ * @returns type of platform of empty object
40
+ */
41
+ export function windowFactory(browserWindowRef, platformId) {
42
+ if (isPlatformBrowser(platformId)) {
43
+ return browserWindowRef.nativeWindow;
44
+ }
45
+ const obj = {
46
+ setTimeout: (func, time) => { },
47
+ clearTimeout: (a) => { }
48
+ };
49
+ return obj;
50
+ }
51
+ /**
52
+ * Create a injectable provider for the WindowRef token that uses the BrowserWindowRef class.
53
+ */
54
+ export const browserWindowProvider = {
55
+ provide: WindowRef,
56
+ useClass: BrowserWindowRef
57
+ };
58
+ /**
59
+ * Create an injectable provider that uses the windowFactory function for returning the native window object.
60
+ */
61
+ export const windowProvider = {
62
+ provide: WINDOW,
63
+ useFactory: windowFactory,
64
+ deps: [WindowRef, PLATFORM_ID]
65
+ };
66
+ /**
67
+ * Create an array of providers.
68
+ */
69
+ export const WINDOW_PROVIDERS = [browserWindowProvider, windowProvider];
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LXJlZi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNmYy1jb21tb24vc3JjL2xpYi9zZXJ2aWNlcy93aW5kb3ctcmVmLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFrQyxjQUFjLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFeEc7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7QUFFeEQ7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLFNBQVM7SUFDN0IsSUFBSSxZQUFZO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFNBQVM7SUFDN0M7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRDs7T0FFRztJQUNILElBQWEsWUFBWTtRQUN2QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOzs2R0FWVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVOztBQWNYOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsZ0JBQWtDLEVBQ2xDLFVBQWtCO0lBRWxCLElBQUksaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDakMsT0FBTyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7S0FDdEM7SUFDRCxNQUFNLEdBQUcsR0FBRztRQUNWLFVBQVUsRUFBRSxDQUFDLElBQVMsRUFBRSxJQUFTLEVBQUUsRUFBRSxHQUFHLENBQUM7UUFDekMsWUFBWSxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRyxDQUFDO0tBQzlCLENBQUE7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFrQjtJQUNsRCxPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsZ0JBQWdCO0NBQzNCLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBb0I7SUFDN0MsT0FBTyxFQUFFLE1BQU07SUFDZixVQUFVLEVBQUUsYUFBYTtJQUN6QixJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO0NBQy9CLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMscUJBQXFCLEVBQUUsY0FBYyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENsYXNzUHJvdmlkZXIsIEZhY3RvcnlQcm92aWRlciwgSW5qZWN0aW9uVG9rZW4sIFBMQVRGT1JNX0lELCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgbmV3IGluamVjdGlvbiB0b2tlbiBmb3IgaW5qZWN0aW5nIHRoZSB3aW5kb3cgaW50byBhIGNvbXBvbmVudC5cclxuICovXHJcbmV4cG9ydCBjb25zdCBXSU5ET1cgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1dpbmRvd1Rva2VuJyk7XHJcblxyXG4vKipcclxuICogRGVmaW5lIGFic3RyYWN0IGNsYXNzIGZvciBvYnRhaW5pbmcgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgd2luZG93IG9iamVjdC5cclxuICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBXaW5kb3dSZWYge1xyXG4gIGdldCBuYXRpdmVXaW5kb3coKTogV2luZG93IHwgT2JqZWN0IHtcclxuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIERlZmluZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGFic3RyYWN0IGNsYXNzIGFuZCByZXR1cm5zIHRoZSBuYXRpdmUgd2luZG93IG9iamVjdC5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEJyb3dzZXJXaW5kb3dSZWYgZXh0ZW5kcyBXaW5kb3dSZWYge1xyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEByZXR1cm5zIHdpbmRvdyBvYmplY3RcclxuICAgKi9cclxuICBvdmVycmlkZSBnZXQgbmF0aXZlV2luZG93KCk6IFdpbmRvdyB8IE9iamVjdCB7XHJcbiAgICByZXR1cm4gd2luZG93O1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmF0aXZlIHdpbmRvdyBvYmplY3QuXHJcbiAqIEBwYXJhbSBicm93c2VyV2luZG93UmVmIE5hdGl2ZSB3aW5kb3cgb2JqZWN0XHJcbiAqIEBwYXJhbSBwbGF0Zm9ybUlkIGlkIG9mIHBsYXRmb3JtXHJcbiAqIEByZXR1cm5zIHR5cGUgb2YgcGxhdGZvcm0gb2YgZW1wdHkgb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gd2luZG93RmFjdG9yeShcclxuICBicm93c2VyV2luZG93UmVmOiBCcm93c2VyV2luZG93UmVmLFxyXG4gIHBsYXRmb3JtSWQ6IE9iamVjdFxyXG4pOiBXaW5kb3cgfCBPYmplY3Qge1xyXG4gIGlmIChpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSkge1xyXG4gICAgcmV0dXJuIGJyb3dzZXJXaW5kb3dSZWYubmF0aXZlV2luZG93O1xyXG4gIH1cclxuICBjb25zdCBvYmogPSB7XHJcbiAgICBzZXRUaW1lb3V0OiAoZnVuYzogYW55LCB0aW1lOiBhbnkpID0+IHsgfSxcclxuICAgIGNsZWFyVGltZW91dDogKGE6IGFueSkgPT4geyB9XHJcbiAgfVxyXG4gIHJldHVybiBvYmo7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBpbmplY3RhYmxlIHByb3ZpZGVyIGZvciB0aGUgV2luZG93UmVmIHRva2VuIHRoYXQgdXNlcyB0aGUgQnJvd3NlcldpbmRvd1JlZiBjbGFzcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBicm93c2VyV2luZG93UHJvdmlkZXI6IENsYXNzUHJvdmlkZXIgPSB7XHJcbiAgcHJvdmlkZTogV2luZG93UmVmLFxyXG4gIHVzZUNsYXNzOiBCcm93c2VyV2luZG93UmVmXHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuIGluamVjdGFibGUgcHJvdmlkZXIgdGhhdCB1c2VzIHRoZSB3aW5kb3dGYWN0b3J5IGZ1bmN0aW9uIGZvciByZXR1cm5pbmcgdGhlIG5hdGl2ZSB3aW5kb3cgb2JqZWN0LlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHdpbmRvd1Byb3ZpZGVyOiBGYWN0b3J5UHJvdmlkZXIgPSB7XHJcbiAgcHJvdmlkZTogV0lORE9XLFxyXG4gIHVzZUZhY3Rvcnk6IHdpbmRvd0ZhY3RvcnksXHJcbiAgZGVwczogW1dpbmRvd1JlZiwgUExBVEZPUk1fSURdXHJcbn07XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuIGFycmF5IG9mIHByb3ZpZGVycy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBXSU5ET1dfUFJPVklERVJTID0gW2Jyb3dzZXJXaW5kb3dQcm92aWRlciwgd2luZG93UHJvdmlkZXJdO1xyXG4iXX0=
@@ -0,0 +1,244 @@
1
+ import { CommonConstants } from "../constants";
2
+ import { SortingDirection } from "../enums";
3
+ import { isDefined } from "./common.utils";
4
+ import { isNullOrEmptyString } from "./string.utils";
5
+ /**
6
+ * Return true if collection not empty
7
+ * @param collection Array of items
8
+ * @returns True if collection not empty
9
+ */
10
+ export function any(collection) {
11
+ return isDefined(collection) && collection.length > 0;
12
+ }
13
+ /**
14
+ * Return true if collection has such value
15
+ * @param collection Array of items
16
+ * @param value Value to check
17
+ * @returns True if found value in collection
18
+ */
19
+ export function hasItem(collection, value) {
20
+ return any(collection)
21
+ && collection.findIndex(item => item === value) !== CommonConstants.NOT_FOUND_INDEX;
22
+ }
23
+ /**
24
+ * Return true if collection has such value by predicate function
25
+ * @param collection Array of items
26
+ * @param predicate Function to define check logic
27
+ * @returns True if found value in collection
28
+ */
29
+ export function hasItemBy(collection, predicate) {
30
+ return any(collection) && collection.findIndex(predicate) !== CommonConstants.NOT_FOUND_INDEX;
31
+ }
32
+ /**
33
+ * Return true if collection of objects has such value as object
34
+ * @param collection Array of objects
35
+ * @param property Property name
36
+ * @param value Value to check
37
+ * @returns True if found value in collection
38
+ */
39
+ export function hasObjectItem(collection, // TODO <-- Array<T>
40
+ property, value) {
41
+ return any(collection)
42
+ && collection.findIndex(item => item.hasOwnProperty(property)
43
+ && item[property] === value) !== CommonConstants.NOT_FOUND_INDEX;
44
+ }
45
+ /**
46
+ * Return value from collection by predicate function
47
+ * @param collection Array of items
48
+ * @param predicate Function to define search logic
49
+ * @returns Value from collection
50
+ */
51
+ export function firstOrDefault(collection, predicate) {
52
+ return any(collection) ? collection?.find(predicate) : undefined;
53
+ }
54
+ /**
55
+ * Return first item from collection
56
+ * @param collection Array of items
57
+ * @returns First value from collection
58
+ */
59
+ export function firstItem(collection) {
60
+ return any(collection) ? collection[0] : null;
61
+ }
62
+ /**
63
+ * Return last item from collection
64
+ * @param collection Array of items
65
+ * @returns Last value from collection
66
+ */
67
+ export function lastItem(collection) {
68
+ return any(collection) ? collection[collection.length - 1] : null;
69
+ }
70
+ /**
71
+ * Return True if all values match predicate function
72
+ * @param collection Array of objects
73
+ * @param predicate Function to define check logic
74
+ * @returns True if all values match predicate
75
+ */
76
+ export function all(collection, predicate) {
77
+ return any(collection) ? collection.filter(predicate).length == collection.length : false;
78
+ }
79
+ /**
80
+ * Return items from collection by predicate function
81
+ * @param collection Array of items
82
+ * @param predicate Function to define search logic
83
+ * @returns Values from collection
84
+ */
85
+ export function where(collection, predicate) {
86
+ return any(collection) ? collection.filter(predicate) : null;
87
+ }
88
+ /**
89
+ * Return sliced collection by page number and page size
90
+ * @param collection Array of items
91
+ * @param page Page number
92
+ * @param size Page size
93
+ * @returns Sliced collection
94
+ */
95
+ export function skip(collection, page, size) {
96
+ if (any(collection)) {
97
+ let start = (page - 1) * size;
98
+ return collection.slice(start, start + size);
99
+ }
100
+ return collection;
101
+ }
102
+ /**
103
+ * Return sorted collection of objects by property
104
+ * @param collection Array of items
105
+ * @param property Property name
106
+ * @param direction Sorting direction
107
+ * @returns Sorted collection
108
+ */
109
+ export function sortBy(collection, property, direction) {
110
+ if (any(collection)) {
111
+ let _sortFunc = (a, b) => (t1, t2) => (a[property] > b[property] ? t1 : t2);
112
+ return direction == SortingDirection.Ascending
113
+ ? collection.sort((a, b) => _sortFunc(a, b)(1, -1))
114
+ : collection.sort((a, b) => _sortFunc(a, b)(-1, 1));
115
+ }
116
+ return collection;
117
+ }
118
+ /**
119
+ * Return sorted collection of objects by path
120
+ * @param collection Array of items
121
+ * @param path Path to property
122
+ * @param direction Sorting direction
123
+ * @returns Sorted collection
124
+ */
125
+ export function sortByPath(collection, path, direction) {
126
+ if (any(collection)) {
127
+ if (isNullOrEmptyString(path))
128
+ throw new Error('Collection utils | Sort By Path function --> Path is empty.');
129
+ const pathParts = path.split('.');
130
+ if (!any(pathParts))
131
+ throw new Error('Collection utils | Sort By Path function --> Path is incorrect.');
132
+ const partsLength = pathParts.length;
133
+ collection.sort((a, b) => {
134
+ var i = 0;
135
+ while (i < partsLength) {
136
+ a = a[pathParts[i]];
137
+ b = b[pathParts[i]];
138
+ i++;
139
+ }
140
+ return direction == SortingDirection.Ascending
141
+ ? a > b ? 1 : -1
142
+ : a > b ? -1 : 1;
143
+ });
144
+ return collection;
145
+ }
146
+ return collection;
147
+ }
148
+ /**
149
+ * Return collection without matches
150
+ * @param collection Array of items
151
+ * @returns Collection without matches
152
+ */
153
+ export function distinct(collection) {
154
+ return any(collection)
155
+ ? collection.filter((value, index, self) => self.indexOf(value) === index)
156
+ : collection;
157
+ }
158
+ /**
159
+ * Return sum value from collection items by map function
160
+ * @param collection Array of items
161
+ * @param select Map function
162
+ * @returns Sum value of colection items
163
+ */
164
+ export function sum(collection, select) {
165
+ return any(collection)
166
+ ? collection
167
+ .map(select)
168
+ .reduce((a, b) => { return a + b; }, 0)
169
+ : 0;
170
+ }
171
+ /**
172
+ * Return max value from collection items by map function
173
+ * @param collection Array of items
174
+ * @param select Map function
175
+ * @returns Max value of collection items
176
+ */
177
+ export function max(collection, select) {
178
+ if (any(collection))
179
+ return Math.max(...collection.map(select));
180
+ throw new Error('Collection utils | Max function --> Collection is empty.');
181
+ }
182
+ /**
183
+ * Delete items from collection by predicate
184
+ * @param collection Array of items
185
+ * @param predicate Function to define remove logic
186
+ */
187
+ export function remove(collection, predicate) {
188
+ var i = collection.length;
189
+ while (i--) {
190
+ if (predicate(collection[i])) {
191
+ collection.splice(i, 1);
192
+ }
193
+ }
194
+ }
195
+ /**
196
+ * Add item to collection
197
+ * @param collection Array of items
198
+ * @param item New item
199
+ * @param predicate Function to define if allowed to add new item
200
+ * @returns True if successfully added
201
+ */
202
+ export function addItem(collection, item, predicate) {
203
+ if (!isDefined(collection))
204
+ collection = new Array();
205
+ if (isDefined(predicate) && predicate(item))
206
+ return false;
207
+ collection.push(item);
208
+ return true;
209
+ }
210
+ /**
211
+ * Delete item from collection by predicate
212
+ * @param collection Array of items
213
+ * @param predicate Function to define remove logic
214
+ * @returns True if successfully removed
215
+ */
216
+ export function removeItem(collection, predicate) {
217
+ const foundItem = firstOrDefault(collection, predicate);
218
+ if (isDefined(foundItem)) {
219
+ collection.splice(collection.indexOf(foundItem), 1);
220
+ return true;
221
+ }
222
+ return false;
223
+ }
224
+ export function updateItem(collection, predicate, newItem) {
225
+ const itemIndex = collection.findIndex(predicate);
226
+ if (itemIndex !== CommonConstants.NOT_FOUND_INDEX) {
227
+ const result = collection.slice(0);
228
+ result[itemIndex] = {
229
+ ...collection[itemIndex],
230
+ ...newItem
231
+ };
232
+ return result;
233
+ }
234
+ return null;
235
+ }
236
+ /**
237
+ * Return collection or empty if collection is not defined
238
+ * @param collection Array of items
239
+ * @returns Collection or empty
240
+ */
241
+ export function getCollectionOrEmpty(collection) {
242
+ return isDefined(collection) ? collection : [];
243
+ }
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnMudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc2ZjLWNvbW1vbi9zcmMvbGliL3V0aWxzL2NvbGxlY3Rpb25zLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsQ0FBSSxVQUF1QztJQUMxRCxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSyxVQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBSSxVQUFvQixFQUFFLEtBQVE7SUFDckQsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDO1dBQ2YsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsS0FBSyxlQUFlLENBQUMsZUFBZSxDQUFDO0FBQzVGLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUksVUFBb0IsRUFBRSxTQUErQjtJQUM5RSxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLGVBQWUsQ0FBQyxlQUFlLENBQUM7QUFDbEcsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUksVUFBc0IsRUFBRSxvQkFBb0I7QUFDekUsUUFBZ0IsRUFBRSxLQUFRO0lBQzFCLE9BQU8s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QWUsRUFBRTtRQUMvQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRztZQUNoQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7WUFDeEIsR0FBRyxPQUFPO1NBQ2IsQ0FBQztRQUNGLE9BQU8sTUFBTSxDQUFBO0tBQ2hCO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUksVUFBb0I7SUFDeEQsT0FBTyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Db25zdGFudHMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IFNvcnRpbmdEaXJlY3Rpb24gfSBmcm9tIFwiLi4vZW51bXNcIjtcclxuaW1wb3J0IHsgaXNEZWZpbmVkIH0gZnJvbSBcIi4vY29tbW9uLnV0aWxzXCI7XHJcbmltcG9ydCB7IGlzTnVsbE9yRW1wdHlTdHJpbmcgfSBmcm9tIFwiLi9zdHJpbmcudXRpbHNcIjtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiBjb2xsZWN0aW9uIG5vdCBlbXB0eVxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcmV0dXJucyBUcnVlIGlmIGNvbGxlY3Rpb24gbm90IGVtcHR5XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYW55PFQ+KGNvbGxlY3Rpb246IEFycmF5PFQ+IHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlzRGVmaW5lZChjb2xsZWN0aW9uKSAmJiAoY29sbGVjdGlvbiBhcyBBcnJheTxUPikubGVuZ3RoID4gMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIGNvbGxlY3Rpb24gaGFzIHN1Y2ggdmFsdWVcclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHBhcmFtIHZhbHVlIFZhbHVlIHRvIGNoZWNrXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgZm91bmQgdmFsdWUgaW4gY29sbGVjdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhhc0l0ZW08VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIHZhbHVlOiBUKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gYW55KGNvbGxlY3Rpb24pXHJcbiAgICAgICAgJiYgY29sbGVjdGlvbi5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSB2YWx1ZSkgIT09IENvbW1vbkNvbnN0YW50cy5OT1RfRk9VTkRfSU5ERVg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdHJ1ZSBpZiBjb2xsZWN0aW9uIGhhcyBzdWNoIHZhbHVlIGJ5IHByZWRpY2F0ZSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRvIGRlZmluZSBjaGVjayBsb2dpY1xyXG4gKiBAcmV0dXJucyBUcnVlIGlmIGZvdW5kIHZhbHVlIGluIGNvbGxlY3Rpb25cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBoYXNJdGVtQnk8VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBhbnkoY29sbGVjdGlvbikgJiYgY29sbGVjdGlvbi5maW5kSW5kZXgocHJlZGljYXRlKSAhPT0gQ29tbW9uQ29uc3RhbnRzLk5PVF9GT1VORF9JTkRFWDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiB0cnVlIGlmIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBoYXMgc3VjaCB2YWx1ZSBhcyBvYmplY3RcclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2Ygb2JqZWN0c1xyXG4gKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgbmFtZVxyXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gY2hlY2tcclxuICogQHJldHVybnMgVHJ1ZSBpZiBmb3VuZCB2YWx1ZSBpbiBjb2xsZWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaGFzT2JqZWN0SXRlbTxUPihjb2xsZWN0aW9uOiBBcnJheTxhbnk+LCAvLyBUT0RPIDwtLSBBcnJheTxUPlxyXG4gICAgcHJvcGVydHk6IHN0cmluZywgdmFsdWU6IFQpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBhbnkoY29sbGVjdGlvbilcclxuICAgICAgICAmJiBjb2xsZWN0aW9uLmZpbmRJbmRleChpdGVtID0+XHJcbiAgICAgICAgICAgIGl0ZW0uaGFzT3duUHJvcGVydHkocHJvcGVydHkpXHJcbiAgICAgICAgICAgICYmIGl0ZW1bcHJvcGVydHldID09PSB2YWx1ZSkgIT09IENvbW1vbkNvbnN0YW50cy5OT1RfRk9VTkRfSU5ERVg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdmFsdWUgZnJvbSBjb2xsZWN0aW9uIGJ5IHByZWRpY2F0ZSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRvIGRlZmluZSBzZWFyY2ggbG9naWNcclxuICogQHJldHVybnMgVmFsdWUgZnJvbSBjb2xsZWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmlyc3RPckRlZmF1bHQ8VD4oY29sbGVjdGlvbjogQXJyYXk8VD4gfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbilcclxuICAgIDogVCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gYW55KGNvbGxlY3Rpb24pID8gY29sbGVjdGlvbj8uZmluZChwcmVkaWNhdGUpIDogdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIGZpcnN0IGl0ZW0gZnJvbSBjb2xsZWN0aW9uXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEByZXR1cm5zIEZpcnN0IHZhbHVlIGZyb20gY29sbGVjdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0SXRlbTxUPihjb2xsZWN0aW9uOiBBcnJheTxUPik6IFQgfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiBhbnkoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uWzBdIDogbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBsYXN0IGl0ZW0gZnJvbSBjb2xsZWN0aW9uXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEByZXR1cm5zIExhc3QgdmFsdWUgZnJvbSBjb2xsZWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbGFzdEl0ZW08VD4oY29sbGVjdGlvbjogQXJyYXk8VD4pOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gYW55KGNvbGxlY3Rpb24pID8gY29sbGVjdGlvbltjb2xsZWN0aW9uLmxlbmd0aCAtIDFdIDogbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBUcnVlIGlmIGFsbCB2YWx1ZXMgbWF0Y2ggcHJlZGljYXRlIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIG9iamVjdHNcclxuICogQHBhcmFtIHByZWRpY2F0ZSBGdW5jdGlvbiB0byBkZWZpbmUgY2hlY2sgbG9naWNcclxuICogQHJldHVybnMgVHJ1ZSBpZiBhbGwgdmFsdWVzIG1hdGNoIHByZWRpY2F0ZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFsbDxUPihjb2xsZWN0aW9uOiBBcnJheTxUPiwgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGFueShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24uZmlsdGVyKHByZWRpY2F0ZSkubGVuZ3RoID09IGNvbGxlY3Rpb24ubGVuZ3RoIDogZmFsc2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gaXRlbXMgZnJvbSBjb2xsZWN0aW9uIGJ5IHByZWRpY2F0ZSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcGFyYW0gcHJlZGljYXRlIEZ1bmN0aW9uIHRvIGRlZmluZSBzZWFyY2ggbG9naWNcclxuICogQHJldHVybnMgVmFsdWVzIGZyb20gY29sbGVjdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHdoZXJlPFQ+KGNvbGxlY3Rpb246IEFycmF5PFQ+LCBwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBib29sZWFuKVxyXG4gICAgOiBBcnJheTxUPiB8IG51bGwgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGFueShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24uZmlsdGVyKHByZWRpY2F0ZSkgOiBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHNsaWNlZCBjb2xsZWN0aW9uIGJ5IHBhZ2UgbnVtYmVyIGFuZCBwYWdlIHNpemVcclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHBhcmFtIHBhZ2UgUGFnZSBudW1iZXJcclxuICogQHBhcmFtIHNpemUgUGFnZSBzaXplXHJcbiAqIEByZXR1cm5zIFNsaWNlZCBjb2xsZWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2tpcDxUPihjb2xsZWN0aW9uOiBBcnJheTxUPiwgcGFnZTogbnVtYmVyLCBzaXplOiBudW1iZXIpOiBBcnJheTxUPiB7XHJcbiAgICBpZiAoYW55KGNvbGxlY3Rpb24pKSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0ID0gKHBhZ2UgLSAxKSAqIHNpemU7XHJcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgc2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gc29ydGVkIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBieSBwcm9wZXJ0eVxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgbmFtZVxyXG4gKiBAcGFyYW0gZGlyZWN0aW9uIFNvcnRpbmcgZGlyZWN0aW9uXHJcbiAqIEByZXR1cm5zIFNvcnRlZCBjb2xsZWN0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc29ydEJ5PFQ+KGNvbGxlY3Rpb246IEFycmF5PFQ+LCBwcm9wZXJ0eTogc3RyaW5nLFxyXG4gICAgZGlyZWN0aW9uOiBTb3J0aW5nRGlyZWN0aW9uKTogQXJyYXk8VD4ge1xyXG4gICAgaWYgKGFueShjb2xsZWN0aW9uKSkge1xyXG4gICAgICAgIGxldCBfc29ydEZ1bmMgPSAoYTogYW55LCBiOiBhbnkpID0+XHJcbiAgICAgICAgICAgICh0MTogbnVtYmVyLCB0MjogbnVtYmVyKSA9PlxyXG4gICAgICAgICAgICAgICAgKGFbcHJvcGVydHldID4gYltwcm9wZXJ0eV0gPyB0MSA6IHQyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PSBTb3J0aW5nRGlyZWN0aW9uLkFzY2VuZGluZ1xyXG4gICAgICAgICAgICA/IGNvbGxlY3Rpb24uc29ydCgoYTogYW55LCBiOiBhbnkpID0+IF9zb3J0RnVuYyhhLCBiKSgxLCAtMSkpXHJcbiAgICAgICAgICAgIDogY29sbGVjdGlvbi5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gX3NvcnRGdW5jKGEsIGIpKC0xLCAxKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gc29ydGVkIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBieSBwYXRoXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEBwYXJhbSBwYXRoIFBhdGggdG8gcHJvcGVydHlcclxuICogQHBhcmFtIGRpcmVjdGlvbiBTb3J0aW5nIGRpcmVjdGlvblxyXG4gKiBAcmV0dXJucyBTb3J0ZWQgY29sbGVjdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRCeVBhdGg8VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIHBhdGg6IHN0cmluZywgZGlyZWN0aW9uOiBTb3J0aW5nRGlyZWN0aW9uKVxyXG4gICAgOiBBcnJheTxUPiB7XHJcbiAgICBpZiAoYW55KGNvbGxlY3Rpb24pKSB7XHJcbiAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHlTdHJpbmcocGF0aCkpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbiB1dGlscyB8IFNvcnQgQnkgUGF0aCBmdW5jdGlvbiAtLT4gUGF0aCBpcyBlbXB0eS4nKTtcclxuXHJcbiAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdCgnLicpO1xyXG5cclxuICAgICAgICBpZiAoIWFueShwYXRoUGFydHMpKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb24gdXRpbHMgfCBTb3J0IEJ5IFBhdGggZnVuY3Rpb24gLS0+IFBhdGggaXMgaW5jb3JyZWN0LicpO1xyXG5cclxuICAgICAgICBjb25zdCBwYXJ0c0xlbmd0aCA9IHBhdGhQYXJ0cy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGNvbGxlY3Rpb24uc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdmFyIGkgPSAwO1xyXG4gICAgICAgICAgICB3aGlsZSAoaSA8IHBhcnRzTGVuZ3RoKSB7IGEgPSBhW3BhdGhQYXJ0c1tpXV07IGIgPSBiW3BhdGhQYXJ0c1tpXV07IGkrKzsgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGlvbiA9PSBTb3J0aW5nRGlyZWN0aW9uLkFzY2VuZGluZ1xyXG4gICAgICAgICAgICAgICAgPyBhID4gYiA/IDEgOiAtMVxyXG4gICAgICAgICAgICAgICAgOiBhID4gYiA/IC0xIDogMTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbGxlY3Rpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gY29sbGVjdGlvbiB3aXRob3V0IG1hdGNoZXNcclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHJldHVybnMgQ29sbGVjdGlvbiB3aXRob3V0IG1hdGNoZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkaXN0aW5jdDxUPihjb2xsZWN0aW9uOiBBcnJheTxUPik6IEFycmF5PFQ+IHtcclxuICAgIHJldHVybiBhbnkoY29sbGVjdGlvbilcclxuICAgICAgICA/IGNvbGxlY3Rpb24uZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4KVxyXG4gICAgICAgIDogY29sbGVjdGlvbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybiBzdW0gdmFsdWUgZnJvbSBjb2xsZWN0aW9uIGl0ZW1zIGJ5IG1hcCBmdW5jdGlvblxyXG4gKiBAcGFyYW0gY29sbGVjdGlvbiBBcnJheSBvZiBpdGVtc1xyXG4gKiBAcGFyYW0gc2VsZWN0IE1hcCBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyBTdW0gdmFsdWUgb2YgY29sZWN0aW9uIGl0ZW1zXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3VtPFQ+KGNvbGxlY3Rpb246IEFycmF5PFQ+LCBzZWxlY3Q6IChpdGVtOiBUKSA9PiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGFueShjb2xsZWN0aW9uKVxyXG4gICAgICAgID8gY29sbGVjdGlvblxyXG4gICAgICAgICAgICAubWFwKHNlbGVjdClcclxuICAgICAgICAgICAgLnJlZHVjZSgoYSwgYikgPT4geyByZXR1cm4gYSArIGIgfSwgMClcclxuICAgICAgICA6IDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gbWF4IHZhbHVlIGZyb20gY29sbGVjdGlvbiBpdGVtcyBieSBtYXAgZnVuY3Rpb25cclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHBhcmFtIHNlbGVjdCBNYXAgZnVuY3Rpb25cclxuICogQHJldHVybnMgTWF4IHZhbHVlIG9mIGNvbGxlY3Rpb24gaXRlbXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBtYXg8VD4oY29sbGVjdGlvbjogQXJyYXk8VD4sIHNlbGVjdDogKGl0ZW06IFQpID0+IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBpZiAoYW55KGNvbGxlY3Rpb24pKVxyXG4gICAgICAgIHJldHVybiBNYXRoLm1heCguLi5jb2xsZWN0aW9uLm1hcChzZWxlY3QpKTtcclxuXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb24gdXRpbHMgfCBNYXggZnVuY3Rpb24gLS0+IENvbGxlY3Rpb24gaXMgZW1wdHkuJylcclxufVxyXG5cclxuLyoqXHJcbiAqIERlbGV0ZSBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gYnkgcHJlZGljYXRlXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEBwYXJhbSBwcmVkaWNhdGUgRnVuY3Rpb24gdG8gZGVmaW5lIHJlbW92ZSBsb2dpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZTxUPihjb2xsZWN0aW9uOiBBcnJheTxUPiwgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdmFyIGkgPSBjb2xsZWN0aW9uLmxlbmd0aDtcclxuICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICBpZiAocHJlZGljYXRlKGNvbGxlY3Rpb25baV0pKSB7XHJcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZCBpdGVtIHRvIGNvbGxlY3Rpb25cclxuICogQHBhcmFtIGNvbGxlY3Rpb24gQXJyYXkgb2YgaXRlbXNcclxuICogQHBhcmFtIGl0ZW0gTmV3IGl0ZW1cclxuICogQHBhcmFtIHByZWRpY2F0ZSBGdW5jdGlvbiB0byBkZWZpbmUgaWYgYWxsb3dlZCB0byBhZGQgbmV3IGl0ZW1cclxuICogQHJldHVybnMgVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgYWRkZWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRJdGVtPFQ+KGNvbGxlY3Rpb246IEFycmF5PFQ+LCBpdGVtOiBULFxyXG4gICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG5cclxuICAgIGlmICghaXNEZWZpbmVkKGNvbGxlY3Rpb24pKVxyXG4gICAgICAgIGNvbGxlY3Rpb24gPSBuZXcgQXJyYXk8VD4oKTtcclxuXHJcbiAgICBpZiAoaXNEZWZpbmVkKHByZWRpY2F0ZSkgJiYgcHJlZGljYXRlKGl0ZW0pKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBjb2xsZWN0aW9uLnB1c2goaXRlbSk7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZWxldGUgaXRlbSBmcm9tIGNvbGxlY3Rpb24gYnkgcHJlZGljYXRlXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEBwYXJhbSBwcmVkaWNhdGUgRnVuY3Rpb24gdG8gZGVmaW5lIHJlbW92ZSBsb2dpY1xyXG4gKiBAcmV0dXJucyBUcnVlIGlmIHN1Y2Nlc3NmdWxseSByZW1vdmVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlSXRlbTxUPihjb2xsZWN0aW9uOiBBcnJheTxUPiwgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZm91bmRJdGVtOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCA9IGZpcnN0T3JEZWZhdWx0KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSk7XHJcbiAgICBpZiAoaXNEZWZpbmVkKGZvdW5kSXRlbSkpIHtcclxuICAgICAgICBjb2xsZWN0aW9uLnNwbGljZShjb2xsZWN0aW9uLmluZGV4T2YoZm91bmRJdGVtIGFzIFQpLCAxKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVJdGVtPFQ+KGNvbGxlY3Rpb246IEFycmF5PFQ+LCBwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBib29sZWFuLCBuZXdJdGVtOiBUKVxyXG4gICAgOiBBcnJheTxUPiB8IG51bGwge1xyXG4gICAgY29uc3QgaXRlbUluZGV4ID0gY29sbGVjdGlvbi5maW5kSW5kZXgocHJlZGljYXRlKTtcclxuXHJcbiAgICBpZiAoaXRlbUluZGV4ICE9PSBDb21tb25Db25zdGFudHMuTk9UX0ZPVU5EX0lOREVYKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29sbGVjdGlvbi5zbGljZSgwKTtcclxuICAgICAgICByZXN1bHRbaXRlbUluZGV4XSA9IHtcclxuICAgICAgICAgICAgLi4uY29sbGVjdGlvbltpdGVtSW5kZXhdLFxyXG4gICAgICAgICAgICAuLi5uZXdJdGVtXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gY29sbGVjdGlvbiBvciBlbXB0eSBpZiBjb2xsZWN0aW9uIGlzIG5vdCBkZWZpbmVkXHJcbiAqIEBwYXJhbSBjb2xsZWN0aW9uIEFycmF5IG9mIGl0ZW1zXHJcbiAqIEByZXR1cm5zIENvbGxlY3Rpb24gb3IgZW1wdHlcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uT3JFbXB0eTxUPihjb2xsZWN0aW9uOiBBcnJheTxUPik6IEFycmF5PFQ+IHtcclxuICAgIHJldHVybiBpc0RlZmluZWQoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogW107XHJcbn0iXX0=