atr-components 0.2.417 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/atr-components.module.d.ts +9 -9
  2. package/atr-public-api.d.ts +53 -53
  3. package/core/animations/animations.d.ts +1 -1
  4. package/core/animations/fly-in.d.ts +1 -1
  5. package/core/animations/scroll-screen.d.ts +1 -1
  6. package/core/auth/auth.guard.d.ts +11 -11
  7. package/core/base/atr-common.d.ts +347 -347
  8. package/core/directive/error-img.directive.d.ts +10 -10
  9. package/core/directive/hq-spin.directive.d.ts +13 -13
  10. package/core/directive/role.directive.d.ts +16 -16
  11. package/core/interceptor/base.interceptor.d.ts +17 -17
  12. package/core/ngz-module/cus-zorro-antd.module.d.ts +75 -75
  13. package/core/pipe/china-num.pipe.d.ts +7 -7
  14. package/core/pipe/count.pipe.d.ts +7 -7
  15. package/core/pipe/day.pipe.d.ts +8 -8
  16. package/core/pipe/defaultVal.pipe.d.ts +7 -7
  17. package/core/pipe/dicts.pipe.d.ts +10 -10
  18. package/core/pipe/image-pipe.pipe.d.ts +8 -8
  19. package/core/pipe/is-empty.pipe.d.ts +7 -7
  20. package/core/pipe/is-not-empty.pipe.d.ts +7 -7
  21. package/core/pipe/oss.pipe.d.ts +7 -7
  22. package/core/pipe/ossStatic.pipe.d.ts +7 -7
  23. package/core/pipe/pipe-module.module.d.ts +21 -21
  24. package/core/pipe/remove-html.pipe.d.ts +10 -10
  25. package/core/pipe/safe-compute.pipe.d.ts +7 -7
  26. package/core/pipe/safe-html.pipe.d.ts +10 -10
  27. package/core/pipe/safe-url.pipe.d.ts +10 -10
  28. package/core/routereuse/atr-reuse-strategy.d.ts +19 -19
  29. package/core/services/dict/dict.service.d.ts +20 -20
  30. package/core/services/http.service.d.ts +31 -31
  31. package/core/services/menu.service.d.ts +29 -29
  32. package/core/services/upload-oss.service.d.ts +14 -14
  33. package/core/utils/ToolsUtil.d.ts +180 -180
  34. package/core/utils/localstorage.util.d.ts +15 -15
  35. package/core/utils/sessionstorage.util.d.ts +15 -15
  36. package/{esm2020 → esm2022}/atr-components.mjs +4 -4
  37. package/esm2022/atr-components.module.mjs +36 -0
  38. package/{esm2020 → esm2022}/atr-public-api.mjs +54 -54
  39. package/{esm2020 → esm2022}/core/animations/animations.mjs +9 -9
  40. package/{esm2020 → esm2022}/core/animations/fly-in.mjs +18 -18
  41. package/{esm2020 → esm2022}/core/animations/scroll-screen.mjs +22 -22
  42. package/{esm2020 → esm2022}/core/auth/auth.guard.mjs +37 -37
  43. package/esm2022/core/base/atr-common.mjs +47 -0
  44. package/{esm2020 → esm2022}/core/directive/error-img.directive.mjs +31 -31
  45. package/{esm2020 → esm2022}/core/directive/hq-spin.directive.mjs +48 -48
  46. package/esm2022/core/directive/role.directive.mjs +69 -0
  47. package/{esm2020 → esm2022}/core/interceptor/base.interceptor.mjs +165 -165
  48. package/{esm2020 → esm2022}/core/ngz-module/cus-zorro-antd.module.mjs +292 -292
  49. package/{esm2020 → esm2022}/core/pipe/china-num.pipe.mjs +36 -36
  50. package/{esm2020 → esm2022}/core/pipe/count.pipe.mjs +34 -34
  51. package/{esm2020 → esm2022}/core/pipe/day.pipe.mjs +24 -24
  52. package/{esm2020 → esm2022}/core/pipe/defaultVal.pipe.mjs +23 -23
  53. package/{esm2020 → esm2022}/core/pipe/dicts.pipe.mjs +28 -28
  54. package/{esm2020 → esm2022}/core/pipe/image-pipe.pipe.mjs +17 -17
  55. package/{esm2020 → esm2022}/core/pipe/is-empty.pipe.mjs +20 -20
  56. package/{esm2020 → esm2022}/core/pipe/is-not-empty.pipe.mjs +17 -17
  57. package/{esm2020 → esm2022}/core/pipe/oss.pipe.mjs +17 -17
  58. package/{esm2020 → esm2022}/core/pipe/ossStatic.pipe.mjs +17 -17
  59. package/esm2022/core/pipe/pipe-module.module.mjs +38 -0
  60. package/{esm2020 → esm2022}/core/pipe/remove-html.pipe.mjs +21 -21
  61. package/{esm2020 → esm2022}/core/pipe/safe-compute.pipe.mjs +23 -23
  62. package/{esm2020 → esm2022}/core/pipe/safe-html.pipe.mjs +20 -20
  63. package/{esm2020 → esm2022}/core/pipe/safe-url.pipe.mjs +20 -20
  64. package/esm2022/core/routereuse/atr-reuse-strategy.mjs +79 -0
  65. package/esm2022/core/services/dict/dict.service.mjs +152 -0
  66. package/{esm2020 → esm2022}/core/services/http.service.mjs +306 -306
  67. package/{esm2020 → esm2022}/core/services/menu.service.mjs +130 -130
  68. package/{esm2020 → esm2022}/core/services/upload-oss.service.mjs +74 -74
  69. package/esm2022/core/utils/ToolsUtil.mjs +622 -0
  70. package/{esm2020 → esm2022}/core/utils/localstorage.util.mjs +94 -94
  71. package/{esm2020 → esm2022}/core/utils/sessionstorage.util.mjs +72 -72
  72. package/{esm2020 → esm2022}/lib/hello/hello.component.mjs +15 -15
  73. package/esm2022/lib/hello/hello.module.mjs +20 -0
  74. package/esm2022/lib/shared/atr-shared.module.mjs +204 -0
  75. package/esm2022/lib/shared/echarts/echarts.component.mjs +77 -0
  76. package/esm2022/lib/shared/form/form.component.mjs +574 -0
  77. package/esm2022/lib/shared/img-canvas/img-canvas.component.mjs +132 -0
  78. package/esm2022/lib/shared/local-upload/local-upload.component.mjs +68 -0
  79. package/esm2022/lib/shared/quill-editor/quill-editor.component.mjs +248 -0
  80. package/esm2022/lib/shared/select-icons/select-icons.component.mjs +90 -0
  81. package/{esm2020 → esm2022}/lib/shared/select-tree/select-tree.component.mjs +55 -55
  82. package/{esm2020 → esm2022}/lib/shared/service/busi.service.mjs +69 -69
  83. package/{esm2020 → esm2022}/lib/shared/share.service.mjs +107 -107
  84. package/esm2022/lib/shared/table/table-form-item/table-form-item.component.mjs +96 -0
  85. package/esm2022/lib/shared/table/table-td/table-td.component.mjs +165 -0
  86. package/esm2022/lib/shared/table/table.component.mjs +749 -0
  87. package/{esm2020 → esm2022}/lib/shared/upload/upload.component.mjs +274 -274
  88. package/{esm2020 → esm2022}/lib/shared/validators/atr-validtors.mjs +8 -8
  89. package/esm2022/lib/shared/video/video.component.mjs +16 -0
  90. package/esm2022/lib/shared/view-form/view-form.component.mjs +181 -0
  91. package/{fesm2020 → fesm2022}/atr-components.mjs +5311 -5312
  92. package/fesm2022/atr-components.mjs.map +1 -0
  93. package/{atr-components.d.ts → index.d.ts} +5 -5
  94. package/lib/hello/hello.component.d.ts +8 -8
  95. package/lib/hello/hello.module.d.ts +8 -8
  96. package/lib/shared/atr-shared.module.d.ts +36 -33
  97. package/lib/shared/echarts/echarts.component.d.ts +34 -34
  98. package/lib/shared/form/form.component.d.ts +45 -45
  99. package/lib/shared/img-canvas/img-canvas.component.d.ts +28 -28
  100. package/lib/shared/local-upload/local-upload.component.d.ts +22 -22
  101. package/lib/shared/quill-editor/quill-editor.component.d.ts +45 -45
  102. package/lib/shared/select-icons/select-icons.component.d.ts +24 -24
  103. package/lib/shared/select-tree/select-tree.component.d.ts +23 -23
  104. package/lib/shared/service/busi.service.d.ts +20 -20
  105. package/lib/shared/share.service.d.ts +14 -14
  106. package/lib/shared/table/table-form-item/table-form-item.component.d.ts +25 -25
  107. package/lib/shared/table/table-td/table-td.component.d.ts +26 -26
  108. package/lib/shared/table/table.component.d.ts +94 -94
  109. package/lib/shared/upload/upload.component.d.ts +53 -53
  110. package/lib/shared/validators/atr-validtors.d.ts +2 -2
  111. package/lib/shared/video/video.component.d.ts +7 -7
  112. package/lib/shared/view-form/view-form.component.d.ts +28 -28
  113. package/package.json +14 -22
  114. package/esm2020/atr-components.module.mjs +0 -38
  115. package/esm2020/core/base/atr-common.mjs +0 -47
  116. package/esm2020/core/directive/role.directive.mjs +0 -69
  117. package/esm2020/core/pipe/pipe-module.module.mjs +0 -40
  118. package/esm2020/core/routereuse/atr-reuse-strategy.mjs +0 -79
  119. package/esm2020/core/services/dict/dict.service.mjs +0 -152
  120. package/esm2020/core/utils/ToolsUtil.mjs +0 -622
  121. package/esm2020/lib/hello/hello.module.mjs +0 -22
  122. package/esm2020/lib/shared/atr-shared.module.mjs +0 -199
  123. package/esm2020/lib/shared/echarts/echarts.component.mjs +0 -77
  124. package/esm2020/lib/shared/form/form.component.mjs +0 -574
  125. package/esm2020/lib/shared/img-canvas/img-canvas.component.mjs +0 -132
  126. package/esm2020/lib/shared/local-upload/local-upload.component.mjs +0 -68
  127. package/esm2020/lib/shared/quill-editor/quill-editor.component.mjs +0 -248
  128. package/esm2020/lib/shared/select-icons/select-icons.component.mjs +0 -90
  129. package/esm2020/lib/shared/table/table-form-item/table-form-item.component.mjs +0 -96
  130. package/esm2020/lib/shared/table/table-td/table-td.component.mjs +0 -165
  131. package/esm2020/lib/shared/table/table.component.mjs +0 -749
  132. package/esm2020/lib/shared/video/video.component.mjs +0 -15
  133. package/esm2020/lib/shared/view-form/view-form.component.mjs +0 -181
  134. package/fesm2015/atr-components.mjs +0 -5522
  135. package/fesm2015/atr-components.mjs.map +0 -1
  136. package/fesm2020/atr-components.mjs.map +0 -1
