@aggdirect/coolmap 2.0.6 → 2.0.8

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 (121) hide show
  1. package/README.md +24 -57
  2. package/bundles/coolmap.umd.js +1383 -0
  3. package/bundles/coolmap.umd.js.map +1 -0
  4. package/bundles/coolmap.umd.min.js +2 -0
  5. package/bundles/coolmap.umd.min.js.map +1 -0
  6. package/coolmap.d.ts +5 -0
  7. package/coolmap.metadata.json +1 -0
  8. package/esm2015/coolmap.js +6 -0
  9. package/esm2015/coolmap.ngsummary.json +1 -0
  10. package/esm2015/lib/component/add-route/add-route.component.js +309 -0
  11. package/esm2015/lib/component/add-route/add-route.component.ngfactory.js +304 -0
  12. package/esm2015/lib/component/add-route/add-route.component.ngsummary.json +1 -0
  13. package/esm2015/lib/component/job-code/job-code.component.js +116 -0
  14. package/esm2015/lib/component/job-code/job-code.component.ngfactory.js +77 -0
  15. package/esm2015/lib/component/job-code/job-code.component.ngsummary.json +1 -0
  16. package/esm2015/lib/component/map/map.component.js +39 -0
  17. package/esm2015/lib/component/map/map.component.ngfactory.js +23 -0
  18. package/esm2015/lib/component/map/map.component.ngsummary.json +1 -0
  19. package/esm2015/lib/component/nav/layout/add-route-nav/add-route-nav.component.js +79 -0
  20. package/esm2015/lib/component/nav/layout/add-route-nav/add-route-nav.component.ngfactory.js +142 -0
  21. package/esm2015/lib/component/nav/layout/add-route-nav/add-route-nav.component.ngsummary.json +1 -0
  22. package/esm2015/lib/component/nav/layout/job-code-nav/job-code-nav.component.js +82 -0
  23. package/esm2015/lib/component/nav/layout/job-code-nav/job-code-nav.component.ngfactory.js +194 -0
  24. package/esm2015/lib/component/nav/layout/job-code-nav/job-code-nav.component.ngsummary.json +1 -0
  25. package/esm2015/lib/component/nav/nav.component.js +54 -0
  26. package/esm2015/lib/component/nav/nav.component.ngfactory.js +43 -0
  27. package/esm2015/lib/component/nav/nav.component.ngsummary.json +1 -0
  28. package/esm2015/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.js +66 -0
  29. package/esm2015/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.ngfactory.js +46 -0
  30. package/esm2015/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.ngsummary.json +1 -0
  31. package/esm2015/lib/component/route-jobcode-list/route-jobcode-list.component.js +301 -0
  32. package/esm2015/lib/component/route-jobcode-list/route-jobcode-list.component.ngfactory.js +99 -0
  33. package/esm2015/lib/component/route-jobcode-list/route-jobcode-list.component.ngsummary.json +1 -0
  34. package/esm2015/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.js +20 -0
  35. package/esm2015/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.ngfactory.js +21 -0
  36. package/esm2015/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.ngsummary.json +1 -0
  37. package/esm2015/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.js +30 -0
  38. package/esm2015/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.ngfactory.js +30 -0
  39. package/esm2015/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.ngsummary.json +1 -0
  40. package/esm2015/lib/component/shared/dialog/dialog.component.js +29 -0
  41. package/esm2015/lib/component/shared/dialog/dialog.component.ngfactory.js +24 -0
  42. package/esm2015/lib/component/shared/dialog/dialog.component.ngsummary.json +1 -0
  43. package/esm2015/lib/component/shared/estimation-display/estimation-display.component.js +20 -0
  44. package/esm2015/lib/component/shared/estimation-display/estimation-display.component.ngfactory.js +23 -0
  45. package/esm2015/lib/component/shared/estimation-display/estimation-display.component.ngsummary.json +1 -0
  46. package/esm2015/lib/component/shared/job-route-list/job-route-list.component.js +63 -0
  47. package/esm2015/lib/component/shared/job-route-list/job-route-list.component.ngfactory.js +134 -0
  48. package/esm2015/lib/component/shared/job-route-list/job-route-list.component.ngsummary.json +1 -0
  49. package/esm2015/lib/component/shared/jobcode-overview/jobcode-overview.component.js +20 -0
  50. package/esm2015/lib/component/shared/jobcode-overview/jobcode-overview.component.ngfactory.js +19 -0
  51. package/esm2015/lib/component/shared/jobcode-overview/jobcode-overview.component.ngsummary.json +1 -0
  52. package/esm2015/lib/component/shared/jobcode-status/jobcode-status.component.js +16 -0
  53. package/esm2015/lib/component/shared/jobcode-status/jobcode-status.component.ngfactory.js +17 -0
  54. package/esm2015/lib/component/shared/jobcode-status/jobcode-status.component.ngsummary.json +1 -0
  55. package/esm2015/lib/coolmap.component.js +18 -0
  56. package/esm2015/lib/coolmap.component.ngfactory.js +16 -0
  57. package/esm2015/lib/coolmap.component.ngsummary.json +1 -0
  58. package/esm2015/lib/coolmap.module.js +108 -0
  59. package/esm2015/lib/coolmap.module.ngfactory.js +46 -0
  60. package/esm2015/lib/coolmap.module.ngsummary.json +1 -0
  61. package/esm2015/public-api.ngsummary.json +1 -0
  62. package/fesm2015/coolmap.js +1317 -0
  63. package/fesm2015/coolmap.js.map +1 -0
  64. package/lib/component/add-route/add-route.component.d.ts +0 -3
  65. package/lib/component/add-route/add-route.component.ngfactory.d.ts +1 -0
  66. package/lib/component/job-code/job-code.component.d.ts +0 -3
  67. package/lib/component/job-code/job-code.component.ngfactory.d.ts +1 -0
  68. package/lib/component/map/map.component.d.ts +0 -3
  69. package/lib/component/map/map.component.ngfactory.d.ts +1 -0
  70. package/lib/component/nav/layout/add-route-nav/add-route-nav.component.d.ts +3 -8
  71. package/lib/component/nav/layout/add-route-nav/add-route-nav.component.ngfactory.d.ts +1 -0
  72. package/lib/component/nav/layout/job-code-nav/job-code-nav.component.d.ts +4 -9
  73. package/lib/component/nav/layout/job-code-nav/job-code-nav.component.ngfactory.d.ts +1 -0
  74. package/lib/component/nav/nav.component.d.ts +0 -3
  75. package/lib/component/nav/nav.component.ngfactory.d.ts +1 -0
  76. package/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.d.ts +0 -3
  77. package/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.ngfactory.d.ts +1 -0
  78. package/lib/component/route-jobcode-list/route-jobcode-list.component.d.ts +1 -4
  79. package/lib/component/route-jobcode-list/route-jobcode-list.component.ngfactory.d.ts +1 -0
  80. package/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.d.ts +0 -3
  81. package/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.ngfactory.d.ts +1 -0
  82. package/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.d.ts +0 -3
  83. package/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.ngfactory.d.ts +1 -0
  84. package/lib/component/shared/dialog/dialog.component.d.ts +0 -3
  85. package/lib/component/shared/dialog/dialog.component.ngfactory.d.ts +1 -0
  86. package/lib/component/shared/estimation-display/estimation-display.component.d.ts +6 -0
  87. package/lib/component/shared/estimation-display/estimation-display.component.ngfactory.d.ts +1 -0
  88. package/lib/component/shared/job-route-list/job-route-list.component.d.ts +2 -7
  89. package/lib/component/shared/job-route-list/job-route-list.component.ngfactory.d.ts +1 -0
  90. package/lib/component/shared/jobcode-overview/jobcode-overview.component.d.ts +0 -3
  91. package/lib/component/shared/jobcode-overview/jobcode-overview.component.ngfactory.d.ts +1 -0
  92. package/lib/component/shared/jobcode-status/jobcode-status.component.d.ts +0 -3
  93. package/lib/component/shared/jobcode-status/jobcode-status.component.ngfactory.d.ts +1 -0
  94. package/lib/coolmap.component.d.ts +0 -3
  95. package/lib/coolmap.component.ngfactory.d.ts +1 -0
  96. package/lib/coolmap.module.d.ts +0 -38
  97. package/lib/coolmap.module.ngfactory.d.ts +3 -0
  98. package/package.json +12 -37
  99. package/esm2020/aggdirect-coolmap.mjs +0 -5
  100. package/esm2020/lib/component/add-route/add-route.component.mjs +0 -317
  101. package/esm2020/lib/component/job-code/job-code.component.mjs +0 -118
  102. package/esm2020/lib/component/map/map.component.mjs +0 -37
  103. package/esm2020/lib/component/nav/layout/add-route-nav/add-route-nav.component.mjs +0 -87
  104. package/esm2020/lib/component/nav/layout/job-code-nav/job-code-nav.component.mjs +0 -89
  105. package/esm2020/lib/component/nav/nav.component.mjs +0 -52
  106. package/esm2020/lib/component/route-jobcode-list/job-code-list-card/job-code-list-card.component.mjs +0 -68
  107. package/esm2020/lib/component/route-jobcode-list/route-jobcode-list.component.mjs +0 -314
  108. package/esm2020/lib/component/route-jobcode-list/sms-card-details-overview/sms-card-details-overview.component.mjs +0 -19
  109. package/esm2020/lib/component/route-jobcode-list/view-route-list-card/view-route-list-card.component.mjs +0 -29
  110. package/esm2020/lib/component/shared/dialog/dialog.component.mjs +0 -29
  111. package/esm2020/lib/component/shared/job-route-list/job-route-list.component.mjs +0 -71
  112. package/esm2020/lib/component/shared/jobcode-overview/jobcode-overview.component.mjs +0 -19
  113. package/esm2020/lib/component/shared/jobcode-status/jobcode-status.component.mjs +0 -14
  114. package/esm2020/lib/coolmap.component.mjs +0 -22
  115. package/esm2020/lib/coolmap.module.mjs +0 -178
  116. package/fesm2015/aggdirect-coolmap.mjs +0 -1373
  117. package/fesm2015/aggdirect-coolmap.mjs.map +0 -1
  118. package/fesm2020/aggdirect-coolmap.mjs +0 -1349
  119. package/fesm2020/aggdirect-coolmap.mjs.map +0 -1
  120. package/index.d.ts +0 -5
  121. /package/{esm2020/public-api.mjs → esm2015/public-api.js} +0 -0
@@ -0,0 +1,3 @@
1
+ import * as i0 from '@angular/core';
2
+ import * as i1 from './coolmap.module';
3
+ export declare const CoolmapModuleNgFactory: i0.NgModuleFactory<i1.CoolmapModule>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aggdirect/coolmap",
3
- "version": "2.0.6",
3
+ "version": "2.0.8",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^11.2.14",
6
6
  "@angular/core": "^11.2.14"
@@ -8,46 +8,21 @@
8
8
  "dependencies": {
9
9
  "tslib": "^2.0.0"
10
10
  },
