@magic-xpa/gui 4.1200.0-dev4120.21 → 4.1200.0-dev4120.212

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 (81) hide show
  1. package/fesm2022/magic-xpa-gui.mjs +5724 -249
  2. package/fesm2022/magic-xpa-gui.mjs.map +1 -1
  3. package/index.d.ts +3 -0
  4. package/package.json +2 -4
  5. package/src/GuiEnums.d.ts +3 -0
  6. package/src/gui/GuiMgControl.d.ts +1 -0
  7. package/src/management/exp/ExpressionInterface.d.ts +1 -0
  8. package/src/management/gui/MgControlBase.d.ts +1 -1
  9. package/src/management/gui/PropInterface.d.ts +2 -1
  10. package/esm2022/index.mjs +0 -71
  11. package/esm2022/magic-xpa-gui.mjs +0 -2
  12. package/esm2022/src/Commands.mjs +0 -184
  13. package/esm2022/src/Events.mjs +0 -425
  14. package/esm2022/src/EventsProcessor.mjs +0 -67
  15. package/esm2022/src/FocusManager.mjs +0 -34
  16. package/esm2022/src/GuiConstants.mjs +0 -68
  17. package/esm2022/src/GuiEnums.mjs +0 -301
  18. package/esm2022/src/GuiEnvironment.mjs +0 -4
  19. package/esm2022/src/IFlowMonitorQueue.mjs +0 -2
  20. package/esm2022/src/Manager.mjs +0 -91
  21. package/esm2022/src/UIBridge.mjs +0 -33
  22. package/esm2022/src/env/IEnvironment.mjs +0 -2
  23. package/esm2022/src/gui/ControlBase.mjs +0 -3
  24. package/esm2022/src/gui/GuiMgControl.mjs +0 -123
  25. package/esm2022/src/gui/GuiMgForm.mjs +0 -4
  26. package/esm2022/src/gui/KeyboardItem.mjs +0 -135
  27. package/esm2022/src/gui/LastFocusedVal.mjs +0 -11
  28. package/esm2022/src/gui/MgValue.mjs +0 -16
  29. package/esm2022/src/gui/PropParentInterface.mjs +0 -2
  30. package/esm2022/src/gui/low/DialogHandler.mjs +0 -7
  31. package/esm2022/src/gui/low/GuiCommand.mjs +0 -68
  32. package/esm2022/src/gui/low/GuiCommandQueue.mjs +0 -35
  33. package/esm2022/src/gui/low/GuiInteractive.mjs +0 -178
  34. package/esm2022/src/gui/low/Style.mjs +0 -20
  35. package/esm2022/src/management/RuntimeContextBase.mjs +0 -42
  36. package/esm2022/src/management/data/BlobType.mjs +0 -281
  37. package/esm2022/src/management/data/DcValues.mjs +0 -214
  38. package/esm2022/src/management/data/DcValuesBuilderBase.mjs +0 -96
  39. package/esm2022/src/management/data/FieldDef.mjs +0 -331
  40. package/esm2022/src/management/data/FieldsTable.mjs +0 -54
  41. package/esm2022/src/management/data/GuiDataViewBase.mjs +0 -88
  42. package/esm2022/src/management/data/GuiFieldBase.mjs +0 -82
  43. package/esm2022/src/management/data/IRecord.mjs +0 -2
  44. package/esm2022/src/management/data/IReferencedObject.mjs +0 -2
  45. package/esm2022/src/management/data/NUM_TYPE.mjs +0 -1739
  46. package/esm2022/src/management/data/ObjectReferenceBase.mjs +0 -48
  47. package/esm2022/src/management/data/ObjectReferencesCollection.mjs +0 -27
  48. package/esm2022/src/management/data/RecordUtils.mjs +0 -361
  49. package/esm2022/src/management/data/VectorType.mjs +0 -612
  50. package/esm2022/src/management/data/VectorTypeBase.mjs +0 -88
  51. package/esm2022/src/management/events/IActionManager.mjs +0 -2
  52. package/esm2022/src/management/events/IGuiEventsManager.mjs +0 -2
  53. package/esm2022/src/management/exp/ExpressionInterface.mjs +0 -244
  54. package/esm2022/src/management/exp/GuiExpressionEvaluator.mjs +0 -305
  55. package/esm2022/src/management/gui/ControlTable.mjs +0 -118
  56. package/esm2022/src/management/gui/DisplayConvertor.mjs +0 -1649
  57. package/esm2022/src/management/gui/FieldValidator.mjs +0 -711
  58. package/esm2022/src/management/gui/GuiControlPropertyAdapter.mjs +0 -24
  59. package/esm2022/src/management/gui/GuiFormPropertyAdapter.mjs +0 -11
  60. package/esm2022/src/management/gui/HebrewDate.mjs +0 -278
  61. package/esm2022/src/management/gui/Helps.mjs +0 -237
  62. package/esm2022/src/management/gui/MgControlBase.mjs +0 -1869
  63. package/esm2022/src/management/gui/MgFormBase.mjs +0 -741
  64. package/esm2022/src/management/gui/PIC.mjs +0 -1185
  65. package/esm2022/src/management/gui/PropDefaults.mjs +0 -230
  66. package/esm2022/src/management/gui/PropInterface.mjs +0 -246
  67. package/esm2022/src/management/gui/PropTable.mjs +0 -221
  68. package/esm2022/src/management/gui/Property.mjs +0 -1362
  69. package/esm2022/src/management/gui/ValidationDetails.mjs +0 -248
  70. package/esm2022/src/management/gui/ValidationDetailsBase.mjs +0 -93
  71. package/esm2022/src/management/gui/WrongFormatException.mjs +0 -29
  72. package/esm2022/src/management/tasks/GuiDataCollection.mjs +0 -4
  73. package/esm2022/src/management/tasks/GuiTaskBase.mjs +0 -511
  74. package/esm2022/src/management/tasks/IMGDataTable.mjs +0 -2
  75. package/esm2022/src/management/tasks/ITask.mjs +0 -2
  76. package/esm2022/src/management/tasks/MgTimer.mjs +0 -21
  77. package/esm2022/src/management/tasks/TaskDefinitionId.mjs +0 -54
  78. package/esm2022/src/management/tasks/TaskDefinitionIdTableSaxHandler.mjs +0 -41
  79. package/esm2022/src/util/MemoryUtil.mjs +0 -35
  80. package/esm2022/src/util/ObjectReference.mjs +0 -36
  81. package/esm2022/src/util/UsernamePasswordCredentials.mjs +0 -52