@@ -0,0 +1,622 @@
1
+ import { atr_static_datas } from '../base/atr-common';
2
+ import { Validators } from "@angular/forms";
3
+ import { SessionStorageUtil } from './sessionstorage.util';
4
+ import { ulid } from 'ulid';
5
+ export class ToolsUtil {
6
+ static { this.ossPrefix = ''; }
7
+ static { this.getOrgCode = function () {
8
+ // var orgCode = '';
9
+ // var hrefs = window.location.href.split('?')
10
+ // if (hrefs.length >= 2) {
11
+ // var paramStr = hrefs[1];
12
+ // //参数字符串里有没带 =?/#
13
+ // orgCode = paramStr.split('=')[0];
14
+ // orgCode = orgCode.split('?')[0];
15
+ // orgCode = orgCode.split('/')[0];
16
+ // orgCode = orgCode.split('#')[0];
17
+ // orgCode = orgCode.split('/')[0];
18
+ // }
19
+ return '';
20
+ }; }
21
+ static getUlid() {
22
+ return ulid();
23
+ }
24
+ static isBase64(string) {
25
+ let reg = /^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*?)\s*$/i;
26
+ return reg.test(string);
27
+ }
28
+ static dataURItoBlob(code) {
29
+ const parts = code.split(';base64,');
30
+ const contentType = parts[0].split(':')[1];
31
+ const raw = window.atob(parts[1]);
32
+ const rawLength = raw.length;
33
+ const uInt8Array = new Uint8Array(rawLength);
34
+ for (let i = 0; i < rawLength; ++i) {
35
+ uInt8Array[i] = raw.charCodeAt(i);
36
+ }
37
+ return new Blob([uInt8Array], { type: contentType });
38
+ }
39
+ static isNull(val) {
40
+ if (val || ['boolean', 'string', 'number'].some(v => typeof val == v)) {
41
+ return false;
42
+ }
43
+ return true;
44
+ }
45
+ static getControlsConfig(dataFrom, requiredRule) {
46
+ let controlsConfig = {};
47
+ for (const key in dataFrom) {
48
+ if (requiredRule.some(item => item == key)) {
49
+ controlsConfig[key] = [dataFrom[key], [Validators.required]];
50
+ }
51
+ else {
52
+ controlsConfig[key] = [dataFrom[key]];
53
+ }
54
+ }
55
+ return controlsConfig;
56
+ }
57
+ static httpSucces(res) {
58
+ return ['200', '201', '204'].some(v => res.status == v);
59
+ }
60
+ /**
61
+ * 计算两点坐标距离
62
+ * @param point1
63
+ * @param point2
64
+ */
65
+ static getDistance(point1, point2) {
66
+ let distance = Math.sqrt((point2.x - point1.x) * (point2.x - point1.x) + (point2.y - point1.y) * (point2.y - point1.y));
67
+ return distance;
68
+ }
69
+ /**
70
+ * 判断线段是否相交,相交返回交点坐标
71
+ * @param p1
72
+ * @param p2
73
+ */
74
+ static checkIntersect(lineArr1, lineArr2) {
75
+ //解线性方程组求线段交点
76
+ //如果父母为0,则不需要计算交点 两线平行
77
+ let a = lineArr1[0], b = lineArr1[1], c = lineArr2[0], d = lineArr2[1];
78
+ a = { x: parseFloat(a.x.toFixed(2)), y: parseFloat(a.y.toFixed(2)) };
79
+ b = { x: parseFloat(b.x.toFixed(2)), y: parseFloat(b.y.toFixed(2)) };
80
+ c = { x: parseFloat(c.x.toFixed(2)), y: parseFloat(c.y.toFixed(2)) };
81
+ d = { x: parseFloat(d.x.toFixed(2)), y: parseFloat(d.y.toFixed(2)) };
82
+ console.log((b.y - a.y));
83
+ console.log((d.x - c.x));
84
+ console.log((a.x - b.x));
85
+ console.log((c.y - d.y));
86
+ let denominator = (b.y - a.y) * (d.x - c.x) - (a.x - b.x) * (c.y - d.y);
87
+ if (denominator == 0) {
88
+ return false;
89
+ }
90
+ let x = ((b.x - a.x) * (d.x - c.x) * (c.y - a.y)
91
+ + (b.y - a.y) * (d.x - c.x) * a.x
92
+ - (d.y - c.y) * (b.x - a.x) * c.x) / denominator, y = -((b.y - a.y) * (d.y - c.y) * (c.x - a.x)
93
+ + (b.x - a.x) * (d.y - c.y) * a.y
94
+ - (d.x - c.x) * (b.y - a.y) * c.y) / denominator;
95
+ //判断交点是否在两条线段上
96
+ if (
97
+ //交点在线段1
98
+ (x - a.x) * (x - b.x) <= 0 && (y - a.y) * (y - b.y) <= 0 &&
99
+ //并且交点在线段2上
100
+ (x - c.x) * (x - d.x) <= 0 && (y - c.y) * (y - d.y) <= 0) {
101
+ return { x: x, y: y };
102
+ }
103
+ return false;
104
+ }
105
+ /**
106
+ *
107
+ * @param num1
108
+ * @param num2
109
+ * @param error 误差
110
+ */
111
+ static equalNum(num1, num2, error = 5) {
112
+ let num = num1 - num2;
113
+ return num < error && num > -error;
114
+ }
115
+ /**
116
+ * 坐标对比
117
+ * @param point1
118
+ * @param point2
119
+ * @param error
120
+ */
121
+ static equalPoint(point1, point2, error = 5) {
122
+ return ToolsUtil.equalNum(point1.x, point2.x, error) && ToolsUtil.equalNum(point1.y, point2.y, error);
123
+ }
124
+ //判断点是否在线段上
125
+ /**
126
+ *
127
+ * @param startP
128
+ * @param endP
129
+ * @param a
130
+ * @param error 误差
131
+ */
132
+ static checkInLine(startP, endP, a, error = 5) {
133
+ //点和端点重合
134
+ if (ToolsUtil.equalPoint(startP, endP, error)
135
+ || ToolsUtil.equalPoint(startP, a)
136
+ || ToolsUtil.equalPoint(endP, a)) {
137
+ return true;
138
+ }
139
+ if (ToolsUtil.equalNum(startP.x, endP.x, error)
140
+ && !ToolsUtil.equalNum(startP.x, a.x, error)) {
141
+ return false;
142
+ }
143
+ else if (ToolsUtil.equalNum(startP.x, endP.x, error)
144
+ && ToolsUtil.equalNum(startP.x, a.x, error)) {
145
+ if (startP.y > endP.y) {
146
+ return startP.y > a.y && endP.y < a.y;
147
+ }
148
+ return startP.y < a.y && endP.y > a.y;
149
+ }
150
+ //判断点在线段上
151
+ //斜率是否一致
152
+ let k1 = (endP.y - startP.y) / (endP.x - startP.x);
153
+ let b = startP.y - k1 * startP.x;
154
+ let y = k1 * a.x + b;
155
+ if (ToolsUtil.equalNum(y, a.y, error)) {
156
+ //5像素的误差
157
+ let startLen = ToolsUtil.getLength(startP, a);
158
+ let endLen = ToolsUtil.getLength(a, endP);
159
+ let len = ToolsUtil.getLength(startP, endP);
160
+ return len >= startLen && len >= endLen;
161
+ }
162
+ return false;
163
+ }
164
+ /**
165
+ * 点斜式
166
+ */
167
+ static getSlopePoint(startP, endP) {
168
+ //计算斜率
169
+ if (startP.x == endP.x) {
170
+ return { k: Infinity, x: startP.x };
171
+ }
172
+ let k = (endP.y - startP.y) / (endP.x - startP.x);
173
+ let b = startP.y - k * startP.x;
174
+ return { k: k, b: b };
175
+ }
176
+ /**
177
+ *判断点是否在坐标区域内
178
+ * @param p 判定的点
179
+ * @param pointsArr
180
+ */
181
+ static judgeInRec(p, pointsArr) {
182
+ pointsArr = pointsArr.map(item => {
183
+ return { x1: Number(item.x1 || item.x || 0), y1: Number(item.y1 || item.y || 0) };
184
+ });
185
+ p = { x1: p.x1 || p.x || 0, y1: p.y1 || p.y || 0 };
186
+ let px = Number(p.x1), py = Number(p.y1), flag = false, //穿越边框
187
+ inRect = false; //是否在多边形的边或者端点上
188
+ let start = pointsArr[0];
189
+ //如果数组首尾没有相连,手动添加};
190
+ let end = pointsArr[pointsArr.length - 1];
191
+ //如果数组首尾没有相连,手动添加
192
+ pointsArr = start.x1 != end.x1 || start.y1 != end.y1 ? pointsArr.concat(start) : pointsArr;
193
+ //射线选取Y坐标不变,x正方向
194
+ pointsArr.forEach((item, index) => {
195
+ if (index == pointsArr.length - 1
196
+ || inRect //在多边形的边或者端点上视为在区域内
197
+ ) {
198
+ return;
199
+ }
200
+ let endPoint = pointsArr[index + 1];
201
+ const startX = Number(item.x1), startY = Number(item.y1), endX = Number(endPoint.x1), endY = Number(endPoint.y1);
202
+ //判断点是否在端点上
203
+ if ((px == startX && py == startY)
204
+ || (px == endX && px == endY)) {
205
+ inRect = true;
206
+ return;
207
+ }
208
+ //判断射线重合并且点在边上
209
+ if ((startY == endY && endY == py)
210
+ && ((px > endX && px < startX
211
+ || (px < endX && px > startX)))) {
212
+ inRect = true;
213
+ return;
214
+ }
215
+ if ((startY < py && endY >= py)
216
+ || (startY >= py && endY < py)) {
217
+ //求射线与线段交点的x坐标,y坐标还是py
218
+ let x = startX + (py - startY) * (endX - startX) / (endY - startY);
219
+ //点在边上
220
+ if (x == px) {
221
+ inRect = true;
222
+ return;
223
+ }
224
+ //x大于px来保证射线朝右
225
+ if (x > px) {
226
+ flag = !flag;
227
+ }
228
+ }
229
+ });
230
+ return inRect || flag;
231
+ }
232
+ static diffInput(chng, action) {
233
+ if (chng === undefined)
234
+ return;
235
+ let cur = JSON.stringify(chng.currentValue);
236
+ let prev = JSON.stringify(chng.previousValue);
237
+ if (cur !== prev) {
238
+ action();
239
+ }
240
+ }
241
+ static deepCopy(obj) {
242
+ return JSON.parse(JSON.stringify(obj));
243
+ }
244
+ static diffInputs(chng, action) {
245
+ if (chng === undefined)
246
+ return;
247
+ if (chng.length == 0)
248
+ return;
249
+ for (let i = 0; i < chng.length; i++) {
250
+ let item = chng[i];
251
+ if (item === undefined)
252
+ continue;
253
+ let cur = JSON.stringify(item.currentValue);
254
+ let prev = JSON.stringify(item.previousValue);
255
+ if (cur !== prev) {
256
+ action();
257
+ return;
258
+ }
259
+ }
260
+ }
261
+ static dataURLtoBlob(dataurl) {
262
+ var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
263
+ while (n--) {
264
+ u8arr[n] = bstr.charCodeAt(n);
265
+ }
266
+ return new Blob([u8arr], { type: mime });
267
+ }
268
+ static dataURLtoFile(dataurl, filename) {
269
+ var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
270
+ while (n--) {
271
+ u8arr[n] = bstr.charCodeAt(n);
272
+ }
273
+ return new File([u8arr], (filename || ToolsUtil.getRandomFileName()), { type: mime });
274
+ }
275
+ static getYesterday(day) {
276
+ let time = day.getTime() - 1000 * 60 * 60 * 24;
277
+ day = new Date(time);
278
+ return day;
279
+ }
280
+ static getTomorrowday(day) {
281
+ let time = day.getTime() + 1000 * 60 * 60 * 24;
282
+ return new Date(time);
283
+ }
284
+ static getNextMonth(day) {
285
+ let ds = new Date(day).setMonth(day.getMonth() + 1);
286
+ return new Date(ds);
287
+ }
288
+ static getVideoCover(url) {
289
+ return ToolsUtil.getOssUrl(url) + "?x-oss-process=video/snapshot,t_10000,m_fast";
290
+ }
291
+ static fistDayOfMonth(day) {
292
+ return new Date(new Date(day).setDate(1));
293
+ }
294
+ static lastDayOfMonth(day) {
295
+ return new Date(ToolsUtil.getNextMonth(day).setDate(0));
296
+ }
297
+ static { this.getRandomFileName = function () {
298
+ const expect = 16;
299
+ let str = Math.random().toString(36).substring(2);
300
+ while (str.length < expect) {
301
+ str += Math.random().toString(36).substring(2);
302
+ }
303
+ return str.substring(0, expect);
304
+ }; }
305
+ static { this.getFileExt = function (fileName) {
306
+ var index = fileName.lastIndexOf(".");
307
+ var suffix = fileName.substr(index + 1);
308
+ return suffix;
309
+ }; }
310
+ static getHttpOptions() {
311
+ return { isCommonHttpHeader: true };
312
+ }
313
+ static resetFormValue(opt, json) {
314
+ for (let item of opt.items) {
315
+ item.value = "";
316
+ for (const key of Object.keys(json)) {
317
+ if (json.hasOwnProperty(key) && json[key] != null && json[key] != undefined && key == item.key) {
318
+ if (item.type == 'date')
319
+ item.value = new Date(json[key]);
320
+ else if (item.type == 'dateTime') {
321
+ item.value = new Date(json[key]);
322
+ }
323
+ else
324
+ item.value = json[key];
325
+ }
326
+ }
327
+ }
328
+ return opt;
329
+ }
330
+ static getFormatDate(date) {
331
+ let month = date.getMonth() + 1;
332
+ let strDate = date.getDate();
333
+ if (month <= 9) {
334
+ month = "0" + month;
335
+ }
336
+ if (strDate <= 9) {
337
+ strDate = "0" + strDate;
338
+ }
339
+ return date.getFullYear() + "-" + month + "-" + strDate;
340
+ // + " "
341
+ // + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
342
+ }
343
+ static getFormatDateFull(date) {
344
+ let month = date.getMonth() + 1;
345
+ let strDate = date.getDate();
346
+ if (month <= 9) {
347
+ month = "0" + month;
348
+ }
349
+ if (strDate <= 9) {
350
+ strDate = "0" + strDate;
351
+ }
352
+ return date.getFullYear() + "-" + month + "-" + strDate + " " + (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ":" + (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ":" + (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
353
+ }
354
+ static getFormatDateWithoutS(date) {
355
+ let month = date.getMonth() + 1;
356
+ let strDate = date.getDate();
357
+ let hours = date.getHours();
358
+ let seconds = date.getMinutes();
359
+ if (month <= 9) {
360
+ month = "0" + month;
361
+ }
362
+ if (strDate <= 9) {
363
+ strDate = "0" + strDate;
364
+ }
365
+ if (hours <= 9) {
366
+ hours = "0" + hours;
367
+ }
368
+ if (seconds <= 9) {
369
+ seconds = "0" + seconds;
370
+ }
371
+ return date.getFullYear() + "-" + month + "-" + strDate + " " + hours + ":" + seconds;
372
+ }
373
+ static getFormatDateHour(date) {
374
+ let month = date.getMonth() + 1;
375
+ let strDate = date.getDate();
376
+ let hours = date.getHours();
377
+ let seconds = date.getMinutes();
378
+ if (month <= 9) {
379
+ month = "0" + month;
380
+ }
381
+ if (strDate <= 9) {
382
+ strDate = "0" + strDate;
383
+ }
384
+ if (hours <= 9) {
385
+ hours = "0" + hours;
386
+ }
387
+ if (seconds <= 9) {
388
+ seconds = "0" + seconds;
389
+ }
390
+ return date.getFullYear() + "" + month + strDate + hours;
391
+ }
392
+ static getOssUrl(url, needTime = false) {
393
+ if (!url) {
394
+ return "";
395
+ }
396
+ if (needTime) {
397
+ // url = url + "?v=" + ToolsUtil.getFormatDateHour(new Date());
398
+ url = url + "?v=" + new Date().getTime();
399
+ }
400
+ if (url.startsWith("http")) {
401
+ return url;
402
+ }
403
+ if (!url.startsWith("/") && !atr_static_datas.OSS_URL.endsWith('/')) {
404
+ url = '/' + url;
405
+ }
406
+ let result = atr_static_datas.OSS_URL + url;
407
+ return result;
408
+ }
409
+ static getStaticOssUrl(url) {
410
+ if (!url) {
411
+ return "";
412
+ }
413
+ if (url.startsWith("http")) {
414
+ return url;
415
+ }
416
+ return atr_static_datas.STATIC_OSS_URL + url;
417
+ }
418
+ static removeHtml(value) {
419
+ if (!value) {
420
+ return '';
421
+ }
422
+ return value.replace(/<[^<>]+>/g, '').replace(/&nbsp;/ig, '');
423
+ }
424
+ static mul(...numbers) {
425
+ if (numbers.length < 2) {
426
+ return;
427
+ }
428
+ let m = this.getDigit(numbers);
429
+ let result = 1;
430
+ numbers.forEach((num) => {
431
+ let s = num.toString();
432
+ result *= Number(s.replace(".", ""));
433
+ });
434
+ return result / Math.pow(10, m);
435
+ }
436
+ static getDigit(...numbers) {
437
+ let m = 0;
438
+ numbers.forEach(num => {
439
+ let s = num.toString();
440
+ try {
441
+ m += s.split(".")[1].length;
442
+ }
443
+ catch (e) {
444
+ }
445
+ });
446
+ return m;
447
+ }
448
+ static downloadImg(data, fileName, endpoint) {
449
+ // // 下载类型 xls
450
+ // const contentType = 'image/jpeg';
451
+ // // const contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
452
+ // // 下载类型:csv
453
+ // const debug = {hello: "world"};
454
+ // const blob = new Blob([],{type : 'image/jpeg'});
455
+ // const url = window.URL.createObjectURL(blob);
456
+ //
457
+ // // 打开新窗口方式进行下载
458
+ // // window.open(url);
459
+ //
460
+ // // 以动态创建a标签进行下载
461
+ const a = document.createElement('a');
462
+ a.href = data;
463
+ // a.download = fileName;
464
+ a.download = fileName ? fileName : "" + endpoint;
465
+ a.click();
466
+ }
467
+ static downloadXls(url, params) {
468
+ if (params) {
469
+ url += "?";
470
+ for (const key of Object.keys(params)) {
471
+ if (params[key]) {
472
+ url += key + "=" + params[key] + "&&";
473
+ }
474
+ }
475
+ }
476
+ // window.open(url);
477
+ const a = document.createElement('a');
478
+ a.href = url;
479
+ // // a.download = fileName;
480
+ // a.download = "3321.xls";
481
+ a.click();
482
+ }
483
+ static getImg(url, param = {
484
+ imgW: 0, imgH: 0,
485
+ needTime: false, isFullUrl: false
486
+ }) {
487
+ return new Promise((resolve, reject) => {
488
+ let dataUrl = SessionStorageUtil.getImg(url);
489
+ let img = new Image();
490
+ img.setAttribute('crossOrigin', 'anonymous');
491
+ if (!dataUrl) {
492
+ img.src = param.isFullUrl ? url : ToolsUtil.getOssUrl(url, param.needTime);
493
+ }
494
+ else {
495
+ let index = dataUrl.indexOf("}") + 1;
496
+ img.src = dataUrl.slice(0, 50) + dataUrl.slice(index);
497
+ }
498
+ img.onload = () => {
499
+ let c = document.createElement('canvas');
500
+ let context2 = c.getContext("2d");
501
+ c.width = param.imgW || img.width;
502
+ c.height = param.imgH || img.height;
503
+ context2.drawImage(img, 0, 0, c.width, c.height);
504
+ let dataUrl = c.toDataURL();
505
+ let str = c.width + "," + c.height + "}";
506
+ dataUrl = dataUrl.slice(0, 50) + str + dataUrl.slice(50);
507
+ //不保存
508
+ // SessionStorageUtil.setImg(url, dataUrl)
509
+ resolve(img);
510
+ };
511
+ });
512
+ }
513
+ static pixelToNum(width) {
514
+ const re = /px/gi;
515
+ let widthStr = width.replace(re, "");
516
+ return Number(widthStr);
517
+ }
518
+ static { this.allEqual = (...array) => array.every(item => item === array[0]); }
519
+ /**
520
+ * array所有参数满足fn函数返回true
521
+ * all(x => x > 1,1,2,3); // true
522
+ * @param callback
523
+ * @param array
524
+ */
525
+ static { this.satisfiedFn = (callback, ...array) => array.every(callback); }
526
+ //全部不空为true
527
+ static notEmpty(...arr) {
528
+ return arr.every(item => !!item);
529
+ }
530
+ //包含空为true
531
+ static hasEmpty(...arr) {
532
+ return arr.some(item => !item);
533
+ }
534
+ static allEmpty(...arr) {
535
+ return arr.every(item => !item);
536
+ }
537
+ static isArray(obj) {
538
+ return obj instanceof Array;
539
+ }
540
+ static isEmpty(obj) {
541
+ if (obj === undefined) {
542
+ return true;
543
+ }
544
+ if (obj === null) {
545
+ return true;
546
+ }
547
+ if (typeof obj == 'boolean') {
548
+ return false;
549
+ }
550
+ if (obj === 0) {
551
+ return false;
552
+ }
553
+ if (typeof obj == "string" && obj.trim() === '') {
554
+ return true;
555
+ }
556
+ return false;
557
+ }
558
+ static encodeValue(params) {
559
+ Object.keys(params).forEach(key => params[key] = encodeURIComponent(params[key]));
560
+ return params;
561
+ }
562
+ static windowHeight() {
563
+ return document.documentElement.clientHeight;
564
+ }
565
+ static windowWidth() {
566
+ return document.documentElement.clientWidth;
567
+ }
568
+ static modaleStyle() {
569
+ return { 'maxHeight': ToolsUtil.windowHeight() - 200 + 'px', 'overflow-y': 'auto' };
570
+ }
571
+ static getLength(pointA, pointB) {
572
+ pointA.x1 = pointA.x || pointA.x1 || 0;
573
+ pointA.y1 = pointA.y || pointA.y1 || 0;
574
+ pointB.y1 = pointB.y || pointB.y1 || 0;
575
+ pointB.x1 = pointB.x || pointB.x1 || 0;
576
+ var lengthAB = Math.sqrt(Math.pow(pointA.x1 - pointB.x1, 2) +
577
+ Math.pow(pointA.y1 - pointB.y1, 2));
578
+ return lengthAB;
579
+ }
580
+ static getRotateNum(pointB, pointC, pointA) {
581
+ pointA.x1 = pointA.x || pointA.x1 || 0;
582
+ pointA.y1 = pointA.y || pointA.y1 || 0;
583
+ pointB.x1 = pointB.y || pointB.x1 || 0;
584
+ pointB.y1 = pointB.x || pointB.x1 || 0;
585
+ pointC.x1 = pointC.y || pointC.x1 || 0;
586
+ pointC.y1 = pointC.x || pointC.x1 || 0;
587
+ //ABC中心点,起始点,终点
588
+ let AB = {};
589
+ let AC = {};
590
+ AB.x1 = pointB.x1 - pointA.x1;
591
+ AB.y1 = pointB.y1 - pointA.y1;
592
+ AC.x1 = pointC.x1 - pointA.x1;
593
+ AC.y1 = pointC.y1 - pointA.y1;
594
+ var direct = AB.x1 * AC.y1 - AB.y1 * AC.y1;
595
+ var lengthAB = this.getLength(pointB, pointA);
596
+ var lengthAC = this.getLength(pointC, pointA);
597
+ var lengthBC = this.getLength(pointB, pointC);
598
+ var cosA = (Math.pow(lengthAB, 2) + Math.pow(lengthAC, 2) -
599
+ Math.pow(lengthBC, 2)) / (2 * lengthAB * lengthAC);
600
+ var angleA = Math.round(Math.acos(cosA) * 180 / Math.PI);
601
+ if (direct < 0) {
602
+ return -angleA;
603
+ }
604
+ else {
605
+ return angleA;
606
+ }
607
+ }
608
+ //绕center点旋转rotate角度
609
+ static getRotatePoint(p, center, rotate) {
610
+ let startX = p.x1;
611
+ let startY = p.y1;
612
+ let a = center.x1;
613
+ let b = center.y1;
614
+ let x1 = a - Math.cos(rotate * Math.PI / 180) * (a - startX) + Math.sin(rotate * Math.PI / 180) * (b - startY);
615
+ let y1 = b - Math.cos(rotate * Math.PI / 180) * (b - startY) - Math.sin(rotate * Math.PI / 180) * (a - startX);
616
+ return {
617
+ x1: x1,
618
+ y1: y1
619
+ };
620
+ }
621
+ }
622
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9vbHNVdGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvY29yZS91dGlscy9Ub29sc1V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFtQixnQkFBZ0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXRFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTFCLE1BQU0sT0FBTyxTQUFTO2FBQ2IsY0FBUyxHQUFXLEVBQUUsQ0FBQzthQUN2QixlQUFVLEdBQUc7UUFDbEIsb0JBQW9CO1FBQ3BCLDhDQUE4QztRQUM5QywyQkFBMkI7UUFDM0IsNkJBQTZCO1FBQzdCLHFCQUFxQjtRQUNyQixzQ0FBc0M7UUFDdEMscUNBQXFDO1FBQ3JDLHFDQUFxQztRQUNyQyxxQ0FBcUM7UUFDckMscUNBQXFDO1FBQ3JDLElBQUk7UUFFSixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQTtJQUVELE1BQU0sQ0FBQyxPQUFPO1FBQ1osT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNmLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQVc7UUFDekIsSUFBSSxHQUFHLEdBQUcsNEdBQTRHLENBQUM7UUFDdkgsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQVM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMs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TyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7UUFDbkUsQ0FBQyxHQUFHLEVBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1FBQ25FLENBQUMsR0FBRyxFQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQTtRQUNsRSxDQUFDLEdBQUcsRUFBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7UUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDeEIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLFdBQVcsSUFBSSxDQUFDLEVBQUU7WUFDcEIsT0FBTyxLQUFLLENBQUE7U0FDYjtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2NBQzFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztjQUMvQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFDbEQsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7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LElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUE7UUFDakIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQTtRQUM5RyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFBO1FBQzlHLE9BQU87WUFDTCxFQUFFLEVBQUUsRUFBRTtZQUNOLEVBQUUsRUFBRSxFQUFFO1NBQ1AsQ0FBQTtJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2pzb24sIEF0ckZvcm1PcHQsIGF0cl9zdGF0aWNfZGF0YXN9IGZyb20gJy4uL2Jhc2UvYXRyLWNvbW1vbic7XHJcbmltcG9ydCB7U2ltcGxlQ2hhbmdlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtWYWxpZGF0b3JzfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtTZXNzaW9uU3RvcmFnZVV0aWx9IGZyb20gJy4vc2Vzc2lvbnN0b3JhZ2UudXRpbCc7XHJcbmltcG9ydCB7dWxpZH0gZnJvbSAndWxpZCc7XHJcblxyXG5leHBvcnQgY2xhc3MgVG9vbHNVdGlsIHtcclxuICBzdGF0aWMgb3NzUHJlZml4OiBzdHJpbmcgPSAnJztcclxuICBzdGF0aWMgZ2V0T3JnQ29kZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIC8vIHZhciBvcmdDb2RlID0gJyc7XHJcbiAgICAvLyB2YXIgaHJlZnMgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnPycpXHJcbiAgICAvLyBpZiAoaHJlZnMubGVuZ3RoID49IDIpIHtcclxuICAgIC8vICAgdmFyIHBhcmFtU3RyID0gaHJlZnNbMV07XHJcbiAgICAvLyAgIC8v5Y+C5pWw5a2X56ym5Liy6YeM5pyJ5rKh5bimID0/LyNcclxuICAgIC8vICAgb3JnQ29kZSA9IHBhcmFtU3RyLnNwbGl0KCc9JylbMF07XHJcbiAgICAvLyAgIG9yZ0NvZGUgPSBvcmdDb2RlLnNwbGl0KCc/JylbMF07XHJcbiAgICAvLyAgIG9yZ0NvZGUgPSBvcmdDb2RlLnNwbGl0KCcvJylbMF07XHJcbiAgICAvLyAgIG9yZ0NvZGUgPSBvcmdDb2RlLnNwbGl0KCcjJylbMF07XHJcbiAgICAvLyAgIG9yZ0NvZGUgPSBvcmdDb2RlLnNwbGl0KCcvJylbMF07XHJcbiAgICAvLyB9XHJcblxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFVsaWQoKSB7XHJcbiAgICByZXR1cm4gdWxpZCgpXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgaXNCYXNlNjQoc3RyaW5nOiBhbnkpIHtcclxuICAgIGxldCByZWcgPSAvXlxccypkYXRhOihbYS16XStcXC9bYS16MC05LSsuXSsoO1thLXotXSs9W2EtejAtOS1dKyk/KT8oO2Jhc2U2NCk/LChbYS16MC05ISQmJywoKSorOz1cXC0uX346QFxcLz8lXFxzXSo/KVxccyokL2k7XHJcbiAgICByZXR1cm4gcmVnLnRlc3Qoc3RyaW5nKVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRhdGFVUkl0b0Jsb2IoY29kZTogYW55KSB7XHJcbiAgICBjb25zdCBwYXJ0cyA9IGNvZGUuc3BsaXQoJztiYXNlNjQsJyk7XHJcbiAgICBjb25zdCBjb250ZW50VHlwZSA9IHBhcnRzWzBdLnNwbGl0KCc6JylbMV07XHJcbiAgICBjb25zdCByYXcgPSB3aW5kb3cuYXRvYihwYXJ0c1sxXSk7XHJcbiAgICBjb25zdCByYXdMZW5ndGggPSByYXcubGVuZ3RoO1xyXG4gICAgY29uc3QgdUludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KHJhd0xlbmd0aCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0xlbmd0aDsgKytpKSB7XHJcbiAgICAgIHVJbnQ4QXJyYXlbaV0gPSByYXcuY2hhckNvZGVBdChpKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQmxvYihbdUludDhBcnJheV0sIHt0eXBlOiBjb250ZW50VHlwZX0pO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGlzTnVsbCh2YWw6IGFueSkge1xyXG4gICAgaWYgKHZhbCB8fCBbJ2Jvb2xlYW4nLCAnc3RyaW5nJywgJ251bWJlciddLnNvbWUodiA9PiB0eXBlb2YgdmFsID09IHYpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRDb250cm9sc0NvbmZpZyhkYXRhRnJvbTogYW55LCByZXF1aXJlZFJ1bGU6IHN0cmluZ1tdKSB7XHJcbiAgICBsZXQgY29udHJvbHNDb25maWc6IGFueSA9IHt9XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhRnJvbSkge1xyXG4gICAgICBpZiAocmVxdWlyZWRSdWxlLnNvbWUoaXRlbSA9PiBpdGVtID09IGtleSkpIHtcclxuICAgICAgICBjb250cm9sc0NvbmZpZ1trZXldID0gW2RhdGFGcm9tW2tleV0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb250cm9sc0NvbmZpZ1trZXldID0gW2RhdGFGcm9tW2tleV1dXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb250cm9sc0NvbmZpZztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBodHRwU3VjY2VzKHJlczogYW55KSB7XHJcbiAgICByZXR1cm4gWycyMDAnLCAnMjAxJywgJzIwNCddLnNvbWUodiA9PiByZXMuc3RhdHVzID09IHYpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDorqHnrpfkuKTngrnlnZDmoIfot53nprtcclxuICAgKiBAcGFyYW0gcG9pbnQxXHJcbiAgICogQHBhcmFtIHBvaW50MlxyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXREaXN0YW5jZShwb2ludDE6IHsgeDogYW55LCB5OiBhbnkgfSwgcG9pbnQyOiB7IHg6IGFueSwgeTogYW55IH0pIHtcclxuICAgIGxldCBkaXN0YW5jZSA9IE1hdGguc3FydCgocG9pbnQyLnggLSBwb2ludDEueCkgKiAocG9pbnQyLnggLSBwb2ludDEueCkgKyAocG9pbnQyLnkgLSBwb2ludDEueSkgKiAocG9pbnQyLnkgLSBwb2ludDEueSkpO1xyXG4gICAgcmV0dXJuIGRpc3RhbmNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog5Yik5pat57q/5q615piv5ZCm55u45LqkLOebuOS6pOi/lOWbnuS6pOeCueWdkOagh1xyXG4gICAqIEBwYXJhbSBwMVxyXG4gICAqIEBwYXJhbSBwMlxyXG4gICAqL1xyXG4gIHN0YXRpYyBjaGVja0ludGVyc2VjdChsaW5lQXJyMTogeyB4OiBhbnksIHk6IGFueSB9W10sIGxpbmVBcnIyOiB7IHg6IGFueSwgeTogYW55IH1bXSkge1xyXG4gICAgLy/op6Pnur/mgKfmlrnnqIvnu4TmsYLnur/mrrXkuqTngrlcclxuICAgIC8v5aaC5p6c54i25q+N5Li6MO+8jOWImeS4jemcgOimgeiuoeeul+S6pOeCuSDkuKTnur/lubPooYxcclxuICAgIGxldCBhID0gbGluZUFycjFbMF0sIGIgPSBsaW5lQXJyMVsxXSwgYyA9IGxpbmVBcnIyWzBdLCBkID0gbGluZUFycjJbMV1cclxuXHJcbiAgICBhID0ge3g6IHBhcnNlRmxvYXQoYS54LnRvRml4ZWQoMikpLCB5OiBwYXJzZUZsb2F0KGEueS50b0ZpeGVkKDIpKX07XHJcbiAgICBiID0ge3g6IHBhcnNlRmxvYXQoYi54LnRvRml4ZWQoMikpLCB5OiBwYXJzZUZsb2F0KGIueS50b0ZpeGVkKDIpKX07XHJcbiAgICBjID0ge3g6IHBhcnNlRmxvYXQoYy54LnRvRml4ZWQoMikpLCB5OiBwYXJzZUZsb2F0KGMueS50b0ZpeGVkKDIpKX1cclxuICAgIGQgPSB7eDogcGFyc2VGbG9hdChkLngudG9GaXhlZCgyKSksIHk6IHBhcnNlRmxvYXQoZC55LnRvRml4ZWQoMikpfTtcclxuICAgIGNvbnNvbGUubG9nKChiLnkgLSBhLnkpKVxyXG4gICAgY29uc29sZS5sb2coKGQueCAtIGMueCkpXHJcbiAgICBjb25zb2xlLmxvZygoYS54IC0gYi54KSlcclxuICAgIGNvbnNvbGUubG9nKChjLnkgLSBkLnkpKVxyXG4gICAgbGV0IGRlbm9taW5hdG9yID0gKGIueSAtIGEueSkgKiAoZC54IC0gYy54KSAtIChhLnggLSBiLngpICogKGMueSAtIGQueSk7XHJcbiAgICBpZiAoZGVub21pbmF0b3IgPT0gMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGxldCB4ID0gKChiLnggLSBhLngpICogKGQueCAtIGMueCkgKiAoYy55IC0gYS55KVxyXG4gICAgICAgICsgKGIueSAtIGEueSkgKiAoZC54IC0gYy54KSAqIGEueFxyXG4gICAgICAgIC0gKGQueSAtIGMueSkgKiAoYi54IC0gYS54KSAqIGMueCkgLyBkZW5vbWluYXRvcixcclxuICAgICAgeSA9IC0oKGIueSAtIGEueSkgKiAoZC55IC0gYy55KSAqIChjLnggLSBhLngpXHJcbiAgICAgICAgKyAoYi54IC0gYS54KSAqIChkLnkgLSBjLnkpICogYS55XHJcbiAgICAgICAgLSAoZC54IC0gYy54KSAqIChiLnkgLSBhLnkpICogYy55KSAvIGRlbm9taW5hdG9yO1xyXG4gICAgLy/liKTmlq3kuqTngrnmmK/lkKblnKjkuKTmnaHnur/mrrXkuIpcclxuICAgIGlmIChcclxuICAgICAgLy/kuqTngrnlnKjnur/mrrUxXHJcbiAgICAgICh4IC0gYS54KSAqICh4IC0gYi54KSA8PSAwICYmICh5IC0gYS55KSAqICh5IC0gYi55KSA8PSAwICYmXHJcbiAgICAgIC8v5bm25LiU5Lqk54K55Zyo57q/5q61MuS4ilxyXG4gICAgICAoeCAtIGMueCkgKiAoeCAtIGQueCkgPD0gMCAmJiAoeSAtIGMueSkgKiAoeSAtIGQueSkgPD0gMFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB7eDogeCwgeTogeX1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSBudW0xXHJcbiAgICogQHBhcmFtIG51bTJcclxuICAgKiBAcGFyYW0gZXJyb3Ig6K+v5beuXHJcbiAgICovXHJcbiAgc3RhdGljIGVxdWFsTnVtKG51bTE6IGFueSwgbnVtMjogYW55LCBlcnJvciA9IDUpIHtcclxuICAgIGxldCBudW0gPSBudW0xIC0gbnVtMjtcclxuICAgIHJldHVybiBudW0gPCBlcnJvciAmJiBudW0gPiAtZXJyb3I7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDlnZDmoIflr7nmr5RcclxuICAgKiBAcGFyYW0gcG9pbnQxXHJcbiAgICogQHBhcmFtIHBvaW50MlxyXG4gICAqIEBwYXJhbSBlcnJvclxyXG4gICAqL1xyXG4gIHN0YXRpYyBlcXVhbFBvaW50KHBvaW50MTogeyB4OiBhbnksIHk6IGFueSB9LCBwb2ludDI6IHsgeDogYW55LCB5OiBhbnkgfSwgZXJyb3IgPSA1KSB7XHJcbiAgICByZXR1cm4gVG9vbHNVdGlsLmVxdWFsTnVtKHBvaW50MS54LCBwb2ludDIueCwgZXJyb3IpICYmIFRvb2xzVXRpbC5lcXVhbE51bShwb2ludDEueSwgcG9pbnQyLnksIGVycm9yKVxyXG4gIH1cclxuXHJcblxyXG4gIC8v5Yik5pat54K55piv5ZCm5Zyo57q/5q615LiKXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBAcGFyYW0gc3RhcnRQXHJcbiAgICogQHBhcmFtIGVuZFBcclxuICAgKiBAcGFyYW0gYVxyXG4gICAqIEBwYXJhbSBlcnJvciDor6/lt65cclxuICAgKi9cclxuICBzdGF0aWMgY2hlY2tJbkxpbmUoc3RhcnRQOiBhbnksIGVuZFA6IGFueSwgYTogYW55LCBlcnJvciA9IDUpIHtcclxuICAgIC8v54K55ZKM56uv54K56YeN5ZCIXHJcbiAgICBpZiAoVG9vbHNVdGlsLmVxdWFsUG9pbnQoc3RhcnRQLCBlbmRQLCBlcnJvcilcclxuICAgICAgfHwgVG9vbHNVdGlsLmVxdWFsUG9pbnQoc3RhcnRQLCBhKVxyXG4gICAgICB8fCBUb29sc1V0aWwuZXF1YWxQb2ludChlbmRQLCBhKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChUb29sc1V0aWwuZXF1YWxOdW0oc3RhcnRQLngsIGVuZFAueCwgZXJyb3IpXHJcbiAgICAgICYmICFUb29sc1V0aWwuZXF1YWxOdW0oc3RhcnRQLngsIGEueCwgZXJyb3IpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfSBlbHNlIGlmIChUb29sc1V0aWwuZXF1YWxOdW0oc3RhcnRQLngsIGVuZFAueCwgZXJyb3IpXHJcbiAgICAgICYmIFRvb2xzVXRpbC5lcXVhbE51bShzdGFydFAueCwgYS54LCBlcnJvcikpIHtcclxuICAgICAgaWYgKHN0YXJ0UC55ID4gZW5kUC55KSB7XHJcbiAgICAgICAgcmV0dXJuIHN0YXJ0UC55ID4gYS55ICYmIGVuZFAueSA8IGEueVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzdGFydFAueSA8IGEueSAmJiBlbmRQLnkgPiBhLnlcclxuICAgIH1cclxuICAgIC8v5Yik5pat54K55Zyo57q/5q615LiKXHJcbiAgICAvL+aWnOeOh+aYr+WQpuS4gOiHtFxyXG4gICAgbGV0IGsxID0gKGVuZFAueSAtIHN0YXJ0UC55KSAvIChlbmRQLnggLSBzdGFydFAueCk7XHJcbiAgICBsZXQgYiA9IHN0YXJ0UC55IC0gazEgKiBzdGFydFAueDtcclxuICAgIGxldCB5ID0gazEgKiBhLnggKyBiO1xyXG4gICAgaWYgKFRvb2xzVXRpbC5lcXVhbE51bSh5LCBhLnksIGVycm9yKSkge1xyXG4gICAgICAvLzXlg4/ntKDnmoTor6/lt65cclxuICAgICAgbGV0IHN0YXJ0TGVuID0gVG9vbHNVdGlsLmdldExlbmd0aChzdGFydFAsIGEpXHJcbiAgICAgIGxldCBlbmRMZW4gPSBUb29sc1V0aWwuZ2V0TGVuZ3RoKGEsIGVuZFApXHJcbiAgICAgIGxldCBsZW4gPSBUb29sc1V0aWwuZ2V0TGVuZ3RoKHN0YXJ0UCwgZW5kUClcclxuICAgICAgcmV0dXJuIGxlbiA+PSBzdGFydExlbiAmJiBsZW4gPj0gZW5kTGVuXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOeCueaWnOW8j1xyXG4gICAqL1xyXG4gIHN0YXRpYyBnZXRTbG9wZVBvaW50KHN0YXJ0UDogYW55LCBlbmRQOiBhbnkpIHtcclxuICAgIC8v6K6h566X5pac546HXHJcbiAgICBpZiAoc3RhcnRQLnggPT0gZW5kUC54KSB7XHJcbiAgICAgIHJldHVybiB7azogSW5maW5pdHksIHg6IHN0YXJ0UC54fTtcclxuICAgIH1cclxuICAgIGxldCBrID0gKGVuZFAueSAtIHN0YXJ0UC55KSAvIChlbmRQLnggLSBzdGFydFAueCk7XHJcbiAgICBsZXQgYiA9IHN0YXJ0UC55IC0gayAqIHN0YXJ0UC54O1xyXG4gICAgcmV0dXJuIHtrOiBrLCBiOiBifVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICrliKTmlq3ngrnmmK/lkKblnKjlnZDmoIfljLrln5/lhoVcclxuICAgKiBAcGFyYW0gcCDliKTlrprnmoTngrlcclxuICAgKiBAcGFyYW0gcG9pbnRzQXJyXHJcbiAgICovXHJcbiAgc3RhdGljIGp1ZGdlSW5SZWMocDogeyB4MT86IGFueSwgeTE/OiBhbnksIHg/OiBhbnksIHk/OiBhbnkgfSwgcG9pbnRzQXJyOiB7IHgxPzogYW55LCB5MT86IGFueSwgeD86IGFueSwgeT86IGFueSB9W10pIHtcclxuICAgIHBvaW50c0FyciA9IHBvaW50c0Fyci5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIHJldHVybiB7eDE6IE51bWJlcihpdGVtLngxIHx8IGl0ZW0ueCB8fCAwKSwgeTE6IE51bWJlcihpdGVtLnkxIHx8IGl0ZW0ueSB8fCAwKX1cclxuICAgIH0pXHJcbiAgICBwID0ge3gxOiBwLngxIHx8IHAueCB8fCAwLCB5MTogcC55MSB8fCBwLnkgfHwgMH1cclxuICAgIGxldCBweCA9IE51bWJlcihwLngxKSwgcHkgPSBOdW1iZXIocC55MSksXHJcbiAgICAgIGZsYWcgPSBmYWxzZSwvL+epv+i2iui+ueahhlxyXG4gICAgICBpblJlY3QgPSBmYWxzZTsvL+aYr+WQpuWcqOWkmui+ueW9oueahOi+ueaIluiAheerr+eCueS4ilxyXG4gICAgbGV0IHN0YXJ0ID0gcG9pbnRzQXJyWzBdXHJcbiAgICAvL+WmguaenOaVsOe7hOmmluWwvuayoeacieebuOi/nizmiYvliqjmt7vliqB9O1xyXG4gICAgbGV0IGVuZCA9IHBvaW50c0Fycltwb2ludHNBcnIubGVuZ3RoIC0gMV07XHJcbiAgICAvL+WmguaenOaVsOe7hOmmluWwvuayoeacieebuOi/nizmiYvliqjmt7vliqBcclxuICAgIHBvaW50c0FyciA9IHN0YXJ0LngxICE9IGVuZC54MSB8fCBzdGFydC55MSAhPSBlbmQueTEgPyBwb2ludHNBcnIuY29uY2F0KHN0YXJ0KSA6IHBvaW50c0FycjtcclxuICAgIC8v5bCE57q/6YCJ5Y+WWeWdkOagh+S4jeWPmCx45q2j5pa55ZCRXHJcbiAgICBwb2ludHNBcnIuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKGluZGV4ID09IHBvaW50c0Fyci5sZW5ndGggLSAxXHJcbiAgICAgICAgfHwgaW5SZWN0Ly/lnKjlpJrovrnlvaLnmoTovrnmiJbogIXnq6/ngrnkuIrop4bkuLrlnKjljLrln5/lhoVcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgICAgbGV0IGVuZFBvaW50ID0gcG9pbnRzQXJyW2luZGV4ICsgMV1cclxuICAgICAgY29uc3Qgc3RhcnRYID0gTnVtYmVyKGl0ZW0ueDEpLCBzdGFydFkgPSBOdW1iZXIoaXRlbS55MSksXHJcbiAgICAgICAgZW5kWCA9IE51bWJlcihlbmRQb2ludC54MSksIGVuZFkgPSBOdW1iZXIoZW5kUG9pbnQueTEpO1xyXG4gICAgICAvL+WIpOaWreeCueaYr+WQpuWcqOerr+eCueS4ilxyXG4gICAgICBpZiAoKHB4ID09IHN0YXJ0WCAmJiBweSA9PSBzdGFydFkpXHJcbiAgICAgICAgfHwgKHB4ID09IGVuZFggJiYgcHggPT0gZW5kWSkpIHtcclxuICAgICAgICBpblJlY3QgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy/liKTmlq3lsITnur/ph43lkIjlubbkuJTngrnlnKjovrnkuIpcclxuICAgICAgaWYgKChzdGFydFkgPT0gZW5kWSAmJiBlbmRZID09IHB5KVxyXG4gICAgICAgICYmICgocHggPiBlbmRYICYmIHB4IDwgc3RhcnRYXHJcbiAgICAgICAgICB8fCAocHggPCBlbmRYICYmIHB4ID4gc3RhcnRYKSkpKSB7XHJcbiAgICAgICAgaW5SZWN0ID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICgoc3RhcnRZIDwgcHkgJiYgZW5kWSA+PSBweSlcclxuICAgICAgICB8fCAoc3RhcnRZID49IHB5ICYmIGVuZFkgPCBweSkpIHtcclxuXHJcbiAgICAgICAgLy/msYLlsITnur/kuI7nur/mrrXkuqTngrnnmoR45Z2Q5qCHLHnlnZDmoIfov5jmmK9weVxyXG4gICAgICAgIGxldCB4ID0gc3RhcnRYICsgKHB5IC0gc3RhcnRZKSAqIChlbmRYIC0gc3RhcnRYKSAvIChlbmRZIC0gc3RhcnRZKTtcclxuICAgICAgICAvL+eCueWcqOi+ueS4ilxyXG4gICAgICAgIGlmICh4ID09IHB4KSB7XHJcbiAgICAgICAgICBpblJlY3QgPSB0cnVlXHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8veOWkp+S6jnB45p2l5L+d6K+B5bCE57q/5pyd5Y+zXHJcbiAgICAgICAgaWYgKHggPiBweCkge1xyXG4gICAgICAgICAgZmxhZyA9ICFmbGFnXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIGluUmVjdCB8fCBmbGFnO1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXRpYyBkaWZmSW5wdXQoY2huZzogU2ltcGxlQ2hhbmdlLCBhY3Rpb246ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIGlmIChjaG5nID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuXHJcbiAgICBsZXQgY3VyID0gSlNPTi5zdHJpbmdpZnkoY2huZy5jdXJyZW50VmFsdWUpO1xyXG4gICAgbGV0IHByZXYgPSBKU09OLnN0cmluZ2lmeShjaG5nLnByZXZpb3VzVmFsdWUpO1xyXG4gICAgaWYgKGN1ciAhPT0gcHJldikge1xyXG4gICAgICBhY3Rpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyBkZWVwQ29weShvYmo6IGFueSkge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGlmZklucHV0cyhjaG5nOiBTaW1wbGVDaGFuZ2VbXSwgYWN0aW9uOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICBpZiAoY2huZyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICBpZiAoY2huZy5sZW5ndGggPT0gMCkgcmV0dXJuO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaG5nLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBpdGVtID0gY2huZ1tpXTtcclxuICAgICAgaWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkgY29udGludWU7XHJcbiAgICAgIGxldCBjdXIgPSBKU09OLnN0cmluZ2lmeShpdGVtLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIGxldCBwcmV2ID0gSlNPTi5zdHJpbmdpZnkoaXRlbS5wcmV2aW91c1ZhbHVlKTtcclxuICAgICAgaWYgKGN1ciAhPT0gcHJldikge1xyXG4gICAgICAgIGFjdGlvbigpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGF0YVVSTHRvQmxvYihkYXRhdXJsOiBhbnkpIHtcclxuICAgIHZhciBhcnIgPSBkYXRhdXJsLnNwbGl0KCcsJyksIG1pbWUgPSBhcnJbMF0ubWF0Y2goLzooLio/KTsvKVsxXSxcclxuICAgICAgYnN0ciA9IGF0b2IoYXJyWzFdKSwgbiA9IGJzdHIubGVuZ3RoLCB1OGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xyXG4gICAgd2hpbGUgKG4tLSkge1xyXG4gICAgICB1OGFycltuXSA9IGJzdHIuY2hhckNvZGVBdChuKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgQmxvYihbdThhcnJdLCB7dHlwZTogbWltZX0pO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRhdGFVUkx0b0ZpbGUoZGF0YXVybDogYW55LCBmaWxlbmFtZT86IHN0cmluZykge1xyXG4gICAgdmFyIGFyciA9IGRhdGF1cmwuc3BsaXQoJywnKSwgbWltZSA9IGFyclswXS5tYXRjaCgvOiguKj8pOy8pWzFdLFxyXG4gICAgICBic3RyID0gYXRvYihhcnJbMV0pLCBuID0gYnN0ci5sZW5ndGgsIHU4YXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XHJcbiAgICB3aGlsZSAobi0tKSB7XHJcbiAgICAgIHU4YXJyW25dID0gYnN0ci5jaGFyQ29kZUF0KG4pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBGaWxlKFt1OGFycl0sIChmaWxlbmFtZSB8fCBUb29sc1V0aWwuZ2V0UmFuZG9tRmlsZU5hbWUoKSksIHt0eXBlOiBtaW1lfSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0WWVzdGVyZGF5KGRheTogRGF0ZSk6IERhdGUge1xyXG5cclxuICAgIGxldCB0aW1lID0gZGF5LmdldFRpbWUoKSAtIDEwMDAgKiA2MCAqIDYwICogMjQ7XHJcbiAgICBkYXkgPSBuZXcgRGF0ZSh0aW1lKTtcclxuXHJcbiAgICByZXR1cm4gZGF5O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFRvbW9ycm93ZGF5KGRheTogRGF0ZSk6IERhdGUge1xyXG4gICAgbGV0IHRpbWUgPSBkYXkuZ2V0VGltZSgpICsgMTAwMCAqIDYwICogNjAgKiAyNDtcclxuXHJcbiAgICByZXR1cm4gbmV3IERhdGUodGltZSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0TmV4dE1vbnRoKGRheTogRGF0ZSkge1xyXG4gICAgbGV0IGRzID0gbmV3IERhdGUoZGF5KS5zZXRNb250aChkYXkuZ2V0TW9udGgoKSArIDEpO1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKGRzKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRWaWRlb0NvdmVyKHVybDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gVG9vbHNVdGlsLmdldE9zc1VybCh1cmwpICsgXCI/eC1vc3MtcHJvY2Vzcz12aWRlby9zbmFwc2hvdCx0XzEwMDAwLG1fZmFzdFwiO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZpc3REYXlPZk1vbnRoKGRheTogRGF0ZSkge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRlKG5ldyBEYXRlKGRheSkuc2V0RGF0ZSgxKSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgbGFzdERheU9mTW9udGgoZGF5OiBEYXRlKSB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoVG9vbHNVdGlsLmdldE5leHRNb250aChkYXkpLnNldERhdGUoMCkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldFJhbmRvbUZpbGVOYW1lID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3QgZXhwZWN0ID0gMTY7XHJcbiAgICBsZXQgc3RyID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpO1xyXG4gICAgd2hpbGUgKHN0ci5sZW5ndGggPCBleHBlY3QpIHtcclxuICAgICAgc3RyICs9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGV4cGVjdCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0RmlsZUV4dCA9IGZ1bmN0aW9uIChmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICB2YXIgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZihcIi5cIik7XHJcbiAgICB2YXIgc3VmZml4ID0gZmlsZU5hbWUuc3Vic3RyKGluZGV4ICsgMSk7XHJcbiAgICByZXR1cm4gc3VmZml4O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldEh0dHBPcHRpb25zKCk6IGFueSB7XHJcbiAgICByZXR1cm4ge2lzQ29tbW9uSHR0cEhlYWRlcjogdHJ1ZX1cclxuICB9XHJcblxyXG5cclxuICBzdGF0aWMgcmVzZXRGb3JtVmFsdWUob3B0OiBBdHJGb3JtT3B0LCBqc29uOiBqc29uKTogQXRyRm9ybU9wdCB7XHJcbiAgICBmb3IgKGxldCBpdGVtIG9mIG9wdC5pdGVtcykge1xyXG4gICAgICBpdGVtLnZhbHVlID0gXCJcIjtcclxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoanNvbikpIHtcclxuICAgICAgICBpZiAoanNvbi5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGpzb25ba2V5XSAhPSBudWxsICYmIGpzb25ba2V5XSAhPSB1bmRlZmluZWQgJiYga2V5ID09IGl0ZW0ua2V5KSB7XHJcbiAgICAgICAgICBpZiAoaXRlbS50eXBlID09ICdkYXRlJylcclxuICAgICAgICAgICAgaXRlbS52YWx1ZSA9IG5ldyBEYXRlKGpzb25ba2V5XSk7XHJcbiAgICAgICAgICBlbHNlIGlmIChpdGVtLnR5cGUgPT0gJ2RhdGVUaW1lJykge1xyXG4gICAgICAgICAgICBpdGVtLnZhbHVlID0gbmV3IERhdGUoanNvbltrZXldKTtcclxuICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICBpdGVtLnZhbHVlID0ganNvbltrZXldXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3B0O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldEZvcm1hdERhdGUoZGF0ZTogRGF0ZSk6IHN0cmluZyB7XHJcbiAgICBsZXQgbW9udGg6IHN0cmluZyB8IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICBsZXQgc3RyRGF0ZTogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXREYXRlKCk7XHJcblxyXG4gICAgaWYgKG1vbnRoIDw9IDkpIHtcclxuICAgICAgbW9udGggPSBcIjBcIiArIG1vbnRoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdHJEYXRlIDw9IDkpIHtcclxuICAgICAgc3RyRGF0ZSA9IFwiMFwiICsgc3RyRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCItXCIgKyBtb250aCArIFwiLVwiICsgc3RyRGF0ZVxyXG4gICAgLy8gKyBcIiBcIlxyXG4gICAgLy8gKyBkYXRlLmdldEhvdXJzKCkgKyBcIjpcIiArIGRhdGUuZ2V0TWludXRlcygpICsgXCI6XCIgKyBkYXRlLmdldFNlY29uZHMoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRGb3JtYXREYXRlRnVsbChkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGxldCBtb250aDogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTtcclxuICAgIGxldCBzdHJEYXRlOiBzdHJpbmcgfCBudW1iZXIgPSBkYXRlLmdldERhdGUoKTtcclxuXHJcbiAgICBpZiAobW9udGggPD0gOSkge1xyXG4gICAgICBtb250aCA9IFwiMFwiICsgbW9udGg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0ckRhdGUgPD0gOSkge1xyXG4gICAgICBzdHJEYXRlID0gXCIwXCIgKyBzdHJEYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi1cIiArIG1vbnRoICsgXCItXCIgKyBzdHJEYXRlICsgXCIgXCIgKyAoZGF0ZS5nZXRIb3VycygpIDwgMTAgPyAnMCcgKyBkYXRlLmdldEhvdXJzKCkgOiBkYXRlLmdldEhvdXJzKCkpICsgXCI6XCIgKyAoZGF0ZS5nZXRNaW51dGVzKCkgPCAxMCA/ICcwJyArIGRhdGUuZ2V0TWludXRlcygpIDogZGF0ZS5nZXRNaW51dGVzKCkpICsgXCI6XCIgKyAoZGF0ZS5nZXRTZWNvbmRzKCkgPCAxMCA/ICcwJyArIGRhdGUuZ2V0U2Vjb25kcygpIDogZGF0ZS5nZXRTZWNvbmRzKCkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldEZvcm1hdERhdGVXaXRob3V0UyhkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGxldCBtb250aDogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTtcclxuICAgIGxldCBzdHJEYXRlOiBzdHJpbmcgfCBudW1iZXIgPSBkYXRlLmdldERhdGUoKTtcclxuICAgIGxldCBob3Vyczogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXRIb3VycygpO1xyXG4gICAgbGV0IHNlY29uZHM6IHN0cmluZyB8IG51bWJlciA9IGRhdGUuZ2V0TWludXRlcygpO1xyXG4gICAgaWYgKG1vbnRoIDw9IDkpIHtcclxuICAgICAgbW9udGggPSBcIjBcIiArIG1vbnRoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdHJEYXRlIDw9IDkpIHtcclxuICAgICAgc3RyRGF0ZSA9IFwiMFwiICsgc3RyRGF0ZTtcclxuICAgIH1cclxuICAgIGlmIChob3VycyA8PSA5KSB7XHJcbiAgICAgIGhvdXJzID0gXCIwXCIgKyBob3VycztcclxuICAgIH1cclxuICAgIGlmIChzZWNvbmRzIDw9IDkpIHtcclxuICAgICAgc2Vjb25kcyA9IFwiMFwiICsgc2Vjb25kcztcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIi1cIiArIG1vbnRoICsgXCItXCIgKyBzdHJEYXRlICsgXCIgXCIgKyBob3VycyArIFwiOlwiICsgc2Vjb25kcztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRGb3JtYXREYXRlSG91cihkYXRlOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGxldCBtb250aDogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpICsgMTtcclxuICAgIGxldCBzdHJEYXRlOiBzdHJpbmcgfCBudW1iZXIgPSBkYXRlLmdldERhdGUoKTtcclxuICAgIGxldCBob3Vyczogc3RyaW5nIHwgbnVtYmVyID0gZGF0ZS5nZXRIb3VycygpO1xyXG4gICAgbGV0IHNlY29uZHM6IHN0cmluZyB8IG51bWJlciA9IGRhdGUuZ2V0TWludXRlcygpO1xyXG4gICAgaWYgKG1vbnRoIDw9IDkpIHtcclxuICAgICAgbW9udGggPSBcIjBcIiArIG1vbnRoO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdHJEYXRlIDw9IDkpIHtcclxuICAgICAgc3RyRGF0ZSA9IFwiMFwiICsgc3RyRGF0ZTtcclxuICAgIH1cclxuICAgIGlmIChob3VycyA8PSA5KSB7XHJcbiAgICAgIGhvdXJzID0gXCIwXCIgKyBob3VycztcclxuICAgIH1cclxuICAgIGlmIChzZWNvbmRzIDw9IDkpIHtcclxuICAgICAgc2Vjb25kcyA9IFwiMFwiICsgc2Vjb25kcztcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIlwiICsgbW9udGggKyBzdHJEYXRlICsgaG91cnM7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0T3NzVXJsKHVybDogc3RyaW5nLCBuZWVkVGltZSA9IGZhbHNlKSB7XHJcbiAgICBpZiAoIXVybCkge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICAgIGlmIChuZWVkVGltZSkge1xyXG4gICAgICAvLyB1cmwgPSB1cmwgKyBcIj92PVwiICsgVG9vbHNVdGlsLmdldEZvcm1hdERhdGVIb3VyKG5ldyBEYXRlKCkpO1xyXG4gICAgICB1cmwgPSB1cmwgKyBcIj92PVwiICsgbmV3IERhdGUoKS5nZXRUaW1lKClcclxuICAgIH1cclxuICAgIGlmICh1cmwuc3RhcnRzV2l0aChcImh0dHBcIikpIHtcclxuICAgICAgcmV0dXJuIHVybFxyXG4gICAgfVxyXG4gICAgaWYgKCF1cmwuc3RhcnRzV2l0aChcIi9cIikgJiYgIWF0cl9zdGF0aWNfZGF0YXMuT1NTX1VSTC5lbmRzV2l0aCgnLycpKSB7XHJcbiAgICAgIHVybCA9ICcvJyArIHVybFxyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdCA9IGF0cl9zdGF0aWNfZGF0YXMuT1NTX1VSTCArIHVybFxyXG5cclxuICAgIHJldHVybiByZXN1bHRcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRTdGF0aWNPc3NVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIGlmICghdXJsKSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gICAgaWYgKHVybC5zdGFydHNXaXRoKFwiaHR0cFwiKSkge1xyXG4gICAgICByZXR1cm4gdXJsXHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXRyX3N0YXRpY19kYXRhcy5TVEFUSUNfT1NTX1VSTCArIHVybDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyByZW1vdmVIdG1sKHZhbHVlOiBhbnkpIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLzxbXjw+XSs+L2csICcnKS5yZXBsYWNlKC8mbmJzcDsvaWcsICcnKVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIG11bCguLi5udW1iZXJzOiBhbnkpIHtcclxuICAgIGlmIChudW1iZXJzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IG0gPSB0aGlzLmdldERpZ2l0KG51bWJlcnMpO1xyXG4gICAgbGV0IHJlc3VsdCA9IDE7XHJcbiAgICBudW1iZXJzLmZvckVhY2goXHJcbiAgICAgIChudW06IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBzID0gbnVtLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgcmVzdWx0ICo9IE51bWJlcihzLnJlcGxhY2UoXCIuXCIsIFwiXCIpKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICAgIHJldHVybiByZXN1bHQgLyBNYXRoLnBvdygxMCwgbSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0RGlnaXQoLi4ubnVtYmVyczogYW55W10pIHtcclxuICAgIGxldCBtID0gMDtcclxuICAgIG51bWJlcnMuZm9yRWFjaChcclxuICAgICAgbnVtID0+IHtcclxuICAgICAgICBsZXQgcyA9IG51bS50b1N0cmluZygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBtICs9IHMuc3BsaXQoXCIuXCIpWzFdLmxlbmd0aFxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICByZXR1cm4gbTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkb3dubG9hZEltZyhkYXRhOiBhbnksIGZpbGVOYW1lPzogc3RyaW5nLCBlbmRwb2ludD86IHN0cmluZykge1xyXG4gICAgLy8gLy8g5LiL6L2957G75Z6LIHhsc1xyXG4gICAgLy8gY29uc3QgY29udGVudFR5cGUgPSAnaW1hZ2UvanBlZyc7XHJcbiAgICAvLyAvLyBjb25zdCBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCc7XHJcbiAgICAvLyAvLyDkuIvovb3nsbvlnovvvJpjc3ZcclxuICAgIC8vIGNvbnN0IGRlYnVnID0ge2hlbGxvOiBcIndvcmxkXCJ9O1xyXG4gICAgLy8gY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtdLHt0eXBlIDogJ2ltYWdlL2pwZWcnfSk7XHJcbiAgICAvLyBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgIC8vXHJcbiAgICAvLyAvLyDmiZPlvIDmlrDnqpflj6PmlrnlvI/ov5vooYzkuIvovb1cclxuICAgIC8vIC8vIHdpbmRvdy5vcGVuKHVybCk7XHJcbiAgICAvL1xyXG4gICAgLy8gLy8g5Lul5Yqo5oCB5Yib5bu6Yeagh+etvui/m+ihjOS4i+i9vVxyXG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGEuaHJlZiA9IGRhdGE7XHJcbiAgICAvLyBhLmRvd25sb2FkID0gZmlsZU5hbWU7XHJcbiAgICBhLmRvd25sb2FkID0gZmlsZU5hbWUgPyBmaWxlTmFtZSA6IFwiXCIgKyBlbmRwb2ludDtcclxuICAgIGEuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkb3dubG9hZFhscyh1cmw6IHN0cmluZywgcGFyYW1zPzogYW55LCkge1xyXG4gICAgaWYgKHBhcmFtcykge1xyXG4gICAgICB1cmwgKz0gXCI/XCI7XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHBhcmFtcykpIHtcclxuICAgICAgICBpZiAocGFyYW1zW2tleV0pIHtcclxuICAgICAgICAgIHVybCArPSBrZXkgKyBcIj1cIiArIHBhcmFtc1trZXldICsgXCImJlwiXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyB3aW5kb3cub3Blbih1cmwpO1xyXG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGEuaHJlZiA9IHVybDtcclxuICAgIC8vIC8vIGEuZG93bmxvYWQgPSBmaWxlTmFtZTtcclxuICAgIC8vIGEuZG93bmxvYWQgPSBcIjMzMjEueGxzXCI7XHJcbiAgICBhLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZ2V0SW1nKHVybDogc3RyaW5nLCBwYXJhbTogYW55ID0ge1xyXG4gICAgaW1nVzogMCwgaW1nSDogMCxcclxuICAgIG5lZWRUaW1lOiBmYWxzZSwgaXNGdWxsVXJsOiBmYWxzZVxyXG4gIH0pIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGxldCBkYXRhVXJsOiBhbnkgPSBTZXNzaW9uU3RvcmFnZVV0aWwuZ2V0SW1nKHVybClcclxuICAgICAgbGV0IGltZyA9IG5ldyBJbWFnZSgpXHJcbiAgICAgIGltZy5zZXRBdHRyaWJ1dGUoJ2Nyb3NzT3JpZ2luJywgJ2Fub255bW91cycpXHJcbiAgICAgIGlmICghZGF0YVVybCkge1xyXG4gICAgICAgIGltZy5zcmMgPSBwYXJhbS5pc0Z1bGxVcmwgPyB1cmwgOiBUb29sc1V0aWwuZ2V0T3NzVXJsKHVybCwgcGFyYW0ubmVlZFRpbWUpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gZGF0YVVybC5pbmRleE9mKFwifVwiKSArIDFcclxuICAgICAgICBpbWcuc3JjID0gZGF0YVVybC5zbGljZSgwLCA1MCkgKyBkYXRhVXJsLnNsaWNlKGluZGV4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBsZXQgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpXHJcbiAgICAgICAgbGV0IGNvbnRleHQyOiBhbnkgPSBjLmdldENvbnRleHQoXCIyZFwiKVxyXG4gICAgICAgIGMud2lkdGggPSBwYXJhbS5pbWdXIHx8IGltZy53aWR0aDtcclxuICAgICAgICBjLmhlaWdodCA9IHBhcmFtLmltZ0ggfHwgaW1nLmhlaWdodFxyXG4gICAgICAgIGNvbnRleHQyLmRyYXdJbWFnZShpbWcsIDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KVxyXG4gICAgICAgIGxldCBkYXRhVXJsID0gYy50b0RhdGFVUkwoKVxyXG4gICAgICAgIGxldCBzdHIgPSBjLndpZHRoICsgXCIsXCIgKyBjLmhlaWdodCArIFwifVwiXHJcbiAgICAgICAgZGF0YVVybCA9IGRhdGFVcmwuc2xpY2UoMCwgNTApICsgc3RyICsgZGF0YVVybC5zbGljZSg1MClcclxuLy/kuI3kv53lrZhcclxuLy8gICAgICAgICBTZXNzaW9uU3RvcmFnZVV0aWwuc2V0SW1nKHVybCwgZGF0YVVybClcclxuXHJcbiAgICAgICAgcmVzb2x2ZShpbWcpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgc3RhdGljIHBpeGVsVG9OdW0od2lkdGg6IGFueSkge1xyXG4gICAgY29uc3QgcmUgPSAvcHgvZ2k7XHJcbiAgICBsZXQgd2lkdGhTdHIgPSB3aWR0aC5yZXBsYWNlKHJlLCBcIlwiKTtcclxuICAgIHJldHVybiBOdW1iZXIod2lkdGhTdHIpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFsbEVxdWFsID0gKC4uLmFycmF5OiBhbnlbXSkgPT4gYXJyYXkuZXZlcnkoaXRlbSA9PiBpdGVtID09PSBhcnJheVswXSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIGFycmF55omA5pyJ5Y+C5pWw5ruh6LazZm7lh73mlbDov5Tlm550cnVlXHJcbiAgICogYWxsKHggPT4geCA+IDEsMSwyLDMpOyAvLyB0cnVlXHJcbiAgICogQHBhcmFtIGNhbGxiYWNrXHJcbiAgICogQHBhcmFtIGFycmF5XHJcbiAgICovXHJcbiAgc3RhdGljIHNhdGlzZmllZEZuID0gKGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGJvb2xlYW4sIC4uLmFycmF5OiBhbnlbXSkgPT4gYXJyYXkuZXZlcnkoY2FsbGJhY2spO1xyXG5cclxuICAvL+WFqOmDqOS4jeepuuS4unRydWVcclxuICBzdGF0aWMgbm90RW1wdHkoLi4uYXJyOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGFyci5ldmVyeShpdGVtID0+ICEhaXRlbSlcclxuICB9XHJcblxyXG4gIC8v5YyF5ZCr56m65Li6dHJ1ZVxyXG4gIHN0YXRpYyBoYXNFbXB0eSguLi5hcnI6IGFueVtdKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gYXJyLnNvbWUoaXRlbSA9PiAhaXRlbSk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYWxsRW1wdHkoLi4uYXJyOiBhbnlbXSkge1xyXG4gICAgcmV0dXJuIGFyci5ldmVyeShpdGVtID0+ICFpdGVtKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc0FycmF5KG9iajogYW55KSB7XHJcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgQXJyYXlcclxuICB9XHJcblxyXG4gIHN0YXRpYyBpc0VtcHR5KG9iajogYW55KSB7XHJcbiAgICBpZiAob2JqID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICAgIGlmIChvYmogPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2Ygb2JqID09ICdib29sZWFuJykge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGlmIChvYmogPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIG9iaiA9PSBcInN0cmluZ1wiICYmIG9iai50cmltKCkgPT09ICcnKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIHN0YXRpYyBlbmNvZGVWYWx1ZShwYXJhbXM6IGFueSkge1xyXG4gICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKGtleSA9PiBwYXJhbXNba2V5XSA9IGVuY29kZVVSSUNvbXBvbmVudChwYXJhbXNba2V5XSkpO1xyXG4gICAgcmV0dXJuIHBhcmFtcztcclxuICB9XHJcblxyXG4gIHN0YXRpYyB3aW5kb3dIZWlnaHQoKSB7XHJcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB3aW5kb3dXaWR0aCgpIHtcclxuXHJcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIG1vZGFsZVN0eWxlKCkge1xyXG4gICAgcmV0dXJuIHsnbWF4SGVpZ2h0JzogVG9vbHNVdGlsLndpbmRvd0hlaWdodCgpIC0gMjAwICsgJ3B4JywgJ292ZXJmbG93LXknOiAnYXV0byd9O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldExlbmd0aChwb2ludEE6IHsgeDE6IGFueSwgeTE6IGFueSwgeDogYW55LCB5OiBhbnkgfSwgcG9pbnRCOiB7IHg6IGFueSwgeTogYW55LCB4MTogYW55LCB5MTogYW55IH0pIHtcclxuICAgIHBvaW50QS54MSA9IHBvaW50QS54IHx8IHBvaW50QS54MSB8fCAwXHJcbiAgICBwb2ludEEueTEgPSBwb2ludEEueSB8fCBwb2ludEEueTEgfHwgMFxyXG4gICAgcG9pbnRCLnkxID0gcG9pbnRCLnkgfHwgcG9pbnRCLnkxIHx8IDA7XHJcbiAgICBwb2ludEIueDEgPSBwb2ludEIueCB8fCBwb2ludEIueDEgfHwgMDtcclxuICAgIHZhciBsZW5ndGhBQiA9IE1hdGguc3FydChNYXRoLnBvdyhwb2ludEEueDEgLSBwb2ludEIueDEsIDIpICtcclxuICAgICAgTWF0aC5wb3cocG9pbnRBLnkxIC0gcG9pbnRCLnkxLCAyKSlcclxuICAgIHJldHVybiBsZW5ndGhBQjtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXRSb3RhdGVOdW0ocG9pbnRCOiB7IHgxOiBhbnksIHkxOiBhbnksIHg6IGFueSwgeTogYW55IH0sIHBvaW50QzogeyB4MTogYW55LCB5MTogYW55LCB4OiBhbnksIHk6IGFueSB9LCBwb2ludEE6IHsgeDE6IGFueSwgeTE6IGFueSwgeDogYW55LCB5OiBhbnkgfSkge1xyXG4gICAgcG9pbnRBLngxID0gcG9pbnRBLnggfHwgcG9pbnRBLngxIHx8IDBcclxuICAgIHBvaW50QS55MSA9IHBvaW50QS55IHx8IHBvaW50QS55MSB8fCAwXHJcbiAgICBwb2ludEIueDEgPSBwb2ludEIueSB8fCBwb2ludEIueDEgfHwgMDtcclxuICAgIHBvaW50Qi55MSA9IHBvaW50Qi54IHx8IHBvaW50Qi54MSB8fCAwO1xyXG4gICAgcG9pbnRDLngxID0gcG9pbnRDLnkgfHwgcG9pbnRDLngxIHx8IDA7XHJcbiAgICBwb2ludEMueTEgPSBwb2ludEMueCB8fCBwb2ludEMueDEgfHwgMDtcclxuXHJcbiAgICAvL0FCQ+S4reW/g+eCuSzotbflp4vngrks57uI54K5XHJcbiAgICBsZXQgQUI6IGFueSA9IHt9O1xyXG4gICAgbGV0IEFDOiBhbnkgPSB7fTtcclxuICAgIEFCLngxID0gcG9pbnRCLngxIC0gcG9pbnRBLngxXHJcbiAgICBBQi55MSA9IHBvaW50Qi55MSAtIHBvaW50QS55MVxyXG4gICAgQUMueDEgPSBwb2ludEMueDEgLSBwb2ludEEueDFcclxuICAgIEFDLnkxID0gcG9pbnRDLnkxIC0gcG9pbnRBLnkxXHJcbiAgICB2YXIgZGlyZWN0ID0gQUIueDEgKiBBQy55MSAtIEFCLnkxICogQUMueTFcclxuICAgIHZhciBsZW5ndGhBQiA9IHRoaXMuZ2V0TGVuZ3RoKHBvaW50QiwgcG9pbnRBKVxyXG4gICAgdmFyIGxlbmd0aEFDID0gdGhpcy5nZXRMZW5ndGgocG9pbnRDLCBwb2ludEEpXHJcbiAgICB2YXIgbGVuZ3RoQkMgPSB0aGlzLmdldExlbmd0aChwb2ludEIsIHBvaW50QylcclxuICAgIHZhciBjb3NBID0gKE1hdGgucG93KGxlbmd0aEFCLCAyKSArIE1hdGgucG93KGxlbmd0aEFDLCAyKSAtXHJcbiAgICAgIE1hdGgucG93KGxlbmd0aEJDLCAyKSkgLyAoMiAqIGxlbmd0aEFCICogbGVuZ3RoQUMpXHJcbiAgICB2YXIgYW5nbGVBID0gTWF0aC5yb3VuZChNYXRoLmFjb3MoY29zQSkgKiAxODAgLyBNYXRoLlBJKVxyXG4gICAgaWYgKGRpcmVjdCA8IDApIHtcclxuICAgICAgcmV0dXJuIC1hbmdsZUFcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBhbmdsZUFcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvL+e7lWNlbnRlcueCueaXi+i9rHJvdGF0ZeinkuW6plxyXG4gIHN0YXRpYyBnZXRSb3RhdGVQb2ludChwOiB7IHgxOiBhbnksIHkxOiBhbnkgfSwgY2VudGVyOiB7IHgxOiBhbnksIHkxOiBhbnkgfSwgcm90YXRlOiBhbnkpIHtcclxuICAgIGxldCBzdGFydFggPSBwLngxXHJcbiAgICBsZXQgc3RhcnRZID0gcC55MVxyXG4gICAgbGV0IGEgPSBjZW50ZXIueDFcclxuICAgIGxldCBiID0gY2VudGVyLnkxXHJcbiAgICBsZXQgeDEgPSBhIC0gTWF0aC5jb3Mocm90YXRlICogTWF0aC5QSSAvIDE4MCkgKiAoYSAtIHN0YXJ0WCkgKyBNYXRoLnNpbihyb3RhdGUgKiBNYXRoLlBJIC8gMTgwKSAqIChiIC0gc3RhcnRZKVxyXG4gICAgbGV0IHkxID0gYiAtIE1hdGguY29zKHJvdGF0ZSAqIE1hdGguUEkgLyAxODApICogKGIgLSBzdGFydFkpIC0gTWF0aC5zaW4ocm90YXRlICogTWF0aC5QSSAvIDE4MCkgKiAoYSAtIHN0YXJ0WClcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHgxOiB4MSxcclxuICAgICAgeTE6IHkxXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==