11
- "allowedNonPeerDependencies": {
12
- "mapbox-gl": "^2.10.0",
13
- "@types/mapbox-gl": "^2.7.5",
14
- "@turf/turf": "^6.5.0",
15
- "deck.gl": "^8.4.16"
16
- },
17
- "description": "This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.2.0.",
18
- "main": "karma.conf.js",
19
- "author": "Navin Vishwakarma <navin@ogmaconceptions.com>",
20
- "contributors": [
21
- "Santanu Das <santanu.das@ogmaconceptions.com>"
22
- ],
23
- "license": "ISC",
24
- "keywords": [
25
- "coolmap"
26
- ],
27
- "module": "fesm2015/aggdirect-coolmap.mjs",
28
- "es2020": "fesm2020/aggdirect-coolmap.mjs",
29
- "esm2020": "esm2020/aggdirect-coolmap.mjs",
30
- "fesm2020": "fesm2020/aggdirect-coolmap.mjs",
31
- "fesm2015": "fesm2015/aggdirect-coolmap.mjs",
32
- "typings": "index.d.ts",
33
- "exports": {
34
- "./package.json": {
35
- "default": "./package.json"
36
- },
37
- ".": {
38
- "types": "./index.d.ts",
39
- "esm2020": "./esm2020/aggdirect-coolmap.mjs",
40
- "es2020": "./fesm2020/aggdirect-coolmap.mjs",
41
- "es2015": "./fesm2015/aggdirect-coolmap.mjs",
42
- "node": "./fesm2015/aggdirect-coolmap.mjs",
43
- "default": "./fesm2020/aggdirect-coolmap.mjs"
44
- }
45
- },
11
+ "main": "bundles/coolmap.umd.js",
12
+ "module": "fesm2015/coolmap.js",
13
+ "es2015": "fesm2015/coolmap.js",
14
+ "esm2015": "esm2015/coolmap.js",
15
+ "fesm2015": "fesm2015/coolmap.js",
16
+ "typings": "coolmap.d.ts",
17
+ "metadata": "coolmap.metadata.json",
46
18
  "sideEffects": false,
19
+ "description": "This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.14.",
47
20
  "directories": {
48
21
  "lib": "lib"
49
22
  },