@@ -1,281 +0,0 @@
1
- import { Logger, StrUtil } from '@magic-xpa/utils';
2
- import { ApplicationException, Debug, Encoding, ISO_8859_1_Encoding, NNumber, NString } from '@magic-xpa/mscorelib';
3
- import { GuiConstants } from '../../GuiConstants';
4
- import { GuiEnvironment } from '../../GuiEnvironment';
5
- export class BlobType {
6
- static CONTENT_TYPE_UNKNOWN = '0';
7
- static CONTENT_TYPE_ANSI = '1';
8
- static CONTENT_TYPE_UNICODE = '2';
9
- static CONTENT_TYPE_BINARY = '3';
10
- static getContentType(blob) {
11
- try {
12
- let tokens = StrUtil.tokenize(blob, /,|;/);
13
- return tokens[4].charAt(0);
14
- }
15
- catch (Exception) {
16
- throw new ApplicationException(" in BlobType.getContentType blob is in invalid format");
17
- }
18
- }
19
- static getEmptyBlobPrefix(vecCellAttr) {
20
- return NString.Format("0,0,{0},{1},0", '\0', vecCellAttr);
21
- }
22
- static getBlobPrefixForContentType(contentType) {
23
- return NString.Format("0,0,{0},{0},{1};", '\0', contentType);
24
- }
25
- static getPrefix(str) {
26
- let idx = str.indexOf(';');
27
- return str.substr(0, idx + 1);
28
- }
29
- static getEncodingFromContentType(ContentType) {
30
- let encoding;
31
- if (ContentType === BlobType.CONTENT_TYPE_UNICODE)
32
- encoding = Encoding.Unicode;
33
- else if (ContentType === BlobType.CONTENT_TYPE_ANSI)
34
- encoding = GuiEnvironment.Environment.GetEncoding();
35
- else
36
- encoding = ISO_8859_1_Encoding.ISO_8859_1;
37
- return encoding;
38
- }
39
- static MbToUnicode(BytesInMb) {
40
- let result = null;
41
- try {
42
- let UnicodeString = GuiEnvironment.Environment.GetEncoding().GetString(BytesInMb, 0, BytesInMb.length);
43
- result = Encoding.Unicode.GetBytes(UnicodeString);
44
- }
45
- catch (Exception) {
46
- result = null;
47
- }
48
- return result;
49
- }
50
- static UnicodeToMb(BytesInUnicode) {
51
- let result = null;
52
- try {
53
- let UnicodeString = Encoding.Unicode.GetString(BytesInUnicode, 0, BytesInUnicode.length);
54
- result = GuiEnvironment.Environment.GetEncoding().GetBytes(UnicodeString);
55
- }
56
- catch (Exception) {
57
- result = null;
58
- }
59
- return result;
60
- }
61
- static getString(blob) {
62
- let result = null;
63
- let bytes = null;
64
- if (BlobType.isValidBlob(blob)) {
65
- let contentType = BlobType.getContentType(blob);
66
- if (contentType !== BlobType.CONTENT_TYPE_UNICODE)
67
- contentType = BlobType.CONTENT_TYPE_ANSI;
68
- try {
69
- bytes = BlobType.getBytes(blob);
70
- let encoding = BlobType.getEncodingFromContentType(contentType);
71
- result = encoding.GetString(bytes, 0, bytes.length);
72
- let index = result.indexOf('\0');
73
- if (index !== -1)
74
- result = result.substr(0, index);
75
- }
76
- catch (Exception) {
77
- result = null;
78
- }
79
- }
80
- else
81
- Debug.Assert(false);
82
- return result;
83
- }
84
- static createFromString(blobStr, contentType) {
85
- let blob = null;
86
- let srcContentType = contentType;
87
- let bytes = null;
88
- if (contentType !== BlobType.CONTENT_TYPE_UNICODE)
89
- srcContentType = BlobType.CONTENT_TYPE_ANSI;
90
- try {
91
- if (blobStr.constructor === ArrayBuffer) {
92
- bytes = new Uint8Array(blobStr);
93
- }
94
- else {
95
- let encoding = BlobType.getEncodingFromContentType(srcContentType);
96
- bytes = encoding.GetBytes(blobStr);
97
- }
98
- blob = BlobType.createFromBytes(bytes, contentType);
99
- }
100
- catch (Exception) {
101
- blob = null;
102
- }
103
- return blob;
104
- }
105
- static getBytes(str) {
106
- let bytes = null;
107
- let data = BlobType.removeBlobPrefix(str);
108
- try {
109
- let encoding = ISO_8859_1_Encoding.ISO_8859_1;
110
- bytes = encoding.GetBytes(data);
111
- }
112
- catch (Exception) {
113
- bytes = null;
114
- }
115
- return bytes;
116
- }
117
- static createFromBytes(bytes, contentType) {
118
- let blobStr = '';
119
- let blobPrefix;
120
- let blobData;
121
- blobPrefix = BlobType.getBlobPrefixForContentType(contentType);
122
- try {
123
- let encoding = ISO_8859_1_Encoding.ISO_8859_1;
124
- blobData = encoding.GetString(bytes, 0, bytes.length);
125
- }
126
- catch (Exception) {
127
- blobData = null;
128
- }
129
- blobStr = blobPrefix + blobData;
130
- return blobStr;
131
- }
132
- static copyBlob(dest, src) {
133
- let srcBytes;
134
- let destBytes;
135
- if (src === null)
136
- return null;
137
- else if (dest === null)
138
- return src;
139
- srcBytes = BlobType.getBytes(src);
140
- let destContentType = BlobType.getContentType(dest);
141
- let srcContentType = BlobType.getContentType(src);
142
- if (srcContentType === BlobType.CONTENT_TYPE_ANSI && destContentType === BlobType.CONTENT_TYPE_UNICODE)
143
- destBytes = BlobType.MbToUnicode(srcBytes);
144
- else if (srcContentType === BlobType.CONTENT_TYPE_UNICODE && destContentType === BlobType.CONTENT_TYPE_ANSI)
145
- destBytes = BlobType.UnicodeToMb(srcBytes);
146
- else
147
- destBytes = srcBytes;
148
- dest = BlobType.createFromBytes(destBytes, destContentType);
149
- return dest;
150
- }
151
- static removeBlobPrefix(source) {
152
- let idx;
153
- if (source !== null) {
154
- idx = source.indexOf(';');
155
- if (idx < 0)
156
- Logger.Instance.WriteToLog("Error: invalid blob prefix", true);
157
- return source.substr(idx + 1);
158
- }
159
- else
160
- return null;
161
- }
162
- static isValidBlob(blob) {
163
- let isValid = true;
164
- if (blob === null || blob.indexOf(';') < 0)
165
- isValid = false;
166
- if (isValid) {
167
- let contentType = BlobType.getContentType(blob);
168
- if (contentType !== BlobType.CONTENT_TYPE_ANSI && contentType !== BlobType.CONTENT_TYPE_BINARY && contentType !== BlobType.CONTENT_TYPE_UNICODE && contentType !== BlobType.CONTENT_TYPE_UNKNOWN)
169
- isValid = false;
170
- }
171
- return isValid;
172
- }
173
- static setContentType(str, contentType) {
174
- let result = "";
175
- try {
176
- let prefixLastIndex = str.indexOf(";");
177
- let prefix = str.substr(0, prefixLastIndex);
178
- let dataLength = str.length - (prefix.length + 1);
179
- let data = str.substr(prefixLastIndex + 1, dataLength);
180
- let prefixTokens = StrUtil.tokenize(prefix, /,|;/);
181
- for (let i = 0; i < GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT; i = i + 1) {
182
- if (i === 4)
183
- result = result + contentType + ",";
184
- else
185
- result = result + prefixTokens[i] + ",";
186
- }
187
- return result.substr(0, result.length - 1) + ";" + data;
188
- }
189
- catch (Exception) {
190
- throw new ApplicationException(" in BlobType.setContentType : invalid format");
191
- }
192
- }
193
- static SetVecCellAttr(str, vecCellAttr) {
194
- let result = "";
195
- try {
196
- let prefixLastIndex = str.indexOf(";");
197
- let prefix = str.substr(0, prefixLastIndex);
198
- let data = str.substr(prefixLastIndex + 1);
199
- let tokens = StrUtil.tokenize(prefix, /,|;/);
200
- for (let i = 0; i < GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT; i = i + 1) {
201
- if (i === 3)
202
- result = result + vecCellAttr + ",";
203
- else
204
- result = result + tokens[i] + ",";
205
- }
206
- return result.substr(0, result.length - 1) + ";" + data;
207
- }
208
- catch (Exception) {
209
- throw new ApplicationException(" in XMLparser.blobPrefixLength invalid format");
210
- }
211
- }
212
- static GetVecCellAttr(blobStr) {
213
- try {
214
- let tokens = StrUtil.tokenize(blobStr, /,|;/);
215
- return tokens[3].charAt(0);
216
- }
217
- catch (Exception) {
218
- throw new ApplicationException(" in BlobType.GetVecCellAttr(): blob is in invalid format");
219
- }
220
- }
221
- static blobPrefixLength(blob) {
222
- try {
223
- let prefixLength = blob.indexOf(';') + 1;
224
- let prefix = blob.substr(0, prefixLength);
225
- if (prefixLength > 0) {
226
- let tokens = StrUtil.tokenize(prefix, ",");
227
- if (tokens.length === GuiConstants.BLOB_PREFIX_ELEMENTS_COUNT)
228
- return prefixLength;
229
- }
230
- }
231
- catch (Exception) {
232
- }
233
- throw new ApplicationException(" in XMLparser.blobPrefixLength invalid format");
234
- }
235
- static getKey(blobStr) {
236
- let tokens = StrUtil.tokenize(blobStr, /,|;/);
237
- let key = 0;
238
- if (tokens.length > 5) {
239
- try {
240
- key = NNumber.Parse(tokens[0]);
241
- }
242
- catch (Exception) {
243
- }
244
- }
245
- return key;
246
- }
247
- static getBlobSize(blob) {
248
- let size = 0;
249
- try {
250
- let tokens = StrUtil.tokenize(blob, /,|;/);
251
- if (tokens.length > 5) {
252
- size = blob.length;
253
- for (let i = 0; i < 5; i = i + 1) {
254
- size = size - tokens[i].length;
255
- size = size - 1;
256
- }
257
- }
258
- }
259
- catch (Exception) {
260
- }
261
- return size;
262
- }
263
- static ParseContentType(contentType) {
264
- let newContentType = ' ';
265
- switch (contentType) {
266
- case 0:
267
- newContentType = BlobType.CONTENT_TYPE_UNKNOWN;
268
- break;
269
- case 1:
270
- newContentType = BlobType.CONTENT_TYPE_ANSI;
271
- break;
272
- case 2:
273
- newContentType = BlobType.CONTENT_TYPE_UNICODE;
274
- break;
275
- case 3:
276
- newContentType = BlobType.CONTENT_TYPE_BINARY;
277
- }
278
- return newContentType;
279
- }
280
- }
281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvYlR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZGF0YS9CbG9iVHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFvQixPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxNQUFNLE9BQU8sUUFBUTtJQUNuQixNQUFNLENBQUMsb0JBQW9CLEdBQVcsR0FBRyxDQUFDO0lBQzFDLE1BQU0sQ0FBQyxpQkFBaUIsR0FBVyxHQUFHLENBQUM7SUFDdkMsTUFBTSxDQUFDLG9CQUFvQixHQUFXLEdBQUcsQ0FBQztJQUMxQyxNQUFNLENBQUMsbUJBQW1CLEdBQVcsR0FBRyxDQUFDO0lBT3pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBWTtRQUNoQyxJQUFJO1lBQ0YsSUFBSSxNQUFNLEdBQWEsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxTQUFTLEVBQUU7WUFDaEIsTUFBTSxJQUFJLG9CQUFvQixDQUFDLHVEQUF1RCxDQUFDLENBQUM7U0FDekY7SUFDSCxDQUFDO0lBT0QsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFdBQW1CO1FBQzNDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFF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QUM7Z0JBQ0osY0FBYyxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztnQkFDL0MsTUFBTTtZQUNSLEtBQUssQ0FBQztnQkFDSixjQUFjLEdBQUcsUUFBUSxDQUFDLG1CQUFtQixDQUFDO1NBQ2pEO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvZ2dlciwgU3RvcmFnZUF0dHJpYnV0ZSwgU3RyVXRpbCB9IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQgeyBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgRGVidWcsIEVuY29kaW5nLCBJU09fODg1OV8xX0VuY29kaW5nLCBOTnVtYmVyLCBOU3RyaW5nIH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQgeyBHdWlDb25zdGFudHMgfSBmcm9tICcuLi8uLi9HdWlDb25zdGFudHMnO1xyXG5pbXBvcnQgeyBHdWlFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL0d1aUVudmlyb25tZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBCbG9iVHlwZSB7XHJcbiAgc3RhdGljIENPTlRFTlRfVFlQRV9VTktOT1dOOiBzdHJpbmcgPSAnMCc7XHJcbiAgc3RhdGljIENPTlRFTlRfVFlQRV9BTlNJOiBzdHJpbmcgPSAnMSc7XHJcbiAgc3RhdGljIENPTlRFTlRfVFlQRV9VTklDT0RFOiBzdHJpbmcgPSAnMic7XHJcbiAgc3RhdGljIENPTlRFTlRfVFlQRV9CSU5BUlk6IHN0cmluZyA9ICczJztcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiByZXR1cm5zIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGJsb2I8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYmxvYlwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5cclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXRDb250ZW50VHlwZShibG9iOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGJsb2IsIC8sfDsvKTtcclxuICAgICAgcmV0dXJuIHRva2Vuc1s0XS5jaGFyQXQoMCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcIiBpbiBCbG9iVHlwZS5nZXRDb250ZW50VHlwZSBibG9iIGlzIGluIGludmFsaWQgZm9ybWF0XCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBDcmVhdGVzIGFuIGVtcHR5IGJsb2IgcHJlZml4IHdpdGggYSBnaXZlbiBjZWxsIGF0dHJpYnV0ZTwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2ZWNDZWxsQXR0clwiPmluIGNhc2UgdGhpcyBibG9iIGlzIHZlY3RvciB0aGUgY2VsbHMgdHlwZSBlbHNlIDBcclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IGFuIGVtcHR5IGJsb2IgcHJlZml4IHdpdGhvdXQgdGhlICc7XCIgYXQgdGhlIGVuZFxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGdldEVtcHR5QmxvYlByZWZpeCh2ZWNDZWxsQXR0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcIjAsMCx7MH0sezF9LDBcIiwgJ1xcMCcsIHZlY0NlbGxBdHRyKTtcclxuICB9XHJcblxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGdldEJsb2JQcmVmaXhGb3JDb250ZW50VHlwZShjb250ZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBOU3RyaW5nLkZvcm1hdChcIjAsMCx7MH0sezB9LHsxfTtcIiwgJ1xcMCcsIGNvbnRlbnRUeXBlKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gcmV0dXJucyB0aGUgaGVhZGVyIG9ubHk8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3RyXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGdldFByZWZpeChzdHI6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgaWR4OiBudW1iZXIgPSBzdHIuaW5kZXhPZignOycpLyonOycqLztcclxuICAgIHJldHVybiBzdHIuc3Vic3RyKDAsIGlkeCArIDEpO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiQ29udGVudFR5cGVcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0RW5jb2RpbmdGcm9tQ29udGVudFR5cGUoQ29udGVudFR5cGU6IHN0cmluZyk6IEVuY29kaW5nIHtcclxuICAgIGxldCBlbmNvZGluZzogRW5jb2Rpbmc7XHJcblxyXG4gICAgaWYgKENvbnRlbnRUeXBlID09PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5JQ09ERSlcclxuICAgICAgZW5jb2RpbmcgPSBFbmNvZGluZy5Vbmljb2RlO1xyXG4gICAgZWxzZSBpZiAoQ29udGVudFR5cGUgPT09IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9BTlNJKVxyXG4gICAgICBlbmNvZGluZyA9IEd1aUVudmlyb25tZW50LkVudmlyb25tZW50LkdldEVuY29kaW5nKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIGVuY29kaW5nID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xO1xyXG5cclxuICAgIHJldHVybiBlbmNvZGluZztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbnNpIGJ5dGVzIHRvIHVuaWNvZGUgYnl0ZXMuXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJCeXRlc0luTWJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz48L3JldHVybnM+XHJcbiAgcHJpdmF0ZSBzdGF0aWMgTWJUb1VuaWNvZGUoQnl0ZXNJbk1iOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XHJcbiAgICBsZXQgcmVzdWx0OiBVaW50OEFycmF5ID0gbnVsbDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgVW5pY29kZVN0cmluZzogc3RyaW5nID0gR3VpRW52aXJvbm1lbnQuRW52aXJvbm1lbnQuR2V0RW5jb2RpbmcoKS5HZXRTdHJpbmcoQnl0ZXNJbk1iLCAwLCBCeXRlc0luTWIubGVuZ3RoKTtcclxuICAgICAgcmVzdWx0ID0gRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhVbmljb2RlU3RyaW5nKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgcmVzdWx0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHVuaWNvZGUgYnl0ZXMgdG8gYW5zaSBieXRlcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cIkJ5dGVzSW5Vbmljb2RlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHByaXZhdGUgc3RhdGljIFVuaWNvZGVUb01iKEJ5dGVzSW5Vbmljb2RlOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XHJcbiAgICBsZXQgcmVzdWx0OiBVaW50OEFycmF5ID0gbnVsbDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgVW5pY29kZVN0cmluZzogc3RyaW5nID0gRW5jb2RpbmcuVW5pY29kZS5HZXRTdHJpbmcoQnl0ZXNJblVuaWNvZGUsIDAsIEJ5dGVzSW5Vbmljb2RlLmxlbmd0aCk7XHJcblxyXG4gICAgICByZXN1bHQgPSBHdWlFbnZpcm9ubWVudC5FbnZpcm9ubWVudC5HZXRFbmNvZGluZygpLkdldEJ5dGVzKFVuaWNvZGVTdHJpbmcpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICByZXN1bHQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gQXNzdW1lcyB0aGUgZ2l2ZW4gYmxvYiBjb250YWlucyBhIHN0cmluZyBhbmQgcmV0dXJucyBpdC4gSWYgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgYmxvYiBpcyBub3QgVW5pY29kZVxyXG4gIC8vLyB0aGVuIGFzc3VtZSBpdCBpcyBBTlNJLlxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYmxvYlwiPmEgdmFsaWQgcmVwcmVzZW50YXRpb24gb2YgYSBibG9iXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgc3RyaW5nIGNvbnRhaW5lZCBieSB0aGUgYmxvYlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGdldFN0cmluZyhibG9iOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBieXRlczogVWludDhBcnJheSA9IG51bGw7XHJcblxyXG4gICAgaWYgKEJsb2JUeXBlLmlzVmFsaWRCbG9iKGJsb2IpKSB7XHJcbiAgICAgIGxldCBjb250ZW50VHlwZTogc3RyaW5nID0gQmxvYlR5cGUuZ2V0Q29udGVudFR5cGUoYmxvYik7XHJcbiAgICAgIGlmIChjb250ZW50VHlwZSAhPT0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOSUNPREUpXHJcbiAgICAgICAgY29udGVudFR5cGUgPSBCbG9iVHlwZS5DT05URU5UX1RZUEVfQU5TSTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYnl0ZXMgPSBCbG9iVHlwZS5nZXRCeXRlcyhibG9iKTtcclxuXHJcbiAgICAgICAgbGV0IGVuY29kaW5nOiBFbmNvZGluZyA9IEJsb2JUeXBlLmdldEVuY29kaW5nRnJvbUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTtcclxuICAgICAgICByZXN1bHQgPSBlbmNvZGluZy5HZXRTdHJpbmcoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyID0gcmVzdWx0LmluZGV4T2YoJ1xcMCcpLyonXHUwMDAwJyovO1xyXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpXHJcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyKDAsIGluZGV4KTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICBEZWJ1Zy5Bc3NlcnQoZmFsc2UpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENyZWF0ZSBhIGJsb2Igb2YgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgZnJvbSB0aGUgZGlzcGxheSBzdHJpbmdcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJsb2JTdHJcIj48L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImNvbnRlbnRUeXBlXCI+PC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBjcmVhdGVGcm9tU3RyaW5nKGJsb2JTdHI6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgYmxvYjogc3RyaW5nID0gbnVsbDtcclxuICAgIGxldCBzcmNDb250ZW50VHlwZTogc3RyaW5nID0gY29udGVudFR5cGU7XHJcbiAgICBsZXQgYnl0ZXM6IFVpbnQ4QXJyYXkgPSBudWxsO1xyXG5cclxuICAgIGlmIChjb250ZW50VHlwZSAhPT0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOSUNPREUpXHJcbiAgICAgIHNyY0NvbnRlbnRUeXBlID0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX0FOU0k7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYoYmxvYlN0ci5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpIHtcclxuICAgICAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KDxBcnJheUJ1ZmZlcj48YW55PmJsb2JTdHIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBlbmNvZGluZzogRW5jb2RpbmcgPSBCbG9iVHlwZS5nZXRFbmNvZGluZ0Zyb21Db250ZW50VHlwZShzcmNDb250ZW50VHlwZSk7XHJcblxyXG4gICAgICAgIGJ5dGVzID0gZW5jb2RpbmcuR2V0Qnl0ZXMoYmxvYlN0cik7XHJcbiAgICAgIH1cclxuICAgICAgYmxvYiA9IEJsb2JUeXBlLmNyZWF0ZUZyb21CeXRlcyhieXRlcywgY29udGVudFR5cGUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICBibG9iID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYmxvYjtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gR2V0IGJsb2IgY29udGVudHMgYXMgYnl0ZSBhcnJheVxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYmxvYlwiPmNvbnRlbnRzIGluY2x1ZGluZyBibG9iIHByZWZpeFxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gYnl0ZSBhcnJheSBhY2NvcmRpbmcgdG8gY29udGVudCB0eXBlIGluIGJsb2IgcHJlZml4XHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0Qnl0ZXMoc3RyOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcclxuICAgIGxldCBieXRlczogVWludDhBcnJheSA9IG51bGw7XHJcbiAgICBsZXQgZGF0YTogc3RyaW5nID0gQmxvYlR5cGUucmVtb3ZlQmxvYlByZWZpeChzdHIpO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBlbmNvZGluZzogRW5jb2RpbmcgPSBJU09fODg1OV8xX0VuY29kaW5nLklTT184ODU5XzE7XHJcbiAgICAgIGJ5dGVzID0gZW5jb2RpbmcuR2V0Qnl0ZXMoZGF0YSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgIGJ5dGVzID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYnl0ZXM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENyZWF0ZSBhIGJsb2Igb2YgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgZnJvbSB0aGUgYnl0ZSBhcnJheVxyXG4gIC8vL1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiQnl0ZXNcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50VHlwZVwiPlxyXG4gIC8vLyA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gc3RyaW5nXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgY3JlYXRlRnJvbUJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5LCBjb250ZW50VHlwZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBibG9iU3RyID0gJyc7XHJcbiAgICBsZXQgYmxvYlByZWZpeDogc3RyaW5nO1xyXG4gICAgbGV0IGJsb2JEYXRhOiBzdHJpbmc7XHJcblxyXG4gICAgYmxvYlByZWZpeCA9IEJsb2JUeXBlLmdldEJsb2JQcmVmaXhGb3JDb250ZW50VHlwZShjb250ZW50VHlwZSk7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGVuY29kaW5nOiBJU09fODg1OV8xX0VuY29kaW5nID0gSVNPXzg4NTlfMV9FbmNvZGluZy5JU09fODg1OV8xO1xyXG4gICAgICBibG9iRGF0YSA9IGVuY29kaW5nLkdldFN0cmluZyhieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgYmxvYkRhdGEgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGJsb2JTdHIgPSBibG9iUHJlZml4ICsgYmxvYkRhdGE7XHJcblxyXG4gICAgcmV0dXJuIGJsb2JTdHI7XHJcbiAgfVxyXG5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZXN0XCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic3JjXCI+XHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlxyXG4gIC8vLyA8L3JldHVybnM+XHJcbiAgc3RhdGljIGNvcHlCbG9iKGRlc3Q6IHN0cmluZywgc3JjOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHNyY0J5dGVzOiBVaW50OEFycmF5O1xyXG4gICAgbGV0IGRlc3RCeXRlczogVWludDhBcnJheTtcclxuXHJcbiAgICBpZiAoc3JjID09PSBudWxsKVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIGVsc2UgaWYgKGRlc3QgPT09IG51bGwpXHJcbiAgICAgIHJldHVybiBzcmM7XHJcblxyXG4gICAgc3JjQnl0ZXMgPSBCbG9iVHlwZS5nZXRCeXRlcyhzcmMpO1xyXG5cclxuICAgIGxldCBkZXN0Q29udGVudFR5cGU6IHN0cmluZyA9IEJsb2JUeXBlLmdldENvbnRlbnRUeXBlKGRlc3QpO1xyXG4gICAgbGV0IHNyY0NvbnRlbnRUeXBlOiBzdHJpbmcgPSBCbG9iVHlwZS5nZXRDb250ZW50VHlwZShzcmMpO1xyXG5cclxuICAgIGlmIChzcmNDb250ZW50VHlwZSA9PT0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX0FOU0kgJiYgZGVzdENvbnRlbnRUeXBlID09PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5JQ09ERSlcclxuICAgICAgZGVzdEJ5dGVzID0gQmxvYlR5cGUuTWJUb1VuaWNvZGUoc3JjQnl0ZXMpO1xyXG4gICAgZWxzZSBpZiAoc3JjQ29udGVudFR5cGUgPT09IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTklDT0RFICYmIGRlc3RDb250ZW50VHlwZSA9PT0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX0FOU0kpXHJcbiAgICAgIGRlc3RCeXRlcyA9IEJsb2JUeXBlLlVuaWNvZGVUb01iKHNyY0J5dGVzKTtcclxuICAgIGVsc2VcclxuICAgICAgZGVzdEJ5dGVzID0gc3JjQnl0ZXM7XHJcblxyXG4gICAgZGVzdCA9IEJsb2JUeXBlLmNyZWF0ZUZyb21CeXRlcyhkZXN0Qnl0ZXMsIGRlc3RDb250ZW50VHlwZSk7XHJcblxyXG4gICAgcmV0dXJuIGRlc3Q7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IHJlbW92ZXMgYmxvYiBwcmVmaXggZnJvbSBzb3VyY2U8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291cmNlXCI+LSBibG9iIHZhbHVlXHJcbiAgLy8vXHJcbiAgLy8vXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgc3RhdGljIHJlbW92ZUJsb2JQcmVmaXgoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGlkeDogbnVtYmVyO1xyXG4gICAgaWYgKHNvdXJjZSAhPT0gbnVsbCkge1xyXG4gICAgICBpZHggPSBzb3VyY2UuaW5kZXhPZignOycpO1xyXG4gICAgICBpZiAoaWR4IDwgMClcclxuICAgICAgICAgIExvZ2dlci5JbnN0YW5jZS5Xcml0ZVRvTG9nKFwiRXJyb3I6IGludmFsaWQgYmxvYiBwcmVmaXhcIiwgdHJ1ZSk7XHJcbiAgICAgIHJldHVybiBzb3VyY2Uuc3Vic3RyKGlkeCArIDEpO1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gY2hlY2tzIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBibG9iPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJsb2JcIj5cclxuICAvLy8gPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+IHRydWUgaWYgdGhlIGJsb2IgaXMgdmFsaWRcclxuICAvLy8gPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBpc1ZhbGlkQmxvYihibG9iOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1ZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoYmxvYiA9PT0gbnVsbCB8fCBibG9iLmluZGV4T2YoJzsnKSA8IDApXHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoaXNWYWxpZCkge1xyXG4gICAgICBsZXQgY29udGVudFR5cGU6IHN0cmluZyA9IEJsb2JUeXBlLmdldENvbnRlbnRUeXBlKGJsb2IpO1xyXG4gICAgICBpZiAoY29udGVudFR5cGUgIT09IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9BTlNJICYmIGNvbnRlbnRUeXBlICE9PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfQklOQVJZICYmIGNvbnRlbnRUeXBlICE9PSBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5JQ09ERSAmJiBjb250ZW50VHlwZSAhPT0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX1VOS05PV04pXHJcbiAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzVmFsaWQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2V0Q29udGVudFR5cGUoc3RyOiBzdHJpbmcsIGNvbnRlbnRUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgcHJlZml4TGFzdEluZGV4OiBudW1iZXIgPSBzdHIuaW5kZXhPZihcIjtcIik7XHJcbiAgICAgIGxldCBwcmVmaXg6IHN0cmluZyA9IHN0ci5zdWJzdHIoMCwgcHJlZml4TGFzdEluZGV4KTtcclxuXHJcbiAgICAgIGxldCBkYXRhTGVuZ3RoOiBudW1iZXIgPSBzdHIubGVuZ3RoIC0gKHByZWZpeC5sZW5ndGggKyAxKTtcclxuICAgICAgbGV0IGRhdGE6IHN0cmluZyA9IHN0ci5zdWJzdHIocHJlZml4TGFzdEluZGV4ICsgMSwgZGF0YUxlbmd0aCk7XHJcblxyXG4gICAgICBsZXQgcHJlZml4VG9rZW5zOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUocHJlZml4LCAvLHw7Lyk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgR3VpQ29uc3RhbnRzLkJMT0JfUFJFRklYX0VMRU1FTlRTX0NPVU5UOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAoaSA9PT0gNClcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGNvbnRlbnRUeXBlICsgXCIsXCI7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcHJlZml4VG9rZW5zW2ldICsgXCIsXCI7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdC5zdWJzdHIoMCwgcmVzdWx0Lmxlbmd0aCAtIDEpICsgXCI7XCIgKyBkYXRhO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCIgaW4gQmxvYlR5cGUuc2V0Q29udGVudFR5cGUgOiBpbnZhbGlkIGZvcm1hdFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gUmVwbGFjZSB0aGUgdmVjdG9yJ3MgY2VsbCBhdHRyaWJ1dGUgaW4gdGhlIGJsb2IgcHJlZml4IGJ5IHRoZSBzcGVjaWZpZWQgb25lPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0clwiPmEgdmFsaWQgYmxvYiBzdHJpbmcgKGkuZS4gcHJlZml4O2RhdGEpIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwidmVjQ2VsbEF0dHJcIj5hdHRyaWJ1dGUgdG8gaW5zZXJ0IGludG8gdGhlIHByZWZpeCA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gbW9kaWZpZWQgYmxvYiBzdHJpbmcgPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBTZXRWZWNDZWxsQXR0cihzdHI6IHN0cmluZywgdmVjQ2VsbEF0dHI6IFN0b3JhZ2VBdHRyaWJ1dGUpOiBzdHJpbmcge1xyXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nID0gXCJcIjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBwcmVmaXhMYXN0SW5kZXg6IG51bWJlciA9IHN0ci5pbmRleE9mKFwiO1wiKTtcclxuICAgICAgbGV0IHByZWZpeDogc3RyaW5nID0gc3RyLnN1YnN0cigwLCBwcmVmaXhMYXN0SW5kZXgpO1xyXG5cclxuICAgICAgbGV0IGRhdGE6IHN0cmluZyA9IHN0ci5zdWJzdHIocHJlZml4TGFzdEluZGV4ICsgMSk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUocHJlZml4LCAvLHw7Lyk7XHJcblxyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgR3VpQ29uc3RhbnRzLkJMT0JfUFJFRklYX0VMRU1FTlRTX0NPVU5UOyBpID0gaSArIDEpIHtcclxuICAgICAgICBpZiAoaSA9PT0gMylcclxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDxzdHJpbmc+dmVjQ2VsbEF0dHIgKyBcIixcIjtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyB0b2tlbnNbaV0gKyBcIixcIjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cigwLCByZXN1bHQubGVuZ3RoIC0gMSkgKyBcIjtcIiArIGRhdGE7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoRXhjZXB0aW9uKSB7XHJcbiAgICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcIiBpbiBYTUxwYXJzZXIuYmxvYlByZWZpeExlbmd0aCBpbnZhbGlkIGZvcm1hdFwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gUmV0dXJucyB0aGUgVmVjdG9yJyBjZWxsIGF0dHJpYnV0ZSBmcm9tIHRoZSBwcmVmaXguIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJibG9iU3RyXCI+QSB2YWxpZCBibG9iIHN0cmluZyAgKGkuZS4gcHJlZml4O2RhdGEpIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgR2V0VmVjQ2VsbEF0dHIoYmxvYlN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShibG9iU3RyLCAvLHw7Lyk7XHJcblxyXG4gICAgICByZXR1cm4gdG9rZW5zWzNdLmNoYXJBdCgwKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgICAgdGhyb3cgbmV3IEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiIGluIEJsb2JUeXBlLkdldFZlY0NlbGxBdHRyKCk6IGJsb2IgaXMgaW4gaW52YWxpZCBmb3JtYXRcIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBibG9iIHByZWZpeC4gVGhlIHByZWZpeCBpcyBpbiB0aGUgZm9ybWF0OlxyXG4gIC8vLyA8dHQ+XCJPYmpIYW5kbGUsVmFyaWFudElkeCxDb250ZW50VHlwZSxWZWNDZWxsQXR0cjtcIjwvdHQ+LiBUaGUgbGVuZ3RoIGluY2x1ZGVzIHRoZSBjb21tYXMgYW5kIHRoZVxyXG4gIC8vLyBzZW1pY29sb24uXHJcbiAgLy8vXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJibG9iXCI+YSB2YWxpZCBibG9iXHJcbiAgLy8vIDwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiB0aGUgYmxvYiBwcmVmaXggbGVuZ3RoXHJcbiAgLy8vIDwvcmV0dXJucz5cclxuICBzdGF0aWMgYmxvYlByZWZpeExlbmd0aChibG9iOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IHByZWZpeExlbmd0aDogbnVtYmVyID0gYmxvYi5pbmRleE9mKCc7JykgKyAxO1xyXG4gICAgICBsZXQgcHJlZml4OiBzdHJpbmcgPSBibG9iLnN1YnN0cigwLCBwcmVmaXhMZW5ndGgpO1xyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIHByZWZpeCBpcyB2YWxpZFxyXG4gICAgICBpZiAocHJlZml4TGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gU3RyVXRpbC50b2tlbml6ZShwcmVmaXgsIFwiLFwiKTtcclxuICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gR3VpQ29uc3RhbnRzLkJMT0JfUFJFRklYX0VMRU1FTlRTX0NPVU5UKVxyXG4gICAgICAgICAgcmV0dXJuIHByZWZpeExlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICAvLyBpbnZhbGlkIHByZWZpeFxyXG4gICAgfVxyXG5cclxuICAgIHRocm93IG5ldyBBcHBsaWNhdGlvbkV4Y2VwdGlvbihcIiBpbiBYTUxwYXJzZXIuYmxvYlByZWZpeExlbmd0aCBpbnZhbGlkIGZvcm1hdFwiKTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gZ2V0cyB0aGUga2V5IGZyb20gYSBibG9iIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYmxvYlN0clwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0S2V5KGJsb2JTdHI6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IFN0clV0aWwudG9rZW5pemUoYmxvYlN0ciwgLyx8Oy8pO1xyXG4gICAgbGV0IGtleTogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDUpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBrZXkgPSBOTnVtYmVyLlBhcnNlKHRva2Vuc1swXSk7XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikge1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGtleTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT4gY2FsY3VsYXRlcyB0aGUgYmxvYiBzaXplIGhlbGQgaW4gdGhlIHN0cmluZ1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwiYmxvYlwiPiBUaGUgc3RyaW5nIGhvbGRpbmcgdGhlIGJsb2IgPC9wYXJhbT5cclxuICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBnZXRCbG9iU2l6ZShibG9iOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgbGV0IHNpemU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IHRva2Vuczogc3RyaW5nW10gPSBTdHJVdGlsLnRva2VuaXplKGJsb2IsIC8sfDsvKTtcclxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiA1KSB7XHJcbiAgICAgICAgc2l6ZSA9IGJsb2IubGVuZ3RoO1xyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCA1OyBpID0gaSArIDEpIHtcclxuICAgICAgICAgIHNpemUgPSBzaXplIC0gdG9rZW5zW2ldLmxlbmd0aDtcclxuICAgICAgICAgIHNpemUgPSBzaXplIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChFeGNlcHRpb24pIHtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2l6ZTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUGFyc2UgY29udGVudCB0eXBlXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJjb250ZW50VHlwZVwiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgUGFyc2VDb250ZW50VHlwZShjb250ZW50VHlwZTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGxldCBuZXdDb250ZW50VHlwZTogc3RyaW5nID0gJyAnO1xyXG4gICAgc3dpdGNoIChjb250ZW50VHlwZSkge1xyXG4gICAgICBjYXNlIDA6XHJcbiAgICAgICAgbmV3Q29udGVudFR5cGUgPSBCbG9iVHlwZS5DT05URU5UX1RZUEVfVU5LTk9XTjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIG5ld0NvbnRlbnRUeXBlID0gQmxvYlR5cGUuQ09OVEVOVF9UWVBFX0FOU0k7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICBuZXdDb250ZW50VHlwZSA9IEJsb2JUeXBlLkNPTlRFTlRfVFlQRV9VTklDT0RFO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDM6XHJcbiAgICAgICAgbmV3Q29udGVudFR5cGUgPSBCbG9iVHlwZS5DT05URU5UX1RZUEVfQklOQVJZO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ld0NvbnRlbnRUeXBlO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,214 +0,0 @@
1
- import { GuiConstants } from "../../GuiConstants";
2
- import { StorageAttribute, StrUtil } from "@magic-xpa/utils";
3
- import { NUM_TYPE } from "./NUM_TYPE";
4
- import { ApplicationException, NString } from "@magic-xpa/mscorelib";
5
- import { VectorType } from "./VectorType";
6
- export const EMPTY_DCREF = -2;
7
- export const NOT_FOUND = GuiConstants.DEFAULT_VALUE_INT;
8
- export class DcValues {
9
- _id = 0;
10
- _type = StorageAttribute.NONE;
11
- _refCount = 0;
12
- _nullFlags = null;
13
- _isNumericType = false;
14
- _numVals = null;
15
- _linkVals = null;
16
- _dispVals = null;
17
- get HasReferences() {
18
- return this._refCount > 0;
19
- }
20
- constructor(empty) {
21
- if (empty) {
22
- this._id = EMPTY_DCREF;
23
- }
24
- this._isNumericType = false;
25
- }
26
- GetAttr() {
27
- return this._type;
28
- }
29
- setType(type) {
30
- this._type = type;
31
- if (this._type === StorageAttribute.MEMO)
32
- this._type = StorageAttribute.ALPHA;
33
- if (this._type === StorageAttribute.NUMERIC || this._type === StorageAttribute.DATE ||
34
- this._type === StorageAttribute.TIME) {
35
- this._isNumericType = true;
36
- }
37
- }
38
- SetID(newId) {
39
- this._id = newId;
40
- }
41
- SetDisplayValues(displayValues) {
42
- if (displayValues !== null)
43
- this._dispVals = displayValues.slice();
44
- else
45
- this._dispVals = null;
46
- }
47
- SetLinkValues(linkValues) {
48
- if (linkValues !== null)
49
- this._linkVals = linkValues.slice();
50
- else
51
- this._linkVals = null;
52
- this.setNumericVals();
53
- }
54
- setNullFlags(nullFlags) {
55
- if (nullFlags !== null)
56
- this._nullFlags = nullFlags.slice();
57
- else
58
- this._nullFlags = null;
59
- }
60
- setNumericVals() {
61
- if (this._isNumericType && this._linkVals !== null) {
62
- this._numVals = new Array(this._linkVals.length);
63
- for (let i = 0; i < this._linkVals.length; i = i + 1) {
64
- this._numVals[i] = new NUM_TYPE(this._linkVals[i]);
65
- }
66
- }
67
- else {
68
- this._numVals = null;
69
- }
70
- }
71
- getId() {
72
- return this._id;
73
- }
74
- getDispVals() {
75
- return this._dispVals;
76
- }
77
- GetLinkVals() {
78
- return this._linkVals;
79
- }
80
- getIndexOf(mgVal, isVectorValue, isNull, extraVals, extraNums, splitCommaSeperatedVals) {
81
- let result = NOT_FOUND;
82
- let tmpMgVal;
83
- let ctrlNumVal;
84
- let trimmedVal;
85
- let vals = null;
86
- let nums = null;
87
- let offset = 0;
88
- let firstFitMatchIdx;
89
- let firstFitMatchLength = -1;
90
- let minLength = -1;
91
- let compStr = "";
92
- let indice = null;
93
- let values = null;
94
- if (isNull) {
95
- let i = 0;
96
- indice = [
97
- NOT_FOUND
98
- ];
99
- for (i = 0; this._nullFlags !== null && i < this._nullFlags.length; i++) {
100
- if (this._nullFlags[i]) {
101
- indice[0] = i;
102
- break;
103
- }
104
- }
105
- return indice;
106
- }
107
- if (!isVectorValue) {
108
- if (splitCommaSeperatedVals) {
109
- values = mgVal.split(',');
110
- }
111
- else {
112
- values = [
113
- mgVal
114
- ];
115
- }
116
- }
117
- else {
118
- let vectorType = new VectorType(mgVal);
119
- values = vectorType.GetCellValues();
120
- }
121
- indice = new Array(values.length);
122
- for (let iCtr = 0; iCtr < values.length; iCtr = iCtr + 1) {
123
- result = NOT_FOUND;
124
- firstFitMatchIdx = NOT_FOUND;
125
- tmpMgVal = values[iCtr];
126
- if (this._isNumericType || extraNums !== null) {
127
- ctrlNumVal = new NUM_TYPE(tmpMgVal);
128
- trimmedVal = tmpMgVal;
129
- }
130
- else {
131
- ctrlNumVal = null;
132
- trimmedVal = StrUtil.rtrim(tmpMgVal);
133
- }
134
- for (let i = 0; i < 2 && result === NOT_FOUND; i++) {
135
- switch (i) {
136
- case 0:
137
- vals = extraVals;
138
- nums = extraNums;
139
- offset = 0;
140
- break;
141
- case 1:
142
- default:
143
- if (this._isNumericType || nums != null)
144
- offset = (nums == null ? 0 : nums.length);
145
- else
146
- offset = (vals == null ? 0 : vals.length);
147
- vals = this._linkVals;
148
- nums = this._numVals;
149
- break;
150
- }
151
- if (vals != null) {
152
- for (let j = 0; j < vals.length && result === NOT_FOUND; j++) {
153
- if (this._isNumericType || nums != null) {
154
- if (NUM_TYPE.num_cmp(ctrlNumVal, nums[j]) === 0 || tmpMgVal === vals[j] ||
155
- tmpMgVal === vals[j]) {
156
- result = j + offset;
157
- break;
158
- }
159
- }
160
- else {
161
- if (vals[j] === tmpMgVal || trimmedVal.length > 0 && StrUtil.rtrim(vals[j]) === trimmedVal) {
162
- result = j + offset;
163
- break;
164
- }
165
- if (trimmedVal.length === 0 && StrUtil.rtrim(vals[j]).length === 0) {
166
- result = j + offset;
167
- break;
168
- }
169
- if (result === NOT_FOUND && trimmedVal.length > 0) {
170
- minLength = Math.min(trimmedVal.length, vals[j].length);
171
- compStr = trimmedVal.substr(0, minLength);
172
- if (compStr.length > 0 && vals[j].startsWith(compStr)) {
173
- if (minLength > firstFitMatchLength) {
174
- firstFitMatchIdx = j + offset;
175
- firstFitMatchLength = minLength;
176
- }
177
- }
178
- }
179
- }
180
- }
181
- }
182
- }
183
- if (result === NOT_FOUND)
184
- result = firstFitMatchIdx;
185
- indice[iCtr] = result;
186
- }
187
- return indice;
188
- }
189
- getLinkValue(idx) {
190
- let lnkVal = null;
191
- if (this._linkVals !== null) {
192
- lnkVal = this._linkVals[idx];
193
- }
194
- return lnkVal;
195
- }
196
- isNull(idx) {
197
- if (this._nullFlags == null)
198
- return false;
199
- return this._nullFlags[idx];
200
- }
201
- AddReference() {
202
- this._refCount++;
203
- }
204
- RemoveReference() {
205
- this._refCount--;
206
- if (this._refCount < 0) {
207
- throw new ApplicationException("in dcVals.decrease() references count is less than zero");
208
- }
209
- }
210
- ToString() {
211
- return NString.Format("{{DCValues 0x{0:X8}, {1} refs}}", this._id, this._refCount);
212
- }
213
- }
214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGNWYWx1ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ndWkvc3JjL21hbmFnZW1lbnQvZGF0YS9EY1ZhbHVlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLG9CQUFvQixFQUFFLE9BQU8sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ25FLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHeEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFXLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBVyxZQUFZLENBQUMsaUJBQWlCLENBQUM7QUFHaEUsTUFBTSxPQUFPLFFBQVE7SUFHWCxHQUFHLEdBQVcsQ0FBQyxDQUFDO0lBQ2hCLEtBQUssR0FBcUIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO0lBQ2hELFNBQVMsR0FBVyxDQUFDLENBQUM7SUFDdEIsVUFBVSxHQUFjLElBQUksQ0FBQztJQUM3QixjQUFjLEdBQVksS0FBSyxDQUFDO0lBQ2hDLFFBQVEsR0FBZSxJQUFJLENBQUM7SUFDNUIsU0FBUyxHQUFhLElBQUksQ0FBQztJQUMzQixTQUFTLEdBQWEsSUFBSSxDQUFDO0lBRW5DLElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQU9ELFlBQVksS0FBYztRQUN4QixJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFL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UyxHQUFHLENBQUMsRUFBRTtZQUN0QixNQUFNLElBQUksb0JBQW9CLENBQUMseURBQXlELENBQUMsQ0FBQztTQUMzRjtJQUNILENBQUM7SUFLRCxRQUFRO1FBQ04sT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLGlDQUFpQyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SVJlZmVyZW5jZWRPYmplY3R9IGZyb20gXCIuL0lSZWZlcmVuY2VkT2JqZWN0XCI7XHJcbmltcG9ydCB7R3VpQ29uc3RhbnRzfSBmcm9tIFwiLi4vLi4vR3VpQ29uc3RhbnRzXCI7XHJcbmltcG9ydCB7U3RvcmFnZUF0dHJpYnV0ZSwgU3RyVXRpbH0gZnJvbSBcIkBtYWdpYy14cGEvdXRpbHNcIjtcclxuaW1wb3J0IHtOVU1fVFlQRX0gZnJvbSBcIi4vTlVNX1RZUEVcIjtcclxuaW1wb3J0IHtBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgTlN0cmluZ30gZnJvbSBcIkBtYWdpYy14cGEvbXNjb3JlbGliXCI7XHJcbmltcG9ydCB7VmVjdG9yVHlwZX0gZnJvbSBcIi4vVmVjdG9yVHlwZVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBFTVBUWV9EQ1JFRjogbnVtYmVyID0gLTI7XHJcbmV4cG9ydCBjb25zdCBOT1RfRk9VTkQ6IG51bWJlciA9IEd1aUNvbnN0YW50cy5ERUZBVUxUX1ZBTFVFX0lOVDtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgRGNWYWx1ZXMgaW1wbGVtZW50cyBJUmVmZXJlbmNlZE9iamVjdCB7XHJcblxyXG5cclxuICBwcml2YXRlIF9pZDogbnVtYmVyID0gMDtcclxuICBwcml2YXRlIF90eXBlOiBTdG9yYWdlQXR0cmlidXRlID0gU3RvcmFnZUF0dHJpYnV0ZS5OT05FOyAvLyBBbHBoYSB8IE51bWVyaWMgfCBEYXRlIHwgVGltZSB8IExvZ2ljYWxcclxuICBwcml2YXRlIF9yZWZDb3VudDogbnVtYmVyID0gMDsgLy8gcmVmZXJlbmNlcyBjb3VudGVyXHJcbiAgcHJpdmF0ZSBfbnVsbEZsYWdzOiBib29sZWFuW10gPSBudWxsOyAvLyBsaW5rZWQgbnVsbCB2YWx1ZSBmbGFnc1xyXG4gIHByaXZhdGUgX2lzTnVtZXJpY1R5cGU6IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBvbmUgb2Y6IG51bWVyaWMsIGRhdGUsIHRpbWVcclxuICBwcml2YXRlIF9udW1WYWxzOiBOVU1fVFlQRVtdID0gbnVsbDsgLy8gbnVtZXJpYyBsaW5rZWQgdmFsdWVzXHJcbiAgcHJpdmF0ZSBfbGlua1ZhbHM6IHN0cmluZ1tdID0gbnVsbDsgLy8gbGlua2VkIHZhbHVlc1xyXG4gIHByaXZhdGUgX2Rpc3BWYWxzOiBzdHJpbmdbXSA9IG51bGw7IC8vIGRpc3BsYXkgdmFsdWVzXHJcblxyXG4gIGdldCBIYXNSZWZlcmVuY2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlZkNvdW50ID4gMDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy9cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImVtcHR5XCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJpc1ZlY3RvclwiPjwvcGFyYW0+XHJcbiAgY29uc3RydWN0b3IoZW1wdHk6IGJvb2xlYW4pIHtcclxuICAgIGlmIChlbXB0eSkge1xyXG4gICAgICB0aGlzLl9pZCA9IEVNUFRZX0RDUkVGO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNOdW1lcmljVHlwZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBSZXR1cm5zIHRoZSBhdHRyIG9mIERjVmFsdWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBHZXRBdHRyKCk6IFN0b3JhZ2VBdHRyaWJ1dGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XHJcbiAgfVxyXG5cclxuICBzZXRUeXBlKHR5cGU6IFN0b3JhZ2VBdHRyaWJ1dGUpOiB2b2lkIHtcclxuICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xyXG4gICAgaWYgKHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuTUVNTylcclxuICAgICAgdGhpcy5fdHlwZSA9IFN0b3JhZ2VBdHRyaWJ1dGUuQUxQSEE7XHJcbiAgICBpZiAodGhpcy5fdHlwZSA9PT0gU3RvcmFnZUF0dHJpYnV0ZS5OVU1FUklDIHx8IHRoaXMuX3R5cGUgPT09IFN0b3JhZ2VBdHRyaWJ1dGUuREFURSB8fFxyXG4gICAgICB0aGlzLl90eXBlID09PSBTdG9yYWdlQXR0cmlidXRlLlRJTUUpIHtcclxuICAgICAgdGhpcy5faXNOdW1lcmljVHlwZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBTZXRJRChuZXdJZDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pZCA9IG5ld0lkO1xyXG4gIH1cclxuXHJcbiAgU2V0RGlzcGxheVZhbHVlcyhkaXNwbGF5VmFsdWVzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgaWYgKGRpc3BsYXlWYWx1ZXMgIT09IG51bGwpXHJcbiAgICAgIHRoaXMuX2Rpc3BWYWxzID0gZGlzcGxheVZhbHVlcy5zbGljZSgpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLl9kaXNwVmFscyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBTZXRMaW5rVmFsdWVzKGxpbmtWYWx1ZXM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBpZiAobGlua1ZhbHVlcyAhPT0gbnVsbClcclxuICAgICAgdGhpcy5fbGlua1ZhbHMgPSBsaW5rVmFsdWVzLnNsaWNlKCk7XHJcbiAgICBlbHNlXHJcbiAgICAgIHRoaXMuX2xpbmtWYWxzID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLnNldE51bWVyaWNWYWxzKCk7XHJcbiAgfVxyXG5cclxuICBzZXROdWxsRmxhZ3MobnVsbEZsYWdzOiBib29sZWFuW10pOiB2b2lkIHtcclxuICAgIGlmIChudWxsRmxhZ3MgIT09IG51bGwpXHJcbiAgICAgIHRoaXMuX251bGxGbGFncyA9IG51bGxGbGFncy5zbGljZSgpO1xyXG5cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fbnVsbEZsYWdzID0gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0TnVtZXJpY1ZhbHMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNOdW1lcmljVHlwZSAmJiB0aGlzLl9saW5rVmFscyAhPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9udW1WYWxzID0gbmV3IEFycmF5PE5VTV9UWVBFPih0aGlzLl9saW5rVmFscy5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5fbGlua1ZhbHMubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICB0aGlzLl9udW1WYWxzW2ldID0gbmV3IE5VTV9UWVBFKHRoaXMuX2xpbmtWYWxzW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX251bVZhbHMgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdGhlIGlkIG9mIHRoaXMgZGNWYWxzIG9iamVjdFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgZ2V0SWQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm4gdGhlIGRpc3BsYXkgdmFsdWVzXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBnZXREaXNwVmFscygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzcFZhbHM7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIHJldHVybiBMaW5rIGZpZWxkIHZhbHVlcy5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIEdldExpbmtWYWxzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLl9saW5rVmFscztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICByZXR1cm5zIHRoZSBhcnJheSBvZiBpbmRpY2UgZm9yIGFuIGl0ZW0gaW4gdGhlIGxpc3QgYnkgY29tcGFyaW5nIHRoZSBtZ1ZhbCB0byB0aGUgbGlua2VkIHZhbHVlIG9yICgtMSkgaWYgbm9uZSB3YXNcclxuICAvLy8gICBmb3VuZFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJtZ1ZhbFwiPnRoZSBpbnRlcm5hbCB2YWx1ZSB0byBsb29rIGZvciA8L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZSA9IFwiaXNWZWN0b3JWYWx1ZVwiPkRlbm90ZXMgd2hldGhlciB0aGUgdmFsdWUgaW4gbWdWYWwgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSB2ZWN0b3IgKHRydWUpIG9yIG5vdCAoZmFsc2UpLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpc051bGxcIj50cnVlIGlmIHRoZSB2YWx1ZSB0byBsb29rIGZvciBpcyBudWxsIDwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJleHRyYVZhbHNcIj5BZGRpdGlvbmFsIHZhbHVlcywgcHJlcGVuZGVkIHRvIHRoZSBzZWFyY2hlZCB2YWx1ZXMuPC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJleHRyYU51bXNcIj5BZGRpdGlvbmFsIG51bWVyaWMgdmFsdWVzIHRvIGJlIHByZXBlbmRlZCB0byB0aGUgc2VhcmNoZWQgdmFsdWVzLjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJzcGxpdENvbW1hU2VwZXJhdGVkVmFsc1wiPnRvIHNwbGl0IHRoZSB2YWwgb24gY29tbWEgb3Igbm90IDwvcGFyYW0+XHJcbiAgZ2V0SW5kZXhPZihtZ1ZhbDogc3RyaW5nLCBpc1ZlY3RvclZhbHVlOiBib29sZWFuLCBpc051bGw6IGJvb2xlYW4sIGV4dHJhVmFsczogc3RyaW5nW10sIGV4dHJhTnVtczogTlVNX1RZUEVbXSwgc3BsaXRDb21tYVNlcGVyYXRlZFZhbHM6IGJvb2xlYW4pOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSBOT1RfRk9VTkQ7XHJcblxyXG4gICAgbGV0IHRtcE1nVmFsOiBzdHJpbmc7XHJcbiAgICBsZXQgY3RybE51bVZhbDogTlVNX1RZUEU7XHJcbiAgICBsZXQgdHJpbW1lZFZhbDogc3RyaW5nO1xyXG4gICAgbGV0IHZhbHM6IHN0cmluZ1tdID0gbnVsbDtcclxuICAgIGxldCBudW1zOiBOVU1fVFlQRVtdID0gbnVsbDtcclxuICAgIGxldCBvZmZzZXQ6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgZmlyc3RGaXRNYXRjaElkeDtcclxuICAgIGxldCBmaXJzdEZpdE1hdGNoTGVuZ3RoOiBudW1iZXIgPSAtMTtcclxuICAgIGxldCBtaW5MZW5ndGg6IG51bWJlciA9IC0xO1xyXG4gICAgbGV0IGNvbXBTdHI6IHN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgaW5kaWNlOiBudW1iZXJbXSA9IG51bGw7XHJcbiAgICBsZXQgdmFsdWVzOiBzdHJpbmdbXSA9IG51bGw7XHJcblxyXG4gICAgaWYgKGlzTnVsbCkge1xyXG4gICAgICBsZXQgaTogbnVtYmVyID0gMDtcclxuICAgICAgaW5kaWNlID0gW1xyXG4gICAgICAgIE5PVF9GT1VORFxyXG4gICAgICBdO1xyXG4gICAgICBmb3IgKGkgPSAwOyB0aGlzLl9udWxsRmxhZ3MgIT09IG51bGwgJiYgaSA8IHRoaXMuX251bGxGbGFncy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLl9udWxsRmxhZ3NbaV0pIHtcclxuICAgICAgICAgIGluZGljZVswXSA9IGk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBpbmRpY2U7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzVmVjdG9yVmFsdWUpIHtcclxuICAgICAgLy8gc3BsaXQgdGhlIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXM7XHJcbiAgICAgIGlmIChzcGxpdENvbW1hU2VwZXJhdGVkVmFscykge1xyXG4gICAgICAgIHZhbHVlcyA9IG1nVmFsLnNwbGl0KCcsJyk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdmFsdWVzID0gW1xyXG4gICAgICAgICAgbWdWYWxcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHZlY3RvclR5cGU6IFZlY3RvclR5cGUgPSBuZXcgVmVjdG9yVHlwZShtZ1ZhbCk7XHJcbiAgICAgIHZhbHVlcyA9IHZlY3RvclR5cGUuR2V0Q2VsbFZhbHVlcygpO1xyXG4gICAgfVxyXG4gICAgaW5kaWNlID0gbmV3IEFycmF5PG51bWJlcj4odmFsdWVzLmxlbmd0aCk7XHJcblxyXG4gICAgZm9yIChsZXQgaUN0cjogbnVtYmVyID0gMDsgaUN0ciA8IHZhbHVlcy5sZW5ndGg7IGlDdHIgPSBpQ3RyICsgMSkge1xyXG4gICAgICByZXN1bHQgPSBOT1RfRk9VTkQ7XHJcbiAgICAgIGZpcnN0Rml0TWF0Y2hJZHggPSBOT1RfRk9VTkQ7XHJcblxyXG4gICAgICB0bXBNZ1ZhbCA9IHZhbHVlc1tpQ3RyXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9pc051bWVyaWNUeXBlIHx8IGV4dHJhTnVtcyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgY3RybE51bVZhbCA9IG5ldyBOVU1fVFlQRSh0bXBNZ1ZhbCk7XHJcbiAgICAgICAgdHJpbW1lZFZhbCA9IHRtcE1nVmFsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGN0cmxOdW1WYWwgPSBudWxsO1xyXG4gICAgICAgIHRyaW1tZWRWYWwgPSBTdHJVdGlsLnJ0cmltKHRtcE1nVmFsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUnVuIHR3byBwYXNzZXMuIEZpcnN0IG9uZSBvbiBleHRyYSB2YWx1ZXMsIHNlY29uZCBvbmUgb24gdmFsdWVzIGJlbG9uZ2luZyB0byB0aGlzIG9iamVjdFxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIgJiYgcmVzdWx0ID09PSBOT1RfRk9VTkQ7IGkrKykge1xyXG4gICAgICAgIHN3aXRjaCAoaSkge1xyXG4gICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICB2YWxzID0gZXh0cmFWYWxzO1xyXG4gICAgICAgICAgICBudW1zID0gZXh0cmFOdW1zO1xyXG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNOdW1lcmljVHlwZSB8fCBudW1zICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgb2Zmc2V0ID0gKG51bXMgPT0gbnVsbCA/IDAgOiBudW1zLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICBvZmZzZXQgPSAodmFscyA9PSBudWxsID8gMCA6IHZhbHMubGVuZ3RoKTtcclxuICAgICAgICAgICAgdmFscyA9IHRoaXMuX2xpbmtWYWxzO1xyXG4gICAgICAgICAgICBudW1zID0gdGhpcy5fbnVtVmFscztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFscyAhPSBudWxsKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHMubGVuZ3RoICYmIHJlc3VsdCA9PT0gTk9UX0ZPVU5EOyBqKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzTnVtZXJpY1R5cGUgfHwgbnVtcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgaWYgKE5VTV9UWVBFLm51bV9jbXAoY3RybE51bVZhbCwgbnVtc1tqXSkgPT09IDAgfHwgdG1wTWdWYWwgPT09IHZhbHNbal0gfHxcclxuICAgICAgICAgICAgICAgIHRtcE1nVmFsID09PSB2YWxzW2pdKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgbnVtZXJpYyB0eXBlIGlzIGZvdW5kIGV4YWN0bHlcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGogKyBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbHNbal0gPT09IHRtcE1nVmFsIHx8IHRyaW1tZWRWYWwubGVuZ3RoID4gMCAmJiBTdHJVdGlsLnJ0cmltKHZhbHNbal0pID09PSB0cmltbWVkVmFsKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBqICsgb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBJZiBNYWdpYyBzZW50IHVzIGEgYmxhbmsgdmFsdWUsIGFuZCBzdWNoIGEgdmFsdWUgZXhpc3RzIGluIHRoZSBcIm5vbiBEQyByYW5nZVwiIHNlbGVjdCBpdC5cclxuICAgICAgICAgICAgICAvLyBRQ1IgIyA3NTEwMzcgLSBzZWFyY2ggZm9yIGJsYW5rIHZhbHVlcyBldmVuIGluIHRoZSBsaW5rZWQgdmFsdWVzIGFycmF5IG9mIHRoZSBkYXRhIGNvbnRyb2xcclxuICAgICAgICAgICAgICBpZiAodHJpbW1lZFZhbC5sZW5ndGggPT09IDAgJiYgU3RyVXRpbC5ydHJpbSh2YWxzW2pdKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGogKyBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vIHNhdmUgdGhlIGZpcnN0IGZpdHRpbmcgcmVzdWx0XHJcbiAgICAgICAgICAgICAgLy8gZml4ZWQgYnVnIzogOTM1MDE1LCB0aGUgY29tcGFyaXNvbiB3aWxsIGJlIGFjY29yZGluZyB0byB0aGUgbWluIGxlbmd0aCBvZiB0aGUgZGF0YSAmIHRoZSBvcHRpb25zXHJcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gTk9UX0ZPVU5EICYmIHRyaW1tZWRWYWwubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbWluTGVuZ3RoID0gTWF0aC5taW4odHJpbW1lZFZhbC5sZW5ndGgsIHZhbHNbal0ubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIGNvbXBTdHIgPSB0cmltbWVkVmFsLnN1YnN0cigwLCBtaW5MZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBTdHIubGVuZ3RoID4gMCAmJiB2YWxzW2pdLnN0YXJ0c1dpdGgoY29tcFN0cikpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBtaW4gbGVuZ3RoIG1hdGNoLCBjaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgZml0IG1hdGNoLlxyXG4gICAgICAgICAgICAgICAgICAvLyBlZzogaWYgbGlzdCBoYXMgYSxhYWEsYWFhYWEgYW5kIGZpZWxkIHZhbHVlIGlzICdhYScgdGhlbiBmaXJzdCBmaXQgbWF0Y2ggaXMgJ2FhYScuXHJcbiAgICAgICAgICAgICAgICAgIC8vIGlmIGxpc3QgaXMgYSxhYWFhYSxhYWEgYW5kIGZpZWxkIHZhbHVlIGlzICdhYScgdGhlbiBmaXJzdCBmaXQgbWF0Y2ggaXMgJ2FhYWFhJy5cclxuICAgICAgICAgICAgICAgICAgLy8gaWYgZmlyc3QgZml0IG5vdCBmb3VuZCwgdGhlbiBjbG9zZXN0IG1hdGNoIGlzIHVzZWQgKGVnLSBpZiBmaWVsZCB2YWx1ZSBpc1xyXG4gICAgICAgICAgICAgICAgICAvLyAnYWFhYWFhYWFhJyBpbiBib3RoIHRoZSBhYm92ZSBsaXN0LCBjbG9zZXN0IG1hdGNoIHdvdWxkIGJlICdhYWFhYScpLlxyXG4gICAgICAgICAgICAgICAgICBpZiAobWluTGVuZ3RoID4gZmlyc3RGaXRNYXRjaExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Rml0TWF0Y2hJZHggPSBqICsgb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Rml0TWF0Y2hMZW5ndGggPSBtaW5MZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXN1bHQgPT09IE5PVF9GT1VORClcclxuICAgICAgICByZXN1bHQgPSBmaXJzdEZpdE1hdGNoSWR4O1xyXG5cclxuICAgICAgLy8gc3RvcmUgaW5kaWNlIGZvdW5kIGluIGludGVnZXIgYXJyYXkuXHJcbiAgICAgIGluZGljZVtpQ3RyXSA9IHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW5kaWNlO1xyXG4gIH1cclxuXHJcbi8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBnZXRzIHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIGxpbmsgaXRlbVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJpZHhcIj50aGUgaW5kZXggb2YgdGhlIGxpbmsgdmFsdWUgKDAgPSBmaXJzdCBpdGVtKSA8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz4gTWFnaWMgdmFsdWUgb2YgdGhlIGl0ZW0gPC9yZXR1cm5zPlxyXG4gIGdldExpbmtWYWx1ZShpZHg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgbG5rVmFsOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAgIGlmICh0aGlzLl9saW5rVmFscyAhPT0gbnVsbCkge1xyXG4gICAgICBsbmtWYWwgPSB0aGlzLl9saW5rVmFsc1tpZHhdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsbmtWYWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgcmV0dXJucyB0cnVlLCBpZiB2YWx1ZSBhdCBpbmRleCBpZHggaXMgbnVsbFxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lID0gXCJ0aGVcIj5pbmRleCBvZiBhbiBpdGVtIGluIHRoZSBsaXN0IDwvcGFyYW0+XHJcbiAgaXNOdWxsKGlkeDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5fbnVsbEZsYWdzID09IG51bGwpXHJcbiAgICAvLyBoYXBwZW5zIGZvciBub24tREMgY2hvaWNlIGNvbnRyb2xzXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fbnVsbEZsYWdzW2lkeF07XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vICAgaW5jcmVhc2UgdGhlIHJlZmVyZW5jZXMgY291bnQgYnkgMVxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgQWRkUmVmZXJlbmNlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVmQ291bnQrKztcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gICBkZWNyZWFzZSB0aGUgcmVmZXJlbmNlcyBjb3VudCBieSAxXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBSZW1vdmVSZWZlcmVuY2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZWZDb3VudC0tO1xyXG4gICAgaWYgKHRoaXMuX3JlZkNvdW50IDwgMCkge1xyXG4gICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oXCJpbiBkY1ZhbHMuZGVjcmVhc2UoKSByZWZlcmVuY2VzIGNvdW50IGlzIGxlc3MgdGhhbiB6ZXJvXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVmZXJlbmNlcyBjb3VudCBpcyB6ZXJvXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICBUb1N0cmluZygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIE5TdHJpbmcuRm9ybWF0KFwie3tEQ1ZhbHVlcyAweHswOlg4fSwgezF9IHJlZnN9fVwiLCB0aGlzLl9pZCwgdGhpcy5fcmVmQ291bnQpO1xyXG4gIH1cclxufVxyXG4iXX0=