50
23
  "scripts": {
51
24
  "test": "echo \"Error: no test specified\" && exit 1"
52
- }
25
+ },
26
+ "author": "",
27
+ "license": "ISC"
53
28
  }
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdnZGlyZWN0LWNvb2xtYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9jb29sbWFwL3NyYy9hZ2dkaXJlY3QtY29vbG1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -1,317 +0,0 @@
1
- import { Component, ViewChild, Output, EventEmitter, Input } from '@angular/core';
2
- import { FormControl, FormGroup, Validators } from '@angular/forms';
3
- import { debounceTime, distinctUntilChanged, fromEvent, map, startWith, Subject, takeUntil } from 'rxjs';
4
- import { DialogComponent } from '../shared/dialog/dialog.component';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@aggdirect/coolmap-services";
7
- import * as i2 from "@angular/material/dialog";
8
- import * as i3 from "@angular/common";
9
- import * as i4 from "@angular/cdk/drag-drop";
10
- import * as i5 from "@angular/forms";
11
- import * as i6 from "@angular/material/form-field";
12
- import * as i7 from "@angular/material/input";
13
- import * as i8 from "@angular/material/select";
14
- import * as i9 from "@angular/material/core";
15
- import * as i10 from "@angular/material/icon";
16
- import * as i11 from "@angular/material/autocomplete";
17
- import * as i12 from "@angular/material/progress-spinner";
18
- import * as i13 from "@angular/material/button";
19
- export class AddRouteComponent {
20
- constructor(coolMapService, utils, dialog) {
21
- this.coolMapService = coolMapService;
22
- this.utils = utils;
23
- this.dialog = dialog;
24
- this.changeNav = new EventEmitter();
25
- this.updateRouteList = new EventEmitter();
26
- this.pickupOptions = [];
27
- this.deliveryOptions = [];
28
- this.requestParmsForRouteDetails = { pickup_lat_lng: '', delivery_lat_lng: '' };
29
- this.customersList = [];
30
- this.unitsList = [];
31
- this.materialsList = [];
32
- this.preventSave = false;
33
- this.preventInitialSave = false;
34
- this.destroyer$ = new Subject();
35
- this.enablePopUp = false;
36
- this.prevantPopupClose = false;
37
- this.enableForm = false;
38
- this.formInit();
39
- this.utils.getrouteDetailsUtility.subscribe(res => {
40
- if (res) {
41
- if (res['event'] !== 'click' && !this.prevantPopupClose) {
42
- this.enablePopUp = res['event'];
43
- }
44
- else if (this.enablePopUp && !this.prevantPopupClose) {
45
- this.prevantPopupClose = true;
46
- }
47
- if (res['event'] !== 'click' && !res['event'] && this.prevantPopupClose) {
48
- this.popupDetails = this.utils.getdictValue('route-detailsv2');
49
- }
50
- else {
51
- this.popupDetails = res['route'];
52
- }
53
- if (this.enablePopUp)
54
- this.popupDetails['created_at'] = this.utils.getDateFormat(new Date(this.popupDetails['created_at']), '/');
55
- }
56
- });
57
- }
58
- filterCustomerList() {
59
- this.customersList$ = this.addRouteForm.controls['customer_name'].valueChanges.pipe(startWith(''), map(value => this._filter(value || '')));
60
- }
61
- _filter(value) {
62
- const filterValue = value.toLowerCase();
63
- return this.customersList.filter((option) => option['customer_name'].toLowerCase().includes(filterValue));
64
- }
65
- ngOnChanges(changes) {
66
- if (changes['routeData'] && !changes['routeData']['currentValue'])
67
- this.inIt(null);
68
- }
69
- openDialog() {
70
- const dialogRef = this.dialog.open(DialogComponent, {
71
- data: { body: 'Are you sure you want to delete this route?' },
72
- });
73
- dialogRef.afterClosed().subscribe(res => { if (res) {
74
- this.deleteRoute();
75
- } });
76
- }
77
- editEvent() {
78
- this.prevantPopupClose = false;
79
- this.enableForm = true;
80
- this.enablePopUp = false;
81
- this.popupDetails['prevent'] = false;
82
- this.utils.removeMapEntity.next(this.popupDetails);
83
- this.inIt(this.popupDetails);
84
- }
85
- inIt(changes) {
86
- if (changes) {
87
- if (!changes['prevent']) {
88
- this.preventSave = false;
89
- this.formControlValue();
90
- this.patchFormValue(changes);
91
- this.checkAndFetchRouteInformation(true);
92
- }
93
- }
94
- if (!changes) {
95
- this.enableForm = true;
96
- this.preventSave = true;
97
- this.patchFormValue();
98
- this.checkAndFetchRouteInformation();
99
- }
100
- }
101
- ngOnInit() {
102
- this.fetchCustomersList();
103
- this.fetchUnitsList();
104
- this.fetchMaterialsList();
105
- this.formControlValue();
106
- }
107
- ngAfterViewInit() {
108
- fromEvent(this.filterPickup.nativeElement, 'keyup').pipe(distinctUntilChanged(), debounceTime(150)).pipe(takeUntil(this.destroyer$)).subscribe(() => {
109
- this.utils.fetchAutoCompleteLocations(this.filterPickup.nativeElement.value).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
110
- this.pickupOptions = res.features;
111
- });
112
- });
113
- fromEvent(this.filterDelivery.nativeElement, 'keyup').pipe(distinctUntilChanged(), debounceTime(150)).pipe(takeUntil(this.destroyer$)).subscribe(() => {
114
- this.utils.fetchAutoCompleteLocations(this.filterDelivery.nativeElement.value).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
115
- this.deliveryOptions = res.features;
116
- });
117
- });
118
- }
119
- formControlValue() {
120
- this.addRouteForm.controls['pickup_location']?.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
121
- if (this.addRouteForm.value.pickup_location && res !== this.addRouteForm.value.pickup_location) {
122
- this.addRouteForm.patchValue({
123
- pickup_lat_lng: '',
124
- });
125
- this.addRouteForm.controls['pickup_lat_lng'].markAsTouched();
126
- }
127
- });
128
- this.addRouteForm.controls['delivery_location']?.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
129
- if (this.addRouteForm.value.delivery_location && res !== this.addRouteForm.value.delivery_location) {
130
- this.addRouteForm.patchValue({
131
- delivery_lat_lng: '',
132
- });
133
- this.addRouteForm.controls['delivery_lat_lng'].markAsTouched();
134
- }
135
- });
136
- }
137
- formInit() {
138
- this.addRouteForm = new FormGroup({
139
- route_name: new FormControl('', [Validators.required]),
140
- customer_name: new FormControl({ value: '', disabled: true }, [Validators.required]),
141
- materials_id: new FormControl('', [Validators.required]),
142
- unit_id: new FormControl('', [Validators.required]),
143
- path: new FormControl('', [Validators.required]),
144
- pickup_location: new FormControl('', [Validators.required]),
145
- pickup_lat_lng: new FormControl('', [Validators.required]),
146
- delivery_location: new FormControl('', [Validators.required]),
147
- delivery_lat_lng: new FormControl('', [Validators.required]),
148
- estimated_distance: new FormControl('', [Validators.required]),
149
- estimated_time: new FormControl('', [Validators.required]),
150
- note: new FormControl('', [Validators.maxLength(2048)]),
151
- });
152
- }
153
- patchFormValue(data) {
154
- this.addRouteForm.reset();
155
- this.addRouteForm.patchValue(data);
156
- this.routeId = data?.route_id;
157
- this.routeDetails = data ? { pickup_location: data.pickup_location, delivery_location: data.delivery_location } : null;
158
- this.addRouteForm.valueChanges.pipe(takeUntil(this.destroyer$)).subscribe(res => {
159
- if (res) {
160
- if (this.preventInitialSave)
161
- this.preventInitialSave = false;
162
- }
163
- });
164
- this.filterCustomerList();
165
- }
166
- fetchCustomersList() {
167
- this.utils.getData(`${this.portalName}/company/list/view`).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
168
- if (res) {
169
- this.customersList = res.data;
170
- this.filterCustomerList();
171
- this.addRouteForm.controls['customer_name'].enable();
172
- }
173
- });
174
- }
175
- fetchUnitsList() {
176
- this.utils.getData(`${this.portalName}/unit/list/view`).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
177
- if (res) {
178
- this.unitsList = res.data;
179
- }
180
- });
181
- }
182
- fetchMaterialsList() {
183
- this.utils.getData(`${this.portalName}/material/list/view`).pipe(takeUntil(this.destroyer$)).subscribe(((res) => {
184
- res.data.sort((a, b) => a.material.localeCompare(b.material));
185
- this.materialsList = res.data;
186
- }));
187
- }
188
- selectedLongLat(type, event) {
189
- if (type === 'pickup') {
190
- this.addRouteForm.patchValue({
191
- pickup_lat_lng: (event.geometry.coordinates[1] + ',' + event.geometry.coordinates[0]).toString()
192
- });
193
- this.coolMapService.clearBoundWithCordinates();
194
- }
195
- else if (type === 'delivery') {
196
- this.addRouteForm.patchValue({
197
- delivery_lat_lng: (event.geometry.coordinates[1] + ',' + event.geometry.coordinates[0]).toString()
198
- });
199
- }
200
- this.checkAndFetchRouteInformation();
201
- }
202
- checkAndFetchRouteInformation(isinitial) {
203
- if (this.addRouteForm.value?.delivery_lat_lng?.length > 0 && this.addRouteForm.value?.pickup_lat_lng?.length > 0 && this.addRouteForm.value.unit_id) {
204
- let unit = this.unitsList.find((x) => x.id === this.addRouteForm.value.unit_id);
205
- const param = {
206
- delivery_lat_lng: this.addRouteForm.value.delivery_lat_lng,
207
- pickup_lat_lng: this.addRouteForm.value.pickup_lat_lng,
208
- unit: unit?.type
209
- };
210
- this.utils.postdata('coolmap/calculate/routes/estimation', param).pipe(takeUntil(this.destroyer$)).subscribe((res) => {
211
- if (res && res['path']) {
212
- this.addRouteForm.patchValue({
213
- estimated_distance: res.dist, estimated_time: res.time, path: res.path
214
- });
215
- let path = res['path'].split(';');
216
- path = path.map((ele) => { return ele = this.formateLatLong(ele); });
217
- res['path'] = path;
218
- const element = {
219
- type: 'FeatureCollection',
220
- features: [{ type: 'Feature', properties: {}, geometry: { type: 'LineString', coordinates: res['path'] } }]
221
- };
222
- this.coolMapService.removeRouteAndMarker(1).then(() => {
223
- const unit = this.unitsList.find((x) => x.id === this.addRouteForm.value.unit_id);
224
- const materialDetails = this.materialsList.find((x) => x.material_id === this.addRouteForm.value.materials_id);
225
- this.coolMapService.loadMapProperty(element, 1, unit?.type, {
226
- pickup_location: this.addRouteForm.get('pickup_location')?.value,
227
- delivery_location: this.addRouteForm.get('delivery_location')?.value,
228
- route_name: this.addRouteForm.get('route_name')?.value,
229
- material: materialDetails?.material, unit: unit?.type
230
- }).then((res) => { this.preventSave = true; });
231
- });
232
- }
233
- else {
234
- this.coolMapService.removeRouteAndMarker(1);
235
- this.utils.openSnackBar(res['status'], 'error');
236
- }
237
- if (this.routeId && isinitial)
238
- this.preventInitialSave = true;
239
- });
240
- }
241
- else {
242
- this.coolMapService.removeRouteAndMarker(1);
243
- }
244
- }
245
- formateLatLong(latlong) { return latlong ? latlong.split(',').map(x => +x).reverse() : null; }
246
- saveRoute() {
247
- if (this.addRouteForm.valid) {
248
- this.preventSave = false;
249
- const data = this.addRouteForm.value;
250
- data['trucker_pay_estimate'] = null;
251
- data['customer_price_estimate'] = null;
252
- const url = this.routeId ? this.utils.postdata('coolmap/update/routes', data) : this.utils.postdata('coolmap/add/routes', data);
253
- if (this.routeId)
254
- data['id'] = this.routeId;
255
- url.pipe(takeUntil(this.destroyer$)).subscribe((res) => {
256
- if (res.success) {
257
- this.updateRouteList.emit(true);
258
- this.utils.openSnackBar(res.message, 'success');
259
- this.preventInitialSave = true;
260
- this.preventSave = true;
261
- if (!this.routeId)
262
- this.changeNav.next('Addroute');
263
- }
264
- else {
265
- this.utils.openSnackBar(res.message, 'error');
266
- this.preventSave = true;
267
- }
268
- }, (err) => { if (err) {
269
- this.preventSave = true;
270
- } });
271
- }
272
- else {
273
- this.addRouteForm.markAllAsTouched();
274
- }
275
- }
276
- deleteRoute() {
277
- this.preventSave = false;
278
- this.utils.postdata('coolmap/delete/routes', { uuid: this.routeId }).subscribe(res => {
279
- if (res['data']['success']) {
280
- this.utils.openSnackBar(res['data']['message'], 'success');
281
- this.updateRouteList.emit(true);
282
- this.changeNav.next('Addroute');
283
- this.preventInitialSave = true;
284
- this.preventSave = true;
285
- }
286
- else {
287
- this.utils.openSnackBar('Somthing went wrong', 'error');
288
- this.preventSave = true;
289
- }
290
- }, (err) => { this.preventSave = true; });
291
- }
292
- ngOnDestroy() {
293
- this.destroyer$.next(true);
294
- this.destroyer$.unsubscribe();
295
- }
296
- }
297
- AddRouteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AddRouteComponent, deps: [{ token: i1.CoolmapService }, { token: i1.UtilsService }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
298
- AddRouteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: AddRouteComponent, selector: "app-add-route", inputs: { routeData: "routeData", portalName: "portalName" }, outputs: { changeNav: "changeNav", updateRouteList: "updateRouteList" }, viewQueries: [{ propertyName: "filterPickup", first: true, predicate: ["filterPickup"], descendants: true }, { propertyName: "filterDelivery", first: true, predicate: ["filterDelivery"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"addroutebox\">\r\n <div class=\"routedetailbox\" *ngIf=\"enablePopUp\">\r\n <div class=\"closebtnroutedetail\">\r\n <mat-icon (click)=\"prevantPopupClose = false; enablePopUp = false;\">clear</mat-icon>\r\n </div>\r\n <div class=\"destination\">\r\n <div class=\"duration\">\r\n <p class=\"pickprt\"><b>Pickup:</b>{{popupDetails['pickup_location']}}</p>\r\n <p class=\"dropprt\"><b>Delivery:</b>{{popupDetails['delivery_location']}}</p>\r\n </div>\r\n <span><b>Name:</b> {{popupDetails['route_name']}}</span>\r\n <span><b>Customer:</b> {{popupDetails['customer_name']}}</span>\r\n <span><b>Material:</b> {{popupDetails['material']}}</span>\r\n <span><b>Type:</b> {{popupDetails['unit']}}</span>\r\n <span><b>Distance:</b> {{popupDetails['estimated_distance']}}</span>\r\n <span><b>Travel Time:</b> {{popupDetails['estimated_time']}}</span>\r\n\r\n <span class=\"routenotes\"><b>Notes:</b> {{popupDetails['note']}}</span>\r\n </div>\r\n <div class=\"createTxt\">\r\n <small>\r\n Created by {{popupDetails['created_by_name']}} on {{popupDetails['created_at']}}\r\n </small>\r\n <button class=\"editbtn\" (click)=\"editEvent()\">Edit</button>\r\n </div>\r\n </div>\r\n <div class=\"add_add_route_box\" cdkDrag [style.visibility]=\"!enableForm ? 'hidden' : 'visible'\">\r\n <div class=\"topheadingprt\">\r\n <h2> {{routeId? 'EDIT' : 'ADD'}} ROUTE </h2>\r\n <div class=\"buttonprt\">\r\n <button *ngIf=\"routeId\" class=\"delbtn\" (click)=\"openDialog()\">Delete</button>\r\n <button mat-raised-button type=\"submit\" class=\"closebtn\" (click)=\"changeNav.next('Addroute')\">Close</button>\r\n </div>\r\n </div>\r\n <form [formGroup]=\"addRouteForm\">\r\n <div class=\"route_form_area\">\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Route Name</mat-label>\r\n <input matInput formControlName=\"route_name\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-error *ngIf=\"addRouteForm.controls['route_name'].hasError('required')\">\r\n Route Name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <input type=\"text\" placeholder=\"Customer Name\" matInput formControlName=\"customer_name\" [matAutocomplete]=\"auto\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let customer of customersList$ | async\" [value]=\"customer['customer_name']\">\r\n {{customer['customer_name']}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"addRouteForm.controls['customer_name'].hasError('required')\">\r\n Customer name is required.\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Pickup</mat-label>\r\n <input type=\"text\" placeholder=\"Search...\" matInput #filterPickup [matAutocomplete]=\"pickupAutocomplete\"\r\n formControlName=\"pickup_location\" (mousedown)=\"$event.stopPropagation()\">\r\n\r\n <mat-autocomplete #pickupAutocomplete=\"matAutocomplete\">\r\n <mat-option (click)=\"selectedLongLat('pickup', option)\" *ngFor=\"let option of pickupOptions\"\r\n [value]=\"option?.place_name\">\r\n {{option?.place_name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n <mat-error *ngIf=\"addRouteForm.controls['pickup_lat_lng'].touched && addRouteForm.controls['pickup_lat_lng'].hasError('required')\">\r\n Please select pickup location from the list.\r\n </mat-error>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Delivery</mat-label>\r\n <input type=\"text\" placeholder=\"Search...\" matInput #filterDelivery [matAutocomplete]=\"deliveryAutocomplete\"\r\n formControlName=\"delivery_location\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-autocomplete #deliveryAutocomplete=\"matAutocomplete\">\r\n <mat-option (click)=\"selectedLongLat('delivery', option)\" *ngFor=\"let option of deliveryOptions\"\r\n [value]=\"option?.place_name\">\r\n {{option?.place_name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n <mat-error *ngIf=\"addRouteForm.controls['delivery_lat_lng'].touched && addRouteForm.controls['delivery_lat_lng'].hasError('required')\">\r\n Please select delivery location from the list.\r\n </mat-error>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Notes</mat-label>\r\n <textarea style=\"height: 18px; resize: none;\" matInput name=\"\" id=\"\" cols=\"30\" rows=\"10\" formControlName=\"note\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\"></textarea>\r\n <mat-error *ngIf=\"addRouteForm.controls['note'].hasError('maxlength')\">\r\n Notes should be within 2048 characters.\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"col-6 d-flex\">\r\n <div class=\"inputbox m-0\">\r\n <mat-form-field>\r\n <mat-label>Unit type</mat-label>\r\n <mat-select formControlName=\"unit_id\" (selectionChange)=\"checkAndFetchRouteInformation()\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-option *ngFor=\"let unit of unitsList\" [value]=\"unit?.id\"> {{unit?.type}} </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"addRouteForm.controls['unit_id'].hasError('required')\">\r\n Unit is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"inputbox m-0\">\r\n <mat-form-field>\r\n <mat-label>Material</mat-label>\r\n <mat-select formControlName=\"materials_id\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-option *ngFor=\"let material of materialsList\" [value]=\"material?.material_id\"> {{material?.material}}\r\n </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"addRouteForm.controls['materials_id'].hasError('required')\">\r\n Meterial is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-6\">\r\n <app-estimation-display *ngIf=\"addRouteForm?.value?.pickup_lat_lng && addRouteForm?.value?.delivery_lat_lng\" [value]=\"addRouteForm['value']\"></app-estimation-display>\r\n </div>\r\n <button mat-raised-button type=\"submit\" (click)=\"saveRoute()\" *ngIf=\"preventSave\"\r\n [disabled]=\"addRouteForm.invalid && preventSave || preventInitialSave\">{{routeId? 'Update' : 'Save'}}\r\n </button>\r\n <div class=\"loader\">\r\n <mat-spinner *ngIf=\"!preventSave\"></mat-spinner>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n", styles: [".addroutebox{width:calc(100% - 315px);position:absolute;left:300px;bottom:10px;z-index:999;display:flex;justify-content:space-between;align-items:flex-start}.addroutebox .routedetailbox{max-width:300px;padding:10px;background-color:#fff;border-radius:20px;margin-right:20px}@media (min-width: 1600px){.addroutebox .routedetailbox{max-width:280px}}.addroutebox .editbtn{background:#326ad3;padding:10px 25px;color:#fff;font-size:.8125rem;border-radius:30px;float:right}.add_add_route_box{background:white;padding:10px 20px;border-radius:20px;box-shadow:2px 4px 4px 2px #00000024;height:370px;width:100%;position:relative;cursor:move}.add_add_route_box .route_form_area{display:flex;flex-wrap:wrap;justify-content:space-between}.add_add_route_box .route_form_area .col-6{width:48%;margin-top:15px;justify-content:space-between}.add_add_route_box .route_form_area .col-6 .inputbox{width:47%}.add_add_route_box .route_form_area .col-6 span{font-size:.875rem}.add_add_route_box .route_form_area button{background:#326ad3;padding:0 18px;color:#fff;font-size:.8125rem;border-radius:30px;position:absolute;right:18px;top:20px}.closebtn{background:black;color:#fff;border-radius:30px;padding:0 18px;margin-left:10px}.delbtn{background:red;color:#fff;border-radius:30px;padding:10px 18px}.add_route_listingpart .listing_toggle{background:white;border-radius:15px;padding:8px 10px;position:absolute;right:10px;top:30px;cursor:pointer}.listing_box{background:#282828;height:100vh;position:fixed;right:0;top:0;z-index:1111;box-shadow:-3px 0 5px #ffffff14;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;width:0;border-radius:40px 0 0 40px;opacity:0}.listing_box .closebtn{display:none}.show .listing_box{width:250px;max-width:250px;flex:0 0 250px;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;padding:40px 0 40px 20px;opacity:1}@media (min-width: 1600px){.show .listing_box{width:320px;max-width:320px;flex:0 0 320px}}.show .listing_box h2{color:#fff;white-space:nowrap}.show .listing_box ul{padding:0 20px 0 0}.show .listing_box ul li{background:#4a4a4a;padding:15px;border-radius:15px;display:flex;margin-bottom:15px}.show .listing_box ul li .companayIcon{width:40px;height:40px;border-radius:10px;background:white;margin-right:10px;display:flex;justify-content:center;align-items:center}.show .listing_box ul li .company_cont{width:calc(100% - 50px)}.show .listing_box ul li .company_cont h3{color:#fff;font-size:15px;font-weight:400;margin:0;text-overflow:ellipsis;max-width:129px;-webkit-box-orient:vertical;white-space:nowrap;overflow:hidden}@media (min-width: 1600px){.show .listing_box ul li .company_cont h3{max-width:170px}}.show .listing_box ul li .company_cont p{color:#bcbcbc;font-size:12px;margin:5px 0;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:16px}.show .closebtn{position:absolute;left:-33px;top:50px;background:#282828;color:#fff;padding:8px;border-top-left-radius:15px;border-bottom-left-radius:15px;cursor:pointer;box-shadow:-4px 2px 5px #ffffff14;display:block}.loader{position:absolute;width:95%;height:100%;display:flex;justify-content:center;align-items:center;pointer-events:none}.buttonprt{margin-right:83px}.destination .duration{padding:10px}.destination span{padding:5px 0}.closebtnroutedetail{box-shadow:0 0 5px #0000001c;border-radius:100%;width:30px;height:30px;display:flex;justify-content:center;align-items:center;cursor:pointer;background:#fff;position:absolute;top:-11px;left:-11px}.routenotes{max-height:170px;overflow:auto}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i11.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: i12.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i13.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }] });
299
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AddRouteComponent, decorators: [{
300
- type: Component,
301
- args: [{ selector: 'app-add-route', template: "<div class=\"addroutebox\">\r\n <div class=\"routedetailbox\" *ngIf=\"enablePopUp\">\r\n <div class=\"closebtnroutedetail\">\r\n <mat-icon (click)=\"prevantPopupClose = false; enablePopUp = false;\">clear</mat-icon>\r\n </div>\r\n <div class=\"destination\">\r\n <div class=\"duration\">\r\n <p class=\"pickprt\"><b>Pickup:</b>{{popupDetails['pickup_location']}}</p>\r\n <p class=\"dropprt\"><b>Delivery:</b>{{popupDetails['delivery_location']}}</p>\r\n </div>\r\n <span><b>Name:</b> {{popupDetails['route_name']}}</span>\r\n <span><b>Customer:</b> {{popupDetails['customer_name']}}</span>\r\n <span><b>Material:</b> {{popupDetails['material']}}</span>\r\n <span><b>Type:</b> {{popupDetails['unit']}}</span>\r\n <span><b>Distance:</b> {{popupDetails['estimated_distance']}}</span>\r\n <span><b>Travel Time:</b> {{popupDetails['estimated_time']}}</span>\r\n\r\n <span class=\"routenotes\"><b>Notes:</b> {{popupDetails['note']}}</span>\r\n </div>\r\n <div class=\"createTxt\">\r\n <small>\r\n Created by {{popupDetails['created_by_name']}} on {{popupDetails['created_at']}}\r\n </small>\r\n <button class=\"editbtn\" (click)=\"editEvent()\">Edit</button>\r\n </div>\r\n </div>\r\n <div class=\"add_add_route_box\" cdkDrag [style.visibility]=\"!enableForm ? 'hidden' : 'visible'\">\r\n <div class=\"topheadingprt\">\r\n <h2> {{routeId? 'EDIT' : 'ADD'}} ROUTE </h2>\r\n <div class=\"buttonprt\">\r\n <button *ngIf=\"routeId\" class=\"delbtn\" (click)=\"openDialog()\">Delete</button>\r\n <button mat-raised-button type=\"submit\" class=\"closebtn\" (click)=\"changeNav.next('Addroute')\">Close</button>\r\n </div>\r\n </div>\r\n <form [formGroup]=\"addRouteForm\">\r\n <div class=\"route_form_area\">\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Route Name</mat-label>\r\n <input matInput formControlName=\"route_name\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-error *ngIf=\"addRouteForm.controls['route_name'].hasError('required')\">\r\n Route Name is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <input type=\"text\" placeholder=\"Customer Name\" matInput formControlName=\"customer_name\" [matAutocomplete]=\"auto\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-autocomplete autoActiveFirstOption #auto=\"matAutocomplete\">\r\n <mat-option *ngFor=\"let customer of customersList$ | async\" [value]=\"customer['customer_name']\">\r\n {{customer['customer_name']}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n <mat-error *ngIf=\"addRouteForm.controls['customer_name'].hasError('required')\">\r\n Customer name is required.\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Pickup</mat-label>\r\n <input type=\"text\" placeholder=\"Search...\" matInput #filterPickup [matAutocomplete]=\"pickupAutocomplete\"\r\n formControlName=\"pickup_location\" (mousedown)=\"$event.stopPropagation()\">\r\n\r\n <mat-autocomplete #pickupAutocomplete=\"matAutocomplete\">\r\n <mat-option (click)=\"selectedLongLat('pickup', option)\" *ngFor=\"let option of pickupOptions\"\r\n [value]=\"option?.place_name\">\r\n {{option?.place_name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n <mat-error *ngIf=\"addRouteForm.controls['pickup_lat_lng'].touched && addRouteForm.controls['pickup_lat_lng'].hasError('required')\">\r\n Please select pickup location from the list.\r\n </mat-error>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Delivery</mat-label>\r\n <input type=\"text\" placeholder=\"Search...\" matInput #filterDelivery [matAutocomplete]=\"deliveryAutocomplete\"\r\n formControlName=\"delivery_location\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-autocomplete #deliveryAutocomplete=\"matAutocomplete\">\r\n <mat-option (click)=\"selectedLongLat('delivery', option)\" *ngFor=\"let option of deliveryOptions\"\r\n [value]=\"option?.place_name\">\r\n {{option?.place_name}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n <mat-error *ngIf=\"addRouteForm.controls['delivery_lat_lng'].touched && addRouteForm.controls['delivery_lat_lng'].hasError('required')\">\r\n Please select delivery location from the list.\r\n </mat-error>\r\n </div>\r\n <div class=\"col-6\">\r\n <mat-form-field>\r\n <mat-label>Notes</mat-label>\r\n <textarea style=\"height: 18px; resize: none;\" matInput name=\"\" id=\"\" cols=\"30\" rows=\"10\" formControlName=\"note\" autocomplete=\"nope\" (mousedown)=\"$event.stopPropagation()\"></textarea>\r\n <mat-error *ngIf=\"addRouteForm.controls['note'].hasError('maxlength')\">\r\n Notes should be within 2048 characters.\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"col-6 d-flex\">\r\n <div class=\"inputbox m-0\">\r\n <mat-form-field>\r\n <mat-label>Unit type</mat-label>\r\n <mat-select formControlName=\"unit_id\" (selectionChange)=\"checkAndFetchRouteInformation()\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-option *ngFor=\"let unit of unitsList\" [value]=\"unit?.id\"> {{unit?.type}} </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"addRouteForm.controls['unit_id'].hasError('required')\">\r\n Unit is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"inputbox m-0\">\r\n <mat-form-field>\r\n <mat-label>Material</mat-label>\r\n <mat-select formControlName=\"materials_id\" (mousedown)=\"$event.stopPropagation()\">\r\n <mat-option *ngFor=\"let material of materialsList\" [value]=\"material?.material_id\"> {{material?.material}}\r\n </mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"addRouteForm.controls['materials_id'].hasError('required')\">\r\n Meterial is required\r\n </mat-error>\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n <div class=\"col-6\">\r\n <app-estimation-display *ngIf=\"addRouteForm?.value?.pickup_lat_lng && addRouteForm?.value?.delivery_lat_lng\" [value]=\"addRouteForm['value']\"></app-estimation-display>\r\n </div>\r\n <button mat-raised-button type=\"submit\" (click)=\"saveRoute()\" *ngIf=\"preventSave\"\r\n [disabled]=\"addRouteForm.invalid && preventSave || preventInitialSave\">{{routeId? 'Update' : 'Save'}}\r\n </button>\r\n <div class=\"loader\">\r\n <mat-spinner *ngIf=\"!preventSave\"></mat-spinner>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n", styles: [".addroutebox{width:calc(100% - 315px);position:absolute;left:300px;bottom:10px;z-index:999;display:flex;justify-content:space-between;align-items:flex-start}.addroutebox .routedetailbox{max-width:300px;padding:10px;background-color:#fff;border-radius:20px;margin-right:20px}@media (min-width: 1600px){.addroutebox .routedetailbox{max-width:280px}}.addroutebox .editbtn{background:#326ad3;padding:10px 25px;color:#fff;font-size:.8125rem;border-radius:30px;float:right}.add_add_route_box{background:white;padding:10px 20px;border-radius:20px;box-shadow:2px 4px 4px 2px #00000024;height:370px;width:100%;position:relative;cursor:move}.add_add_route_box .route_form_area{display:flex;flex-wrap:wrap;justify-content:space-between}.add_add_route_box .route_form_area .col-6{width:48%;margin-top:15px;justify-content:space-between}.add_add_route_box .route_form_area .col-6 .inputbox{width:47%}.add_add_route_box .route_form_area .col-6 span{font-size:.875rem}.add_add_route_box .route_form_area button{background:#326ad3;padding:0 18px;color:#fff;font-size:.8125rem;border-radius:30px;position:absolute;right:18px;top:20px}.closebtn{background:black;color:#fff;border-radius:30px;padding:0 18px;margin-left:10px}.delbtn{background:red;color:#fff;border-radius:30px;padding:10px 18px}.add_route_listingpart .listing_toggle{background:white;border-radius:15px;padding:8px 10px;position:absolute;right:10px;top:30px;cursor:pointer}.listing_box{background:#282828;height:100vh;position:fixed;right:0;top:0;z-index:1111;box-shadow:-3px 0 5px #ffffff14;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;width:0;border-radius:40px 0 0 40px;opacity:0}.listing_box .closebtn{display:none}.show .listing_box{width:250px;max-width:250px;flex:0 0 250px;transition:.5s;-webkit-transition:.5s;-moz-transition:.5s;padding:40px 0 40px 20px;opacity:1}@media (min-width: 1600px){.show .listing_box{width:320px;max-width:320px;flex:0 0 320px}}.show .listing_box h2{color:#fff;white-space:nowrap}.show .listing_box ul{padding:0 20px 0 0}.show .listing_box ul li{background:#4a4a4a;padding:15px;border-radius:15px;display:flex;margin-bottom:15px}.show .listing_box ul li .companayIcon{width:40px;height:40px;border-radius:10px;background:white;margin-right:10px;display:flex;justify-content:center;align-items:center}.show .listing_box ul li .company_cont{width:calc(100% - 50px)}.show .listing_box ul li .company_cont h3{color:#fff;font-size:15px;font-weight:400;margin:0;text-overflow:ellipsis;max-width:129px;-webkit-box-orient:vertical;white-space:nowrap;overflow:hidden}@media (min-width: 1600px){.show .listing_box ul li .company_cont h3{max-width:170px}}.show .listing_box ul li .company_cont p{color:#bcbcbc;font-size:12px;margin:5px 0;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:16px}.show .closebtn{position:absolute;left:-33px;top:50px;background:#282828;color:#fff;padding:8px;border-top-left-radius:15px;border-bottom-left-radius:15px;cursor:pointer;box-shadow:-4px 2px 5px #ffffff14;display:block}.loader{position:absolute;width:95%;height:100%;display:flex;justify-content:center;align-items:center;pointer-events:none}.buttonprt{margin-right:83px}.destination .duration{padding:10px}.destination span{padding:5px 0}.closebtnroutedetail{box-shadow:0 0 5px #0000001c;border-radius:100%;width:30px;height:30px;display:flex;justify-content:center;align-items:center;cursor:pointer;background:#fff;position:absolute;top:-11px;left:-11px}.routenotes{max-height:170px;overflow:auto}\n"] }]
302
- }], ctorParameters: function () { return [{ type: i1.CoolmapService }, { type: i1.UtilsService }, { type: i2.MatDialog }]; }, propDecorators: { filterPickup: [{
303
- type: ViewChild,
304
- args: ['filterPickup']
305
- }], filterDelivery: [{
306
- type: ViewChild,
307
- args: ['filterDelivery']
308
- }], changeNav: [{
309
- type: Output
310
- }], updateRouteList: [{
311
- type: Output
312
- }], routeData: [{
313
- type: Input
314
- }], portalName: [{
315
- type: Input
316
- }] } });
317
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXJvdXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvb2xtYXAvc3JjL2xpYi9jb21wb25lbnQvYWRkLXJvdXRlL2FkZC1yb3V0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb29sbWFwL3NyYy9saWIvY29tcG9uZW50L2FkZC1yb3V0ZS9hZGQtcm91dGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUMzSSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQWMsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHckgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFRcEUsTUFBTSxPQUFPLGlCQUFpQjtJQXlCNUIsWUFBbUIsY0FBOEIsRUFBUyxLQUFtQixFQUFTLE1BQWlCO1FBQXBGLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUFTLFVBQUssR0FBTCxLQUFLLENBQWM7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBdEJ0RixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN2QyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDL0Qsa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFDeEIsb0JBQWUsR0FBUSxFQUFFLENBQUM7UUFDMUIsZ0NBQTJCLEdBQUcsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxDQUFBO1FBQzFFLGtCQUFhLEdBQVEsRUFBRSxDQUFDO1FBQ3hCLGNBQVMsR0FBUSxFQUFFLENBQUM7UUFDcEIsa0JBQWEsR0FBUSxFQUFFLENBQUM7UUFLeEIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFDN0IsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBRzdCLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBRTNDLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixlQUFVLEdBQVksS0FBSyxDQUFDO1FBRzFCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoRCxJQUFJLEdBQUcsRUFBRTtnQkFDUCxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7b0JBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7aUJBQUU7cUJBQ3ZGLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtvQkFBRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2lCQUFFO2dCQUN4RixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO29CQUN2RSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7aUJBQ2hFO3FCQUFNO29CQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO2lCQUFFO2dCQUMzQyxJQUFJLElBQUksQ0FBQyxXQUFXO29CQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2FBQ2xJO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0Qsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDakYsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUNiLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ3hDLENBQUM7SUFDSixDQUFDO0lBQ00sT0FBTyxDQUFDLEtBQWE7UUFDMUIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNqSCxDQUFDO0lBQ0QsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGNBQWMsQ0FBQztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUNELFVBQVU7UUFDUixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDbEQsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLDZDQUE2QyxFQUFFO1NBQzlELENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRTtZQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtTQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELFNBQVM7UUFDUCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsSUFBSSxDQUFDLE9BQWM7UUFDakIsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDekIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFBO2FBQ3ZFO1NBQ0Y7UUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFBO1NBQUU7SUFDaEksQ0FBQztJQUNELFFBQVE7UUFDTixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGVBQWU7UUFDYixTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUN0RCxvQkFBb0IsRUFBRSxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN6RixJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ25JLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUwsU0FBUyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDeEQsb0JBQW9CLEVBQUUsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDekYsSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNySSxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ2xILElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsZUFBZSxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUU7Z0JBQzlGLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO29CQUMzQixjQUFjLEVBQUUsRUFBRTtpQkFDbkIsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDOUQ7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDcEgsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ2xHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO29CQUMzQixnQkFBZ0IsRUFBRSxFQUFFO2lCQUNyQixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUNoRTtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksU0FBUyxDQUFDO1lBQ2hDLFVBQVUsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEQsYUFBYSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEYsWUFBWSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4RCxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25ELElBQUksRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEQsZUFBZSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRCxjQUFjLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFELGlCQUFpQixFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3RCxnQkFBZ0IsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUQsa0JBQWtCLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlELGNBQWMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUQsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN4RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVk7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksRUFBRSxRQUFRLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN2SCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM5RSxJQUFJLEdBQUcsRUFBRTtnQkFBRSxJQUFJLElBQUksQ0FBQyxrQkFBa0I7b0JBQUUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQTthQUFFO1FBQzNFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNqSCxJQUFJLEdBQUcsRUFBRTtnQkFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7YUFBRTtRQUM5SCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDOUcsSUFBSSxHQUFHLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFBO2FBQUU7UUFDeEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUscUJBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDbkgsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtZQUN2RSxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUE7UUFDL0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7SUFFRCxlQUFlLENBQUMsSUFBWSxFQUFFLEtBQVU7UUFDdEMsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUMzQixjQUFjLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7YUFDakcsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1NBQ2hEO2FBQU0sSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUMzQixnQkFBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTthQUNuRyxDQUFDLENBQUE7U0FDSDtRQUNELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxTQUFtQjtRQUMvQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ25KLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3JGLE1BQU0sS0FBSyxHQUFHO2dCQUNaLGdCQUFnQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGdCQUFnQjtnQkFDMUQsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGNBQWM7Z0JBQ3RELElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTthQUNqQixDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMscUNBQXFDLEVBQUUsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDeEgsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQzt3QkFDM0Isa0JBQWtCLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7cUJBQ3ZFLENBQUMsQ0FBQztvQkFDSCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNsQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQWlCLEVBQUUsRUFBRSxHQUFHLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbEYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztvQkFDbkIsTUFBTSxPQUFPLEdBQVE7d0JBQ25CLElBQUksRUFBRSxtQkFBbUI7d0JBQ3pCLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7cUJBQzVHLENBQUE7b0JBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO3dCQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDdkYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7d0JBQ3BILElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFDeEQ7NEJBQ0UsZUFBZSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsS0FBSzs0QkFDaEUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsRUFBRSxLQUFLOzRCQUNwRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSzs0QkFDdEQsUUFBUSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO3lCQUN0RCxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFDO29CQUMvQyxDQUFDLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ2pEO2dCQUNELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxTQUFTO29CQUFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7WUFDaEUsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUFFO0lBQ3hELENBQUM7SUFFRCxjQUFjLENBQUMsT0FBZSxJQUFJLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxDQUFDLENBQUM7SUFDckcsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDckMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ3BDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN2QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDL0gsSUFBSSxJQUFJLENBQUMsT0FBTztnQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDMUQsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO29CQUNmLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO29CQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztvQkFDeEIsSUFBRyxDQUFDLElBQUksQ0FBQyxPQUFPO3dCQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNsRDtxQkFBTTtvQkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUM5QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztpQkFDekI7WUFDSCxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFO2dCQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2FBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN4RDthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkYsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO2dCQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUN6QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7YUFDekI7UUFDSCxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBLENBQUEsQ0FBQyxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUNELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7OytHQXJRVSxpQkFBaUI7bUdBQWpCLGlCQUFpQixrYUNiOUIsdTNPQTRJQTs0RkQvSGEsaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGVBQWU7d0pBS1MsWUFBWTtzQkFBN0MsU0FBUzt1QkFBQyxjQUFjO2dCQUNXLGNBQWM7c0JBQWpELFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNWLFNBQVM7c0JBQXpCLE1BQU07Z0JBQ1UsZUFBZTtzQkFBL0IsTUFBTTtnQkFRUyxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE9uSW5pdCwgVmlld0NoaWxkLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzLCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZyb21FdmVudCwgbWFwLCBPYnNlcnZhYmxlLCBzdGFydFdpdGgsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQ29vbG1hcFNlcnZpY2UsIFJvdXRlLCBVdGlsc1NlcnZpY2UgfSBmcm9tICdAYWdnZGlyZWN0L2Nvb2xtYXAtc2VydmljZXMnO1xyXG5pbXBvcnQgeyBEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9zaGFyZWQvZGlhbG9nL2RpYWxvZy5jb21wb25lbnQnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWFkZC1yb3V0ZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1yb3V0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYWRkLXJvdXRlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZFJvdXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZCgnZmlsdGVyUGlja3VwJykgcHVibGljIGZpbHRlclBpY2t1cCE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZmlsdGVyRGVsaXZlcnknKSBwdWJsaWMgZmlsdGVyRGVsaXZlcnkhOiBFbGVtZW50UmVmO1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlTmF2ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyB1cGRhdGVSb3V0ZUxpc3QgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgcGlja3VwT3B0aW9uczogYW55ID0gW107XHJcbiAgZGVsaXZlcnlPcHRpb25zOiBhbnkgPSBbXTtcclxuICByZXF1ZXN0UGFybXNGb3JSb3V0ZURldGFpbHMgPSB7IHBpY2t1cF9sYXRfbG5nOiAnJywgZGVsaXZlcnlfbGF0X2xuZzogJycgfVxyXG4gIGN1c3RvbWVyc0xpc3Q6IGFueSA9IFtdO1xyXG4gIHVuaXRzTGlzdDogYW55ID0gW107XHJcbiAgbWF0ZXJpYWxzTGlzdDogYW55ID0gW107XHJcbiAgYWRkUm91dGVGb3JtITogRm9ybUdyb3VwO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyByb3V0ZURhdGEhOiBSb3V0ZTtcclxuICBASW5wdXQoKSBwdWJsaWMgcG9ydGFsTmFtZSE6IHN0cmluZztcclxuICByb3V0ZUlkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gIHByZXZlbnRTYXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJldmVudEluaXRpYWxTYXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VzdG9tZXJzTGlzdCQhOiBPYnNlcnZhYmxlPGFueT47XHJcbiAgcm91dGVEZXRhaWxzITogeyBwaWNrdXBfbG9jYXRpb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7IGRlbGl2ZXJ5X2xvY2F0aW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkOyB9IHwgbnVsbDtcclxuICBwdWJsaWMgZGVzdHJveWVyJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgcG9wdXBEZXRhaWxzOiBSb3V0ZTtcclxuICBlbmFibGVQb3BVcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByZXZhbnRQb3B1cENsb3NlID0gZmFsc2U7XHJcbiAgZW5hYmxlRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29vbE1hcFNlcnZpY2U6IENvb2xtYXBTZXJ2aWNlLCBwdWJsaWMgdXRpbHM6IFV0aWxzU2VydmljZSwgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nKSB7ICAgIFxyXG4gICAgdGhpcy5mb3JtSW5pdCgpO1xyXG4gICAgdGhpcy51dGlscy5nZXRyb3V0ZURldGFpbHNVdGlsaXR5LnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgaWYgKHJlc1snZXZlbnQnXSAhPT0gJ2NsaWNrJyAmJiAhdGhpcy5wcmV2YW50UG9wdXBDbG9zZSkgeyB0aGlzLmVuYWJsZVBvcFVwID0gcmVzWydldmVudCddIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmVuYWJsZVBvcFVwICYmICF0aGlzLnByZXZhbnRQb3B1cENsb3NlKSB7IHRoaXMucHJldmFudFBvcHVwQ2xvc2UgPSB0cnVlOyB9XHJcbiAgICAgICAgaWYgKHJlc1snZXZlbnQnXSAhPT0gJ2NsaWNrJyAmJiAhcmVzWydldmVudCddICYmIHRoaXMucHJldmFudFBvcHVwQ2xvc2UpIHtcclxuICAgICAgICAgIHRoaXMucG9wdXBEZXRhaWxzID0gdGhpcy51dGlscy5nZXRkaWN0VmFsdWUoJ3JvdXRlLWRldGFpbHN2MicpO1xyXG4gICAgICAgIH0gZWxzZSB7IHRoaXMucG9wdXBEZXRhaWxzID0gcmVzWydyb3V0ZSddIH1cclxuICAgICAgICBpZiAodGhpcy5lbmFibGVQb3BVcCkgdGhpcy5wb3B1cERldGFpbHNbJ2NyZWF0ZWRfYXQnXSA9IHRoaXMudXRpbHMuZ2V0RGF0ZUZvcm1hdChuZXcgRGF0ZSh0aGlzLnBvcHVwRGV0YWlsc1snY3JlYXRlZF9hdCddKSwgJy8nKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGZpbHRlckN1c3RvbWVyTGlzdCgpIHtcclxuICAgIHRoaXMuY3VzdG9tZXJzTGlzdCQgPSB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1snY3VzdG9tZXJfbmFtZSddLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG4gICAgICBzdGFydFdpdGgoJycpLFxyXG4gICAgICBtYXAodmFsdWUgPT4gdGhpcy5fZmlsdGVyKHZhbHVlIHx8ICcnKSksXHJcbiAgICApO1xyXG4gIH1cclxuICBwdWJsaWMgX2ZpbHRlcih2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tZXJzTGlzdC5maWx0ZXIoKG9wdGlvbjogYW55KSA9PiBvcHRpb25bJ2N1c3RvbWVyX25hbWUnXS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSk7XHJcbiAgfVxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydyb3V0ZURhdGEnXSAmJiAhY2hhbmdlc1sncm91dGVEYXRhJ11bJ2N1cnJlbnRWYWx1ZSddKSB0aGlzLmluSXQobnVsbCk7XHJcbiAgfVxyXG4gIG9wZW5EaWFsb2coKTogdm9pZCB7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7IGJvZHk6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgcm91dGU/JyB9LFxyXG4gICAgfSk7XHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHsgaWYgKHJlcykgeyB0aGlzLmRlbGV0ZVJvdXRlKCkgfSB9KTtcclxuICB9XHJcbiAgZWRpdEV2ZW50KCl7XHJcbiAgICB0aGlzLnByZXZhbnRQb3B1cENsb3NlID0gZmFsc2U7XHJcbiAgICB0aGlzLmVuYWJsZUZvcm0gPSB0cnVlOyB0aGlzLmVuYWJsZVBvcFVwID0gZmFsc2U7XHJcbiAgICB0aGlzLnBvcHVwRGV0YWlsc1sncHJldmVudCddID0gZmFsc2U7XHJcbiAgICB0aGlzLnV0aWxzLnJlbW92ZU1hcEVudGl0eS5uZXh0KHRoaXMucG9wdXBEZXRhaWxzKTtcclxuICAgIHRoaXMuaW5JdCh0aGlzLnBvcHVwRGV0YWlscyk7XHJcbiAgfVxyXG4gIGluSXQoY2hhbmdlczogUm91dGUpIHtcclxuICAgIGlmIChjaGFuZ2VzKSB7XHJcbiAgICAgIGlmICghY2hhbmdlc1sncHJldmVudCddKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2ZW50U2F2ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2xWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMucGF0Y2hGb3JtVmFsdWUoY2hhbmdlcyk7IHRoaXMuY2hlY2tBbmRGZXRjaFJvdXRlSW5mb3JtYXRpb24odHJ1ZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFjaGFuZ2VzKSB7IHRoaXMuZW5hYmxlRm9ybSA9IHRydWU7IHRoaXMucHJldmVudFNhdmUgPSB0cnVlOyB0aGlzLnBhdGNoRm9ybVZhbHVlKCk7IHRoaXMuY2hlY2tBbmRGZXRjaFJvdXRlSW5mb3JtYXRpb24oKSB9XHJcbiAgfVxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5mZXRjaEN1c3RvbWVyc0xpc3QoKTtcclxuICAgIHRoaXMuZmV0Y2hVbml0c0xpc3QoKTtcclxuICAgIHRoaXMuZmV0Y2hNYXRlcmlhbHNMaXN0KCk7XHJcbiAgICB0aGlzLmZvcm1Db250cm9sVmFsdWUoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGZyb21FdmVudCh0aGlzLmZpbHRlclBpY2t1cC5uYXRpdmVFbGVtZW50LCAna2V5dXAnKS5waXBlKFxyXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBkZWJvdW5jZVRpbWUoMTUwKSkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLnV0aWxzLmZldGNoQXV0b0NvbXBsZXRlTG9jYXRpb25zKHRoaXMuZmlsdGVyUGlja3VwLm5hdGl2ZUVsZW1lbnQudmFsdWUpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMucGlja3VwT3B0aW9ucyA9IHJlcy5mZWF0dXJlcztcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgZnJvbUV2ZW50KHRoaXMuZmlsdGVyRGVsaXZlcnkubmF0aXZlRWxlbWVudCwgJ2tleXVwJykucGlwZShcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZGVib3VuY2VUaW1lKDE1MCkpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy51dGlscy5mZXRjaEF1dG9Db21wbGV0ZUxvY2F0aW9ucyh0aGlzLmZpbHRlckRlbGl2ZXJ5Lm5hdGl2ZUVsZW1lbnQudmFsdWUpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGVsaXZlcnlPcHRpb25zID0gcmVzLmZlYXR1cmVzO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGZvcm1Db250cm9sVmFsdWUoKSB7XHJcbiAgICB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1sncGlja3VwX2xvY2F0aW9uJ10/LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5waWNrdXBfbG9jYXRpb24gJiYgcmVzICE9PSB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5waWNrdXBfbG9jYXRpb24pIHtcclxuICAgICAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICAgIHBpY2t1cF9sYXRfbG5nOiAnJyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmFkZFJvdXRlRm9ybS5jb250cm9sc1sncGlja3VwX2xhdF9sbmcnXS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYWRkUm91dGVGb3JtLmNvbnRyb2xzWydkZWxpdmVyeV9sb2NhdGlvbiddPy52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUuZGVsaXZlcnlfbG9jYXRpb24gJiYgcmVzICE9PSB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS5kZWxpdmVyeV9sb2NhdGlvbikge1xyXG4gICAgICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgICAgZGVsaXZlcnlfbGF0X2xuZzogJycsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5hZGRSb3V0ZUZvcm0uY29udHJvbHNbJ2RlbGl2ZXJ5X2xhdF9sbmcnXS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZm9ybUluaXQoKSB7XHJcbiAgICB0aGlzLmFkZFJvdXRlRm9ybSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICByb3V0ZV9uYW1lOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGN1c3RvbWVyX25hbWU6IG5ldyBGb3JtQ29udHJvbCh7dmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZX0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIG1hdGVyaWFsc19pZDogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICB1bml0X2lkOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIHBhdGg6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcclxuICAgICAgcGlja3VwX2xvY2F0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIHBpY2t1cF9sYXRfbG5nOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGRlbGl2ZXJ5X2xvY2F0aW9uOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGRlbGl2ZXJ5X2xhdF9sbmc6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcclxuICAgICAgZXN0aW1hdGVkX2Rpc3RhbmNlOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIGVzdGltYXRlZF90aW1lOiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXHJcbiAgICAgIG5vdGU6IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDIwNDgpXSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHBhdGNoRm9ybVZhbHVlKGRhdGE/OiBSb3V0ZSkge1xyXG4gICAgdGhpcy5hZGRSb3V0ZUZvcm0ucmVzZXQoKTtcclxuICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoZGF0YSEpO1xyXG4gICAgdGhpcy5yb3V0ZUlkID0gZGF0YT8ucm91dGVfaWQ7XHJcbiAgICB0aGlzLnJvdXRlRGV0YWlscyA9IGRhdGEgPyB7IHBpY2t1cF9sb2NhdGlvbjogZGF0YS5waWNrdXBfbG9jYXRpb24sIGRlbGl2ZXJ5X2xvY2F0aW9uOiBkYXRhLmRlbGl2ZXJ5X2xvY2F0aW9uIH0gOiBudWxsO1xyXG4gICAgdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7IGlmICh0aGlzLnByZXZlbnRJbml0aWFsU2F2ZSkgdGhpcy5wcmV2ZW50SW5pdGlhbFNhdmUgPSBmYWxzZSB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZmlsdGVyQ3VzdG9tZXJMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBmZXRjaEN1c3RvbWVyc0xpc3QoKSB7XHJcbiAgICB0aGlzLnV0aWxzLmdldERhdGEoYCR7dGhpcy5wb3J0YWxOYW1lfS9jb21wYW55L2xpc3Qvdmlld2ApLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVyJCkpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlcykgeyB0aGlzLmN1c3RvbWVyc0xpc3QgPSByZXMuZGF0YTsgdGhpcy5maWx0ZXJDdXN0b21lckxpc3QoKTsgdGhpcy5hZGRSb3V0ZUZvcm0uY29udHJvbHNbJ2N1c3RvbWVyX25hbWUnXS5lbmFibGUoKTsgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGZldGNoVW5pdHNMaXN0KCkge1xyXG4gICAgdGhpcy51dGlscy5nZXREYXRhKGAke3RoaXMucG9ydGFsTmFtZX0vdW5pdC9saXN0L3ZpZXdgKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHsgdGhpcy51bml0c0xpc3QgPSByZXMuZGF0YSB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hNYXRlcmlhbHNMaXN0KCkge1xyXG4gICAgdGhpcy51dGlscy5nZXREYXRhKGAke3RoaXMucG9ydGFsTmFtZX0vbWF0ZXJpYWwvbGlzdC92aWV3YCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgcmVzLmRhdGEuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGEubWF0ZXJpYWwubG9jYWxlQ29tcGFyZShiLm1hdGVyaWFsKSlcclxuICAgICAgdGhpcy5tYXRlcmlhbHNMaXN0ID0gcmVzLmRhdGFcclxuICAgIH0pKVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0ZWRMb25nTGF0KHR5cGU6IHN0cmluZywgZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHR5cGUgPT09ICdwaWNrdXAnKSB7XHJcbiAgICAgIHRoaXMuYWRkUm91dGVGb3JtLnBhdGNoVmFsdWUoe1xyXG4gICAgICAgIHBpY2t1cF9sYXRfbG5nOiAoZXZlbnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0gKyAnLCcgKyBldmVudC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSkudG9TdHJpbmcoKVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5jb29sTWFwU2VydmljZS5jbGVhckJvdW5kV2l0aENvcmRpbmF0ZXMoKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RlbGl2ZXJ5Jykge1xyXG4gICAgICB0aGlzLmFkZFJvdXRlRm9ybS5wYXRjaFZhbHVlKHtcclxuICAgICAgICBkZWxpdmVyeV9sYXRfbG5nOiAoZXZlbnQuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV0gKyAnLCcgKyBldmVudC5nZW9tZXRyeS5jb29yZGluYXRlc1swXSkudG9TdHJpbmcoKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgdGhpcy5jaGVja0FuZEZldGNoUm91dGVJbmZvcm1hdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tBbmRGZXRjaFJvdXRlSW5mb3JtYXRpb24oaXNpbml0aWFsPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlPy5kZWxpdmVyeV9sYXRfbG5nPy5sZW5ndGggPiAwICYmIHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlPy5waWNrdXBfbGF0X2xuZz8ubGVuZ3RoID4gMCAmJiB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS51bml0X2lkKSB7XHJcbiAgICAgIGxldCB1bml0ID0gdGhpcy51bml0c0xpc3QuZmluZCgoeDogYW55KSA9PiB4LmlkID09PSB0aGlzLmFkZFJvdXRlRm9ybS52YWx1ZS51bml0X2lkKTtcclxuICAgICAgY29uc3QgcGFyYW0gPSB7XHJcbiAgICAgICAgZGVsaXZlcnlfbGF0X2xuZzogdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUuZGVsaXZlcnlfbGF0X2xuZyxcclxuICAgICAgICBwaWNrdXBfbGF0X2xuZzogdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUucGlja3VwX2xhdF9sbmcsXHJcbiAgICAgICAgdW5pdDogdW5pdD8udHlwZVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLnV0aWxzLnBvc3RkYXRhKCdjb29sbWFwL2NhbGN1bGF0ZS9yb3V0ZXMvZXN0aW1hdGlvbicsIHBhcmFtKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llciQpKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXNbJ3BhdGgnXSkge1xyXG4gICAgICAgICAgdGhpcy5hZGRSb3V0ZUZvcm0ucGF0Y2hWYWx1ZSh7XHJcbiAgICAgICAgICAgIGVzdGltYXRlZF9kaXN0YW5jZTogcmVzLmRpc3QsIGVzdGltYXRlZF90aW1lOiByZXMudGltZSwgcGF0aDogcmVzLnBhdGhcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgbGV0IHBhdGggPSByZXNbJ3BhdGgnXS5zcGxpdCgnOycpO1xyXG4gICAgICAgICAgcGF0aCA9IHBhdGgubWFwKChlbGU6IHN0cmluZyB8IGFueSkgPT4geyByZXR1cm4gZWxlID0gdGhpcy5mb3JtYXRlTGF0TG9uZyhlbGUpIH0pO1xyXG4gICAgICAgICAgcmVzWydwYXRoJ10gPSBwYXRoO1xyXG4gICAgICAgICAgY29uc3QgZWxlbWVudDogYW55ID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxyXG4gICAgICAgICAgICBmZWF0dXJlczogW3sgdHlwZTogJ0ZlYXR1cmUnLCBwcm9wZXJ0aWVzOiB7fSwgZ2VvbWV0cnk6IHsgdHlwZTogJ0xpbmVTdHJpbmcnLCBjb29yZGluYXRlczogcmVzWydwYXRoJ10gfSB9XVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5jb29sTWFwU2VydmljZS5yZW1vdmVSb3V0ZUFuZE1hcmtlcigxKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdW5pdCA9IHRoaXMudW5pdHNMaXN0LmZpbmQoKHg6IGFueSkgPT4geC5pZCA9PT0gdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWUudW5pdF9pZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsRGV0YWlscyA9IHRoaXMubWF0ZXJpYWxzTGlzdC5maW5kKCh4OiBhbnkpID0+IHgubWF0ZXJpYWxfaWQgPT09IHRoaXMuYWRkUm91dGVGb3JtLnZhbHVlLm1hdGVyaWFsc19pZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29vbE1hcFNlcnZpY2UubG9hZE1hcFByb3BlcnR5KGVsZW1lbnQsIDEsIHVuaXQ/LnR5cGUsXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgcGlja3VwX2xvY2F0aW9uOiB0aGlzLmFkZFJvdXRlRm9ybS5nZXQoJ3BpY2t1cF9sb2NhdGlvbicpPy52YWx1ZSxcclxuICAgICAgICAgICAgICAgIGRlbGl2ZXJ5X2xvY2F0aW9uOiB0aGlzLmFkZFJvdXRlRm9ybS5nZXQoJ2RlbGl2ZXJ5X2xvY2F0aW9uJyk/LnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgcm91dGVfbmFtZTogdGhpcy5hZGRSb3V0ZUZvcm0uZ2V0KCdyb3V0ZV9uYW1lJyk/LnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgbWF0ZXJpYWw6IG1hdGVyaWFsRGV0YWlscz8ubWF0ZXJpYWwsIHVuaXQ6IHVuaXQ/LnR5cGVcclxuICAgICAgICAgICAgICB9KS50aGVuKChyZXMpID0+e3RoaXMucHJldmVudFNhdmUgPSB0cnVlfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5jb29sTWFwU2VydmljZS5yZW1vdmVSb3V0ZUFuZE1hcmtlcigxKTtcclxuICAgICAgICAgIHRoaXMudXRpbHMub3BlblNuYWNrQmFyKHJlc1snc3RhdHVzJ10sICdlcnJvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5yb3V0ZUlkICYmIGlzaW5pdGlhbCkgdGhpcy5wcmV2ZW50SW5pdGlhbFNhdmUgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7IHRoaXMuY29vbE1hcFNlcnZpY2UucmVtb3ZlUm91dGVBbmRNYXJrZXIoMSkgfVxyXG4gIH1cclxuXHJcbiAgZm9ybWF0ZUxhdExvbmcobGF0bG9uZzogc3RyaW5nKSB7IHJldHVybiBsYXRsb25nID8gbGF0bG9uZy5zcGxpdCgnLCcpLm1hcCh4ID0+ICt4KS5yZXZlcnNlKCkgOiBudWxsIH1cclxuICBzYXZlUm91dGUoKSB7XHJcbiAgICBpZiAodGhpcy5hZGRSb3V0ZUZvcm0udmFsaWQpIHtcclxuICAgICAgdGhpcy5wcmV2ZW50U2F2ZSA9IGZhbHNlO1xyXG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5hZGRSb3V0ZUZvcm0udmFsdWU7XHJcbiAgICAgIGRhdGFbJ3RydWNrZXJfcGF5X2VzdGltYXRlJ10gPSBudWxsO1xyXG4gICAgICBkYXRhWydjdXN0b21lcl9wcmljZV9lc3RpbWF0ZSddID0gbnVsbDtcclxuICAgICAgY29uc3QgdXJsID0gdGhpcy5yb3V0ZUlkID8gdGhpcy51dGlscy5wb3N0ZGF0YSgnY29vbG1hcC91cGRhdGUvcm91dGVzJywgZGF0YSkgOiB0aGlzLnV0aWxzLnBvc3RkYXRhKCdjb29sbWFwL2FkZC9yb3V0ZXMnLCBkYXRhKVxyXG4gICAgICBpZiAodGhpcy5yb3V0ZUlkKSBkYXRhWydpZCddID0gdGhpcy5yb3V0ZUlkO1xyXG4gICAgICB1cmwucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZXIkKSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVSb3V0ZUxpc3QuZW1pdCh0cnVlKTtcclxuICAgICAgICAgIHRoaXMudXRpbHMub3BlblNuYWNrQmFyKHJlcy5tZXNzYWdlLCAnc3VjY2VzcycpO1xyXG4gICAgICAgICAgdGhpcy5wcmV2ZW50SW5pdGlhbFNhdmUgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5wcmV2ZW50U2F2ZSA9IHRydWU7XHJcbiAgICAgICAgICBpZighdGhpcy5yb3V0ZUlkKXRoaXMuY2hhbmdlTmF2Lm5leHQoJ0FkZHJvdXRlJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudXRpbHMub3BlblNuYWNrQmFyKHJlcy5tZXNzYWdlLCAnZXJyb3InKTtcclxuICAgICAgICAgIHRoaXMucHJldmVudFNhdmUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgKGVycikgPT4geyBpZiAoZXJyKSB7IHRoaXMucHJldmVudFNhdmUgPSB0cnVlOyB9IH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hZGRSb3V0ZUZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBkZWxldGVSb3V0ZSgpIHtcclxuICAgIHRoaXMucHJldmVudFNhdmUgPSBmYWxzZTtcclxuICAgIHRoaXMudXRpbHMucG9zdGRhdGEoJ2Nvb2xtYXAvZGVsZXRlL3JvdXRlcycsIHsgdXVpZDogdGhpcy5yb3V0ZUlkIH0pLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzWydkYXRhJ11bJ3N1Y2Nlc3MnXSkge1xyXG4gICAgICAgIHRoaXMudXRpbHMub3BlblNuYWNrQmFyKHJlc1snZGF0YSddWydtZXNzYWdlJ10sICdzdWNjZXNzJyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVSb3V0ZUxpc3QuZW1pdCh0cnVlKTtcclxuICAgICAgICB0aGlzLmNoYW5nZU5hdi5uZXh0KCdBZGRyb3V0ZScpO1xyXG4gICAgICAgIHRoaXMucHJldmVudEluaXRpYWxTYXZlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnByZXZlbnRTYXZlID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnV0aWxzLm9wZW5TbmFja0JhcignU29tdGhpbmcgd2VudCB3cm9uZycsICdlcnJvcicpO1xyXG4gICAgICAgIHRoaXMucHJldmVudFNhdmUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9LCAoZXJyKSA9Pnt0aGlzLnByZXZlbnRTYXZlID0gdHJ1ZX0pXHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95ZXIkLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLmRlc3Ryb3llciQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImFkZHJvdXRlYm94XCI+XHJcbiAgPGRpdiBjbGFzcz1cInJvdXRlZGV0YWlsYm94XCIgKm5nSWY9XCJlbmFibGVQb3BVcFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNsb3NlYnRucm91dGVkZXRhaWxcIj5cclxuICAgICAgPG1hdC1pY29uIChjbGljayk9XCJwcmV2YW50UG9wdXBDbG9zZSA9IGZhbHNlOyBlbmFibGVQb3BVcCA9IGZhbHNlO1wiPmNsZWFyPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImRlc3RpbmF0aW9uXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkdXJhdGlvblwiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwicGlja3BydFwiPjxiPlBpY2t1cDo8L2I+e3twb3B1cERldGFpbHNbJ3BpY2t1cF9sb2NhdGlvbiddfX08L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJkcm9wcHJ0XCI+PGI+RGVsaXZlcnk6PC9iPnt7cG9wdXBEZXRhaWxzWydkZWxpdmVyeV9sb2NhdGlvbiddfX08L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8c3Bhbj48Yj5OYW1lOjwvYj4ge3twb3B1cERldGFpbHNbJ3JvdXRlX25hbWUnXX19PC9zcGFuPlxyXG4gICAgICA8c3Bhbj48Yj5DdXN0b21lcjo8L2I+IHt7cG9wdXBEZXRhaWxzWydjdXN0b21lcl9uYW1lJ119fTwvc3Bhbj5cclxuICAgICAgPHNwYW4+PGI+TWF0ZXJpYWw6PC9iPiB7e3BvcHVwRGV0YWlsc1snbWF0ZXJpYWwnXX19PC9zcGFuPlxyXG4gICAgICA8c3Bhbj48Yj5UeXBlOjwvYj4ge3twb3B1cERldGFpbHNbJ3VuaXQnXX19PC9zcGFuPlxyXG4gICAgICA8c3Bhbj48Yj5EaXN0YW5jZTo8L2I+IHt7cG9wdXBEZXRhaWxzWydlc3RpbWF0ZWRfZGlzdGFuY2UnXX19PC9zcGFuPlxyXG4gICAgICA8c3Bhbj48Yj5UcmF2ZWwgVGltZTo8L2I+IHt7cG9wdXBEZXRhaWxzWydlc3RpbWF0ZWRfdGltZSddfX08L3NwYW4+XHJcblxyXG4gICAgICA8c3BhbiBjbGFzcz1cInJvdXRlbm90ZXNcIj48Yj5Ob3Rlczo8L2I+IHt7cG9wdXBEZXRhaWxzWydub3RlJ119fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNyZWF0ZVR4dFwiPlxyXG4gICAgICA8c21hbGw+XHJcbiAgICAgICAgQ3JlYXRlZCBieSB7e3BvcHVwRGV0YWlsc1snY3JlYXRlZF9ieV9uYW1lJ119fSBvbiB7e3BvcHVwRGV0YWlsc1snY3JlYXRlZF9hdCddfX1cclxuICAgICAgPC9zbWFsbD5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImVkaXRidG5cIiAoY2xpY2spPVwiZWRpdEV2ZW50KClcIj5FZGl0PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiYWRkX2FkZF9yb3V0ZV9ib3hcIiBjZGtEcmFnIFtzdHlsZS52aXNpYmlsaXR5XT1cIiFlbmFibGVGb3JtID8gJ2hpZGRlbicgOiAndmlzaWJsZSdcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b3BoZWFkaW5ncHJ0XCI+XHJcbiAgICAgIDxoMj4ge3tyb3V0ZUlkPyAnRURJVCcgOiAnQUREJ319IFJPVVRFIDwvaDI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25wcnRcIj5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwicm91dGVJZFwiIGNsYXNzPVwiZGVsYnRuXCIgKGNsaWNrKT1cIm9wZW5EaWFsb2coKVwiPkRlbGV0ZTwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiY2xvc2VidG5cIiAoY2xpY2spPVwiY2hhbmdlTmF2Lm5leHQoJ0FkZHJvdXRlJylcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJhZGRSb3V0ZUZvcm1cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdXRlX2Zvcm1fYXJlYVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPlJvdXRlIE5hbWU8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cInJvdXRlX25hbWVcIiBhdXRvY29tcGxldGU9XCJub3BlXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImFkZFJvdXRlRm9ybS5jb250cm9sc1sncm91dGVfbmFtZSddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgUm91dGUgTmFtZSBpcyByZXF1aXJlZFxyXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiQ3VzdG9tZXIgTmFtZVwiIG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImN1c3RvbWVyX25hbWVcIiBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSBhdXRvQWN0aXZlRmlyc3RPcHRpb24gI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgY3VzdG9tZXIgb2YgY3VzdG9tZXJzTGlzdCQgfCBhc3luY1wiIFt2YWx1ZV09XCJjdXN0b21lclsnY3VzdG9tZXJfbmFtZSddXCI+XHJcbiAgICAgICAgICAgICAgICB7e2N1c3RvbWVyWydjdXN0b21lcl9uYW1lJ119fVxyXG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWydjdXN0b21lcl9uYW1lJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBDdXN0b21lciBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDxtYXQtbGFiZWw+UGlja3VwPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgbWF0SW5wdXQgI2ZpbHRlclBpY2t1cCBbbWF0QXV0b2NvbXBsZXRlXT1cInBpY2t1cEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGlja3VwX2xvY2F0aW9uXCIgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuXHJcbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNwaWNrdXBBdXRvY29tcGxldGU9XCJtYXRBdXRvY29tcGxldGVcIj5cclxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAoY2xpY2spPVwic2VsZWN0ZWRMb25nTGF0KCdwaWNrdXAnLCBvcHRpb24pXCIgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwaWNrdXBPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24/LnBsYWNlX25hbWVcIj5cclxuICAgICAgICAgICAgICAgIHt7b3B0aW9uPy5wbGFjZV9uYW1lfX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWydwaWNrdXBfbGF0X2xuZyddLnRvdWNoZWQgJiYgYWRkUm91dGVGb3JtLmNvbnRyb2xzWydwaWNrdXBfbGF0X2xuZyddLmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgIFBsZWFzZSBzZWxlY3QgcGlja3VwIGxvY2F0aW9uIGZyb20gdGhlIGxpc3QuXHJcbiAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD5EZWxpdmVyeTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIG1hdElucHV0ICNmaWx0ZXJEZWxpdmVyeSBbbWF0QXV0b2NvbXBsZXRlXT1cImRlbGl2ZXJ5QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWxpdmVyeV9sb2NhdGlvblwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNkZWxpdmVyeUF1dG9jb21wbGV0ZT1cIm1hdEF1dG9jb21wbGV0ZVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIChjbGljayk9XCJzZWxlY3RlZExvbmdMYXQoJ2RlbGl2ZXJ5Jywgb3B0aW9uKVwiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZGVsaXZlcnlPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24/LnBsYWNlX25hbWVcIj5cclxuICAgICAgICAgICAgICAgIHt7b3B0aW9uPy5wbGFjZV9uYW1lfX1cclxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWydkZWxpdmVyeV9sYXRfbG5nJ10udG91Y2hlZCAmJiBhZGRSb3V0ZUZvcm0uY29udHJvbHNbJ2RlbGl2ZXJ5X2xhdF9sbmcnXS5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IGRlbGl2ZXJ5IGxvY2F0aW9uIGZyb20gdGhlIGxpc3QuXHJcbiAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD5Ob3RlczwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8dGV4dGFyZWEgc3R5bGU9XCJoZWlnaHQ6IDE4cHg7IHJlc2l6ZTogbm9uZTtcIiBtYXRJbnB1dCBuYW1lPVwiXCIgaWQ9XCJcIiBjb2xzPVwiMzBcIiByb3dzPVwiMTBcIiBmb3JtQ29udHJvbE5hbWU9XCJub3RlXCIgYXV0b2NvbXBsZXRlPVwibm9wZVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImFkZFJvdXRlRm9ybS5jb250cm9sc1snbm90ZSddLmhhc0Vycm9yKCdtYXhsZW5ndGgnKVwiPlxyXG4gICAgICAgICAgICAgIE5vdGVzIHNob3VsZCBiZSB3aXRoaW4gMjA0OCBjaGFyYWN0ZXJzLlxyXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBkLWZsZXhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dGJveCBtLTBcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+VW5pdCB0eXBlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwidW5pdF9pZFwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiY2hlY2tBbmRGZXRjaFJvdXRlSW5mb3JtYXRpb24oKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdW5pdCBvZiB1bml0c0xpc3RcIiBbdmFsdWVdPVwidW5pdD8uaWRcIj4ge3t1bml0Py50eXBlfX0gPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiYWRkUm91dGVGb3JtLmNvbnRyb2xzWyd1bml0X2lkJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgIFVuaXQgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dGJveCBtLTBcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+TWF0ZXJpYWw8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJtYXRlcmlhbHNfaWRcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG1hdGVyaWFsIG9mIG1hdGVyaWFsc0xpc3RcIiBbdmFsdWVdPVwibWF0ZXJpYWw/Lm1hdGVyaWFsX2lkXCI+IHt7bWF0ZXJpYWw/Lm1hdGVyaWFsfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImFkZFJvdXRlRm9ybS5jb250cm9sc1snbWF0ZXJpYWxzX2lkJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgIE1ldGVyaWFsIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgIDxhcHAtZXN0aW1hdGlvbi1kaXNwbGF5ICpuZ0lmPVwiYWRkUm91dGVGb3JtPy52YWx1ZT8ucGlja3VwX2xhdF9sbmcgJiYgYWRkUm91dGVGb3JtPy52YWx1ZT8uZGVsaXZlcnlfbGF0X2xuZ1wiIFt2YWx1ZV09XCJhZGRSb3V0ZUZvcm1bJ3ZhbHVlJ11cIj48L2FwcC1lc3RpbWF0aW9uLWRpc3BsYXk+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwic3VibWl0XCIgKGNsaWNrKT1cInNhdmVSb3V0ZSgpXCIgKm5nSWY9XCJwcmV2ZW50U2F2ZVwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiYWRkUm91dGVGb3JtLmludmFsaWQgJiYgcHJldmVudFNhdmUgfHwgcHJldmVudEluaXRpYWxTYXZlXCI+e3tyb3V0ZUlkPyAnVXBkYXRlJyA6ICdTYXZlJ319XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRlclwiPlxyXG4gICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiIXByZXZlbnRTYXZlXCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=