@envive-ai/react-hooks 0.2.7-arthur-1 → 0.2.7-arthur-2

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 (176) hide show
  1. package/dist/{NewOrgConfig-yptI2imS.js → NewOrgConfig-BVByiYPp.js} +2 -2
  2. package/dist/{NewOrgConfig-Bo1seKr6.cjs → NewOrgConfig-CInGtTV6.cjs} +2 -2
  3. package/dist/{SystemSettingsContext-EDpRMMt2.cjs → SystemSettingsContext-150LTxIk.cjs} +2 -2
  4. package/dist/{SystemSettingsContext-BY1BFgAQ.js → SystemSettingsContext-ei5B0dxO.js} +2 -2
  5. package/dist/{TrackComponentVisibleEvent-CgxCqrIt.cjs → TrackComponentVisibleEvent-C7-nnBks.cjs} +2 -2
  6. package/dist/{TrackComponentVisibleEvent-CXhKOwKQ.js → TrackComponentVisibleEvent-CuwSLbug.js} +2 -2
  7. package/dist/amplitudeContext-BBQ1ATA3.js +265 -0
  8. package/dist/amplitudeContext-C-0-DDk3.cjs +287 -0
  9. package/dist/{app-CflxT_xI.js → app-C_Y-57U5.js} +3 -4
  10. package/dist/{app-BbPSHefQ.cjs → app-XEFPotoH.cjs} +3 -4
  11. package/dist/application/utils/index.cjs +8 -8
  12. package/dist/application/utils/index.d.cts +2 -2
  13. package/dist/application/utils/index.d.ts +2 -2
  14. package/dist/application/utils/index.js +8 -8
  15. package/dist/{atomStore-CmZbgQHc.cjs → atomStore-8ppNkJ_n.cjs} +1 -1
  16. package/dist/{atomStore-DEcDhiLp.js → atomStore-BLYJ2ZoQ.js} +1 -1
  17. package/dist/atoms/app/index.cjs +4 -4
  18. package/dist/atoms/app/index.d.cts +7 -7
  19. package/dist/atoms/app/index.d.ts +7 -7
  20. package/dist/atoms/app/index.js +4 -4
  21. package/dist/atoms/atomStore/index.cjs +1 -1
  22. package/dist/atoms/atomStore/index.js +1 -1
  23. package/dist/atoms/chat/index.cjs +9 -9
  24. package/dist/atoms/chat/index.d.cts +26 -26
  25. package/dist/atoms/chat/index.d.ts +27 -27
  26. package/dist/atoms/chat/index.js +9 -9
  27. package/dist/atoms/globalSearch/index.d.cts +5 -5
  28. package/dist/atoms/globalSearch/index.d.ts +6 -6
  29. package/dist/atoms/org/index.cjs +1 -1
  30. package/dist/atoms/org/index.d.cts +16 -16
  31. package/dist/atoms/org/index.d.ts +16 -16
  32. package/dist/atoms/org/index.js +1 -1
  33. package/dist/atoms/search/index.cjs +11 -11
  34. package/dist/atoms/search/index.d.cts +1 -1
  35. package/dist/atoms/search/index.d.ts +1 -1
  36. package/dist/atoms/search/index.js +11 -11
  37. package/dist/atoms/search/utils.d.ts +1 -1
  38. package/dist/{cdnContext-CaDyQ_5p.cjs → cdnContext-Bzqk0s2M.cjs} +2 -2
  39. package/dist/{cdnContext-CtrIlAqX.js → cdnContext-CTC-zBtx.js} +2 -2
  40. package/dist/{chat-BjhQCyW_.js → chat-Bzay7QnI.js} +6 -6
  41. package/dist/{chat-BkPax29G.cjs → chat-Ckd1b_z_.cjs} +6 -6
  42. package/dist/{chatSearch-C3N3iIxu.cjs → chatSearch-Bev4ZI8Z.cjs} +3 -3
  43. package/dist/{chatSearch-BsYlFvpv.js → chatSearch-DNaGtQyx.js} +3 -3
  44. package/dist/{chatState-CXA1vF16.js → chatState-CcCvgmSM.js} +2 -2
  45. package/dist/{chatState-CJ52Ag_7.cjs → chatState-OkYPVghN.cjs} +2 -2
  46. package/dist/{commerce-api-rgj30eEp.js → commerce-api-ml5fkEuk.js} +6 -6
  47. package/dist/{commerce-api-DA1QGGMK.cjs → commerce-api-sQtLuwTh.cjs} +6 -6
  48. package/dist/contexts/amplitudeContext/index.cjs +7 -7
  49. package/dist/contexts/amplitudeContext/index.js +7 -7
  50. package/dist/contexts/cdnContext/index.cjs +3 -3
  51. package/dist/contexts/cdnContext/index.js +3 -3
  52. package/dist/contexts/chatContext/index.cjs +16 -16
  53. package/dist/contexts/chatContext/index.d.cts +2 -2
  54. package/dist/contexts/chatContext/index.d.ts +4 -4
  55. package/dist/contexts/chatContext/index.js +16 -16
  56. package/dist/contexts/enviveConfigContext/index.cjs +3 -3
  57. package/dist/contexts/enviveConfigContext/index.js +3 -3
  58. package/dist/contexts/enviveCssContext/index.cjs +6 -6
  59. package/dist/contexts/enviveCssContext/index.js +6 -6
  60. package/dist/contexts/featureFlagContext/index.cjs +4 -4
  61. package/dist/contexts/featureFlagContext/index.js +4 -4
  62. package/dist/contexts/graphqlContext/index.cjs +3 -3
  63. package/dist/contexts/graphqlContext/index.d.ts +1 -1
  64. package/dist/contexts/graphqlContext/index.js +3 -3
  65. package/dist/contexts/localStorageContext/index.cjs +1 -1
  66. package/dist/contexts/localStorageContext/index.js +1 -1
  67. package/dist/contexts/newOrgConfigContext/index.cjs +5 -5
  68. package/dist/contexts/newOrgConfigContext/index.d.ts +2 -2
  69. package/dist/contexts/newOrgConfigContext/index.js +5 -5
  70. package/dist/contexts/searchContext/index.cjs +10 -10
  71. package/dist/contexts/searchContext/index.js +10 -10
  72. package/dist/contexts/sessionStorageContext/index.cjs +1 -1
  73. package/dist/contexts/sessionStorageContext/index.js +1 -1
  74. package/dist/contexts/shopifyUrlContext/index.cjs +1 -1
  75. package/dist/contexts/shopifyUrlContext/index.js +1 -1
  76. package/dist/contexts/systemSettingsContext/index.cjs +3 -3
  77. package/dist/contexts/systemSettingsContext/index.d.cts +2 -2
  78. package/dist/contexts/systemSettingsContext/index.d.ts +2 -2
  79. package/dist/contexts/systemSettingsContext/index.js +3 -3
  80. package/dist/contexts/userIdentityContext/index.cjs +11 -11
  81. package/dist/contexts/userIdentityContext/index.js +11 -11
  82. package/dist/{enviveConfig-DZBohDpc.js → enviveConfig-DV8F12B9.js} +2 -2
  83. package/dist/{enviveConfig-Dv9-esGV.cjs → enviveConfig-DZHdtLsQ.cjs} +2 -2
  84. package/dist/{enviveConfigContext-DrDjCems.js → enviveConfigContext-BS7aNop5.js} +2 -2
  85. package/dist/{enviveConfigContext-D2OELZDR.cjs → enviveConfigContext-CTcHUIFP.cjs} +2 -2
  86. package/dist/frontendConfig-Cawh5iqv.d.ts +1 -1
  87. package/dist/frontendConfig-iZipB5FG.d.cts +1 -1
  88. package/dist/{graphqlContext-DP8T3-Kd.cjs → graphqlContext-CVbYIftg.cjs} +2 -2
  89. package/dist/{graphqlContext-CXQl0hq2.d.ts → graphqlContext-DgkS-UX1.d.ts} +3 -3
  90. package/dist/{graphqlContext-czH0kIZg.js → graphqlContext-DouNZbYo.js} +2 -2
  91. package/dist/hooks/AmplitudeOperations/index.cjs +9 -9
  92. package/dist/hooks/AmplitudeOperations/index.js +9 -9
  93. package/dist/hooks/AppDetails/index.cjs +7 -7
  94. package/dist/hooks/AppDetails/index.js +7 -7
  95. package/dist/hooks/CdnOperations/index.cjs +3 -3
  96. package/dist/hooks/CdnOperations/index.js +3 -3
  97. package/dist/hooks/ChatToggle/index.cjs +9 -9
  98. package/dist/hooks/ChatToggle/index.js +9 -9
  99. package/dist/hooks/ChatToggleAnalytics/index.cjs +10 -10
  100. package/dist/hooks/ChatToggleAnalytics/index.js +10 -10
  101. package/dist/hooks/GrabAndScroll/index.d.cts +2 -2
  102. package/dist/hooks/GrabAndScroll/index.d.ts +2 -2
  103. package/dist/hooks/GraphQLConfig/index.cjs +4 -4
  104. package/dist/hooks/GraphQLConfig/index.d.ts +1 -1
  105. package/dist/hooks/GraphQLConfig/index.js +4 -4
  106. package/dist/hooks/IdentifyUser/index.cjs +11 -11
  107. package/dist/hooks/IdentifyUser/index.js +11 -11
  108. package/dist/hooks/ImageResolver/index.cjs +2 -2
  109. package/dist/hooks/ImageResolver/index.js +2 -2
  110. package/dist/hooks/LocalStorageOperations/index.cjs +1 -1
  111. package/dist/hooks/LocalStorageOperations/index.js +1 -1
  112. package/dist/hooks/NewOrgConfig/index.cjs +6 -6
  113. package/dist/hooks/NewOrgConfig/index.d.ts +2 -2
  114. package/dist/hooks/NewOrgConfig/index.js +6 -6
  115. package/dist/hooks/Search/index.cjs +28 -1166
  116. package/dist/hooks/Search/index.d.cts +1 -1
  117. package/dist/hooks/Search/index.d.ts +1 -1
  118. package/dist/hooks/Search/index.js +26 -1165
  119. package/dist/hooks/SearchOperations/index.cjs +10 -10
  120. package/dist/hooks/SearchOperations/index.js +10 -10
  121. package/dist/hooks/SessionStorageOperations/index.cjs +1 -1
  122. package/dist/hooks/SessionStorageOperations/index.js +1 -1
  123. package/dist/hooks/ShopifyUrlOperations/index.cjs +1 -1
  124. package/dist/hooks/ShopifyUrlOperations/index.js +1 -1
  125. package/dist/hooks/SystemSettingsContext/index.cjs +4 -4
  126. package/dist/hooks/SystemSettingsContext/index.d.cts +2 -2
  127. package/dist/hooks/SystemSettingsContext/index.d.ts +2 -2
  128. package/dist/hooks/SystemSettingsContext/index.js +4 -4
  129. package/dist/hooks/TrackComponentVisibleEvent/index.cjs +8 -8
  130. package/dist/hooks/TrackComponentVisibleEvent/index.js +8 -8
  131. package/dist/hooks/UpdateAnalyticsProps/index.cjs +7 -7
  132. package/dist/hooks/UpdateAnalyticsProps/index.js +7 -7
  133. package/dist/{index-CUO68KG3.d.ts → index-CMJM-3zV.d.ts} +30 -30
  134. package/dist/{index-BSd8767K.d.cts → index-DpJzjjpi.d.cts} +30 -30
  135. package/dist/{localStorageContext-BPZ82q-G.js → localStorageContext-CqcSvg2H.js} +1 -1
  136. package/dist/{localStorageContext-NRP-CdmF.cjs → localStorageContext-DiLfSsqL.cjs} +1 -1
  137. package/dist/{newOrgConfigContext-Bet9CgKP.cjs → newOrgConfigContext-BIDz4ZuO.cjs} +3 -3
  138. package/dist/{newOrgConfigContext-I2qceBB4.d.ts → newOrgConfigContext-CKn7B2rj.d.ts} +2 -2
  139. package/dist/{newOrgConfigContext-Bi_dBNe5.js → newOrgConfigContext-u_9UPNcX.js} +3 -3
  140. package/dist/{orgAnalyticsConfig-Bm23fw4s.cjs → orgAnalyticsConfig-CGEQtAFs.cjs} +1 -1
  141. package/dist/{orgAnalyticsConfig-CpBmga08.js → orgAnalyticsConfig-i4jozLBB.js} +1 -1
  142. package/dist/{search-Csh2n66W.cjs → search-CTVX9gC6.cjs} +2 -2
  143. package/dist/{search-DkiqkogN.js → search-NgNrXNS9.js} +2 -2
  144. package/dist/{searchContext-DksJfC1s.cjs → searchContext-CnDXkawZ.cjs} +5 -5
  145. package/dist/{searchContext-BmgoAFMF.js → searchContext-DtRmshTA.js} +5 -5
  146. package/dist/{sessionStorageContext-B6FsNKjj.cjs → sessionStorageContext-1Ks_d4Z0.cjs} +1 -1
  147. package/dist/{sessionStorageContext-CLYCm83p.js → sessionStorageContext-CDcl7NVl.js} +1 -1
  148. package/dist/{shopifyUrlContext-ZOcARiMR.cjs → shopifyUrlContext-CxjV3qvH.cjs} +1 -1
  149. package/dist/{shopifyUrlContext-C-PkSgNC.js → shopifyUrlContext-D2btP_lY.js} +1 -1
  150. package/dist/{systemSettingsContext-dmE1v6w8.cjs → systemSettingsContext-BejoGzzB.cjs} +2 -2
  151. package/dist/{systemSettingsContext-DF0jSq9m.js → systemSettingsContext-C4dtZ0uZ.js} +2 -2
  152. package/dist/types-BegmH0S1.d.ts +1 -1
  153. package/dist/{unsupportedProductExceptions-DGENUnEA.cjs → unsupportedProductExceptions-B0yx2bHK.cjs} +1 -1
  154. package/dist/{unsupportedProductExceptions-uQuuelOs.js → unsupportedProductExceptions-Cs66ngs3.js} +1 -1
  155. package/dist/{useAmplitudeOperations-Bo6YNbTV.cjs → useAmplitudeOperations-BJXD9v2u.cjs} +2 -2
  156. package/dist/{useAmplitudeOperations-zIRSqmMW.js → useAmplitudeOperations-Dym0Ker8.js} +2 -2
  157. package/dist/{useAppDetails-B584gkCs.js → useAppDetails-Dmh16bWE.js} +4 -4
  158. package/dist/{useAppDetails-DczgqeLG.cjs → useAppDetails-DsAZ1xQn.cjs} +4 -4
  159. package/dist/{useGraphQLConfig-D_rF2Sun.cjs → useGraphQLConfig-B3DlwmGg.cjs} +2 -2
  160. package/dist/{useGraphQLConfig-7UxACM4n.js → useGraphQLConfig-DSRaDTdT.js} +2 -2
  161. package/dist/userIdentityContext-DF3atBFE.js +119 -0
  162. package/dist/userIdentityContext-DpQTduhF.cjs +136 -0
  163. package/dist/{utils-C1ErYSoW.js → utils-B7KTAEmV.js} +2 -2
  164. package/dist/utils-CBD4g2Nc.d.cts +1 -1
  165. package/dist/{utils-mqfncrhI.cjs → utils-CcC2jZRi.cjs} +2 -2
  166. package/package.json +3 -2
  167. package/src/atoms/app/index.ts +1 -1
  168. package/src/contexts/amplitudeContext/__tests__/amplitudeContext.test.tsx +525 -0
  169. package/src/contexts/amplitudeContext/amplitudeContext.tsx +5 -2
  170. package/src/contexts/userIdentityContext/userIdentityContext.tsx +7 -5
  171. package/dist/amplitudeContext-C8tT74Mi.cjs +0 -286
  172. package/dist/amplitudeContext-DCk6Va-j.js +0 -264
  173. package/dist/userIdentityContext-BqbNu7xu.cjs +0 -132
  174. package/dist/userIdentityContext-BxFH9FNQ.js +0 -115
  175. /package/dist/{AmplitudeOperations-ChZWcSsc.js → AmplitudeOperations-C-ieCm9m.js} +0 -0
  176. /package/dist/{AmplitudeOperations-JggIc1zD.cjs → AmplitudeOperations-p7APchq9.cjs} +0 -0
@@ -11,1177 +11,39 @@ require('../../api-DeW6rHj3.cjs');
11
11
  require('../../logger-TBIl4uIH.cjs');
12
12
  require('../../utilityTypes-BGbL2WTP.cjs');
13
13
  require('../../variantInfo-DpLn4nHz.cjs');
14
- require('../../localStorageContext-NRP-CdmF.cjs');
15
- const require_enviveConfig = require('../../enviveConfig-Dv9-esGV.cjs');
16
- require('../../orgAnalyticsConfig-Bm23fw4s.cjs');
17
- require('../../atomStore-CmZbgQHc.cjs');
18
- require('../../app-BbPSHefQ.cjs');
19
- require('../../enviveConfigContext-D2OELZDR.cjs');
14
+ require('../../atomStore-8ppNkJ_n.cjs');
15
+ require('../../localStorageContext-DiLfSsqL.cjs');
16
+ const require_enviveConfig = require('../../enviveConfig-DZHdtLsQ.cjs');
17
+ require('../../orgAnalyticsConfig-CGEQtAFs.cjs');
18
+ require('../../app-XEFPotoH.cjs');
19
+ require('../../enviveConfigContext-CTcHUIFP.cjs');
20
20
  const require_featureFlagServiceContext = require('../../featureFlagServiceContext-CJyYItqu.cjs');
21
- const require_amplitudeContext = require('../../amplitudeContext-C8tT74Mi.cjs');
22
- require('../../chatState-CJ52Ag_7.cjs');
21
+ const require_amplitudeContext = require('../../amplitudeContext-C-0-DDk3.cjs');
22
+ require('../../chatState-OkYPVghN.cjs');
23
23
  require('../../graphqlConfig-BnfE0ql5.cjs');
24
- const require_chat = require('../../chat-BkPax29G.cjs');
24
+ const require_chat = require('../../chat-Ckd1b_z_.cjs');
25
25
  const require_globalSearch = require('../../globalSearch-BOG3wmck.cjs');
26
26
  require('../../org-B_cWn2bt.cjs');
27
27
  require('../../newOrgConfigAtom-CPA6Gp6n.cjs');
28
28
  const require_utils$2 = require('../../utils-CvLmSsUj.cjs');
29
- require('../../chatSearch-C3N3iIxu.cjs');
29
+ require('../../chatSearch-Bev4ZI8Z.cjs');
30
30
  const require_types$1 = require('../../types-BuvXXGxE.cjs');
31
31
  require('../../searchServiceAdapter-BGlvoZFE.cjs');
32
- const require_search = require('../../search-Csh2n66W.cjs');
32
+ const require_search = require('../../search-CTVX9gC6.cjs');
33
33
  require('../../amplitudeContext-DPtyVv3Q.cjs');
34
- require('../../graphqlContext-DP8T3-Kd.cjs');
35
- require('../../useGraphQLConfig-D_rF2Sun.cjs');
36
- require('../../newOrgConfigContext-Bet9CgKP.cjs');
37
- const require_NewOrgConfig = require('../../NewOrgConfig-Bo1seKr6.cjs');
34
+ require('../../graphqlContext-CVbYIftg.cjs');
35
+ require('../../useGraphQLConfig-B3DlwmGg.cjs');
36
+ require('../../newOrgConfigContext-BIDz4ZuO.cjs');
37
+ const require_NewOrgConfig = require('../../NewOrgConfig-CInGtTV6.cjs');
38
38
  require('../../useIntersection-DSDREfj6.cjs');
39
- const require_TrackComponentVisibleEvent = require('../../TrackComponentVisibleEvent-CgxCqrIt.cjs');
39
+ const require_TrackComponentVisibleEvent = require('../../TrackComponentVisibleEvent-C7-nnBks.cjs');
40
40
  let react = require("react");
41
41
  react = require_chunk.__toESM(react);
42
42
  let jotai = require("jotai");
43
43
  jotai = require_chunk.__toESM(jotai);
44
+ let fuse_js = require("fuse.js");
45
+ fuse_js = require_chunk.__toESM(fuse_js);
44
46
 
45
- //#region node_modules/fuse.js/dist/fuse.mjs
46
- /**
47
- * Fuse.js v7.1.0 - Lightweight fuzzy-search (http://fusejs.io)
48
- *
49
- * Copyright (c) 2025 Kiro Risk (http://kiro.me)
50
- * All Rights Reserved. Apache Software License 2.0
51
- *
52
- * http://www.apache.org/licenses/LICENSE-2.0
53
- */
54
- function isArray(value) {
55
- return !Array.isArray ? getTag(value) === "[object Array]" : Array.isArray(value);
56
- }
57
- const INFINITY = Infinity;
58
- function baseToString(value) {
59
- if (typeof value == "string") return value;
60
- let result = value + "";
61
- return result == "0" && 1 / value == -INFINITY ? "-0" : result;
62
- }
63
- function toString(value) {
64
- return value == null ? "" : baseToString(value);
65
- }
66
- function isString(value) {
67
- return typeof value === "string";
68
- }
69
- function isNumber(value) {
70
- return typeof value === "number";
71
- }
72
- function isBoolean(value) {
73
- return value === true || value === false || isObjectLike(value) && getTag(value) == "[object Boolean]";
74
- }
75
- function isObject(value) {
76
- return typeof value === "object";
77
- }
78
- function isObjectLike(value) {
79
- return isObject(value) && value !== null;
80
- }
81
- function isDefined(value) {
82
- return value !== void 0 && value !== null;
83
- }
84
- function isBlank(value) {
85
- return !value.trim().length;
86
- }
87
- function getTag(value) {
88
- return value == null ? value === void 0 ? "[object Undefined]" : "[object Null]" : Object.prototype.toString.call(value);
89
- }
90
- const INCORRECT_INDEX_TYPE = "Incorrect 'index' type";
91
- const LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) => `Invalid value for key ${key}`;
92
- const PATTERN_LENGTH_TOO_LARGE = (max) => `Pattern length exceeds max of ${max}.`;
93
- const MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;
94
- const INVALID_KEY_WEIGHT_VALUE = (key) => `Property 'weight' in key '${key}' must be a positive integer`;
95
- const hasOwn = Object.prototype.hasOwnProperty;
96
- var KeyStore = class {
97
- constructor(keys) {
98
- this._keys = [];
99
- this._keyMap = {};
100
- let totalWeight = 0;
101
- keys.forEach((key) => {
102
- let obj = createKey(key);
103
- this._keys.push(obj);
104
- this._keyMap[obj.id] = obj;
105
- totalWeight += obj.weight;
106
- });
107
- this._keys.forEach((key) => {
108
- key.weight /= totalWeight;
109
- });
110
- }
111
- get(keyId) {
112
- return this._keyMap[keyId];
113
- }
114
- keys() {
115
- return this._keys;
116
- }
117
- toJSON() {
118
- return JSON.stringify(this._keys);
119
- }
120
- };
121
- function createKey(key) {
122
- let path = null;
123
- let id = null;
124
- let src = null;
125
- let weight = 1;
126
- let getFn = null;
127
- if (isString(key) || isArray(key)) {
128
- src = key;
129
- path = createKeyPath(key);
130
- id = createKeyId(key);
131
- } else {
132
- if (!hasOwn.call(key, "name")) throw new Error(MISSING_KEY_PROPERTY("name"));
133
- const name = key.name;
134
- src = name;
135
- if (hasOwn.call(key, "weight")) {
136
- weight = key.weight;
137
- if (weight <= 0) throw new Error(INVALID_KEY_WEIGHT_VALUE(name));
138
- }
139
- path = createKeyPath(name);
140
- id = createKeyId(name);
141
- getFn = key.getFn;
142
- }
143
- return {
144
- path,
145
- id,
146
- weight,
147
- src,
148
- getFn
149
- };
150
- }
151
- function createKeyPath(key) {
152
- return isArray(key) ? key : key.split(".");
153
- }
154
- function createKeyId(key) {
155
- return isArray(key) ? key.join(".") : key;
156
- }
157
- function get(obj, path) {
158
- let list = [];
159
- let arr = false;
160
- const deepGet = (obj$1, path$1, index) => {
161
- if (!isDefined(obj$1)) return;
162
- if (!path$1[index]) list.push(obj$1);
163
- else {
164
- let key = path$1[index];
165
- const value = obj$1[key];
166
- if (!isDefined(value)) return;
167
- if (index === path$1.length - 1 && (isString(value) || isNumber(value) || isBoolean(value))) list.push(toString(value));
168
- else if (isArray(value)) {
169
- arr = true;
170
- for (let i = 0, len = value.length; i < len; i += 1) deepGet(value[i], path$1, index + 1);
171
- } else if (path$1.length) deepGet(value, path$1, index + 1);
172
- }
173
- };
174
- deepGet(obj, isString(path) ? path.split(".") : path, 0);
175
- return arr ? list : list[0];
176
- }
177
- const MatchOptions = {
178
- includeMatches: false,
179
- findAllMatches: false,
180
- minMatchCharLength: 1
181
- };
182
- const BasicOptions = {
183
- isCaseSensitive: false,
184
- ignoreDiacritics: false,
185
- includeScore: false,
186
- keys: [],
187
- shouldSort: true,
188
- sortFn: (a, b) => a.score === b.score ? a.idx < b.idx ? -1 : 1 : a.score < b.score ? -1 : 1
189
- };
190
- const FuzzyOptions = {
191
- location: 0,
192
- threshold: .6,
193
- distance: 100
194
- };
195
- const AdvancedOptions = {
196
- useExtendedSearch: false,
197
- getFn: get,
198
- ignoreLocation: false,
199
- ignoreFieldNorm: false,
200
- fieldNormWeight: 1
201
- };
202
- var Config = {
203
- ...BasicOptions,
204
- ...MatchOptions,
205
- ...FuzzyOptions,
206
- ...AdvancedOptions
207
- };
208
- const SPACE = /[^ ]+/g;
209
- function norm(weight = 1, mantissa = 3) {
210
- const cache = /* @__PURE__ */ new Map();
211
- const m = Math.pow(10, mantissa);
212
- return {
213
- get(value) {
214
- const numTokens = value.match(SPACE).length;
215
- if (cache.has(numTokens)) return cache.get(numTokens);
216
- const norm$1 = 1 / Math.pow(numTokens, .5 * weight);
217
- const n = parseFloat(Math.round(norm$1 * m) / m);
218
- cache.set(numTokens, n);
219
- return n;
220
- },
221
- clear() {
222
- cache.clear();
223
- }
224
- };
225
- }
226
- var FuseIndex = class {
227
- constructor({ getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {
228
- this.norm = norm(fieldNormWeight, 3);
229
- this.getFn = getFn;
230
- this.isCreated = false;
231
- this.setIndexRecords();
232
- }
233
- setSources(docs = []) {
234
- this.docs = docs;
235
- }
236
- setIndexRecords(records = []) {
237
- this.records = records;
238
- }
239
- setKeys(keys = []) {
240
- this.keys = keys;
241
- this._keysMap = {};
242
- keys.forEach((key, idx) => {
243
- this._keysMap[key.id] = idx;
244
- });
245
- }
246
- create() {
247
- if (this.isCreated || !this.docs.length) return;
248
- this.isCreated = true;
249
- if (isString(this.docs[0])) this.docs.forEach((doc, docIndex) => {
250
- this._addString(doc, docIndex);
251
- });
252
- else this.docs.forEach((doc, docIndex) => {
253
- this._addObject(doc, docIndex);
254
- });
255
- this.norm.clear();
256
- }
257
- add(doc) {
258
- const idx = this.size();
259
- if (isString(doc)) this._addString(doc, idx);
260
- else this._addObject(doc, idx);
261
- }
262
- removeAt(idx) {
263
- this.records.splice(idx, 1);
264
- for (let i = idx, len = this.size(); i < len; i += 1) this.records[i].i -= 1;
265
- }
266
- getValueForItemAtKeyId(item, keyId) {
267
- return item[this._keysMap[keyId]];
268
- }
269
- size() {
270
- return this.records.length;
271
- }
272
- _addString(doc, docIndex) {
273
- if (!isDefined(doc) || isBlank(doc)) return;
274
- let record = {
275
- v: doc,
276
- i: docIndex,
277
- n: this.norm.get(doc)
278
- };
279
- this.records.push(record);
280
- }
281
- _addObject(doc, docIndex) {
282
- let record = {
283
- i: docIndex,
284
- $: {}
285
- };
286
- this.keys.forEach((key, keyIndex) => {
287
- let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);
288
- if (!isDefined(value)) return;
289
- if (isArray(value)) {
290
- let subRecords = [];
291
- const stack = [{
292
- nestedArrIndex: -1,
293
- value
294
- }];
295
- while (stack.length) {
296
- const { nestedArrIndex, value: value$1 } = stack.pop();
297
- if (!isDefined(value$1)) continue;
298
- if (isString(value$1) && !isBlank(value$1)) {
299
- let subRecord = {
300
- v: value$1,
301
- i: nestedArrIndex,
302
- n: this.norm.get(value$1)
303
- };
304
- subRecords.push(subRecord);
305
- } else if (isArray(value$1)) value$1.forEach((item, k) => {
306
- stack.push({
307
- nestedArrIndex: k,
308
- value: item
309
- });
310
- });
311
- }
312
- record.$[keyIndex] = subRecords;
313
- } else if (isString(value) && !isBlank(value)) {
314
- let subRecord = {
315
- v: value,
316
- n: this.norm.get(value)
317
- };
318
- record.$[keyIndex] = subRecord;
319
- }
320
- });
321
- this.records.push(record);
322
- }
323
- toJSON() {
324
- return {
325
- keys: this.keys,
326
- records: this.records
327
- };
328
- }
329
- };
330
- function createIndex(keys, docs, { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {
331
- const myIndex = new FuseIndex({
332
- getFn,
333
- fieldNormWeight
334
- });
335
- myIndex.setKeys(keys.map(createKey));
336
- myIndex.setSources(docs);
337
- myIndex.create();
338
- return myIndex;
339
- }
340
- function parseIndex(data, { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}) {
341
- const { keys, records } = data;
342
- const myIndex = new FuseIndex({
343
- getFn,
344
- fieldNormWeight
345
- });
346
- myIndex.setKeys(keys);
347
- myIndex.setIndexRecords(records);
348
- return myIndex;
349
- }
350
- function computeScore$1(pattern, { errors = 0, currentLocation = 0, expectedLocation = 0, distance = Config.distance, ignoreLocation = Config.ignoreLocation } = {}) {
351
- const accuracy = errors / pattern.length;
352
- if (ignoreLocation) return accuracy;
353
- const proximity = Math.abs(expectedLocation - currentLocation);
354
- if (!distance) return proximity ? 1 : accuracy;
355
- return accuracy + proximity / distance;
356
- }
357
- function convertMaskToIndices(matchmask = [], minMatchCharLength = Config.minMatchCharLength) {
358
- let indices = [];
359
- let start = -1;
360
- let end = -1;
361
- let i = 0;
362
- for (let len = matchmask.length; i < len; i += 1) {
363
- let match = matchmask[i];
364
- if (match && start === -1) start = i;
365
- else if (!match && start !== -1) {
366
- end = i - 1;
367
- if (end - start + 1 >= minMatchCharLength) indices.push([start, end]);
368
- start = -1;
369
- }
370
- }
371
- if (matchmask[i - 1] && i - start >= minMatchCharLength) indices.push([start, i - 1]);
372
- return indices;
373
- }
374
- const MAX_BITS = 32;
375
- function search(text, pattern, patternAlphabet, { location = Config.location, distance = Config.distance, threshold = Config.threshold, findAllMatches = Config.findAllMatches, minMatchCharLength = Config.minMatchCharLength, includeMatches = Config.includeMatches, ignoreLocation = Config.ignoreLocation } = {}) {
376
- if (pattern.length > MAX_BITS) throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS));
377
- const patternLen = pattern.length;
378
- const textLen = text.length;
379
- const expectedLocation = Math.max(0, Math.min(location, textLen));
380
- let currentThreshold = threshold;
381
- let bestLocation = expectedLocation;
382
- const computeMatches = minMatchCharLength > 1 || includeMatches;
383
- const matchMask = computeMatches ? Array(textLen) : [];
384
- let index;
385
- while ((index = text.indexOf(pattern, bestLocation)) > -1) {
386
- let score = computeScore$1(pattern, {
387
- currentLocation: index,
388
- expectedLocation,
389
- distance,
390
- ignoreLocation
391
- });
392
- currentThreshold = Math.min(score, currentThreshold);
393
- bestLocation = index + patternLen;
394
- if (computeMatches) {
395
- let i = 0;
396
- while (i < patternLen) {
397
- matchMask[index + i] = 1;
398
- i += 1;
399
- }
400
- }
401
- }
402
- bestLocation = -1;
403
- let lastBitArr = [];
404
- let finalScore = 1;
405
- let binMax = patternLen + textLen;
406
- const mask = 1 << patternLen - 1;
407
- for (let i = 0; i < patternLen; i += 1) {
408
- let binMin = 0;
409
- let binMid = binMax;
410
- while (binMin < binMid) {
411
- if (computeScore$1(pattern, {
412
- errors: i,
413
- currentLocation: expectedLocation + binMid,
414
- expectedLocation,
415
- distance,
416
- ignoreLocation
417
- }) <= currentThreshold) binMin = binMid;
418
- else binMax = binMid;
419
- binMid = Math.floor((binMax - binMin) / 2 + binMin);
420
- }
421
- binMax = binMid;
422
- let start = Math.max(1, expectedLocation - binMid + 1);
423
- let finish = findAllMatches ? textLen : Math.min(expectedLocation + binMid, textLen) + patternLen;
424
- let bitArr = Array(finish + 2);
425
- bitArr[finish + 1] = (1 << i) - 1;
426
- for (let j = finish; j >= start; j -= 1) {
427
- let currentLocation = j - 1;
428
- let charMatch = patternAlphabet[text.charAt(currentLocation)];
429
- if (computeMatches) matchMask[currentLocation] = +!!charMatch;
430
- bitArr[j] = (bitArr[j + 1] << 1 | 1) & charMatch;
431
- if (i) bitArr[j] |= (lastBitArr[j + 1] | lastBitArr[j]) << 1 | 1 | lastBitArr[j + 1];
432
- if (bitArr[j] & mask) {
433
- finalScore = computeScore$1(pattern, {
434
- errors: i,
435
- currentLocation,
436
- expectedLocation,
437
- distance,
438
- ignoreLocation
439
- });
440
- if (finalScore <= currentThreshold) {
441
- currentThreshold = finalScore;
442
- bestLocation = currentLocation;
443
- if (bestLocation <= expectedLocation) break;
444
- start = Math.max(1, 2 * expectedLocation - bestLocation);
445
- }
446
- }
447
- }
448
- if (computeScore$1(pattern, {
449
- errors: i + 1,
450
- currentLocation: expectedLocation,
451
- expectedLocation,
452
- distance,
453
- ignoreLocation
454
- }) > currentThreshold) break;
455
- lastBitArr = bitArr;
456
- }
457
- const result = {
458
- isMatch: bestLocation >= 0,
459
- score: Math.max(.001, finalScore)
460
- };
461
- if (computeMatches) {
462
- const indices = convertMaskToIndices(matchMask, minMatchCharLength);
463
- if (!indices.length) result.isMatch = false;
464
- else if (includeMatches) result.indices = indices;
465
- }
466
- return result;
467
- }
468
- function createPatternAlphabet(pattern) {
469
- let mask = {};
470
- for (let i = 0, len = pattern.length; i < len; i += 1) {
471
- const char = pattern.charAt(i);
472
- mask[char] = (mask[char] || 0) | 1 << len - i - 1;
473
- }
474
- return mask;
475
- }
476
- const stripDiacritics = String.prototype.normalize ? ((str) => str.normalize("NFD").replace(/[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u09FE\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0AFA-\u0AFF\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C04\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D00-\u0D03\u0D3B\u0D3C\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF7-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/g, "")) : ((str) => str);
477
- var BitapSearch = class {
478
- constructor(pattern, { location = Config.location, threshold = Config.threshold, distance = Config.distance, includeMatches = Config.includeMatches, findAllMatches = Config.findAllMatches, minMatchCharLength = Config.minMatchCharLength, isCaseSensitive = Config.isCaseSensitive, ignoreDiacritics = Config.ignoreDiacritics, ignoreLocation = Config.ignoreLocation } = {}) {
479
- this.options = {
480
- location,
481
- threshold,
482
- distance,
483
- includeMatches,
484
- findAllMatches,
485
- minMatchCharLength,
486
- isCaseSensitive,
487
- ignoreDiacritics,
488
- ignoreLocation
489
- };
490
- pattern = isCaseSensitive ? pattern : pattern.toLowerCase();
491
- pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;
492
- this.pattern = pattern;
493
- this.chunks = [];
494
- if (!this.pattern.length) return;
495
- const addChunk = (pattern$1, startIndex) => {
496
- this.chunks.push({
497
- pattern: pattern$1,
498
- alphabet: createPatternAlphabet(pattern$1),
499
- startIndex
500
- });
501
- };
502
- const len = this.pattern.length;
503
- if (len > MAX_BITS) {
504
- let i = 0;
505
- const remainder = len % MAX_BITS;
506
- const end = len - remainder;
507
- while (i < end) {
508
- addChunk(this.pattern.substr(i, MAX_BITS), i);
509
- i += MAX_BITS;
510
- }
511
- if (remainder) {
512
- const startIndex = len - MAX_BITS;
513
- addChunk(this.pattern.substr(startIndex), startIndex);
514
- }
515
- } else addChunk(this.pattern, 0);
516
- }
517
- searchIn(text) {
518
- const { isCaseSensitive, ignoreDiacritics, includeMatches } = this.options;
519
- text = isCaseSensitive ? text : text.toLowerCase();
520
- text = ignoreDiacritics ? stripDiacritics(text) : text;
521
- if (this.pattern === text) {
522
- let result$1 = {
523
- isMatch: true,
524
- score: 0
525
- };
526
- if (includeMatches) result$1.indices = [[0, text.length - 1]];
527
- return result$1;
528
- }
529
- const { location, distance, threshold, findAllMatches, minMatchCharLength, ignoreLocation } = this.options;
530
- let allIndices = [];
531
- let totalScore = 0;
532
- let hasMatches = false;
533
- this.chunks.forEach(({ pattern, alphabet, startIndex }) => {
534
- const { isMatch, score, indices } = search(text, pattern, alphabet, {
535
- location: location + startIndex,
536
- distance,
537
- threshold,
538
- findAllMatches,
539
- minMatchCharLength,
540
- includeMatches,
541
- ignoreLocation
542
- });
543
- if (isMatch) hasMatches = true;
544
- totalScore += score;
545
- if (isMatch && indices) allIndices = [...allIndices, ...indices];
546
- });
547
- let result = {
548
- isMatch: hasMatches,
549
- score: hasMatches ? totalScore / this.chunks.length : 1
550
- };
551
- if (hasMatches && includeMatches) result.indices = allIndices;
552
- return result;
553
- }
554
- };
555
- var BaseMatch = class {
556
- constructor(pattern) {
557
- this.pattern = pattern;
558
- }
559
- static isMultiMatch(pattern) {
560
- return getMatch(pattern, this.multiRegex);
561
- }
562
- static isSingleMatch(pattern) {
563
- return getMatch(pattern, this.singleRegex);
564
- }
565
- search() {}
566
- };
567
- function getMatch(pattern, exp) {
568
- const matches = pattern.match(exp);
569
- return matches ? matches[1] : null;
570
- }
571
- var ExactMatch = class extends BaseMatch {
572
- constructor(pattern) {
573
- super(pattern);
574
- }
575
- static get type() {
576
- return "exact";
577
- }
578
- static get multiRegex() {
579
- return /^="(.*)"$/;
580
- }
581
- static get singleRegex() {
582
- return /^=(.*)$/;
583
- }
584
- search(text) {
585
- const isMatch = text === this.pattern;
586
- return {
587
- isMatch,
588
- score: isMatch ? 0 : 1,
589
- indices: [0, this.pattern.length - 1]
590
- };
591
- }
592
- };
593
- var InverseExactMatch = class extends BaseMatch {
594
- constructor(pattern) {
595
- super(pattern);
596
- }
597
- static get type() {
598
- return "inverse-exact";
599
- }
600
- static get multiRegex() {
601
- return /^!"(.*)"$/;
602
- }
603
- static get singleRegex() {
604
- return /^!(.*)$/;
605
- }
606
- search(text) {
607
- const isMatch = text.indexOf(this.pattern) === -1;
608
- return {
609
- isMatch,
610
- score: isMatch ? 0 : 1,
611
- indices: [0, text.length - 1]
612
- };
613
- }
614
- };
615
- var PrefixExactMatch = class extends BaseMatch {
616
- constructor(pattern) {
617
- super(pattern);
618
- }
619
- static get type() {
620
- return "prefix-exact";
621
- }
622
- static get multiRegex() {
623
- return /^\^"(.*)"$/;
624
- }
625
- static get singleRegex() {
626
- return /^\^(.*)$/;
627
- }
628
- search(text) {
629
- const isMatch = text.startsWith(this.pattern);
630
- return {
631
- isMatch,
632
- score: isMatch ? 0 : 1,
633
- indices: [0, this.pattern.length - 1]
634
- };
635
- }
636
- };
637
- var InversePrefixExactMatch = class extends BaseMatch {
638
- constructor(pattern) {
639
- super(pattern);
640
- }
641
- static get type() {
642
- return "inverse-prefix-exact";
643
- }
644
- static get multiRegex() {
645
- return /^!\^"(.*)"$/;
646
- }
647
- static get singleRegex() {
648
- return /^!\^(.*)$/;
649
- }
650
- search(text) {
651
- const isMatch = !text.startsWith(this.pattern);
652
- return {
653
- isMatch,
654
- score: isMatch ? 0 : 1,
655
- indices: [0, text.length - 1]
656
- };
657
- }
658
- };
659
- var SuffixExactMatch = class extends BaseMatch {
660
- constructor(pattern) {
661
- super(pattern);
662
- }
663
- static get type() {
664
- return "suffix-exact";
665
- }
666
- static get multiRegex() {
667
- return /^"(.*)"\$$/;
668
- }
669
- static get singleRegex() {
670
- return /^(.*)\$$/;
671
- }
672
- search(text) {
673
- const isMatch = text.endsWith(this.pattern);
674
- return {
675
- isMatch,
676
- score: isMatch ? 0 : 1,
677
- indices: [text.length - this.pattern.length, text.length - 1]
678
- };
679
- }
680
- };
681
- var InverseSuffixExactMatch = class extends BaseMatch {
682
- constructor(pattern) {
683
- super(pattern);
684
- }
685
- static get type() {
686
- return "inverse-suffix-exact";
687
- }
688
- static get multiRegex() {
689
- return /^!"(.*)"\$$/;
690
- }
691
- static get singleRegex() {
692
- return /^!(.*)\$$/;
693
- }
694
- search(text) {
695
- const isMatch = !text.endsWith(this.pattern);
696
- return {
697
- isMatch,
698
- score: isMatch ? 0 : 1,
699
- indices: [0, text.length - 1]
700
- };
701
- }
702
- };
703
- var FuzzyMatch = class extends BaseMatch {
704
- constructor(pattern, { location = Config.location, threshold = Config.threshold, distance = Config.distance, includeMatches = Config.includeMatches, findAllMatches = Config.findAllMatches, minMatchCharLength = Config.minMatchCharLength, isCaseSensitive = Config.isCaseSensitive, ignoreDiacritics = Config.ignoreDiacritics, ignoreLocation = Config.ignoreLocation } = {}) {
705
- super(pattern);
706
- this._bitapSearch = new BitapSearch(pattern, {
707
- location,
708
- threshold,
709
- distance,
710
- includeMatches,
711
- findAllMatches,
712
- minMatchCharLength,
713
- isCaseSensitive,
714
- ignoreDiacritics,
715
- ignoreLocation
716
- });
717
- }
718
- static get type() {
719
- return "fuzzy";
720
- }
721
- static get multiRegex() {
722
- return /^"(.*)"$/;
723
- }
724
- static get singleRegex() {
725
- return /^(.*)$/;
726
- }
727
- search(text) {
728
- return this._bitapSearch.searchIn(text);
729
- }
730
- };
731
- var IncludeMatch = class extends BaseMatch {
732
- constructor(pattern) {
733
- super(pattern);
734
- }
735
- static get type() {
736
- return "include";
737
- }
738
- static get multiRegex() {
739
- return /^'"(.*)"$/;
740
- }
741
- static get singleRegex() {
742
- return /^'(.*)$/;
743
- }
744
- search(text) {
745
- let location = 0;
746
- let index;
747
- const indices = [];
748
- const patternLen = this.pattern.length;
749
- while ((index = text.indexOf(this.pattern, location)) > -1) {
750
- location = index + patternLen;
751
- indices.push([index, location - 1]);
752
- }
753
- const isMatch = !!indices.length;
754
- return {
755
- isMatch,
756
- score: isMatch ? 0 : 1,
757
- indices
758
- };
759
- }
760
- };
761
- const searchers = [
762
- ExactMatch,
763
- IncludeMatch,
764
- PrefixExactMatch,
765
- InversePrefixExactMatch,
766
- InverseSuffixExactMatch,
767
- SuffixExactMatch,
768
- InverseExactMatch,
769
- FuzzyMatch
770
- ];
771
- const searchersLen = searchers.length;
772
- const SPACE_RE = / +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/;
773
- const OR_TOKEN = "|";
774
- function parseQuery(pattern, options = {}) {
775
- return pattern.split(OR_TOKEN).map((item) => {
776
- let query = item.trim().split(SPACE_RE).filter((item$1) => item$1 && !!item$1.trim());
777
- let results = [];
778
- for (let i = 0, len = query.length; i < len; i += 1) {
779
- const queryItem = query[i];
780
- let found = false;
781
- let idx = -1;
782
- while (!found && ++idx < searchersLen) {
783
- const searcher = searchers[idx];
784
- let token = searcher.isMultiMatch(queryItem);
785
- if (token) {
786
- results.push(new searcher(token, options));
787
- found = true;
788
- }
789
- }
790
- if (found) continue;
791
- idx = -1;
792
- while (++idx < searchersLen) {
793
- const searcher = searchers[idx];
794
- let token = searcher.isSingleMatch(queryItem);
795
- if (token) {
796
- results.push(new searcher(token, options));
797
- break;
798
- }
799
- }
800
- }
801
- return results;
802
- });
803
- }
804
- const MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);
805
- /**
806
- * Command-like searching
807
- * ======================
808
- *
809
- * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,
810
- * search in a given text.
811
- *
812
- * Search syntax:
813
- *
814
- * | Token | Match type | Description |
815
- * | ----------- | -------------------------- | -------------------------------------- |
816
- * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |
817
- * | `=scheme` | exact-match | Items that are `scheme` |
818
- * | `'python` | include-match | Items that include `python` |
819
- * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |
820
- * | `^java` | prefix-exact-match | Items that start with `java` |
821
- * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |
822
- * | `.js$` | suffix-exact-match | Items that end with `.js` |
823
- * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |
824
- *
825
- * A single pipe character acts as an OR operator. For example, the following
826
- * query matches entries that start with `core` and end with either`go`, `rb`,
827
- * or`py`.
828
- *
829
- * ```
830
- * ^core go$ | rb$ | py$
831
- * ```
832
- */
833
- var ExtendedSearch = class {
834
- constructor(pattern, { isCaseSensitive = Config.isCaseSensitive, ignoreDiacritics = Config.ignoreDiacritics, includeMatches = Config.includeMatches, minMatchCharLength = Config.minMatchCharLength, ignoreLocation = Config.ignoreLocation, findAllMatches = Config.findAllMatches, location = Config.location, threshold = Config.threshold, distance = Config.distance } = {}) {
835
- this.query = null;
836
- this.options = {
837
- isCaseSensitive,
838
- ignoreDiacritics,
839
- includeMatches,
840
- minMatchCharLength,
841
- findAllMatches,
842
- ignoreLocation,
843
- location,
844
- threshold,
845
- distance
846
- };
847
- pattern = isCaseSensitive ? pattern : pattern.toLowerCase();
848
- pattern = ignoreDiacritics ? stripDiacritics(pattern) : pattern;
849
- this.pattern = pattern;
850
- this.query = parseQuery(this.pattern, this.options);
851
- }
852
- static condition(_, options) {
853
- return options.useExtendedSearch;
854
- }
855
- searchIn(text) {
856
- const query = this.query;
857
- if (!query) return {
858
- isMatch: false,
859
- score: 1
860
- };
861
- const { includeMatches, isCaseSensitive, ignoreDiacritics } = this.options;
862
- text = isCaseSensitive ? text : text.toLowerCase();
863
- text = ignoreDiacritics ? stripDiacritics(text) : text;
864
- let numMatches = 0;
865
- let allIndices = [];
866
- let totalScore = 0;
867
- for (let i = 0, qLen = query.length; i < qLen; i += 1) {
868
- const searchers$1 = query[i];
869
- allIndices.length = 0;
870
- numMatches = 0;
871
- for (let j = 0, pLen = searchers$1.length; j < pLen; j += 1) {
872
- const searcher = searchers$1[j];
873
- const { isMatch, indices, score } = searcher.search(text);
874
- if (isMatch) {
875
- numMatches += 1;
876
- totalScore += score;
877
- if (includeMatches) {
878
- const type = searcher.constructor.type;
879
- if (MultiMatchSet.has(type)) allIndices = [...allIndices, ...indices];
880
- else allIndices.push(indices);
881
- }
882
- } else {
883
- totalScore = 0;
884
- numMatches = 0;
885
- allIndices.length = 0;
886
- break;
887
- }
888
- }
889
- if (numMatches) {
890
- let result = {
891
- isMatch: true,
892
- score: totalScore / numMatches
893
- };
894
- if (includeMatches) result.indices = allIndices;
895
- return result;
896
- }
897
- }
898
- return {
899
- isMatch: false,
900
- score: 1
901
- };
902
- }
903
- };
904
- const registeredSearchers = [];
905
- function register(...args) {
906
- registeredSearchers.push(...args);
907
- }
908
- function createSearcher(pattern, options) {
909
- for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {
910
- let searcherClass = registeredSearchers[i];
911
- if (searcherClass.condition(pattern, options)) return new searcherClass(pattern, options);
912
- }
913
- return new BitapSearch(pattern, options);
914
- }
915
- const LogicalOperator = {
916
- AND: "$and",
917
- OR: "$or"
918
- };
919
- const KeyType = {
920
- PATH: "$path",
921
- PATTERN: "$val"
922
- };
923
- const isExpression = (query) => !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);
924
- const isPath = (query) => !!query[KeyType.PATH];
925
- const isLeaf = (query) => !isArray(query) && isObject(query) && !isExpression(query);
926
- const convertToExplicit = (query) => ({ [LogicalOperator.AND]: Object.keys(query).map((key) => ({ [key]: query[key] })) });
927
- function parse(query, options, { auto = true } = {}) {
928
- const next = (query$1) => {
929
- let keys = Object.keys(query$1);
930
- const isQueryPath = isPath(query$1);
931
- if (!isQueryPath && keys.length > 1 && !isExpression(query$1)) return next(convertToExplicit(query$1));
932
- if (isLeaf(query$1)) {
933
- const key = isQueryPath ? query$1[KeyType.PATH] : keys[0];
934
- const pattern = isQueryPath ? query$1[KeyType.PATTERN] : query$1[key];
935
- if (!isString(pattern)) throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key));
936
- const obj = {
937
- keyId: createKeyId(key),
938
- pattern
939
- };
940
- if (auto) obj.searcher = createSearcher(pattern, options);
941
- return obj;
942
- }
943
- let node = {
944
- children: [],
945
- operator: keys[0]
946
- };
947
- keys.forEach((key) => {
948
- const value = query$1[key];
949
- if (isArray(value)) value.forEach((item) => {
950
- node.children.push(next(item));
951
- });
952
- });
953
- return node;
954
- };
955
- if (!isExpression(query)) query = convertToExplicit(query);
956
- return next(query);
957
- }
958
- function computeScore(results, { ignoreFieldNorm = Config.ignoreFieldNorm }) {
959
- results.forEach((result) => {
960
- let totalScore = 1;
961
- result.matches.forEach(({ key, norm: norm$1, score }) => {
962
- const weight = key ? key.weight : null;
963
- totalScore *= Math.pow(score === 0 && weight ? Number.EPSILON : score, (weight || 1) * (ignoreFieldNorm ? 1 : norm$1));
964
- });
965
- result.score = totalScore;
966
- });
967
- }
968
- function transformMatches(result, data) {
969
- const matches = result.matches;
970
- data.matches = [];
971
- if (!isDefined(matches)) return;
972
- matches.forEach((match) => {
973
- if (!isDefined(match.indices) || !match.indices.length) return;
974
- const { indices, value } = match;
975
- let obj = {
976
- indices,
977
- value
978
- };
979
- if (match.key) obj.key = match.key.src;
980
- if (match.idx > -1) obj.refIndex = match.idx;
981
- data.matches.push(obj);
982
- });
983
- }
984
- function transformScore(result, data) {
985
- data.score = result.score;
986
- }
987
- function format(results, docs, { includeMatches = Config.includeMatches, includeScore = Config.includeScore } = {}) {
988
- const transformers = [];
989
- if (includeMatches) transformers.push(transformMatches);
990
- if (includeScore) transformers.push(transformScore);
991
- return results.map((result) => {
992
- const { idx } = result;
993
- const data = {
994
- item: docs[idx],
995
- refIndex: idx
996
- };
997
- if (transformers.length) transformers.forEach((transformer) => {
998
- transformer(result, data);
999
- });
1000
- return data;
1001
- });
1002
- }
1003
- var Fuse = class {
1004
- constructor(docs, options = {}, index) {
1005
- this.options = {
1006
- ...Config,
1007
- ...options
1008
- };
1009
- if (this.options.useExtendedSearch && false);
1010
- this._keyStore = new KeyStore(this.options.keys);
1011
- this.setCollection(docs, index);
1012
- }
1013
- setCollection(docs, index) {
1014
- this._docs = docs;
1015
- if (index && !(index instanceof FuseIndex)) throw new Error(INCORRECT_INDEX_TYPE);
1016
- this._myIndex = index || createIndex(this.options.keys, this._docs, {
1017
- getFn: this.options.getFn,
1018
- fieldNormWeight: this.options.fieldNormWeight
1019
- });
1020
- }
1021
- add(doc) {
1022
- if (!isDefined(doc)) return;
1023
- this._docs.push(doc);
1024
- this._myIndex.add(doc);
1025
- }
1026
- remove(predicate = () => false) {
1027
- const results = [];
1028
- for (let i = 0, len = this._docs.length; i < len; i += 1) {
1029
- const doc = this._docs[i];
1030
- if (predicate(doc, i)) {
1031
- this.removeAt(i);
1032
- i -= 1;
1033
- len -= 1;
1034
- results.push(doc);
1035
- }
1036
- }
1037
- return results;
1038
- }
1039
- removeAt(idx) {
1040
- this._docs.splice(idx, 1);
1041
- this._myIndex.removeAt(idx);
1042
- }
1043
- getIndex() {
1044
- return this._myIndex;
1045
- }
1046
- search(query, { limit = -1 } = {}) {
1047
- const { includeMatches, includeScore, shouldSort, sortFn, ignoreFieldNorm } = this.options;
1048
- let results = isString(query) ? isString(this._docs[0]) ? this._searchStringList(query) : this._searchObjectList(query) : this._searchLogical(query);
1049
- computeScore(results, { ignoreFieldNorm });
1050
- if (shouldSort) results.sort(sortFn);
1051
- if (isNumber(limit) && limit > -1) results = results.slice(0, limit);
1052
- return format(results, this._docs, {
1053
- includeMatches,
1054
- includeScore
1055
- });
1056
- }
1057
- _searchStringList(query) {
1058
- const searcher = createSearcher(query, this.options);
1059
- const { records } = this._myIndex;
1060
- const results = [];
1061
- records.forEach(({ v: text, i: idx, n: norm$1 }) => {
1062
- if (!isDefined(text)) return;
1063
- const { isMatch, score, indices } = searcher.searchIn(text);
1064
- if (isMatch) results.push({
1065
- item: text,
1066
- idx,
1067
- matches: [{
1068
- score,
1069
- value: text,
1070
- norm: norm$1,
1071
- indices
1072
- }]
1073
- });
1074
- });
1075
- return results;
1076
- }
1077
- _searchLogical(query) {
1078
- const expression = parse(query, this.options);
1079
- const evaluate = (node, item, idx) => {
1080
- if (!node.children) {
1081
- const { keyId, searcher } = node;
1082
- const matches = this._findMatches({
1083
- key: this._keyStore.get(keyId),
1084
- value: this._myIndex.getValueForItemAtKeyId(item, keyId),
1085
- searcher
1086
- });
1087
- if (matches && matches.length) return [{
1088
- idx,
1089
- item,
1090
- matches
1091
- }];
1092
- return [];
1093
- }
1094
- const res = [];
1095
- for (let i = 0, len = node.children.length; i < len; i += 1) {
1096
- const child = node.children[i];
1097
- const result = evaluate(child, item, idx);
1098
- if (result.length) res.push(...result);
1099
- else if (node.operator === LogicalOperator.AND) return [];
1100
- }
1101
- return res;
1102
- };
1103
- const records = this._myIndex.records;
1104
- const resultMap = {};
1105
- const results = [];
1106
- records.forEach(({ $: item, i: idx }) => {
1107
- if (isDefined(item)) {
1108
- let expResults = evaluate(expression, item, idx);
1109
- if (expResults.length) {
1110
- if (!resultMap[idx]) {
1111
- resultMap[idx] = {
1112
- idx,
1113
- item,
1114
- matches: []
1115
- };
1116
- results.push(resultMap[idx]);
1117
- }
1118
- expResults.forEach(({ matches }) => {
1119
- resultMap[idx].matches.push(...matches);
1120
- });
1121
- }
1122
- }
1123
- });
1124
- return results;
1125
- }
1126
- _searchObjectList(query) {
1127
- const searcher = createSearcher(query, this.options);
1128
- const { keys, records } = this._myIndex;
1129
- const results = [];
1130
- records.forEach(({ $: item, i: idx }) => {
1131
- if (!isDefined(item)) return;
1132
- let matches = [];
1133
- keys.forEach((key, keyIndex) => {
1134
- matches.push(...this._findMatches({
1135
- key,
1136
- value: item[keyIndex],
1137
- searcher
1138
- }));
1139
- });
1140
- if (matches.length) results.push({
1141
- idx,
1142
- item,
1143
- matches
1144
- });
1145
- });
1146
- return results;
1147
- }
1148
- _findMatches({ key, value, searcher }) {
1149
- if (!isDefined(value)) return [];
1150
- let matches = [];
1151
- if (isArray(value)) value.forEach(({ v: text, i: idx, n: norm$1 }) => {
1152
- if (!isDefined(text)) return;
1153
- const { isMatch, score, indices } = searcher.searchIn(text);
1154
- if (isMatch) matches.push({
1155
- score,
1156
- key,
1157
- value: text,
1158
- idx,
1159
- norm: norm$1,
1160
- indices
1161
- });
1162
- });
1163
- else {
1164
- const { v: text, n: norm$1 } = value;
1165
- const { isMatch, score, indices } = searcher.searchIn(text);
1166
- if (isMatch) matches.push({
1167
- score,
1168
- key,
1169
- value: text,
1170
- norm: norm$1,
1171
- indices
1172
- });
1173
- }
1174
- return matches;
1175
- }
1176
- };
1177
- Fuse.version = "7.1.0";
1178
- Fuse.createIndex = createIndex;
1179
- Fuse.parseIndex = parseIndex;
1180
- Fuse.config = Config;
1181
- Fuse.parseQuery = parse;
1182
- register(ExtendedSearch);
1183
-
1184
- //#endregion
1185
47
  //#region src/hooks/Search/useSearchInput.ts
1186
48
  const useSearchInput = ({ initialSearchText = "", searchOrigin, onSearchSubmit }) => {
1187
49
  const track = (0, jotai.useAtomValue)(require_chat.amplitudeTrackEventAtom);
@@ -1208,7 +70,7 @@ const useSearchInput = ({ initialSearchText = "", searchOrigin, onSearchSubmit }
1208
70
  }), []);
1209
71
  const fuse = (0, react.useMemo)(() => {
1210
72
  if (!globalAutocompleteResults.length) return null;
1211
- return new Fuse(globalAutocompleteResults, fuseOptions);
73
+ return new fuse_js.default(globalAutocompleteResults, fuseOptions);
1212
74
  }, [globalAutocompleteResults, fuseOptions]);
1213
75
  const autocompleteResults = (0, react.useMemo)(() => {
1214
76
  if (!isAutocompleteEnabled || !fuse) return [];
@@ -1360,8 +222,8 @@ const productRetrievalAtom = (0, jotai.atom)({
1360
222
  error: null,
1361
223
  lastProductIds: null
1362
224
  });
1363
- const performProductRetrievalAtom = (0, jotai.atom)(null, async (get$1, set, params) => {
1364
- if (get$1(productRetrievalAtom).loading) return;
225
+ const performProductRetrievalAtom = (0, jotai.atom)(null, async (get, set, params) => {
226
+ if (get(productRetrievalAtom).loading) return;
1365
227
  set(productRetrievalAtom, {
1366
228
  data: null,
1367
229
  loading: true,
@@ -1386,14 +248,14 @@ const performProductRetrievalAtom = (0, jotai.atom)(null, async (get$1, set, par
1386
248
  });
1387
249
  }
1388
250
  });
1389
- const retrievedProductsAtom = (0, jotai.atom)((get$1) => {
1390
- return get$1(productRetrievalAtom).data?.products || [];
251
+ const retrievedProductsAtom = (0, jotai.atom)((get) => {
252
+ return get(productRetrievalAtom).data?.products || [];
1391
253
  });
1392
- const productRetrievalLoadingAtom = (0, jotai.atom)((get$1) => {
1393
- return get$1(productRetrievalAtom).loading;
254
+ const productRetrievalLoadingAtom = (0, jotai.atom)((get) => {
255
+ return get(productRetrievalAtom).loading;
1394
256
  });
1395
- const productRetrievalErrorAtom = (0, jotai.atom)((get$1) => {
1396
- return get$1(productRetrievalAtom).error;
257
+ const productRetrievalErrorAtom = (0, jotai.atom)((get) => {
258
+ return get(productRetrievalAtom).error;
1397
259
  });
1398
260
 
1399
261
  //#endregion
@@ -1632,4 +494,4 @@ const useSearch = () => {
1632
494
 
1633
495
  //#endregion
1634
496
  exports.useSearch = useSearch;
1635
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzIiwibmFtZXMiOlsib2JqIiwicGF0aCIsIm5vcm0iLCJ2YWx1ZSIsInBhdHRlcm4iLCJyZXN1bHQiLCJpdGVtIiwic2VhcmNoZXJzIiwicXVlcnkiLCJhbXBsaXR1ZGVUcmFja0V2ZW50QXRvbSIsImF1dG9jb21wbGV0ZVN0YXRlQXRvbSIsIlNwaWZmeU1ldHJpY3NFdmVudE5hbWUiLCJwcm9kdWN0UmV0cmlldmFsRnVuY3Rpb246XG4gIHwgKChwYXJhbXM6IFByb2R1Y3RSZXRyaWV2YWxQYXJhbXMpID0+IFByb21pc2U8UHJvZHVjdFJldHJpZXZhbFJlc3VsdD4pXG4gIHwgbnVsbCIsImdldCIsImVycm9yOiB1bmtub3duIiwidXNlRmVhdHVyZUZsYWdTZXJ2aWNlIiwiRmVhdHVyZUdhdGVzIiwidXNlTmV3T3JnQ29uZmlnIiwidXNlTmV3T3JnQ29uZmlnIiwib3JnU2hvcnROYW1lQXRvbSIsInNlYXJjaEF0b20iLCJmaWx0ZXJlZFNlYXJjaFByb2R1Y3RzQXRvbSIsInBlcmZvcm1TZWFyY2hBdG9tIiwic2VhcmNoUGFyYW1zQXRvbSIsImlzRmlsdGVyT3BlbkF0b20iLCJzZWFyY2hTZWxlY3RlZEZpbHRlcnNBdG9tIiwiYWRkU2VhcmNoRmlsdGVyQXRvbSIsInJlbW92ZVNlYXJjaEZpbHRlckF0b20iLCJzZWFyY2hQcm9kdWN0U29ydGluZ0F0b20iLCJjbGVhclNlYXJjaEZpbHRlcnNBdG9tIiwic2VhcmNoRmlsdGVyc0F0b20iLCJTcGlmZnlXaWRnZXRzIiwiZ2V0U2VhcmNoUmVzdWx0c1N0YXRlIiwiZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUiLCJQcm9kdWN0U29ydGluZyIsInVzZUFtcGxpdHVkZSIsIlNwaWZmeU1ldHJpY3NFdmVudE5hbWUiLCJjcmVhdGVGaWx0ZXJPcHRpb24iLCJoYW5kbGVTZWxlY3RGaWx0ZXJJdGVtOiBTZWxlY3RGaWx0ZXJJdGVtIiwiU2VhcmNoUmVzdWx0c1N0YXRlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Z1c2UuanMvZGlzdC9mdXNlLm1qcyIsIi4uLy4uLy4uL3NyYy9ob29rcy9TZWFyY2gvdXNlU2VhcmNoSW5wdXQudHMiLCIuLi8uLi8uLi9zcmMvYXRvbXMvc2VhcmNoL3Byb2R1Y3RSZXRyaWV2YWxBZGFwdGVyLnRzIiwiLi4vLi4vLi4vc3JjL2F0b21zL3NlYXJjaC9wcm9kdWN0UmV0cmlldmFsQVBJLnRzIiwiLi4vLi4vLi4vc3JjL2hvb2tzL1NlYXJjaC91c2VSZWNvbW1lbmRlZFByb2R1Y3RzLnRzIiwiLi4vLi4vLi4vc3JjL2hvb2tzL1NlYXJjaC91c2VTZWFyY2gudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRnVzZS5qcyB2Ny4xLjAgLSBMaWdodHdlaWdodCBmdXp6eS1zZWFyY2ggKGh0dHA6Ly9mdXNlanMuaW8pXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDI1IEtpcm8gUmlzayAoaHR0cDovL2tpcm8ubWUpXG4gKiBBbGwgUmlnaHRzIFJlc2VydmVkLiBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjBcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqL1xuXG5mdW5jdGlvbiBpc0FycmF5KHZhbHVlKSB7XG4gIHJldHVybiAhQXJyYXkuaXNBcnJheVxuICAgID8gZ2V0VGFnKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJ1xuICAgIDogQXJyYXkuaXNBcnJheSh2YWx1ZSlcbn1cblxuLy8gQWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL21hc3Rlci8uaW50ZXJuYWwvYmFzZVRvU3RyaW5nLmpzXG5jb25zdCBJTkZJTklUWSA9IDEgLyAwO1xuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gIC8vIEV4aXQgZWFybHkgZm9yIHN0cmluZ3MgdG8gYXZvaWQgYSBwZXJmb3JtYW5jZSBoaXQgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBsZXQgcmVzdWx0ID0gdmFsdWUgKyAnJztcbiAgcmV0dXJuIHJlc3VsdCA9PSAnMCcgJiYgMSAvIHZhbHVlID09IC1JTkZJTklUWSA/ICctMCcgOiByZXN1bHRcbn1cblxuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSlcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcidcbn1cblxuLy8gQWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL21hc3Rlci9pc0Jvb2xlYW4uanNcbmZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICByZXR1cm4gKFxuICAgIHZhbHVlID09PSB0cnVlIHx8XG4gICAgdmFsdWUgPT09IGZhbHNlIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSAnW29iamVjdCBCb29sZWFuXScpXG4gIClcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbn1cblxuLy8gQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHZhbHVlKSAmJiB2YWx1ZSAhPT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0RlZmluZWQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNCbGFuayh2YWx1ZSkge1xuICByZXR1cm4gIXZhbHVlLnRyaW0oKS5sZW5ndGhcbn1cblxuLy8gR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuLy8gQWRhcHRlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL21hc3Rlci8uaW50ZXJuYWwvZ2V0VGFnLmpzXG5mdW5jdGlvbiBnZXRUYWcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGxcbiAgICA/IHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gJ1tvYmplY3QgVW5kZWZpbmVkXSdcbiAgICAgIDogJ1tvYmplY3QgTnVsbF0nXG4gICAgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpXG59XG5cbmNvbnN0IEVYVEVOREVEX1NFQVJDSF9VTkFWQUlMQUJMRSA9ICdFeHRlbmRlZCBzZWFyY2ggaXMgbm90IGF2YWlsYWJsZSc7XG5cbmNvbnN0IElOQ09SUkVDVF9JTkRFWF9UWVBFID0gXCJJbmNvcnJlY3QgJ2luZGV4JyB0eXBlXCI7XG5cbmNvbnN0IExPR0lDQUxfU0VBUkNIX0lOVkFMSURfUVVFUllfRk9SX0tFWSA9IChrZXkpID0+XG4gIGBJbnZhbGlkIHZhbHVlIGZvciBrZXkgJHtrZXl9YDtcblxuY29uc3QgUEFUVEVSTl9MRU5HVEhfVE9PX0xBUkdFID0gKG1heCkgPT5cbiAgYFBhdHRlcm4gbGVuZ3RoIGV4Y2VlZHMgbWF4IG9mICR7bWF4fS5gO1xuXG5jb25zdCBNSVNTSU5HX0tFWV9QUk9QRVJUWSA9IChuYW1lKSA9PiBgTWlzc2luZyAke25hbWV9IHByb3BlcnR5IGluIGtleWA7XG5cbmNvbnN0IElOVkFMSURfS0VZX1dFSUdIVF9WQUxVRSA9IChrZXkpID0+XG4gIGBQcm9wZXJ0eSAnd2VpZ2h0JyBpbiBrZXkgJyR7a2V5fScgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXJgO1xuXG5jb25zdCBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5jbGFzcyBLZXlTdG9yZSB7XG4gIGNvbnN0cnVjdG9yKGtleXMpIHtcbiAgICB0aGlzLl9rZXlzID0gW107XG4gICAgdGhpcy5fa2V5TWFwID0ge307XG5cbiAgICBsZXQgdG90YWxXZWlnaHQgPSAwO1xuXG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGxldCBvYmogPSBjcmVhdGVLZXkoa2V5KTtcblxuICAgICAgdGhpcy5fa2V5cy5wdXNoKG9iaik7XG4gICAgICB0aGlzLl9rZXlNYXBbb2JqLmlkXSA9IG9iajtcblxuICAgICAgdG90YWxXZWlnaHQgKz0gb2JqLndlaWdodDtcbiAgICB9KTtcblxuICAgIC8vIE5vcm1hbGl6ZSB3ZWlnaHRzIHNvIHRoYXQgdGhlaXIgc3VtIGlzIGVxdWFsIHRvIDFcbiAgICB0aGlzLl9rZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAga2V5LndlaWdodCAvPSB0b3RhbFdlaWdodDtcbiAgICB9KTtcbiAgfVxuICBnZXQoa2V5SWQpIHtcbiAgICByZXR1cm4gdGhpcy5fa2V5TWFwW2tleUlkXVxuICB9XG4gIGtleXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2tleXNcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX2tleXMpXG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5KGtleSkge1xuICBsZXQgcGF0aCA9IG51bGw7XG4gIGxldCBpZCA9IG51bGw7XG4gIGxldCBzcmMgPSBudWxsO1xuICBsZXQgd2VpZ2h0ID0gMTtcbiAgbGV0IGdldEZuID0gbnVsbDtcblxuICBpZiAoaXNTdHJpbmcoa2V5KSB8fCBpc0FycmF5KGtleSkpIHtcbiAgICBzcmMgPSBrZXk7XG4gICAgcGF0aCA9IGNyZWF0ZUtleVBhdGgoa2V5KTtcbiAgICBpZCA9IGNyZWF0ZUtleUlkKGtleSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFoYXNPd24uY2FsbChrZXksICduYW1lJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihNSVNTSU5HX0tFWV9QUk9QRVJUWSgnbmFtZScpKVxuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSBrZXkubmFtZTtcbiAgICBzcmMgPSBuYW1lO1xuXG4gICAgaWYgKGhhc093bi5jYWxsKGtleSwgJ3dlaWdodCcpKSB7XG4gICAgICB3ZWlnaHQgPSBrZXkud2VpZ2h0O1xuXG4gICAgICBpZiAod2VpZ2h0IDw9IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKElOVkFMSURfS0VZX1dFSUdIVF9WQUxVRShuYW1lKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXRoID0gY3JlYXRlS2V5UGF0aChuYW1lKTtcbiAgICBpZCA9IGNyZWF0ZUtleUlkKG5hbWUpO1xuICAgIGdldEZuID0ga2V5LmdldEZuO1xuICB9XG5cbiAgcmV0dXJuIHsgcGF0aCwgaWQsIHdlaWdodCwgc3JjLCBnZXRGbiB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUtleVBhdGgoa2V5KSB7XG4gIHJldHVybiBpc0FycmF5KGtleSkgPyBrZXkgOiBrZXkuc3BsaXQoJy4nKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXlJZChrZXkpIHtcbiAgcmV0dXJuIGlzQXJyYXkoa2V5KSA/IGtleS5qb2luKCcuJykgOiBrZXlcbn1cblxuZnVuY3Rpb24gZ2V0KG9iaiwgcGF0aCkge1xuICBsZXQgbGlzdCA9IFtdO1xuICBsZXQgYXJyID0gZmFsc2U7XG5cbiAgY29uc3QgZGVlcEdldCA9IChvYmosIHBhdGgsIGluZGV4KSA9PiB7XG4gICAgaWYgKCFpc0RlZmluZWQob2JqKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghcGF0aFtpbmRleF0pIHtcbiAgICAgIC8vIElmIHRoZXJlJ3Mgbm8gcGF0aCBsZWZ0LCB3ZSd2ZSBhcnJpdmVkIGF0IHRoZSBvYmplY3Qgd2UgY2FyZSBhYm91dC5cbiAgICAgIGxpc3QucHVzaChvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQga2V5ID0gcGF0aFtpbmRleF07XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG5cbiAgICAgIGlmICghaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSWYgd2UncmUgYXQgdGhlIGxhc3QgdmFsdWUgaW4gdGhlIHBhdGgsIGFuZCBpZiBpdCdzIGEgc3RyaW5nL251bWJlci9ib29sLFxuICAgICAgLy8gYWRkIGl0IHRvIHRoZSBsaXN0XG4gICAgICBpZiAoXG4gICAgICAgIGluZGV4ID09PSBwYXRoLmxlbmd0aCAtIDEgJiZcbiAgICAgICAgKGlzU3RyaW5nKHZhbHVlKSB8fCBpc051bWJlcih2YWx1ZSkgfHwgaXNCb29sZWFuKHZhbHVlKSlcbiAgICAgICkge1xuICAgICAgICBsaXN0LnB1c2godG9TdHJpbmcodmFsdWUpKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgYXJyID0gdHJ1ZTtcbiAgICAgICAgLy8gU2VhcmNoIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB2YWx1ZS5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgIGRlZXBHZXQodmFsdWVbaV0sIHBhdGgsIGluZGV4ICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGF0aC5sZW5ndGgpIHtcbiAgICAgICAgLy8gQW4gb2JqZWN0LiBSZWN1cnNlIGZ1cnRoZXIuXG4gICAgICAgIGRlZXBHZXQodmFsdWUsIHBhdGgsIGluZGV4ICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChzaW5jZSBwYXRoIHVzZWQgdG8gYmUgYSBzdHJpbmcpXG4gIGRlZXBHZXQob2JqLCBpc1N0cmluZyhwYXRoKSA/IHBhdGguc3BsaXQoJy4nKSA6IHBhdGgsIDApO1xuXG4gIHJldHVybiBhcnIgPyBsaXN0IDogbGlzdFswXVxufVxuXG5jb25zdCBNYXRjaE9wdGlvbnMgPSB7XG4gIC8vIFdoZXRoZXIgdGhlIG1hdGNoZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHQgc2V0LiBXaGVuIGB0cnVlYCwgZWFjaCByZWNvcmQgaW4gdGhlIHJlc3VsdFxuICAvLyBzZXQgd2lsbCBpbmNsdWRlIHRoZSBpbmRpY2VzIG9mIHRoZSBtYXRjaGVkIGNoYXJhY3RlcnMuXG4gIC8vIFRoZXNlIGNhbiBjb25zZXF1ZW50bHkgYmUgdXNlZCBmb3IgaGlnaGxpZ2h0aW5nIHB1cnBvc2VzLlxuICBpbmNsdWRlTWF0Y2hlczogZmFsc2UsXG4gIC8vIFdoZW4gYHRydWVgLCB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24gd2lsbCBjb250aW51ZSB0byB0aGUgZW5kIG9mIGEgc2VhcmNoIHBhdHRlcm4gZXZlbiBpZlxuICAvLyBhIHBlcmZlY3QgbWF0Y2ggaGFzIGFscmVhZHkgYmVlbiBsb2NhdGVkIGluIHRoZSBzdHJpbmcuXG4gIGZpbmRBbGxNYXRjaGVzOiBmYWxzZSxcbiAgLy8gTWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IG11c3QgYmUgbWF0Y2hlZCBiZWZvcmUgYSByZXN1bHQgaXMgY29uc2lkZXJlZCBhIG1hdGNoXG4gIG1pbk1hdGNoQ2hhckxlbmd0aDogMVxufTtcblxuY29uc3QgQmFzaWNPcHRpb25zID0ge1xuICAvLyBXaGVuIGB0cnVlYCwgdGhlIGFsZ29yaXRobSBjb250aW51ZXMgc2VhcmNoaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0IGV2ZW4gaWYgYSBwZXJmZWN0XG4gIC8vIG1hdGNoIGlzIGZvdW5kIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBzYW1lIGlucHV0LlxuICBpc0Nhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICAvLyBXaGVuIGB0cnVlYCwgdGhlIGFsZ29yaXRobSB3aWxsIGlnbm9yZSBkaWFjcml0aWNzIChhY2NlbnRzKSBpbiBjb21wYXJpc29uc1xuICBpZ25vcmVEaWFjcml0aWNzOiBmYWxzZSxcbiAgLy8gV2hlbiB0cnVlLCB0aGUgbWF0Y2hpbmcgZnVuY3Rpb24gd2lsbCBjb250aW51ZSB0byB0aGUgZW5kIG9mIGEgc2VhcmNoIHBhdHRlcm4gZXZlbiBpZlxuICBpbmNsdWRlU2NvcmU6IGZhbHNlLFxuICAvLyBMaXN0IG9mIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkLiBUaGlzIGFsc28gc3VwcG9ydHMgbmVzdGVkIHByb3BlcnRpZXMuXG4gIGtleXM6IFtdLFxuICAvLyBXaGV0aGVyIHRvIHNvcnQgdGhlIHJlc3VsdCBsaXN0LCBieSBzY29yZVxuICBzaG91bGRTb3J0OiB0cnVlLFxuICAvLyBEZWZhdWx0IHNvcnQgZnVuY3Rpb246IHNvcnQgYnkgYXNjZW5kaW5nIHNjb3JlLCBhc2NlbmRpbmcgaW5kZXhcbiAgc29ydEZuOiAoYSwgYikgPT5cbiAgICBhLnNjb3JlID09PSBiLnNjb3JlID8gKGEuaWR4IDwgYi5pZHggPyAtMSA6IDEpIDogYS5zY29yZSA8IGIuc2NvcmUgPyAtMSA6IDFcbn07XG5cbmNvbnN0IEZ1enp5T3B0aW9ucyA9IHtcbiAgLy8gQXBwcm94aW1hdGVseSB3aGVyZSBpbiB0aGUgdGV4dCBpcyB0aGUgcGF0dGVybiBleHBlY3RlZCB0byBiZSBmb3VuZD9cbiAgbG9jYXRpb246IDAsXG4gIC8vIEF0IHdoYXQgcG9pbnQgZG9lcyB0aGUgbWF0Y2ggYWxnb3JpdGhtIGdpdmUgdXAuIEEgdGhyZXNob2xkIG9mICcwLjAnIHJlcXVpcmVzIGEgcGVyZmVjdCBtYXRjaFxuICAvLyAob2YgYm90aCBsZXR0ZXJzIGFuZCBsb2NhdGlvbiksIGEgdGhyZXNob2xkIG9mICcxLjAnIHdvdWxkIG1hdGNoIGFueXRoaW5nLlxuICB0aHJlc2hvbGQ6IDAuNixcbiAgLy8gRGV0ZXJtaW5lcyBob3cgY2xvc2UgdGhlIG1hdGNoIG11c3QgYmUgdG8gdGhlIGZ1enp5IGxvY2F0aW9uIChzcGVjaWZpZWQgYWJvdmUpLlxuICAvLyBBbiBleGFjdCBsZXR0ZXIgbWF0Y2ggd2hpY2ggaXMgJ2Rpc3RhbmNlJyBjaGFyYWN0ZXJzIGF3YXkgZnJvbSB0aGUgZnV6enkgbG9jYXRpb25cbiAgLy8gd291bGQgc2NvcmUgYXMgYSBjb21wbGV0ZSBtaXNtYXRjaC4gQSBkaXN0YW5jZSBvZiAnMCcgcmVxdWlyZXMgdGhlIG1hdGNoIGJlIGF0XG4gIC8vIHRoZSBleGFjdCBsb2NhdGlvbiBzcGVjaWZpZWQsIGEgdGhyZXNob2xkIG9mICcxMDAwJyB3b3VsZCByZXF1aXJlIGEgcGVyZmVjdCBtYXRjaFxuICAvLyB0byBiZSB3aXRoaW4gODAwIGNoYXJhY3RlcnMgb2YgdGhlIGZ1enp5IGxvY2F0aW9uIHRvIGJlIGZvdW5kIHVzaW5nIGEgMC44IHRocmVzaG9sZC5cbiAgZGlzdGFuY2U6IDEwMFxufTtcblxuY29uc3QgQWR2YW5jZWRPcHRpb25zID0ge1xuICAvLyBXaGVuIGB0cnVlYCwgaXQgZW5hYmxlcyB0aGUgdXNlIG9mIHVuaXgtbGlrZSBzZWFyY2ggY29tbWFuZHNcbiAgdXNlRXh0ZW5kZWRTZWFyY2g6IGZhbHNlLFxuICAvLyBUaGUgZ2V0IGZ1bmN0aW9uIHRvIHVzZSB3aGVuIGZldGNoaW5nIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuXG4gIC8vIFRoZSBkZWZhdWx0IHdpbGwgc2VhcmNoIG5lc3RlZCBwYXRocyAqaWUgZm9vLmJhci5iYXoqXG4gIGdldEZuOiBnZXQsXG4gIC8vIFdoZW4gYHRydWVgLCBzZWFyY2ggd2lsbCBpZ25vcmUgYGxvY2F0aW9uYCBhbmQgYGRpc3RhbmNlYCwgc28gaXQgd29uJ3QgbWF0dGVyXG4gIC8vIHdoZXJlIGluIHRoZSBzdHJpbmcgdGhlIHBhdHRlcm4gYXBwZWFycy5cbiAgLy8gTW9yZSBpbmZvOiBodHRwczovL2Z1c2Vqcy5pby9jb25jZXB0cy9zY29yaW5nLXRoZW9yeS5odG1sI2Z1enppbmVzcy1zY29yZVxuICBpZ25vcmVMb2NhdGlvbjogZmFsc2UsXG4gIC8vIFdoZW4gYHRydWVgLCB0aGUgY2FsY3VsYXRpb24gZm9yIHRoZSByZWxldmFuY2Ugc2NvcmUgKHVzZWQgZm9yIHNvcnRpbmcpIHdpbGxcbiAgLy8gaWdub3JlIHRoZSBmaWVsZC1sZW5ndGggbm9ybS5cbiAgLy8gTW9yZSBpbmZvOiBodHRwczovL2Z1c2Vqcy5pby9jb25jZXB0cy9zY29yaW5nLXRoZW9yeS5odG1sI2ZpZWxkLWxlbmd0aC1ub3JtXG4gIGlnbm9yZUZpZWxkTm9ybTogZmFsc2UsXG4gIC8vIFRoZSB3ZWlnaHQgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIGZpZWxkIGxlbmd0aCBub3JtIGVmZmVjdHMgc2NvcmluZy5cbiAgZmllbGROb3JtV2VpZ2h0OiAxXG59O1xuXG52YXIgQ29uZmlnID0ge1xuICAuLi5CYXNpY09wdGlvbnMsXG4gIC4uLk1hdGNoT3B0aW9ucyxcbiAgLi4uRnV6enlPcHRpb25zLFxuICAuLi5BZHZhbmNlZE9wdGlvbnNcbn07XG5cbmNvbnN0IFNQQUNFID0gL1teIF0rL2c7XG5cbi8vIEZpZWxkLWxlbmd0aCBub3JtOiB0aGUgc2hvcnRlciB0aGUgZmllbGQsIHRoZSBoaWdoZXIgdGhlIHdlaWdodC5cbi8vIFNldCB0byAzIGRlY2ltYWxzIHRvIHJlZHVjZSBpbmRleCBzaXplLlxuZnVuY3Rpb24gbm9ybSh3ZWlnaHQgPSAxLCBtYW50aXNzYSA9IDMpIHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG0gPSBNYXRoLnBvdygxMCwgbWFudGlzc2EpO1xuXG4gIHJldHVybiB7XG4gICAgZ2V0KHZhbHVlKSB7XG4gICAgICBjb25zdCBudW1Ub2tlbnMgPSB2YWx1ZS5tYXRjaChTUEFDRSkubGVuZ3RoO1xuXG4gICAgICBpZiAoY2FjaGUuaGFzKG51bVRva2VucykpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlLmdldChudW1Ub2tlbnMpXG4gICAgICB9XG5cbiAgICAgIC8vIERlZmF1bHQgZnVuY3Rpb24gaXMgMS9zcXJ0KHgpLCB3ZWlnaHQgbWFrZXMgdGhhdCB2YXJpYWJsZVxuICAgICAgY29uc3Qgbm9ybSA9IDEgLyBNYXRoLnBvdyhudW1Ub2tlbnMsIDAuNSAqIHdlaWdodCk7XG5cbiAgICAgIC8vIEluIHBsYWNlIG9mIGB0b0ZpeGVkKG1hbnRpc3NhKWAsIGZvciBmYXN0ZXIgY29tcHV0YXRpb25cbiAgICAgIGNvbnN0IG4gPSBwYXJzZUZsb2F0KE1hdGgucm91bmQobm9ybSAqIG0pIC8gbSk7XG5cbiAgICAgIGNhY2hlLnNldChudW1Ub2tlbnMsIG4pO1xuXG4gICAgICByZXR1cm4gblxuICAgIH0sXG4gICAgY2xlYXIoKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBGdXNlSW5kZXgge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgZ2V0Rm4gPSBDb25maWcuZ2V0Rm4sXG4gICAgZmllbGROb3JtV2VpZ2h0ID0gQ29uZmlnLmZpZWxkTm9ybVdlaWdodFxuICB9ID0ge30pIHtcbiAgICB0aGlzLm5vcm0gPSBub3JtKGZpZWxkTm9ybVdlaWdodCwgMyk7XG4gICAgdGhpcy5nZXRGbiA9IGdldEZuO1xuICAgIHRoaXMuaXNDcmVhdGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLnNldEluZGV4UmVjb3JkcygpO1xuICB9XG4gIHNldFNvdXJjZXMoZG9jcyA9IFtdKSB7XG4gICAgdGhpcy5kb2NzID0gZG9jcztcbiAgfVxuICBzZXRJbmRleFJlY29yZHMocmVjb3JkcyA9IFtdKSB7XG4gICAgdGhpcy5yZWNvcmRzID0gcmVjb3JkcztcbiAgfVxuICBzZXRLZXlzKGtleXMgPSBbXSkge1xuICAgIHRoaXMua2V5cyA9IGtleXM7XG4gICAgdGhpcy5fa2V5c01hcCA9IHt9O1xuICAgIGtleXMuZm9yRWFjaCgoa2V5LCBpZHgpID0+IHtcbiAgICAgIHRoaXMuX2tleXNNYXBba2V5LmlkXSA9IGlkeDtcbiAgICB9KTtcbiAgfVxuICBjcmVhdGUoKSB7XG4gICAgaWYgKHRoaXMuaXNDcmVhdGVkIHx8ICF0aGlzLmRvY3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmlzQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAvLyBMaXN0IGlzIEFycmF5PFN0cmluZz5cbiAgICBpZiAoaXNTdHJpbmcodGhpcy5kb2NzWzBdKSkge1xuICAgICAgdGhpcy5kb2NzLmZvckVhY2goKGRvYywgZG9jSW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy5fYWRkU3RyaW5nKGRvYywgZG9jSW5kZXgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExpc3QgaXMgQXJyYXk8T2JqZWN0PlxuICAgICAgdGhpcy5kb2NzLmZvckVhY2goKGRvYywgZG9jSW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy5fYWRkT2JqZWN0KGRvYywgZG9jSW5kZXgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5ub3JtLmNsZWFyKCk7XG4gIH1cbiAgLy8gQWRkcyBhIGRvYyB0byB0aGUgZW5kIG9mIHRoZSBpbmRleFxuICBhZGQoZG9jKSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5zaXplKCk7XG5cbiAgICBpZiAoaXNTdHJpbmcoZG9jKSkge1xuICAgICAgdGhpcy5fYWRkU3RyaW5nKGRvYywgaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYWRkT2JqZWN0KGRvYywgaWR4KTtcbiAgICB9XG4gIH1cbiAgLy8gUmVtb3ZlcyB0aGUgZG9jIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIGluZGV4XG4gIHJlbW92ZUF0KGlkeCkge1xuICAgIHRoaXMucmVjb3Jkcy5zcGxpY2UoaWR4LCAxKTtcblxuICAgIC8vIENoYW5nZSByZWYgaW5kZXggb2YgZXZlcnkgc3Vic3F1ZW50IGRvY1xuICAgIGZvciAobGV0IGkgPSBpZHgsIGxlbiA9IHRoaXMuc2l6ZSgpOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHRoaXMucmVjb3Jkc1tpXS5pIC09IDE7XG4gICAgfVxuICB9XG4gIGdldFZhbHVlRm9ySXRlbUF0S2V5SWQoaXRlbSwga2V5SWQpIHtcbiAgICByZXR1cm4gaXRlbVt0aGlzLl9rZXlzTWFwW2tleUlkXV1cbiAgfVxuICBzaXplKCkge1xuICAgIHJldHVybiB0aGlzLnJlY29yZHMubGVuZ3RoXG4gIH1cbiAgX2FkZFN0cmluZyhkb2MsIGRvY0luZGV4KSB7XG4gICAgaWYgKCFpc0RlZmluZWQoZG9jKSB8fCBpc0JsYW5rKGRvYykpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCByZWNvcmQgPSB7XG4gICAgICB2OiBkb2MsXG4gICAgICBpOiBkb2NJbmRleCxcbiAgICAgIG46IHRoaXMubm9ybS5nZXQoZG9jKVxuICAgIH07XG5cbiAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xuICB9XG4gIF9hZGRPYmplY3QoZG9jLCBkb2NJbmRleCkge1xuICAgIGxldCByZWNvcmQgPSB7IGk6IGRvY0luZGV4LCAkOiB7fSB9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGV2ZXJ5IGtleSAoaS5lLCBwYXRoKSwgYW5kIGZldGNoIHRoZSB2YWx1ZSBhdCB0aGF0IGtleVxuICAgIHRoaXMua2V5cy5mb3JFYWNoKChrZXksIGtleUluZGV4KSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBrZXkuZ2V0Rm4gPyBrZXkuZ2V0Rm4oZG9jKSA6IHRoaXMuZ2V0Rm4oZG9jLCBrZXkucGF0aCk7XG5cbiAgICAgIGlmICghaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGxldCBzdWJSZWNvcmRzID0gW107XG4gICAgICAgIGNvbnN0IHN0YWNrID0gW3sgbmVzdGVkQXJySW5kZXg6IC0xLCB2YWx1ZSB9XTtcblxuICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgeyBuZXN0ZWRBcnJJbmRleCwgdmFsdWUgfSA9IHN0YWNrLnBvcCgpO1xuXG4gICAgICAgICAgaWYgKCFpc0RlZmluZWQodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgIWlzQmxhbmsodmFsdWUpKSB7XG4gICAgICAgICAgICBsZXQgc3ViUmVjb3JkID0ge1xuICAgICAgICAgICAgICB2OiB2YWx1ZSxcbiAgICAgICAgICAgICAgaTogbmVzdGVkQXJySW5kZXgsXG4gICAgICAgICAgICAgIG46IHRoaXMubm9ybS5nZXQodmFsdWUpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBzdWJSZWNvcmRzLnB1c2goc3ViUmVjb3JkKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKChpdGVtLCBrKSA9PiB7XG4gICAgICAgICAgICAgIHN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgIG5lc3RlZEFyckluZGV4OiBrLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIDtcbiAgICAgICAgfVxuICAgICAgICByZWNvcmQuJFtrZXlJbmRleF0gPSBzdWJSZWNvcmRzO1xuICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyh2YWx1ZSkgJiYgIWlzQmxhbmsodmFsdWUpKSB7XG4gICAgICAgIGxldCBzdWJSZWNvcmQgPSB7XG4gICAgICAgICAgdjogdmFsdWUsXG4gICAgICAgICAgbjogdGhpcy5ub3JtLmdldCh2YWx1ZSlcbiAgICAgICAgfTtcblxuICAgICAgICByZWNvcmQuJFtrZXlJbmRleF0gPSBzdWJSZWNvcmQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlY29yZHMucHVzaChyZWNvcmQpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5czogdGhpcy5rZXlzLFxuICAgICAgcmVjb3JkczogdGhpcy5yZWNvcmRzXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUluZGV4KFxuICBrZXlzLFxuICBkb2NzLFxuICB7IGdldEZuID0gQ29uZmlnLmdldEZuLCBmaWVsZE5vcm1XZWlnaHQgPSBDb25maWcuZmllbGROb3JtV2VpZ2h0IH0gPSB7fVxuKSB7XG4gIGNvbnN0IG15SW5kZXggPSBuZXcgRnVzZUluZGV4KHsgZ2V0Rm4sIGZpZWxkTm9ybVdlaWdodCB9KTtcbiAgbXlJbmRleC5zZXRLZXlzKGtleXMubWFwKGNyZWF0ZUtleSkpO1xuICBteUluZGV4LnNldFNvdXJjZXMoZG9jcyk7XG4gIG15SW5kZXguY3JlYXRlKCk7XG4gIHJldHVybiBteUluZGV4XG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5kZXgoXG4gIGRhdGEsXG4gIHsgZ2V0Rm4gPSBDb25maWcuZ2V0Rm4sIGZpZWxkTm9ybVdlaWdodCA9IENvbmZpZy5maWVsZE5vcm1XZWlnaHQgfSA9IHt9XG4pIHtcbiAgY29uc3QgeyBrZXlzLCByZWNvcmRzIH0gPSBkYXRhO1xuICBjb25zdCBteUluZGV4ID0gbmV3IEZ1c2VJbmRleCh7IGdldEZuLCBmaWVsZE5vcm1XZWlnaHQgfSk7XG4gIG15SW5kZXguc2V0S2V5cyhrZXlzKTtcbiAgbXlJbmRleC5zZXRJbmRleFJlY29yZHMocmVjb3Jkcyk7XG4gIHJldHVybiBteUluZGV4XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTY29yZSQxKFxuICBwYXR0ZXJuLFxuICB7XG4gICAgZXJyb3JzID0gMCxcbiAgICBjdXJyZW50TG9jYXRpb24gPSAwLFxuICAgIGV4cGVjdGVkTG9jYXRpb24gPSAwLFxuICAgIGRpc3RhbmNlID0gQ29uZmlnLmRpc3RhbmNlLFxuICAgIGlnbm9yZUxvY2F0aW9uID0gQ29uZmlnLmlnbm9yZUxvY2F0aW9uXG4gIH0gPSB7fVxuKSB7XG4gIGNvbnN0IGFjY3VyYWN5ID0gZXJyb3JzIC8gcGF0dGVybi5sZW5ndGg7XG5cbiAgaWYgKGlnbm9yZUxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIGFjY3VyYWN5XG4gIH1cblxuICBjb25zdCBwcm94aW1pdHkgPSBNYXRoLmFicyhleHBlY3RlZExvY2F0aW9uIC0gY3VycmVudExvY2F0aW9uKTtcblxuICBpZiAoIWRpc3RhbmNlKSB7XG4gICAgLy8gRG9kZ2UgZGl2aWRlIGJ5IHplcm8gZXJyb3IuXG4gICAgcmV0dXJuIHByb3hpbWl0eSA/IDEuMCA6IGFjY3VyYWN5XG4gIH1cblxuICByZXR1cm4gYWNjdXJhY3kgKyBwcm94aW1pdHkgLyBkaXN0YW5jZVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0TWFza1RvSW5kaWNlcyhcbiAgbWF0Y2htYXNrID0gW10sXG4gIG1pbk1hdGNoQ2hhckxlbmd0aCA9IENvbmZpZy5taW5NYXRjaENoYXJMZW5ndGhcbikge1xuICBsZXQgaW5kaWNlcyA9IFtdO1xuICBsZXQgc3RhcnQgPSAtMTtcbiAgbGV0IGVuZCA9IC0xO1xuICBsZXQgaSA9IDA7XG5cbiAgZm9yIChsZXQgbGVuID0gbWF0Y2htYXNrLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgbGV0IG1hdGNoID0gbWF0Y2htYXNrW2ldO1xuICAgIGlmIChtYXRjaCAmJiBzdGFydCA9PT0gLTEpIHtcbiAgICAgIHN0YXJ0ID0gaTtcbiAgICB9IGVsc2UgaWYgKCFtYXRjaCAmJiBzdGFydCAhPT0gLTEpIHtcbiAgICAgIGVuZCA9IGkgLSAxO1xuICAgICAgaWYgKGVuZCAtIHN0YXJ0ICsgMSA+PSBtaW5NYXRjaENoYXJMZW5ndGgpIHtcbiAgICAgICAgaW5kaWNlcy5wdXNoKFtzdGFydCwgZW5kXSk7XG4gICAgICB9XG4gICAgICBzdGFydCA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIC8vIChpLTEgLSBzdGFydCkgKyAxID0+IGkgLSBzdGFydFxuICBpZiAobWF0Y2htYXNrW2kgLSAxXSAmJiBpIC0gc3RhcnQgPj0gbWluTWF0Y2hDaGFyTGVuZ3RoKSB7XG4gICAgaW5kaWNlcy5wdXNoKFtzdGFydCwgaSAtIDFdKTtcbiAgfVxuXG4gIHJldHVybiBpbmRpY2VzXG59XG5cbi8vIE1hY2hpbmUgd29yZCBzaXplXG5jb25zdCBNQVhfQklUUyA9IDMyO1xuXG5mdW5jdGlvbiBzZWFyY2goXG4gIHRleHQsXG4gIHBhdHRlcm4sXG4gIHBhdHRlcm5BbHBoYWJldCxcbiAge1xuICAgIGxvY2F0aW9uID0gQ29uZmlnLmxvY2F0aW9uLFxuICAgIGRpc3RhbmNlID0gQ29uZmlnLmRpc3RhbmNlLFxuICAgIHRocmVzaG9sZCA9IENvbmZpZy50aHJlc2hvbGQsXG4gICAgZmluZEFsbE1hdGNoZXMgPSBDb25maWcuZmluZEFsbE1hdGNoZXMsXG4gICAgbWluTWF0Y2hDaGFyTGVuZ3RoID0gQ29uZmlnLm1pbk1hdGNoQ2hhckxlbmd0aCxcbiAgICBpbmNsdWRlTWF0Y2hlcyA9IENvbmZpZy5pbmNsdWRlTWF0Y2hlcyxcbiAgICBpZ25vcmVMb2NhdGlvbiA9IENvbmZpZy5pZ25vcmVMb2NhdGlvblxuICB9ID0ge31cbikge1xuICBpZiAocGF0dGVybi5sZW5ndGggPiBNQVhfQklUUykge1xuICAgIHRocm93IG5ldyBFcnJvcihQQVRURVJOX0xFTkdUSF9UT09fTEFSR0UoTUFYX0JJVFMpKVxuICB9XG5cbiAgY29uc3QgcGF0dGVybkxlbiA9IHBhdHRlcm4ubGVuZ3RoO1xuICAvLyBTZXQgc3RhcnRpbmcgbG9jYXRpb24gYXQgYmVnaW5uaW5nIHRleHQgYW5kIGluaXRpYWxpemUgdGhlIGFscGhhYmV0LlxuICBjb25zdCB0ZXh0TGVuID0gdGV4dC5sZW5ndGg7XG4gIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVuIGxvY2F0aW9uID4gdGV4dC5sZW5ndGhcbiAgY29uc3QgZXhwZWN0ZWRMb2NhdGlvbiA9IE1hdGgubWF4KDAsIE1hdGgubWluKGxvY2F0aW9uLCB0ZXh0TGVuKSk7XG4gIC8vIEhpZ2hlc3Qgc2NvcmUgYmV5b25kIHdoaWNoIHdlIGdpdmUgdXAuXG4gIGxldCBjdXJyZW50VGhyZXNob2xkID0gdGhyZXNob2xkO1xuICAvLyBJcyB0aGVyZSBhIG5lYXJieSBleGFjdCBtYXRjaD8gKHNwZWVkdXApXG4gIGxldCBiZXN0TG9jYXRpb24gPSBleHBlY3RlZExvY2F0aW9uO1xuXG4gIC8vIFBlcmZvcm1hbmNlOiBvbmx5IGNvbXB1dGVyIG1hdGNoZXMgd2hlbiB0aGUgbWluTWF0Y2hDaGFyTGVuZ3RoID4gMVxuICAvLyBPUiBpZiBgaW5jbHVkZU1hdGNoZXNgIGlzIHRydWUuXG4gIGNvbnN0IGNvbXB1dGVNYXRjaGVzID0gbWluTWF0Y2hDaGFyTGVuZ3RoID4gMSB8fCBpbmNsdWRlTWF0Y2hlcztcbiAgLy8gQSBtYXNrIG9mIHRoZSBtYXRjaGVzLCB1c2VkIGZvciBidWlsZGluZyB0aGUgaW5kaWNlc1xuICBjb25zdCBtYXRjaE1hc2sgPSBjb21wdXRlTWF0Y2hlcyA/IEFycmF5KHRleHRMZW4pIDogW107XG5cbiAgbGV0IGluZGV4O1xuXG4gIC8vIEdldCBhbGwgZXhhY3QgbWF0Y2hlcywgaGVyZSBmb3Igc3BlZWQgdXBcbiAgd2hpbGUgKChpbmRleCA9IHRleHQuaW5kZXhPZihwYXR0ZXJuLCBiZXN0TG9jYXRpb24pKSA+IC0xKSB7XG4gICAgbGV0IHNjb3JlID0gY29tcHV0ZVNjb3JlJDEocGF0dGVybiwge1xuICAgICAgY3VycmVudExvY2F0aW9uOiBpbmRleCxcbiAgICAgIGV4cGVjdGVkTG9jYXRpb24sXG4gICAgICBkaXN0YW5jZSxcbiAgICAgIGlnbm9yZUxvY2F0aW9uXG4gICAgfSk7XG5cbiAgICBjdXJyZW50VGhyZXNob2xkID0gTWF0aC5taW4oc2NvcmUsIGN1cnJlbnRUaHJlc2hvbGQpO1xuICAgIGJlc3RMb2NhdGlvbiA9IGluZGV4ICsgcGF0dGVybkxlbjtcblxuICAgIGlmIChjb21wdXRlTWF0Y2hlcykge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgd2hpbGUgKGkgPCBwYXR0ZXJuTGVuKSB7XG4gICAgICAgIG1hdGNoTWFza1tpbmRleCArIGldID0gMTtcbiAgICAgICAgaSArPSAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJlc2V0IHRoZSBiZXN0IGxvY2F0aW9uXG4gIGJlc3RMb2NhdGlvbiA9IC0xO1xuXG4gIGxldCBsYXN0Qml0QXJyID0gW107XG4gIGxldCBmaW5hbFNjb3JlID0gMTtcbiAgbGV0IGJpbk1heCA9IHBhdHRlcm5MZW4gKyB0ZXh0TGVuO1xuXG4gIGNvbnN0IG1hc2sgPSAxIDw8IChwYXR0ZXJuTGVuIC0gMSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuTGVuOyBpICs9IDEpIHtcbiAgICAvLyBTY2FuIGZvciB0aGUgYmVzdCBtYXRjaDsgZWFjaCBpdGVyYXRpb24gYWxsb3dzIGZvciBvbmUgbW9yZSBlcnJvci5cbiAgICAvLyBSdW4gYSBiaW5hcnkgc2VhcmNoIHRvIGRldGVybWluZSBob3cgZmFyIGZyb20gdGhlIG1hdGNoIGxvY2F0aW9uIHdlIGNhbiBzdHJheVxuICAgIC8vIGF0IHRoaXMgZXJyb3IgbGV2ZWwuXG4gICAgbGV0IGJpbk1pbiA9IDA7XG4gICAgbGV0IGJpbk1pZCA9IGJpbk1heDtcblxuICAgIHdoaWxlIChiaW5NaW4gPCBiaW5NaWQpIHtcbiAgICAgIGNvbnN0IHNjb3JlID0gY29tcHV0ZVNjb3JlJDEocGF0dGVybiwge1xuICAgICAgICBlcnJvcnM6IGksXG4gICAgICAgIGN1cnJlbnRMb2NhdGlvbjogZXhwZWN0ZWRMb2NhdGlvbiArIGJpbk1pZCxcbiAgICAgICAgZXhwZWN0ZWRMb2NhdGlvbixcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIGlnbm9yZUxvY2F0aW9uXG4gICAgICB9KTtcblxuICAgICAgaWYgKHNjb3JlIDw9IGN1cnJlbnRUaHJlc2hvbGQpIHtcbiAgICAgICAgYmluTWluID0gYmluTWlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmluTWF4ID0gYmluTWlkO1xuICAgICAgfVxuXG4gICAgICBiaW5NaWQgPSBNYXRoLmZsb29yKChiaW5NYXggLSBiaW5NaW4pIC8gMiArIGJpbk1pbik7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSByZXN1bHQgZnJvbSB0aGlzIGl0ZXJhdGlvbiBhcyB0aGUgbWF4aW11bSBmb3IgdGhlIG5leHQuXG4gICAgYmluTWF4ID0gYmluTWlkO1xuXG4gICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoMSwgZXhwZWN0ZWRMb2NhdGlvbiAtIGJpbk1pZCArIDEpO1xuICAgIGxldCBmaW5pc2ggPSBmaW5kQWxsTWF0Y2hlc1xuICAgICAgPyB0ZXh0TGVuXG4gICAgICA6IE1hdGgubWluKGV4cGVjdGVkTG9jYXRpb24gKyBiaW5NaWQsIHRleHRMZW4pICsgcGF0dGVybkxlbjtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIGJpdCBhcnJheVxuICAgIGxldCBiaXRBcnIgPSBBcnJheShmaW5pc2ggKyAyKTtcblxuICAgIGJpdEFycltmaW5pc2ggKyAxXSA9ICgxIDw8IGkpIC0gMTtcblxuICAgIGZvciAobGV0IGogPSBmaW5pc2g7IGogPj0gc3RhcnQ7IGogLT0gMSkge1xuICAgICAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IGogLSAxO1xuICAgICAgbGV0IGNoYXJNYXRjaCA9IHBhdHRlcm5BbHBoYWJldFt0ZXh0LmNoYXJBdChjdXJyZW50TG9jYXRpb24pXTtcblxuICAgICAgaWYgKGNvbXB1dGVNYXRjaGVzKSB7XG4gICAgICAgIC8vIFNwZWVkIHVwOiBxdWljayBib29sIHRvIGludCBjb252ZXJzaW9uIChpLmUsIGBjaGFyTWF0Y2ggPyAxIDogMGApXG4gICAgICAgIG1hdGNoTWFza1tjdXJyZW50TG9jYXRpb25dID0gKyEhY2hhck1hdGNoO1xuICAgICAgfVxuXG4gICAgICAvLyBGaXJzdCBwYXNzOiBleGFjdCBtYXRjaFxuICAgICAgYml0QXJyW2pdID0gKChiaXRBcnJbaiArIDFdIDw8IDEpIHwgMSkgJiBjaGFyTWF0Y2g7XG5cbiAgICAgIC8vIFN1YnNlcXVlbnQgcGFzc2VzOiBmdXp6eSBtYXRjaFxuICAgICAgaWYgKGkpIHtcbiAgICAgICAgYml0QXJyW2pdIHw9XG4gICAgICAgICAgKChsYXN0Qml0QXJyW2ogKyAxXSB8IGxhc3RCaXRBcnJbal0pIDw8IDEpIHwgMSB8IGxhc3RCaXRBcnJbaiArIDFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoYml0QXJyW2pdICYgbWFzaykge1xuICAgICAgICBmaW5hbFNjb3JlID0gY29tcHV0ZVNjb3JlJDEocGF0dGVybiwge1xuICAgICAgICAgIGVycm9yczogaSxcbiAgICAgICAgICBjdXJyZW50TG9jYXRpb24sXG4gICAgICAgICAgZXhwZWN0ZWRMb2NhdGlvbixcbiAgICAgICAgICBkaXN0YW5jZSxcbiAgICAgICAgICBpZ25vcmVMb2NhdGlvblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBUaGlzIG1hdGNoIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBiZXR0ZXIgdGhhbiBhbnkgZXhpc3RpbmcgbWF0Y2guXG4gICAgICAgIC8vIEJ1dCBjaGVjayBhbnl3YXkuXG4gICAgICAgIGlmIChmaW5hbFNjb3JlIDw9IGN1cnJlbnRUaHJlc2hvbGQpIHtcbiAgICAgICAgICAvLyBJbmRlZWQgaXQgaXNcbiAgICAgICAgICBjdXJyZW50VGhyZXNob2xkID0gZmluYWxTY29yZTtcbiAgICAgICAgICBiZXN0TG9jYXRpb24gPSBjdXJyZW50TG9jYXRpb247XG5cbiAgICAgICAgICAvLyBBbHJlYWR5IHBhc3NlZCBgbG9jYCwgZG93bmhpbGwgZnJvbSBoZXJlIG9uIGluLlxuICAgICAgICAgIGlmIChiZXN0TG9jYXRpb24gPD0gZXhwZWN0ZWRMb2NhdGlvbikge1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBXaGVuIHBhc3NpbmcgYGJlc3RMb2NhdGlvbmAsIGRvbid0IGV4Y2VlZCBvdXIgY3VycmVudCBkaXN0YW5jZSBmcm9tIGBleHBlY3RlZExvY2F0aW9uYC5cbiAgICAgICAgICBzdGFydCA9IE1hdGgubWF4KDEsIDIgKiBleHBlY3RlZExvY2F0aW9uIC0gYmVzdExvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGhvcGUgZm9yIGEgKGJldHRlcikgbWF0Y2ggYXQgZ3JlYXRlciBlcnJvciBsZXZlbHMuXG4gICAgY29uc3Qgc2NvcmUgPSBjb21wdXRlU2NvcmUkMShwYXR0ZXJuLCB7XG4gICAgICBlcnJvcnM6IGkgKyAxLFxuICAgICAgY3VycmVudExvY2F0aW9uOiBleHBlY3RlZExvY2F0aW9uLFxuICAgICAgZXhwZWN0ZWRMb2NhdGlvbixcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgaWdub3JlTG9jYXRpb25cbiAgICB9KTtcblxuICAgIGlmIChzY29yZSA+IGN1cnJlbnRUaHJlc2hvbGQpIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgbGFzdEJpdEFyciA9IGJpdEFycjtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBpc01hdGNoOiBiZXN0TG9jYXRpb24gPj0gMCxcbiAgICAvLyBDb3VudCBleGFjdCBtYXRjaGVzICh0aG9zZSB3aXRoIGEgc2NvcmUgb2YgMCkgdG8gYmUgXCJhbG1vc3RcIiBleGFjdFxuICAgIHNjb3JlOiBNYXRoLm1heCgwLjAwMSwgZmluYWxTY29yZSlcbiAgfTtcblxuICBpZiAoY29tcHV0ZU1hdGNoZXMpIHtcbiAgICBjb25zdCBpbmRpY2VzID0gY29udmVydE1hc2tUb0luZGljZXMobWF0Y2hNYXNrLCBtaW5NYXRjaENoYXJMZW5ndGgpO1xuICAgIGlmICghaW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5pc01hdGNoID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgcmVzdWx0LmluZGljZXMgPSBpbmRpY2VzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gY3JlYXRlUGF0dGVybkFscGhhYmV0KHBhdHRlcm4pIHtcbiAgbGV0IG1hc2sgPSB7fTtcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gcGF0dGVybi5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgIGNvbnN0IGNoYXIgPSBwYXR0ZXJuLmNoYXJBdChpKTtcbiAgICBtYXNrW2NoYXJdID0gKG1hc2tbY2hhcl0gfHwgMCkgfCAoMSA8PCAobGVuIC0gaSAtIDEpKTtcbiAgfVxuXG4gIHJldHVybiBtYXNrXG59XG5cbmNvbnN0IHN0cmlwRGlhY3JpdGljcyA9IFN0cmluZy5wcm90b3R5cGUubm9ybWFsaXplXG4gICAgPyAoKHN0cikgPT4gc3RyLm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2RlxcdTA0ODMtXFx1MDQ4OVxcdTA1OTEtXFx1MDVCRFxcdTA1QkZcXHUwNUMxXFx1MDVDMlxcdTA1QzRcXHUwNUM1XFx1MDVDN1xcdTA2MTAtXFx1MDYxQVxcdTA2NEItXFx1MDY1RlxcdTA2NzBcXHUwNkQ2LVxcdTA2RENcXHUwNkRGLVxcdTA2RTRcXHUwNkU3XFx1MDZFOFxcdTA2RUEtXFx1MDZFRFxcdTA3MTFcXHUwNzMwLVxcdTA3NEFcXHUwN0E2LVxcdTA3QjBcXHUwN0VCLVxcdTA3RjNcXHUwN0ZEXFx1MDgxNi1cXHUwODE5XFx1MDgxQi1cXHUwODIzXFx1MDgyNS1cXHUwODI3XFx1MDgyOS1cXHUwODJEXFx1MDg1OS1cXHUwODVCXFx1MDhEMy1cXHUwOEUxXFx1MDhFMy1cXHUwOTAzXFx1MDkzQS1cXHUwOTNDXFx1MDkzRS1cXHUwOTRGXFx1MDk1MS1cXHUwOTU3XFx1MDk2MlxcdTA5NjNcXHUwOTgxLVxcdTA5ODNcXHUwOUJDXFx1MDlCRS1cXHUwOUM0XFx1MDlDN1xcdTA5QzhcXHUwOUNCLVxcdTA5Q0RcXHUwOUQ3XFx1MDlFMlxcdTA5RTNcXHUwOUZFXFx1MEEwMS1cXHUwQTAzXFx1MEEzQ1xcdTBBM0UtXFx1MEE0MlxcdTBBNDdcXHUwQTQ4XFx1MEE0Qi1cXHUwQTREXFx1MEE1MVxcdTBBNzBcXHUwQTcxXFx1MEE3NVxcdTBBODEtXFx1MEE4M1xcdTBBQkNcXHUwQUJFLVxcdTBBQzVcXHUwQUM3LVxcdTBBQzlcXHUwQUNCLVxcdTBBQ0RcXHUwQUUyXFx1MEFFM1xcdTBBRkEtXFx1MEFGRlxcdTBCMDEtXFx1MEIwM1xcdTBCM0NcXHUwQjNFLVxcdTBCNDRcXHUwQjQ3XFx1MEI0OFxcdTBCNEItXFx1MEI0RFxcdTBCNTZcXHUwQjU3XFx1MEI2MlxcdTBCNjNcXHUwQjgyXFx1MEJCRS1cXHUwQkMyXFx1MEJDNi1cXHUwQkM4XFx1MEJDQS1cXHUwQkNEXFx1MEJEN1xcdTBDMDAtXFx1MEMwNFxcdTBDM0UtXFx1MEM0NFxcdTBDNDYtXFx1MEM0OFxcdTBDNEEtXFx1MEM0RFxcdTBDNTVcXHUwQzU2XFx1MEM2MlxcdTBDNjNcXHUwQzgxLVxcdTBDODNcXHUwQ0JDXFx1MENCRS1cXHUwQ0M0XFx1MENDNi1cXHUwQ0M4XFx1MENDQS1cXHUwQ0NEXFx1MENENVxcdTBDRDZcXHUwQ0UyXFx1MENFM1xcdTBEMDAtXFx1MEQwM1xcdTBEM0JcXHUwRDNDXFx1MEQzRS1cXHUwRDQ0XFx1MEQ0Ni1cXHUwRDQ4XFx1MEQ0QS1cXHUwRDREXFx1MEQ1N1xcdTBENjJcXHUwRDYzXFx1MEQ4MlxcdTBEODNcXHUwRENBXFx1MERDRi1cXHUwREQ0XFx1MERENlxcdTBERDgtXFx1MERERlxcdTBERjJcXHUwREYzXFx1MEUzMVxcdTBFMzQtXFx1MEUzQVxcdTBFNDctXFx1MEU0RVxcdTBFQjFcXHUwRUI0LVxcdTBFQjlcXHUwRUJCXFx1MEVCQ1xcdTBFQzgtXFx1MEVDRFxcdTBGMThcXHUwRjE5XFx1MEYzNVxcdTBGMzdcXHUwRjM5XFx1MEYzRVxcdTBGM0ZcXHUwRjcxLVxcdTBGODRcXHUwRjg2XFx1MEY4N1xcdTBGOEQtXFx1MEY5N1xcdTBGOTktXFx1MEZCQ1xcdTBGQzZcXHUxMDJCLVxcdTEwM0VcXHUxMDU2LVxcdTEwNTlcXHUxMDVFLVxcdTEwNjBcXHUxMDYyLVxcdTEwNjRcXHUxMDY3LVxcdTEwNkRcXHUxMDcxLVxcdTEwNzRcXHUxMDgyLVxcdTEwOERcXHUxMDhGXFx1MTA5QS1cXHUxMDlEXFx1MTM1RC1cXHUxMzVGXFx1MTcxMi1cXHUxNzE0XFx1MTczMi1cXHUxNzM0XFx1MTc1MlxcdTE3NTNcXHUxNzcyXFx1MTc3M1xcdTE3QjQtXFx1MTdEM1xcdTE3RERcXHUxODBCLVxcdTE4MERcXHUxODg1XFx1MTg4NlxcdTE4QTlcXHUxOTIwLVxcdTE5MkJcXHUxOTMwLVxcdTE5M0JcXHUxQTE3LVxcdTFBMUJcXHUxQTU1LVxcdTFBNUVcXHUxQTYwLVxcdTFBN0NcXHUxQTdGXFx1MUFCMC1cXHUxQUJFXFx1MUIwMC1cXHUxQjA0XFx1MUIzNC1cXHUxQjQ0XFx1MUI2Qi1cXHUxQjczXFx1MUI4MC1cXHUxQjgyXFx1MUJBMS1cXHUxQkFEXFx1MUJFNi1cXHUxQkYzXFx1MUMyNC1cXHUxQzM3XFx1MUNEMC1cXHUxQ0QyXFx1MUNENC1cXHUxQ0U4XFx1MUNFRFxcdTFDRjItXFx1MUNGNFxcdTFDRjctXFx1MUNGOVxcdTFEQzAtXFx1MURGOVxcdTFERkItXFx1MURGRlxcdTIwRDAtXFx1MjBGMFxcdTJDRUYtXFx1MkNGMVxcdTJEN0ZcXHUyREUwLVxcdTJERkZcXHUzMDJBLVxcdTMwMkZcXHUzMDk5XFx1MzA5QVxcdUE2NkYtXFx1QTY3MlxcdUE2NzQtXFx1QTY3RFxcdUE2OUVcXHVBNjlGXFx1QTZGMFxcdUE2RjFcXHVBODAyXFx1QTgwNlxcdUE4MEJcXHVBODIzLVxcdUE4MjdcXHVBODgwXFx1QTg4MVxcdUE4QjQtXFx1QThDNVxcdUE4RTAtXFx1QThGMVxcdUE4RkZcXHVBOTI2LVxcdUE5MkRcXHVBOTQ3LVxcdUE5NTNcXHVBOTgwLVxcdUE5ODNcXHVBOUIzLVxcdUE5QzBcXHVBOUU1XFx1QUEyOS1cXHVBQTM2XFx1QUE0M1xcdUFBNENcXHVBQTREXFx1QUE3Qi1cXHVBQTdEXFx1QUFCMFxcdUFBQjItXFx1QUFCNFxcdUFBQjdcXHVBQUI4XFx1QUFCRVxcdUFBQkZcXHVBQUMxXFx1QUFFQi1cXHVBQUVGXFx1QUFGNVxcdUFBRjZcXHVBQkUzLVxcdUFCRUFcXHVBQkVDXFx1QUJFRFxcdUZCMUVcXHVGRTAwLVxcdUZFMEZcXHVGRTIwLVxcdUZFMkZdL2csICcnKSlcbiAgICA6ICgoc3RyKSA9PiBzdHIpO1xuXG5jbGFzcyBCaXRhcFNlYXJjaCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhdHRlcm4sXG4gICAge1xuICAgICAgbG9jYXRpb24gPSBDb25maWcubG9jYXRpb24sXG4gICAgICB0aHJlc2hvbGQgPSBDb25maWcudGhyZXNob2xkLFxuICAgICAgZGlzdGFuY2UgPSBDb25maWcuZGlzdGFuY2UsXG4gICAgICBpbmNsdWRlTWF0Y2hlcyA9IENvbmZpZy5pbmNsdWRlTWF0Y2hlcyxcbiAgICAgIGZpbmRBbGxNYXRjaGVzID0gQ29uZmlnLmZpbmRBbGxNYXRjaGVzLFxuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoID0gQ29uZmlnLm1pbk1hdGNoQ2hhckxlbmd0aCxcbiAgICAgIGlzQ2FzZVNlbnNpdGl2ZSA9IENvbmZpZy5pc0Nhc2VTZW5zaXRpdmUsXG4gICAgICBpZ25vcmVEaWFjcml0aWNzID0gQ29uZmlnLmlnbm9yZURpYWNyaXRpY3MsXG4gICAgICBpZ25vcmVMb2NhdGlvbiA9IENvbmZpZy5pZ25vcmVMb2NhdGlvblxuICAgIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBsb2NhdGlvbixcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgaW5jbHVkZU1hdGNoZXMsXG4gICAgICBmaW5kQWxsTWF0Y2hlcyxcbiAgICAgIG1pbk1hdGNoQ2hhckxlbmd0aCxcbiAgICAgIGlzQ2FzZVNlbnNpdGl2ZSxcbiAgICAgIGlnbm9yZURpYWNyaXRpY3MsXG4gICAgICBpZ25vcmVMb2NhdGlvblxuICAgIH07XG5cbiAgICBwYXR0ZXJuID0gaXNDYXNlU2Vuc2l0aXZlID8gcGF0dGVybiA6IHBhdHRlcm4udG9Mb3dlckNhc2UoKTtcbiAgICBwYXR0ZXJuID0gaWdub3JlRGlhY3JpdGljcyA/IHN0cmlwRGlhY3JpdGljcyhwYXR0ZXJuKSA6IHBhdHRlcm47XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcblxuICAgIHRoaXMuY2h1bmtzID0gW107XG5cbiAgICBpZiAoIXRoaXMucGF0dGVybi5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFkZENodW5rID0gKHBhdHRlcm4sIHN0YXJ0SW5kZXgpID0+IHtcbiAgICAgIHRoaXMuY2h1bmtzLnB1c2goe1xuICAgICAgICBwYXR0ZXJuLFxuICAgICAgICBhbHBoYWJldDogY3JlYXRlUGF0dGVybkFscGhhYmV0KHBhdHRlcm4pLFxuICAgICAgICBzdGFydEluZGV4XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgbGVuID0gdGhpcy5wYXR0ZXJuLmxlbmd0aDtcblxuICAgIGlmIChsZW4gPiBNQVhfQklUUykge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgY29uc3QgcmVtYWluZGVyID0gbGVuICUgTUFYX0JJVFM7XG4gICAgICBjb25zdCBlbmQgPSBsZW4gLSByZW1haW5kZXI7XG5cbiAgICAgIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgICAgIGFkZENodW5rKHRoaXMucGF0dGVybi5zdWJzdHIoaSwgTUFYX0JJVFMpLCBpKTtcbiAgICAgICAgaSArPSBNQVhfQklUUztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlbWFpbmRlcikge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gbGVuIC0gTUFYX0JJVFM7XG4gICAgICAgIGFkZENodW5rKHRoaXMucGF0dGVybi5zdWJzdHIoc3RhcnRJbmRleCksIHN0YXJ0SW5kZXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDaHVuayh0aGlzLnBhdHRlcm4sIDApO1xuICAgIH1cbiAgfVxuXG4gIHNlYXJjaEluKHRleHQpIHtcbiAgICBjb25zdCB7IGlzQ2FzZVNlbnNpdGl2ZSwgaWdub3JlRGlhY3JpdGljcywgaW5jbHVkZU1hdGNoZXMgfSA9IHRoaXMub3B0aW9ucztcblxuICAgIHRleHQgPSBpc0Nhc2VTZW5zaXRpdmUgPyB0ZXh0IDogdGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgIHRleHQgPSBpZ25vcmVEaWFjcml0aWNzID8gc3RyaXBEaWFjcml0aWNzKHRleHQpIDogdGV4dDtcblxuICAgIC8vIEV4YWN0IG1hdGNoXG4gICAgaWYgKHRoaXMucGF0dGVybiA9PT0gdGV4dCkge1xuICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgaXNNYXRjaDogdHJ1ZSxcbiAgICAgICAgc2NvcmU6IDBcbiAgICAgIH07XG5cbiAgICAgIGlmIChpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgICByZXN1bHQuaW5kaWNlcyA9IFtbMCwgdGV4dC5sZW5ndGggLSAxXV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHVzZSBCaXRhcCBhbGdvcml0aG1cbiAgICBjb25zdCB7XG4gICAgICBsb2NhdGlvbixcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZmluZEFsbE1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGgsXG4gICAgICBpZ25vcmVMb2NhdGlvblxuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBsZXQgYWxsSW5kaWNlcyA9IFtdO1xuICAgIGxldCB0b3RhbFNjb3JlID0gMDtcbiAgICBsZXQgaGFzTWF0Y2hlcyA9IGZhbHNlO1xuXG4gICAgdGhpcy5jaHVua3MuZm9yRWFjaCgoeyBwYXR0ZXJuLCBhbHBoYWJldCwgc3RhcnRJbmRleCB9KSA9PiB7XG4gICAgICBjb25zdCB7IGlzTWF0Y2gsIHNjb3JlLCBpbmRpY2VzIH0gPSBzZWFyY2godGV4dCwgcGF0dGVybiwgYWxwaGFiZXQsIHtcbiAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uICsgc3RhcnRJbmRleCxcbiAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgIHRocmVzaG9sZCxcbiAgICAgICAgZmluZEFsbE1hdGNoZXMsXG4gICAgICAgIG1pbk1hdGNoQ2hhckxlbmd0aCxcbiAgICAgICAgaW5jbHVkZU1hdGNoZXMsXG4gICAgICAgIGlnbm9yZUxvY2F0aW9uXG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzTWF0Y2gpIHtcbiAgICAgICAgaGFzTWF0Y2hlcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRvdGFsU2NvcmUgKz0gc2NvcmU7XG5cbiAgICAgIGlmIChpc01hdGNoICYmIGluZGljZXMpIHtcbiAgICAgICAgYWxsSW5kaWNlcyA9IFsuLi5hbGxJbmRpY2VzLCAuLi5pbmRpY2VzXTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCByZXN1bHQgPSB7XG4gICAgICBpc01hdGNoOiBoYXNNYXRjaGVzLFxuICAgICAgc2NvcmU6IGhhc01hdGNoZXMgPyB0b3RhbFNjb3JlIC8gdGhpcy5jaHVua3MubGVuZ3RoIDogMVxuICAgIH07XG5cbiAgICBpZiAoaGFzTWF0Y2hlcyAmJiBpbmNsdWRlTWF0Y2hlcykge1xuICAgICAgcmVzdWx0LmluZGljZXMgPSBhbGxJbmRpY2VzO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG5jbGFzcyBCYXNlTWF0Y2gge1xuICBjb25zdHJ1Y3RvcihwYXR0ZXJuKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgfVxuICBzdGF0aWMgaXNNdWx0aU1hdGNoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gZ2V0TWF0Y2gocGF0dGVybiwgdGhpcy5tdWx0aVJlZ2V4KVxuICB9XG4gIHN0YXRpYyBpc1NpbmdsZU1hdGNoKHBhdHRlcm4pIHtcbiAgICByZXR1cm4gZ2V0TWF0Y2gocGF0dGVybiwgdGhpcy5zaW5nbGVSZWdleClcbiAgfVxuICBzZWFyY2goLyp0ZXh0Ki8pIHt9XG59XG5cbmZ1bmN0aW9uIGdldE1hdGNoKHBhdHRlcm4sIGV4cCkge1xuICBjb25zdCBtYXRjaGVzID0gcGF0dGVybi5tYXRjaChleHApO1xuICByZXR1cm4gbWF0Y2hlcyA/IG1hdGNoZXNbMV0gOiBudWxsXG59XG5cbi8vIFRva2VuOiAnZmlsZVxuXG5jbGFzcyBFeGFjdE1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2V4YWN0J1xuICB9XG4gIHN0YXRpYyBnZXQgbXVsdGlSZWdleCgpIHtcbiAgICByZXR1cm4gL149XCIoLiopXCIkL1xuICB9XG4gIHN0YXRpYyBnZXQgc2luZ2xlUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9ePSguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9IHRleHQgPT09IHRoaXMucGF0dGVybjtcblxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoLFxuICAgICAgc2NvcmU6IGlzTWF0Y2ggPyAwIDogMSxcbiAgICAgIGluZGljZXM6IFswLCB0aGlzLnBhdHRlcm4ubGVuZ3RoIC0gMV1cbiAgICB9XG4gIH1cbn1cblxuLy8gVG9rZW46ICFmaXJlXG5cbmNsYXNzIEludmVyc2VFeGFjdE1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2ludmVyc2UtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXiFcIiguKilcIiQvXG4gIH1cbiAgc3RhdGljIGdldCBzaW5nbGVSZWdleCgpIHtcbiAgICByZXR1cm4gL14hKC4qKSQvXG4gIH1cbiAgc2VhcmNoKHRleHQpIHtcbiAgICBjb25zdCBpbmRleCA9IHRleHQuaW5kZXhPZih0aGlzLnBhdHRlcm4pO1xuICAgIGNvbnN0IGlzTWF0Y2ggPSBpbmRleCA9PT0gLTE7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNNYXRjaCxcbiAgICAgIHNjb3JlOiBpc01hdGNoID8gMCA6IDEsXG4gICAgICBpbmRpY2VzOiBbMCwgdGV4dC5sZW5ndGggLSAxXVxuICAgIH1cbiAgfVxufVxuXG4vLyBUb2tlbjogXmZpbGVcblxuY2xhc3MgUHJlZml4RXhhY3RNYXRjaCBleHRlbmRzIEJhc2VNYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHBhdHRlcm4pIHtcbiAgICBzdXBlcihwYXR0ZXJuKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdwcmVmaXgtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXlxcXlwiKC4qKVwiJC9cbiAgfVxuICBzdGF0aWMgZ2V0IHNpbmdsZVJlZ2V4KCkge1xuICAgIHJldHVybiAvXlxcXiguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9IHRleHQuc3RhcnRzV2l0aCh0aGlzLnBhdHRlcm4pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTWF0Y2gsXG4gICAgICBzY29yZTogaXNNYXRjaCA/IDAgOiAxLFxuICAgICAgaW5kaWNlczogWzAsIHRoaXMucGF0dGVybi5sZW5ndGggLSAxXVxuICAgIH1cbiAgfVxufVxuXG4vLyBUb2tlbjogIV5maXJlXG5cbmNsYXNzIEludmVyc2VQcmVmaXhFeGFjdE1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocGF0dGVybikge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2ludmVyc2UtcHJlZml4LWV4YWN0J1xuICB9XG4gIHN0YXRpYyBnZXQgbXVsdGlSZWdleCgpIHtcbiAgICByZXR1cm4gL14hXFxeXCIoLiopXCIkL1xuICB9XG4gIHN0YXRpYyBnZXQgc2luZ2xlUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9eIVxcXiguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9ICF0ZXh0LnN0YXJ0c1dpdGgodGhpcy5wYXR0ZXJuKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoLFxuICAgICAgc2NvcmU6IGlzTWF0Y2ggPyAwIDogMSxcbiAgICAgIGluZGljZXM6IFswLCB0ZXh0Lmxlbmd0aCAtIDFdXG4gICAgfVxuICB9XG59XG5cbi8vIFRva2VuOiAuZmlsZSRcblxuY2xhc3MgU3VmZml4RXhhY3RNYXRjaCBleHRlbmRzIEJhc2VNYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHBhdHRlcm4pIHtcbiAgICBzdXBlcihwYXR0ZXJuKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdzdWZmaXgtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXlwiKC4qKVwiXFwkJC9cbiAgfVxuICBzdGF0aWMgZ2V0IHNpbmdsZVJlZ2V4KCkge1xuICAgIHJldHVybiAvXiguKilcXCQkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgY29uc3QgaXNNYXRjaCA9IHRleHQuZW5kc1dpdGgodGhpcy5wYXR0ZXJuKTtcblxuICAgIHJldHVybiB7XG4gICAgICBpc01hdGNoLFxuICAgICAgc2NvcmU6IGlzTWF0Y2ggPyAwIDogMSxcbiAgICAgIGluZGljZXM6IFt0ZXh0Lmxlbmd0aCAtIHRoaXMucGF0dGVybi5sZW5ndGgsIHRleHQubGVuZ3RoIC0gMV1cbiAgICB9XG4gIH1cbn1cblxuLy8gVG9rZW46ICEuZmlsZSRcblxuY2xhc3MgSW52ZXJzZVN1ZmZpeEV4YWN0TWF0Y2ggZXh0ZW5kcyBCYXNlTWF0Y2gge1xuICBjb25zdHJ1Y3RvcihwYXR0ZXJuKSB7XG4gICAgc3VwZXIocGF0dGVybik7XG4gIH1cbiAgc3RhdGljIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnaW52ZXJzZS1zdWZmaXgtZXhhY3QnXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXiFcIiguKilcIlxcJCQvXG4gIH1cbiAgc3RhdGljIGdldCBzaW5nbGVSZWdleCgpIHtcbiAgICByZXR1cm4gL14hKC4qKVxcJCQvXG4gIH1cbiAgc2VhcmNoKHRleHQpIHtcbiAgICBjb25zdCBpc01hdGNoID0gIXRleHQuZW5kc1dpdGgodGhpcy5wYXR0ZXJuKTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNNYXRjaCxcbiAgICAgIHNjb3JlOiBpc01hdGNoID8gMCA6IDEsXG4gICAgICBpbmRpY2VzOiBbMCwgdGV4dC5sZW5ndGggLSAxXVxuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBGdXp6eU1hdGNoIGV4dGVuZHMgQmFzZU1hdGNoIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcGF0dGVybixcbiAgICB7XG4gICAgICBsb2NhdGlvbiA9IENvbmZpZy5sb2NhdGlvbixcbiAgICAgIHRocmVzaG9sZCA9IENvbmZpZy50aHJlc2hvbGQsXG4gICAgICBkaXN0YW5jZSA9IENvbmZpZy5kaXN0YW5jZSxcbiAgICAgIGluY2x1ZGVNYXRjaGVzID0gQ29uZmlnLmluY2x1ZGVNYXRjaGVzLFxuICAgICAgZmluZEFsbE1hdGNoZXMgPSBDb25maWcuZmluZEFsbE1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGggPSBDb25maWcubWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaXNDYXNlU2Vuc2l0aXZlID0gQ29uZmlnLmlzQ2FzZVNlbnNpdGl2ZSxcbiAgICAgIGlnbm9yZURpYWNyaXRpY3MgPSBDb25maWcuaWdub3JlRGlhY3JpdGljcyxcbiAgICAgIGlnbm9yZUxvY2F0aW9uID0gQ29uZmlnLmlnbm9yZUxvY2F0aW9uXG4gICAgfSA9IHt9XG4gICkge1xuICAgIHN1cGVyKHBhdHRlcm4pO1xuICAgIHRoaXMuX2JpdGFwU2VhcmNoID0gbmV3IEJpdGFwU2VhcmNoKHBhdHRlcm4sIHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgdGhyZXNob2xkLFxuICAgICAgZGlzdGFuY2UsXG4gICAgICBpbmNsdWRlTWF0Y2hlcyxcbiAgICAgIGZpbmRBbGxNYXRjaGVzLFxuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoLFxuICAgICAgaXNDYXNlU2Vuc2l0aXZlLFxuICAgICAgaWdub3JlRGlhY3JpdGljcyxcbiAgICAgIGlnbm9yZUxvY2F0aW9uXG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAnZnV6enknXG4gIH1cbiAgc3RhdGljIGdldCBtdWx0aVJlZ2V4KCkge1xuICAgIHJldHVybiAvXlwiKC4qKVwiJC9cbiAgfVxuICBzdGF0aWMgZ2V0IHNpbmdsZVJlZ2V4KCkge1xuICAgIHJldHVybiAvXiguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2JpdGFwU2VhcmNoLnNlYXJjaEluKHRleHQpXG4gIH1cbn1cblxuLy8gVG9rZW46ICdmaWxlXG5cbmNsYXNzIEluY2x1ZGVNYXRjaCBleHRlbmRzIEJhc2VNYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHBhdHRlcm4pIHtcbiAgICBzdXBlcihwYXR0ZXJuKTtcbiAgfVxuICBzdGF0aWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICdpbmNsdWRlJ1xuICB9XG4gIHN0YXRpYyBnZXQgbXVsdGlSZWdleCgpIHtcbiAgICByZXR1cm4gL14nXCIoLiopXCIkL1xuICB9XG4gIHN0YXRpYyBnZXQgc2luZ2xlUmVnZXgoKSB7XG4gICAgcmV0dXJuIC9eJyguKikkL1xuICB9XG4gIHNlYXJjaCh0ZXh0KSB7XG4gICAgbGV0IGxvY2F0aW9uID0gMDtcbiAgICBsZXQgaW5kZXg7XG5cbiAgICBjb25zdCBpbmRpY2VzID0gW107XG4gICAgY29uc3QgcGF0dGVybkxlbiA9IHRoaXMucGF0dGVybi5sZW5ndGg7XG5cbiAgICAvLyBHZXQgYWxsIGV4YWN0IG1hdGNoZXNcbiAgICB3aGlsZSAoKGluZGV4ID0gdGV4dC5pbmRleE9mKHRoaXMucGF0dGVybiwgbG9jYXRpb24pKSA+IC0xKSB7XG4gICAgICBsb2NhdGlvbiA9IGluZGV4ICsgcGF0dGVybkxlbjtcbiAgICAgIGluZGljZXMucHVzaChbaW5kZXgsIGxvY2F0aW9uIC0gMV0pO1xuICAgIH1cblxuICAgIGNvbnN0IGlzTWF0Y2ggPSAhIWluZGljZXMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzTWF0Y2gsXG4gICAgICBzY29yZTogaXNNYXRjaCA/IDAgOiAxLFxuICAgICAgaW5kaWNlc1xuICAgIH1cbiAgfVxufVxuXG4vLyDinZdPcmRlciBpcyBpbXBvcnRhbnQuIERPIE5PVCBDSEFOR0UuXG5jb25zdCBzZWFyY2hlcnMgPSBbXG4gIEV4YWN0TWF0Y2gsXG4gIEluY2x1ZGVNYXRjaCxcbiAgUHJlZml4RXhhY3RNYXRjaCxcbiAgSW52ZXJzZVByZWZpeEV4YWN0TWF0Y2gsXG4gIEludmVyc2VTdWZmaXhFeGFjdE1hdGNoLFxuICBTdWZmaXhFeGFjdE1hdGNoLFxuICBJbnZlcnNlRXhhY3RNYXRjaCxcbiAgRnV6enlNYXRjaFxuXTtcblxuY29uc3Qgc2VhcmNoZXJzTGVuID0gc2VhcmNoZXJzLmxlbmd0aDtcblxuLy8gUmVnZXggdG8gc3BsaXQgYnkgc3BhY2VzLCBidXQga2VlcCBhbnl0aGluZyBpbiBxdW90ZXMgdG9nZXRoZXJcbmNvbnN0IFNQQUNFX1JFID0gLyArKD89KD86W15cXFwiXSpcXFwiW15cXFwiXSpcXFwiKSpbXlxcXCJdKiQpLztcbmNvbnN0IE9SX1RPS0VOID0gJ3wnO1xuXG4vLyBSZXR1cm4gYSAyRCBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcXVlcnksIGZvciBzaW1wbGVyIHBhcnNpbmcuXG4vLyBFeGFtcGxlOlxuLy8gXCJeY29yZSBnbyQgfCByYiQgfCBweSQgeHkkXCIgPT4gW1tcIl5jb3JlXCIsIFwiZ28kXCJdLCBbXCJyYiRcIl0sIFtcInB5JFwiLCBcInh5JFwiXV1cbmZ1bmN0aW9uIHBhcnNlUXVlcnkocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBwYXR0ZXJuLnNwbGl0KE9SX1RPS0VOKS5tYXAoKGl0ZW0pID0+IHtcbiAgICBsZXQgcXVlcnkgPSBpdGVtXG4gICAgICAudHJpbSgpXG4gICAgICAuc3BsaXQoU1BBQ0VfUkUpXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICYmICEhaXRlbS50cmltKCkpO1xuXG4gICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcXVlcnkubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5SXRlbSA9IHF1ZXJ5W2ldO1xuXG4gICAgICAvLyAxLiBIYW5kbGUgbXVsdGlwbGUgcXVlcnkgbWF0Y2ggKGkuZSwgb25jZSB0aGF0IGFyZSBxdW90ZWQsIGxpa2UgYFwiaGVsbG8gd29ybGRcImApXG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIGxldCBpZHggPSAtMTtcbiAgICAgIHdoaWxlICghZm91bmQgJiYgKytpZHggPCBzZWFyY2hlcnNMZW4pIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoZXIgPSBzZWFyY2hlcnNbaWR4XTtcbiAgICAgICAgbGV0IHRva2VuID0gc2VhcmNoZXIuaXNNdWx0aU1hdGNoKHF1ZXJ5SXRlbSk7XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChuZXcgc2VhcmNoZXIodG9rZW4sIG9wdGlvbnMpKTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIuIEhhbmRsZSBzaW5nbGUgcXVlcnkgbWF0Y2hlcyAoaS5lLCBvbmNlIHRoYXQgYXJlICpub3QqIHF1b3RlZClcbiAgICAgIGlkeCA9IC0xO1xuICAgICAgd2hpbGUgKCsraWR4IDwgc2VhcmNoZXJzTGVuKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaGVyID0gc2VhcmNoZXJzW2lkeF07XG4gICAgICAgIGxldCB0b2tlbiA9IHNlYXJjaGVyLmlzU2luZ2xlTWF0Y2gocXVlcnlJdGVtKTtcbiAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgcmVzdWx0cy5wdXNoKG5ldyBzZWFyY2hlcih0b2tlbiwgb3B0aW9ucykpO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0c1xuICB9KVxufVxuXG4vLyBUaGVzZSBleHRlbmRlZCBtYXRjaGVycyBjYW4gcmV0dXJuIGFuIGFycmF5IG9mIG1hdGNoZXMsIGFzIG9wcG9zZWRcbi8vIHRvIGEgc2luZ2wgbWF0Y2hcbmNvbnN0IE11bHRpTWF0Y2hTZXQgPSBuZXcgU2V0KFtGdXp6eU1hdGNoLnR5cGUsIEluY2x1ZGVNYXRjaC50eXBlXSk7XG5cbi8qKlxuICogQ29tbWFuZC1saWtlIHNlYXJjaGluZ1xuICogPT09PT09PT09PT09PT09PT09PT09PVxuICpcbiAqIEdpdmVuIG11bHRpcGxlIHNlYXJjaCB0ZXJtcyBkZWxpbWl0ZWQgYnkgc3BhY2VzLmUuZy4gYF5qc2NyaXB0IC5weXRob24kIHJ1YnkgIWphdmFgLFxuICogc2VhcmNoIGluIGEgZ2l2ZW4gdGV4dC5cbiAqXG4gKiBTZWFyY2ggc3ludGF4OlxuICpcbiAqIHwgVG9rZW4gICAgICAgfCBNYXRjaCB0eXBlICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAqIHwgYGpzY3JpcHRgICAgfCBmdXp6eS1tYXRjaCAgICAgICAgICAgICAgICB8IEl0ZW1zIHRoYXQgZnV6enkgbWF0Y2ggYGpzY3JpcHRgICAgICAgIHxcbiAqIHwgYD1zY2hlbWVgICAgfCBleGFjdC1tYXRjaCAgICAgICAgICAgICAgICB8IEl0ZW1zIHRoYXQgYXJlIGBzY2hlbWVgICAgICAgICAgICAgICAgIHxcbiAqIHwgYCdweXRob25gICAgfCBpbmNsdWRlLW1hdGNoICAgICAgICAgICAgICB8IEl0ZW1zIHRoYXQgaW5jbHVkZSBgcHl0aG9uYCAgICAgICAgICAgIHxcbiAqIHwgYCFydWJ5YCAgICAgfCBpbnZlcnNlLWV4YWN0LW1hdGNoICAgICAgICB8IEl0ZW1zIHRoYXQgZG8gbm90IGluY2x1ZGUgYHJ1YnlgICAgICAgIHxcbiAqIHwgYF5qYXZhYCAgICAgfCBwcmVmaXgtZXhhY3QtbWF0Y2ggICAgICAgICB8IEl0ZW1zIHRoYXQgc3RhcnQgd2l0aCBgamF2YWAgICAgICAgICAgIHxcbiAqIHwgYCFeZWFybGFuZ2AgfCBpbnZlcnNlLXByZWZpeC1leGFjdC1tYXRjaCB8IEl0ZW1zIHRoYXQgZG8gbm90IHN0YXJ0IHdpdGggYGVhcmxhbmdgIHxcbiAqIHwgYC5qcyRgICAgICAgfCBzdWZmaXgtZXhhY3QtbWF0Y2ggICAgICAgICB8IEl0ZW1zIHRoYXQgZW5kIHdpdGggYC5qc2AgICAgICAgICAgICAgIHxcbiAqIHwgYCEuZ28kYCAgICAgfCBpbnZlcnNlLXN1ZmZpeC1leGFjdC1tYXRjaCB8IEl0ZW1zIHRoYXQgZG8gbm90IGVuZCB3aXRoIGAuZ29gICAgICAgIHxcbiAqXG4gKiBBIHNpbmdsZSBwaXBlIGNoYXJhY3RlciBhY3RzIGFzIGFuIE9SIG9wZXJhdG9yLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZ1xuICogcXVlcnkgbWF0Y2hlcyBlbnRyaWVzIHRoYXQgc3RhcnQgd2l0aCBgY29yZWAgYW5kIGVuZCB3aXRoIGVpdGhlcmBnb2AsIGByYmAsXG4gKiBvcmBweWAuXG4gKlxuICogYGBgXG4gKiBeY29yZSBnbyQgfCByYiQgfCBweSRcbiAqIGBgYFxuICovXG5jbGFzcyBFeHRlbmRlZFNlYXJjaCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhdHRlcm4sXG4gICAge1xuICAgICAgaXNDYXNlU2Vuc2l0aXZlID0gQ29uZmlnLmlzQ2FzZVNlbnNpdGl2ZSxcbiAgICAgIGlnbm9yZURpYWNyaXRpY3MgPSBDb25maWcuaWdub3JlRGlhY3JpdGljcyxcbiAgICAgIGluY2x1ZGVNYXRjaGVzID0gQ29uZmlnLmluY2x1ZGVNYXRjaGVzLFxuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoID0gQ29uZmlnLm1pbk1hdGNoQ2hhckxlbmd0aCxcbiAgICAgIGlnbm9yZUxvY2F0aW9uID0gQ29uZmlnLmlnbm9yZUxvY2F0aW9uLFxuICAgICAgZmluZEFsbE1hdGNoZXMgPSBDb25maWcuZmluZEFsbE1hdGNoZXMsXG4gICAgICBsb2NhdGlvbiA9IENvbmZpZy5sb2NhdGlvbixcbiAgICAgIHRocmVzaG9sZCA9IENvbmZpZy50aHJlc2hvbGQsXG4gICAgICBkaXN0YW5jZSA9IENvbmZpZy5kaXN0YW5jZVxuICAgIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBpc0Nhc2VTZW5zaXRpdmUsXG4gICAgICBpZ25vcmVEaWFjcml0aWNzLFxuICAgICAgaW5jbHVkZU1hdGNoZXMsXG4gICAgICBtaW5NYXRjaENoYXJMZW5ndGgsXG4gICAgICBmaW5kQWxsTWF0Y2hlcyxcbiAgICAgIGlnbm9yZUxvY2F0aW9uLFxuICAgICAgbG9jYXRpb24sXG4gICAgICB0aHJlc2hvbGQsXG4gICAgICBkaXN0YW5jZVxuICAgIH07XG5cbiAgICBwYXR0ZXJuID0gaXNDYXNlU2Vuc2l0aXZlID8gcGF0dGVybiA6IHBhdHRlcm4udG9Mb3dlckNhc2UoKTtcbiAgICBwYXR0ZXJuID0gaWdub3JlRGlhY3JpdGljcyA/IHN0cmlwRGlhY3JpdGljcyhwYXR0ZXJuKSA6IHBhdHRlcm47XG4gICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjtcbiAgICB0aGlzLnF1ZXJ5ID0gcGFyc2VRdWVyeSh0aGlzLnBhdHRlcm4sIHRoaXMub3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgY29uZGl0aW9uKF8sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gb3B0aW9ucy51c2VFeHRlbmRlZFNlYXJjaFxuICB9XG5cbiAgc2VhcmNoSW4odGV4dCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5xdWVyeTtcblxuICAgIGlmICghcXVlcnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzTWF0Y2g6IGZhbHNlLFxuICAgICAgICBzY29yZTogMVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHsgaW5jbHVkZU1hdGNoZXMsIGlzQ2FzZVNlbnNpdGl2ZSwgaWdub3JlRGlhY3JpdGljcyB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgdGV4dCA9IGlzQ2FzZVNlbnNpdGl2ZSA/IHRleHQgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgdGV4dCA9IGlnbm9yZURpYWNyaXRpY3MgPyBzdHJpcERpYWNyaXRpY3ModGV4dCkgOiB0ZXh0O1xuXG4gICAgbGV0IG51bU1hdGNoZXMgPSAwO1xuICAgIGxldCBhbGxJbmRpY2VzID0gW107XG4gICAgbGV0IHRvdGFsU2NvcmUgPSAwO1xuXG4gICAgLy8gT1JzXG4gICAgZm9yIChsZXQgaSA9IDAsIHFMZW4gPSBxdWVyeS5sZW5ndGg7IGkgPCBxTGVuOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHNlYXJjaGVycyA9IHF1ZXJ5W2ldO1xuXG4gICAgICAvLyBSZXNldCBpbmRpY2VzXG4gICAgICBhbGxJbmRpY2VzLmxlbmd0aCA9IDA7XG4gICAgICBudW1NYXRjaGVzID0gMDtcblxuICAgICAgLy8gQU5Ec1xuICAgICAgZm9yIChsZXQgaiA9IDAsIHBMZW4gPSBzZWFyY2hlcnMubGVuZ3RoOyBqIDwgcExlbjsgaiArPSAxKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaGVyID0gc2VhcmNoZXJzW2pdO1xuICAgICAgICBjb25zdCB7IGlzTWF0Y2gsIGluZGljZXMsIHNjb3JlIH0gPSBzZWFyY2hlci5zZWFyY2godGV4dCk7XG5cbiAgICAgICAgaWYgKGlzTWF0Y2gpIHtcbiAgICAgICAgICBudW1NYXRjaGVzICs9IDE7XG4gICAgICAgICAgdG90YWxTY29yZSArPSBzY29yZTtcbiAgICAgICAgICBpZiAoaW5jbHVkZU1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzZWFyY2hlci5jb25zdHJ1Y3Rvci50eXBlO1xuICAgICAgICAgICAgaWYgKE11bHRpTWF0Y2hTZXQuaGFzKHR5cGUpKSB7XG4gICAgICAgICAgICAgIGFsbEluZGljZXMgPSBbLi4uYWxsSW5kaWNlcywgLi4uaW5kaWNlc107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhbGxJbmRpY2VzLnB1c2goaW5kaWNlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvdGFsU2NvcmUgPSAwO1xuICAgICAgICAgIG51bU1hdGNoZXMgPSAwO1xuICAgICAgICAgIGFsbEluZGljZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE9SIGNvbmRpdGlvbiwgc28gaWYgVFJVRSwgcmV0dXJuXG4gICAgICBpZiAobnVtTWF0Y2hlcykge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgIGlzTWF0Y2g6IHRydWUsXG4gICAgICAgICAgc2NvcmU6IHRvdGFsU2NvcmUgLyBudW1NYXRjaGVzXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGluY2x1ZGVNYXRjaGVzKSB7XG4gICAgICAgICAgcmVzdWx0LmluZGljZXMgPSBhbGxJbmRpY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vdGhpbmcgd2FzIG1hdGNoZWRcbiAgICByZXR1cm4ge1xuICAgICAgaXNNYXRjaDogZmFsc2UsXG4gICAgICBzY29yZTogMVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCByZWdpc3RlcmVkU2VhcmNoZXJzID0gW107XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyKC4uLmFyZ3MpIHtcbiAgcmVnaXN0ZXJlZFNlYXJjaGVycy5wdXNoKC4uLmFyZ3MpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTZWFyY2hlcihwYXR0ZXJuLCBvcHRpb25zKSB7XG4gIGZvciAobGV0IGkgPSAwLCBsZW4gPSByZWdpc3RlcmVkU2VhcmNoZXJzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgbGV0IHNlYXJjaGVyQ2xhc3MgPSByZWdpc3RlcmVkU2VhcmNoZXJzW2ldO1xuICAgIGlmIChzZWFyY2hlckNsYXNzLmNvbmRpdGlvbihwYXR0ZXJuLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG5ldyBzZWFyY2hlckNsYXNzKHBhdHRlcm4sIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBCaXRhcFNlYXJjaChwYXR0ZXJuLCBvcHRpb25zKVxufVxuXG5jb25zdCBMb2dpY2FsT3BlcmF0b3IgPSB7XG4gIEFORDogJyRhbmQnLFxuICBPUjogJyRvcidcbn07XG5cbmNvbnN0IEtleVR5cGUgPSB7XG4gIFBBVEg6ICckcGF0aCcsXG4gIFBBVFRFUk46ICckdmFsJ1xufTtcblxuY29uc3QgaXNFeHByZXNzaW9uID0gKHF1ZXJ5KSA9PlxuICAhIShxdWVyeVtMb2dpY2FsT3BlcmF0b3IuQU5EXSB8fCBxdWVyeVtMb2dpY2FsT3BlcmF0b3IuT1JdKTtcblxuY29uc3QgaXNQYXRoID0gKHF1ZXJ5KSA9PiAhIXF1ZXJ5W0tleVR5cGUuUEFUSF07XG5cbmNvbnN0IGlzTGVhZiA9IChxdWVyeSkgPT5cbiAgIWlzQXJyYXkocXVlcnkpICYmIGlzT2JqZWN0KHF1ZXJ5KSAmJiAhaXNFeHByZXNzaW9uKHF1ZXJ5KTtcblxuY29uc3QgY29udmVydFRvRXhwbGljaXQgPSAocXVlcnkpID0+ICh7XG4gIFtMb2dpY2FsT3BlcmF0b3IuQU5EXTogT2JqZWN0LmtleXMocXVlcnkpLm1hcCgoa2V5KSA9PiAoe1xuICAgIFtrZXldOiBxdWVyeVtrZXldXG4gIH0pKVxufSk7XG5cbi8vIFdoZW4gYGF1dG9gIGlzIGB0cnVlYCwgdGhlIHBhcnNlIGZ1bmN0aW9uIHdpbGwgaW5mZXIgYW5kIGluaXRpYWxpemUgYW5kIGFkZFxuLy8gdGhlIGFwcHJvcHJpYXRlIGBTZWFyY2hlcmAgaW5zdGFuY2VcbmZ1bmN0aW9uIHBhcnNlKHF1ZXJ5LCBvcHRpb25zLCB7IGF1dG8gPSB0cnVlIH0gPSB7fSkge1xuICBjb25zdCBuZXh0ID0gKHF1ZXJ5KSA9PiB7XG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhxdWVyeSk7XG5cbiAgICBjb25zdCBpc1F1ZXJ5UGF0aCA9IGlzUGF0aChxdWVyeSk7XG5cbiAgICBpZiAoIWlzUXVlcnlQYXRoICYmIGtleXMubGVuZ3RoID4gMSAmJiAhaXNFeHByZXNzaW9uKHF1ZXJ5KSkge1xuICAgICAgcmV0dXJuIG5leHQoY29udmVydFRvRXhwbGljaXQocXVlcnkpKVxuICAgIH1cblxuICAgIGlmIChpc0xlYWYocXVlcnkpKSB7XG4gICAgICBjb25zdCBrZXkgPSBpc1F1ZXJ5UGF0aCA/IHF1ZXJ5W0tleVR5cGUuUEFUSF0gOiBrZXlzWzBdO1xuXG4gICAgICBjb25zdCBwYXR0ZXJuID0gaXNRdWVyeVBhdGggPyBxdWVyeVtLZXlUeXBlLlBBVFRFUk5dIDogcXVlcnlba2V5XTtcblxuICAgICAgaWYgKCFpc1N0cmluZyhwYXR0ZXJuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoTE9HSUNBTF9TRUFSQ0hfSU5WQUxJRF9RVUVSWV9GT1JfS0VZKGtleSkpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgICAga2V5SWQ6IGNyZWF0ZUtleUlkKGtleSksXG4gICAgICAgIHBhdHRlcm5cbiAgICAgIH07XG5cbiAgICAgIGlmIChhdXRvKSB7XG4gICAgICAgIG9iai5zZWFyY2hlciA9IGNyZWF0ZVNlYXJjaGVyKHBhdHRlcm4sIG9wdGlvbnMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgbGV0IG5vZGUgPSB7XG4gICAgICBjaGlsZHJlbjogW10sXG4gICAgICBvcGVyYXRvcjoga2V5c1swXVxuICAgIH07XG5cbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBxdWVyeVtrZXldO1xuXG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIG5vZGUuY2hpbGRyZW4ucHVzaChuZXh0KGl0ZW0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZVxuICB9O1xuXG4gIGlmICghaXNFeHByZXNzaW9uKHF1ZXJ5KSkge1xuICAgIHF1ZXJ5ID0gY29udmVydFRvRXhwbGljaXQocXVlcnkpO1xuICB9XG5cbiAgcmV0dXJuIG5leHQocXVlcnkpXG59XG5cbi8vIFByYWN0aWNhbCBzY29yaW5nIGZ1bmN0aW9uXG5mdW5jdGlvbiBjb21wdXRlU2NvcmUoXG4gIHJlc3VsdHMsXG4gIHsgaWdub3JlRmllbGROb3JtID0gQ29uZmlnLmlnbm9yZUZpZWxkTm9ybSB9XG4pIHtcbiAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQpID0+IHtcbiAgICBsZXQgdG90YWxTY29yZSA9IDE7XG5cbiAgICByZXN1bHQubWF0Y2hlcy5mb3JFYWNoKCh7IGtleSwgbm9ybSwgc2NvcmUgfSkgPT4ge1xuICAgICAgY29uc3Qgd2VpZ2h0ID0ga2V5ID8ga2V5LndlaWdodCA6IG51bGw7XG5cbiAgICAgIHRvdGFsU2NvcmUgKj0gTWF0aC5wb3coXG4gICAgICAgIHNjb3JlID09PSAwICYmIHdlaWdodCA/IE51bWJlci5FUFNJTE9OIDogc2NvcmUsXG4gICAgICAgICh3ZWlnaHQgfHwgMSkgKiAoaWdub3JlRmllbGROb3JtID8gMSA6IG5vcm0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0LnNjb3JlID0gdG90YWxTY29yZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybU1hdGNoZXMocmVzdWx0LCBkYXRhKSB7XG4gIGNvbnN0IG1hdGNoZXMgPSByZXN1bHQubWF0Y2hlcztcbiAgZGF0YS5tYXRjaGVzID0gW107XG5cbiAgaWYgKCFpc0RlZmluZWQobWF0Y2hlcykpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIG1hdGNoZXMuZm9yRWFjaCgobWF0Y2gpID0+IHtcbiAgICBpZiAoIWlzRGVmaW5lZChtYXRjaC5pbmRpY2VzKSB8fCAhbWF0Y2guaW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHsgaW5kaWNlcywgdmFsdWUgfSA9IG1hdGNoO1xuXG4gICAgbGV0IG9iaiA9IHtcbiAgICAgIGluZGljZXMsXG4gICAgICB2YWx1ZVxuICAgIH07XG5cbiAgICBpZiAobWF0Y2gua2V5KSB7XG4gICAgICBvYmoua2V5ID0gbWF0Y2gua2V5LnNyYztcbiAgICB9XG5cbiAgICBpZiAobWF0Y2guaWR4ID4gLTEpIHtcbiAgICAgIG9iai5yZWZJbmRleCA9IG1hdGNoLmlkeDtcbiAgICB9XG5cbiAgICBkYXRhLm1hdGNoZXMucHVzaChvYmopO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtU2NvcmUocmVzdWx0LCBkYXRhKSB7XG4gIGRhdGEuc2NvcmUgPSByZXN1bHQuc2NvcmU7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdChcbiAgcmVzdWx0cyxcbiAgZG9jcyxcbiAge1xuICAgIGluY2x1ZGVNYXRjaGVzID0gQ29uZmlnLmluY2x1ZGVNYXRjaGVzLFxuICAgIGluY2x1ZGVTY29yZSA9IENvbmZpZy5pbmNsdWRlU2NvcmVcbiAgfSA9IHt9XG4pIHtcbiAgY29uc3QgdHJhbnNmb3JtZXJzID0gW107XG5cbiAgaWYgKGluY2x1ZGVNYXRjaGVzKSB0cmFuc2Zvcm1lcnMucHVzaCh0cmFuc2Zvcm1NYXRjaGVzKTtcbiAgaWYgKGluY2x1ZGVTY29yZSkgdHJhbnNmb3JtZXJzLnB1c2godHJhbnNmb3JtU2NvcmUpO1xuXG4gIHJldHVybiByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiB7XG4gICAgY29uc3QgeyBpZHggfSA9IHJlc3VsdDtcblxuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpdGVtOiBkb2NzW2lkeF0sXG4gICAgICByZWZJbmRleDogaWR4XG4gICAgfTtcblxuICAgIGlmICh0cmFuc2Zvcm1lcnMubGVuZ3RoKSB7XG4gICAgICB0cmFuc2Zvcm1lcnMuZm9yRWFjaCgodHJhbnNmb3JtZXIpID0+IHtcbiAgICAgICAgdHJhbnNmb3JtZXIocmVzdWx0LCBkYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhXG4gIH0pXG59XG5cbmNsYXNzIEZ1c2Uge1xuICBjb25zdHJ1Y3Rvcihkb2NzLCBvcHRpb25zID0ge30sIGluZGV4KSB7XG4gICAgdGhpcy5vcHRpb25zID0geyAuLi5Db25maWcsIC4uLm9wdGlvbnMgfTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMub3B0aW9ucy51c2VFeHRlbmRlZFNlYXJjaCAmJlxuICAgICAgIXRydWVcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihFWFRFTkRFRF9TRUFSQ0hfVU5BVkFJTEFCTEUpXG4gICAgfVxuXG4gICAgdGhpcy5fa2V5U3RvcmUgPSBuZXcgS2V5U3RvcmUodGhpcy5vcHRpb25zLmtleXMpO1xuXG4gICAgdGhpcy5zZXRDb2xsZWN0aW9uKGRvY3MsIGluZGV4KTtcbiAgfVxuXG4gIHNldENvbGxlY3Rpb24oZG9jcywgaW5kZXgpIHtcbiAgICB0aGlzLl9kb2NzID0gZG9jcztcblxuICAgIGlmIChpbmRleCAmJiAhKGluZGV4IGluc3RhbmNlb2YgRnVzZUluZGV4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKElOQ09SUkVDVF9JTkRFWF9UWVBFKVxuICAgIH1cblxuICAgIHRoaXMuX215SW5kZXggPVxuICAgICAgaW5kZXggfHxcbiAgICAgIGNyZWF0ZUluZGV4KHRoaXMub3B0aW9ucy5rZXlzLCB0aGlzLl9kb2NzLCB7XG4gICAgICAgIGdldEZuOiB0aGlzLm9wdGlvbnMuZ2V0Rm4sXG4gICAgICAgIGZpZWxkTm9ybVdlaWdodDogdGhpcy5vcHRpb25zLmZpZWxkTm9ybVdlaWdodFxuICAgICAgfSk7XG4gIH1cblxuICBhZGQoZG9jKSB7XG4gICAgaWYgKCFpc0RlZmluZWQoZG9jKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZG9jcy5wdXNoKGRvYyk7XG4gICAgdGhpcy5fbXlJbmRleC5hZGQoZG9jKTtcbiAgfVxuXG4gIHJlbW92ZShwcmVkaWNhdGUgPSAoLyogZG9jLCBpZHggKi8pID0+IGZhbHNlKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuX2RvY3MubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGRvYyA9IHRoaXMuX2RvY3NbaV07XG4gICAgICBpZiAocHJlZGljYXRlKGRvYywgaSkpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVBdChpKTtcbiAgICAgICAgaSAtPSAxO1xuICAgICAgICBsZW4gLT0gMTtcblxuICAgICAgICByZXN1bHRzLnB1c2goZG9jKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG5cbiAgcmVtb3ZlQXQoaWR4KSB7XG4gICAgdGhpcy5fZG9jcy5zcGxpY2UoaWR4LCAxKTtcbiAgICB0aGlzLl9teUluZGV4LnJlbW92ZUF0KGlkeCk7XG4gIH1cblxuICBnZXRJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbXlJbmRleFxuICB9XG5cbiAgc2VhcmNoKHF1ZXJ5LCB7IGxpbWl0ID0gLTEgfSA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgaW5jbHVkZU1hdGNoZXMsXG4gICAgICBpbmNsdWRlU2NvcmUsXG4gICAgICBzaG91bGRTb3J0LFxuICAgICAgc29ydEZuLFxuICAgICAgaWdub3JlRmllbGROb3JtXG4gICAgfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGxldCByZXN1bHRzID0gaXNTdHJpbmcocXVlcnkpXG4gICAgICA/IGlzU3RyaW5nKHRoaXMuX2RvY3NbMF0pXG4gICAgICAgID8gdGhpcy5fc2VhcmNoU3RyaW5nTGlzdChxdWVyeSlcbiAgICAgICAgOiB0aGlzLl9zZWFyY2hPYmplY3RMaXN0KHF1ZXJ5KVxuICAgICAgOiB0aGlzLl9zZWFyY2hMb2dpY2FsKHF1ZXJ5KTtcblxuICAgIGNvbXB1dGVTY29yZShyZXN1bHRzLCB7IGlnbm9yZUZpZWxkTm9ybSB9KTtcblxuICAgIGlmIChzaG91bGRTb3J0KSB7XG4gICAgICByZXN1bHRzLnNvcnQoc29ydEZuKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOdW1iZXIobGltaXQpICYmIGxpbWl0ID4gLTEpIHtcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNsaWNlKDAsIGxpbWl0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0KHJlc3VsdHMsIHRoaXMuX2RvY3MsIHtcbiAgICAgIGluY2x1ZGVNYXRjaGVzLFxuICAgICAgaW5jbHVkZVNjb3JlXG4gICAgfSlcbiAgfVxuXG4gIF9zZWFyY2hTdHJpbmdMaXN0KHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VhcmNoZXIgPSBjcmVhdGVTZWFyY2hlcihxdWVyeSwgdGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCB7IHJlY29yZHMgfSA9IHRoaXMuX215SW5kZXg7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGV2ZXJ5IHN0cmluZyBpbiB0aGUgaW5kZXhcbiAgICByZWNvcmRzLmZvckVhY2goKHsgdjogdGV4dCwgaTogaWR4LCBuOiBub3JtIH0pID0+IHtcbiAgICAgIGlmICghaXNEZWZpbmVkKHRleHQpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGlzTWF0Y2gsIHNjb3JlLCBpbmRpY2VzIH0gPSBzZWFyY2hlci5zZWFyY2hJbih0ZXh0KTtcblxuICAgICAgaWYgKGlzTWF0Y2gpIHtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICBpdGVtOiB0ZXh0LFxuICAgICAgICAgIGlkeCxcbiAgICAgICAgICBtYXRjaGVzOiBbeyBzY29yZSwgdmFsdWU6IHRleHQsIG5vcm0sIGluZGljZXMgfV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG5cbiAgX3NlYXJjaExvZ2ljYWwocXVlcnkpIHtcblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBwYXJzZShxdWVyeSwgdGhpcy5vcHRpb25zKTtcblxuICAgIGNvbnN0IGV2YWx1YXRlID0gKG5vZGUsIGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgaWYgKCFub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IHsga2V5SWQsIHNlYXJjaGVyIH0gPSBub2RlO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSB0aGlzLl9maW5kTWF0Y2hlcyh7XG4gICAgICAgICAga2V5OiB0aGlzLl9rZXlTdG9yZS5nZXQoa2V5SWQpLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLl9teUluZGV4LmdldFZhbHVlRm9ySXRlbUF0S2V5SWQoaXRlbSwga2V5SWQpLFxuICAgICAgICAgIHNlYXJjaGVyXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChtYXRjaGVzICYmIG1hdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWR4LFxuICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICBtYXRjaGVzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBldmFsdWF0ZShjaGlsZCwgaXRlbSwgaWR4KTtcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICByZXMucHVzaCguLi5yZXN1bHQpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUub3BlcmF0b3IgPT09IExvZ2ljYWxPcGVyYXRvci5BTkQpIHtcbiAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH07XG5cbiAgICBjb25zdCByZWNvcmRzID0gdGhpcy5fbXlJbmRleC5yZWNvcmRzO1xuICAgIGNvbnN0IHJlc3VsdE1hcCA9IHt9O1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcblxuICAgIHJlY29yZHMuZm9yRWFjaCgoeyAkOiBpdGVtLCBpOiBpZHggfSkgPT4ge1xuICAgICAgaWYgKGlzRGVmaW5lZChpdGVtKSkge1xuICAgICAgICBsZXQgZXhwUmVzdWx0cyA9IGV2YWx1YXRlKGV4cHJlc3Npb24sIGl0ZW0sIGlkeCk7XG5cbiAgICAgICAgaWYgKGV4cFJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gRGVkdXBlIHdoZW4gYWRkaW5nXG4gICAgICAgICAgaWYgKCFyZXN1bHRNYXBbaWR4XSkge1xuICAgICAgICAgICAgcmVzdWx0TWFwW2lkeF0gPSB7IGlkeCwgaXRlbSwgbWF0Y2hlczogW10gfTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHRNYXBbaWR4XSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGV4cFJlc3VsdHMuZm9yRWFjaCgoeyBtYXRjaGVzIH0pID0+IHtcbiAgICAgICAgICAgIHJlc3VsdE1hcFtpZHhdLm1hdGNoZXMucHVzaCguLi5tYXRjaGVzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxuXG4gIF9zZWFyY2hPYmplY3RMaXN0KHF1ZXJ5KSB7XG4gICAgY29uc3Qgc2VhcmNoZXIgPSBjcmVhdGVTZWFyY2hlcihxdWVyeSwgdGhpcy5vcHRpb25zKTtcbiAgICBjb25zdCB7IGtleXMsIHJlY29yZHMgfSA9IHRoaXMuX215SW5kZXg7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuXG4gICAgLy8gTGlzdCBpcyBBcnJheTxPYmplY3Q+XG4gICAgcmVjb3Jkcy5mb3JFYWNoKCh7ICQ6IGl0ZW0sIGk6IGlkeCB9KSA9PiB7XG4gICAgICBpZiAoIWlzRGVmaW5lZChpdGVtKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgbGV0IG1hdGNoZXMgPSBbXTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGV2ZXJ5IGtleSAoaS5lLCBwYXRoKSwgYW5kIGZldGNoIHRoZSB2YWx1ZSBhdCB0aGF0IGtleVxuICAgICAga2V5cy5mb3JFYWNoKChrZXksIGtleUluZGV4KSA9PiB7XG4gICAgICAgIG1hdGNoZXMucHVzaChcbiAgICAgICAgICAuLi50aGlzLl9maW5kTWF0Y2hlcyh7XG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZTogaXRlbVtrZXlJbmRleF0sXG4gICAgICAgICAgICBzZWFyY2hlclxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgaWR4LFxuICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgbWF0Y2hlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHRzXG4gIH1cbiAgX2ZpbmRNYXRjaGVzKHsga2V5LCB2YWx1ZSwgc2VhcmNoZXIgfSkge1xuICAgIGlmICghaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgbGV0IG1hdGNoZXMgPSBbXTtcblxuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgdmFsdWUuZm9yRWFjaCgoeyB2OiB0ZXh0LCBpOiBpZHgsIG46IG5vcm0gfSkgPT4ge1xuICAgICAgICBpZiAoIWlzRGVmaW5lZCh0ZXh0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBpc01hdGNoLCBzY29yZSwgaW5kaWNlcyB9ID0gc2VhcmNoZXIuc2VhcmNoSW4odGV4dCk7XG5cbiAgICAgICAgaWYgKGlzTWF0Y2gpIHtcbiAgICAgICAgICBtYXRjaGVzLnB1c2goe1xuICAgICAgICAgICAgc2NvcmUsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB2YWx1ZTogdGV4dCxcbiAgICAgICAgICAgIGlkeCxcbiAgICAgICAgICAgIG5vcm0sXG4gICAgICAgICAgICBpbmRpY2VzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IHY6IHRleHQsIG46IG5vcm0gfSA9IHZhbHVlO1xuXG4gICAgICBjb25zdCB7IGlzTWF0Y2gsIHNjb3JlLCBpbmRpY2VzIH0gPSBzZWFyY2hlci5zZWFyY2hJbih0ZXh0KTtcblxuICAgICAgaWYgKGlzTWF0Y2gpIHtcbiAgICAgICAgbWF0Y2hlcy5wdXNoKHsgc2NvcmUsIGtleSwgdmFsdWU6IHRleHQsIG5vcm0sIGluZGljZXMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoZXNcbiAgfVxufVxuXG5GdXNlLnZlcnNpb24gPSAnNy4xLjAnO1xuRnVzZS5jcmVhdGVJbmRleCA9IGNyZWF0ZUluZGV4O1xuRnVzZS5wYXJzZUluZGV4ID0gcGFyc2VJbmRleDtcbkZ1c2UuY29uZmlnID0gQ29uZmlnO1xuXG57XG4gIEZ1c2UucGFyc2VRdWVyeSA9IHBhcnNlO1xufVxuXG57XG4gIHJlZ2lzdGVyKEV4dGVuZGVkU2VhcmNoKTtcbn1cblxuZXhwb3J0IHsgRnVzZSBhcyBkZWZhdWx0IH07XG4iLCJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlQXRvbVZhbHVlIH0gZnJvbSBcImpvdGFpXCI7XG5pbXBvcnQgRnVzZSBmcm9tIFwiZnVzZS5qc1wiO1xuXG5pbXBvcnQgeyBhdXRvY29tcGxldGVTdGF0ZUF0b20gfSBmcm9tIFwic3JjL2F0b21zL2dsb2JhbFNlYXJjaFwiO1xuaW1wb3J0IHsgYW1wbGl0dWRlVHJhY2tFdmVudEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FtcGxpdHVkZS9hbXBsaXR1ZGVUcmFja0V2ZW50QXRvbVwiO1xuaW1wb3J0IHsgU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSB9IGZyb20gXCJzcmMvY29udGV4dHMvYW1wbGl0dWRlQ29udGV4dFwiO1xuaW1wb3J0IHsgU3BpZmZ5V2lkZ2V0cyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL3NwaWZmeVdpZGdldHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VTZWFyY2hJbnB1dFByb3BzIHtcbiAgaW5pdGlhbFNlYXJjaFRleHQ/OiBzdHJpbmc7XG4gIHNlYXJjaE9yaWdpbjogU3BpZmZ5V2lkZ2V0cztcbiAgb25TZWFyY2hTdWJtaXQ/OiAocXVlcnk6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VTZWFyY2hJbnB1dFJldHVybiB7XG4gIC8vIFN0YXRlXG4gIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgaGFzVGV4dDogYm9vbGVhbjtcbiAgaXNGb2N1c2VkOiBib29sZWFuO1xuICBmb2N1c2VkSW5kZXg6IG51bWJlcjtcbiAgZm9jdXNlZE9wdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGF1dG9jb21wbGV0ZVJlc3VsdHM6IHN0cmluZ1tdO1xuICBzaG91bGRTaG93QXV0b2NvbXBsZXRlOiBib29sZWFuO1xuICBcbiAgLy8gSGFuZGxlcnNcbiAgaGFuZGxlU2VhcmNoSW5wdXRDaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICBoYW5kbGVTZWFyY2hJbnB1dEZvY3VzOiAoKSA9PiB2b2lkO1xuICBoYW5kbGVTZWFyY2hJbnB1dEJsdXI6ICgpID0+IHZvaWQ7XG4gIGhhbmRsZUtleURvd246IChldmVudDogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4gdm9pZDtcbiAgaGFuZGxlQXV0b2NvbXBsZXRlU2VsZWN0OiAoc3VnZ2VzdGlvbjogc3RyaW5nLCByYW5rUG9zaXRpb24/OiBudW1iZXIpID0+IHZvaWQ7XG4gIGhhbmRsZVN1Ym1pdFNlYXJjaDogKCkgPT4gdm9pZDtcbiAgXG4gIC8vIFV0aWxpdGllc1xuICBzZXRTZWFyY2hUZXh0OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICByZXNldFNlYXJjaDogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVNlYXJjaElucHV0ID0gKHtcbiAgaW5pdGlhbFNlYXJjaFRleHQgPSBcIlwiLFxuICBzZWFyY2hPcmlnaW4sXG4gIG9uU2VhcmNoU3VibWl0LFxufTogVXNlU2VhcmNoSW5wdXRQcm9wcyk6IFVzZVNlYXJjaElucHV0UmV0dXJuID0+IHtcbiAgY29uc3QgdHJhY2sgPSB1c2VBdG9tVmFsdWUoYW1wbGl0dWRlVHJhY2tFdmVudEF0b20pO1xuXG4gIC8vIFN0YXRlXG4gIGNvbnN0IFtzZWFyY2hUZXh0LCBzZXRTZWFyY2hUZXh0XSA9IHVzZVN0YXRlKGluaXRpYWxTZWFyY2hUZXh0KTtcbiAgY29uc3QgW2hhc1RleHQsIHNldEhhc1RleHRdID0gdXNlU3RhdGUoaW5pdGlhbFNlYXJjaFRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuICBjb25zdCBbaXNGb2N1c2VkLCBzZXRJc0ZvY3VzZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbZm9jdXNlZEluZGV4LCBzZXRGb2N1c2VkSW5kZXhdID0gdXNlU3RhdGUoLTEpO1xuICBjb25zdCBbZm9jdXNlZE9wdGlvbklkLCBzZXRGb2N1c2VkT3B0aW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgYXV0b2NvbXBsZXRlU3RhdGUgPSB1c2VBdG9tVmFsdWUoYXV0b2NvbXBsZXRlU3RhdGVBdG9tKTtcbiAgY29uc3QgZ2xvYmFsQXV0b2NvbXBsZXRlUmVzdWx0cyA9IGF1dG9jb21wbGV0ZVN0YXRlLnJlc3VsdHM7XG4gIGNvbnN0IGlzQXV0b2NvbXBsZXRlRW5hYmxlZCA9IGdsb2JhbEF1dG9jb21wbGV0ZVJlc3VsdHMubGVuZ3RoID4gMDtcblxuICAvLyBSZWZzXG4gIGNvbnN0IGlzU2VsZWN0aW5nQXV0b2NvbXBsZXRlID0gdXNlUmVmKGZhbHNlKTtcblxuICAvLyBDb21wdXRlZFxuICBjb25zdCBzaG91bGRTaG93QXV0b2NvbXBsZXRlID0gaGFzVGV4dCAmJiBpc0ZvY3VzZWQgJiYgaXNBdXRvY29tcGxldGVFbmFibGVkO1xuXG4gIGNvbnN0IGF1dG9jb21wbGV0ZVJlc3VsdHNMaW1pdCA9IDU7XG5cbiAgLy8gQ29uZmlndXJlIEZ1c2UuanMgZm9yIGZ1enp5IHNlYXJjaCB3aXRoIGN1c3RvbSBzY29yaW5nXG4gIGNvbnN0IGZ1c2VPcHRpb25zID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgaW5jbHVkZVNjb3JlOiB0cnVlLFxuICAgICAgaW5jbHVkZU1hdGNoZXM6IHRydWUsXG4gICAgICAvLyBGdXp6eSBtYXRjaGluZyB0aHJlc2hvbGQgKDAuMCA9IHBlcmZlY3QgbWF0Y2gsIDEuMCA9IG1hdGNoIGFueXRoaW5nKVxuICAgICAgdGhyZXNob2xkOiAwLjMsXG4gICAgICAvLyBMb2NhdGlvbiB3aGVyZSBtYXRjaCBpcyBleHBlY3RlZCAoMCA9IGJlZ2lubmluZylcbiAgICAgIGxvY2F0aW9uOiAwLFxuICAgICAgLy8gRGlzdGFuY2UgZnJvbSBsb2NhdGlvbiB3aGVyZSBtYXRjaCBjYW4gYmUgZm91bmQgLSBzbWFsbGVyIGZvciBwcmVmaXggcHJlZmVyZW5jZVxuICAgICAgZGlzdGFuY2U6IDQsXG4gICAgICAvLyBNaW5pbXVtIGNoYXJhY3RlciBsZW5ndGggYmVmb3JlIGZ1enp5IG1hdGNoaW5nIHN0YXJ0c1xuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoOiAxLFxuICAgICAgLy8gS2V5cyB0byBzZWFyY2ggKHdlJ3JlIHNlYXJjaGluZyBzdHJpbmdzIGRpcmVjdGx5LCBzbyBubyBrZXlzIG5lZWRlZClcbiAgICAgIGtleXM6IFtdLFxuICAgICAgLy8gVXNlIGV4dGVuZGVkIHNlYXJjaCBmb3IgZXhhY3QgbWF0Y2hlcyBhbmQgcHJlZml4IG1hdGNoaW5nXG4gICAgICB1c2VFeHRlbmRlZFNlYXJjaDogZmFsc2UsXG4gICAgICAvLyBEb24ndCBpZ25vcmUgbG9jYXRpb24gLSB0aGlzIGhlbHBzIHByaW9yaXRpemUgbWF0Y2hlcyBhdCB0aGUgYmVnaW5uaW5nXG4gICAgICBpZ25vcmVMb2NhdGlvbjogZmFsc2UsXG4gICAgfSksXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBmdXNlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFnbG9iYWxBdXRvY29tcGxldGVSZXN1bHRzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBGdXNlKGdsb2JhbEF1dG9jb21wbGV0ZVJlc3VsdHMsIGZ1c2VPcHRpb25zKTtcbiAgfSwgW2dsb2JhbEF1dG9jb21wbGV0ZVJlc3VsdHMsIGZ1c2VPcHRpb25zXSk7XG5cbiAgLy8gQXV0b2NvbXBsZXRlIGZ1enp5IHNlYXJjaCB1c2luZyBGdXNlLmpzXG4gIGNvbnN0IGF1dG9jb21wbGV0ZVJlc3VsdHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWlzQXV0b2NvbXBsZXRlRW5hYmxlZCB8fCAhZnVzZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICghc2VhcmNoVGV4dC50cmltKCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmdXNlUmVzdWx0cyA9IGZ1c2Uuc2VhcmNoKHNlYXJjaFRleHQpO1xuXG4gICAgLy8gVXNlIG9ubHkgRnVzZS5qcyBzY29yaW5nIChyZXN1bHRzIGFyZSBhbHJlYWR5IHNvcnRlZCBieSByZWxldmFuY2UpXG4gICAgcmV0dXJuIGZ1c2VSZXN1bHRzXG4gICAgICAuc2xpY2UoMCwgYXV0b2NvbXBsZXRlUmVzdWx0c0xpbWl0KVxuICAgICAgLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuaXRlbSk7XG4gIH0sIFtpc0F1dG9jb21wbGV0ZUVuYWJsZWQsIGZ1c2UsIHNlYXJjaFRleHQsIGF1dG9jb21wbGV0ZVJlc3VsdHNMaW1pdF0pO1xuXG4gIC8vIEhhbmRsZXJzXG4gIGNvbnN0IGhhbmRsZVNlYXJjaElucHV0Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGNoYW5naW5nIHRleHQsIHRoZXkgbXVzdCBiZSBpbnRlcmFjdGluZyB3aXRoIHRoZSBpbnB1dFxuICAgICAgLy8gU28gd2UgY2FuIHNhZmVseSBhc3N1bWUgdGhleSdyZSBmb2N1c2VkXG4gICAgICBpZiAobmV3VmFsdWUgIT09IHNlYXJjaFRleHQpIHtcbiAgICAgICAgc2V0SXNGb2N1c2VkKHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHRyYWNrPy4oe1xuICAgICAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5TZWFyY2hJbnB1dFN0YXJ0ZWQsXG4gICAgICAgICAgZXZlbnRQcm9wczoge1xuICAgICAgICAgICAgc2VhcmNoT3JpZ2luLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc2V0U2VhcmNoVGV4dChuZXdWYWx1ZSk7XG4gICAgICBzZXRIYXNUZXh0KG5ld1ZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgICAgIHNldEZvY3VzZWRJbmRleCgtMSk7XG4gICAgICBzZXRGb2N1c2VkT3B0aW9uSWQodW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIFtzZWFyY2hPcmlnaW4sIHNlYXJjaFRleHQsIHRyYWNrXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVNlYXJjaElucHV0Rm9jdXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SXNGb2N1c2VkKHRydWUpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlU2VhcmNoSW5wdXRCbHVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFpc1NlbGVjdGluZ0F1dG9jb21wbGV0ZS5jdXJyZW50KSB7XG4gICAgICAgIHNldElzRm9jdXNlZChmYWxzZSk7XG4gICAgICAgIHNldEZvY3VzZWRJbmRleCgtMSk7XG4gICAgICAgIHNldEZvY3VzZWRPcHRpb25JZCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0sIDE1MCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXRTZWFyY2ggPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SXNGb2N1c2VkKGZhbHNlKTtcbiAgICBpZiAoc2VhcmNoVGV4dC50cmltKCkgJiYgb25TZWFyY2hTdWJtaXQpIHtcbiAgICAgIHRyYWNrPy4oe1xuICAgICAgICBldmVudE5hbWU6IFNwaWZmeU1ldHJpY3NFdmVudE5hbWUuU2VhcmNoUXVlcnlTdWJtaXR0ZWQsXG4gICAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgICBzZWFyY2hPcmlnaW4sXG4gICAgICAgICAgcXVlcnlUZXh0OiBzZWFyY2hUZXh0LnRyaW0oKSxcbiAgICAgICAgfSxcbiAgICAgICAgYWxzb1NlbmRUb0dvb2dsZUFuYWx5dGljczogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgb25TZWFyY2hTdWJtaXQoc2VhcmNoVGV4dC50cmltKCkpO1xuICAgIH1cbiAgfSwgW3NlYXJjaFRleHQsIG9uU2VhcmNoU3VibWl0LCBzZWFyY2hPcmlnaW4sIHRyYWNrXSk7XG5cbiAgY29uc3QgaGFuZGxlQXV0b2NvbXBsZXRlU2VsZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKHN1Z2dlc3Rpb246IHN0cmluZywgcmFua1Bvc2l0aW9uPzogbnVtYmVyKSA9PiB7XG4gICAgICBpc1NlbGVjdGluZ0F1dG9jb21wbGV0ZS5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHNldFNlYXJjaFRleHQoc3VnZ2VzdGlvbik7XG4gICAgICBzZXRIYXNUZXh0KHN1Z2dlc3Rpb24udHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgc2V0SXNGb2N1c2VkKGZhbHNlKTtcblxuICAgICAgdHJhY2s/Lih7XG4gICAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5TZWFyY2hJbnB1dFN0YXJ0ZWQsXG4gICAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgICBzZWFyY2hPcmlnaW4sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKG9uU2VhcmNoU3VibWl0KSB7XG4gICAgICAgIG9uU2VhcmNoU3VibWl0KHN1Z2dlc3Rpb24udHJpbSgpKTtcbiAgICAgIH1cblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlzU2VsZWN0aW5nQXV0b2NvbXBsZXRlLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSxcbiAgICBbb25TZWFyY2hTdWJtaXQsIHNlYXJjaE9yaWdpbiwgdHJhY2tdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd0Rvd25cIikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IChmb2N1c2VkSW5kZXggKyAxKSAlIGF1dG9jb21wbGV0ZVJlc3VsdHMubGVuZ3RoO1xuICAgICAgICBzZXRGb2N1c2VkSW5kZXgobmV3SW5kZXgpO1xuICAgICAgICBzZXRGb2N1c2VkT3B0aW9uSWQoYG9wdGlvbi0ke25ld0luZGV4fWApO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dVcFwiKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID1cbiAgICAgICAgICAoZm9jdXNlZEluZGV4IC0gMSArIGF1dG9jb21wbGV0ZVJlc3VsdHMubGVuZ3RoKSAlXG4gICAgICAgICAgYXV0b2NvbXBsZXRlUmVzdWx0cy5sZW5ndGg7XG4gICAgICAgIHNldEZvY3VzZWRJbmRleChuZXdJbmRleCk7XG4gICAgICAgIHNldEZvY3VzZWRPcHRpb25JZChgb3B0aW9uLSR7bmV3SW5kZXh9YCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIGlmIChmb2N1c2VkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBoYW5kbGVTdWJtaXRTZWFyY2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25UZXh0ID0gYXV0b2NvbXBsZXRlUmVzdWx0c1tmb2N1c2VkSW5kZXhdO1xuICAgICAgICAgIGhhbmRsZUF1dG9jb21wbGV0ZVNlbGVjdChzdWdnZXN0aW9uVGV4dCwgZm9jdXNlZEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0Rm9jdXNlZEluZGV4KC0xKTtcbiAgICAgICAgc2V0Rm9jdXNlZE9wdGlvbklkKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBhdXRvY29tcGxldGVSZXN1bHRzLFxuICAgICAgZm9jdXNlZEluZGV4LFxuICAgICAgaGFuZGxlQXV0b2NvbXBsZXRlU2VsZWN0LFxuICAgICAgaGFuZGxlU3VibWl0U2VhcmNoLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCBzZXRTZWFyY2hUZXh0VXRpbGl0eSA9IHVzZUNhbGxiYWNrKCh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBzZXRTZWFyY2hUZXh0KHRleHQpO1xuICAgIHNldEhhc1RleHQodGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCByZXNldFNlYXJjaCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTZWFyY2hUZXh0KFwiXCIpO1xuICAgIHNldEhhc1RleHQoZmFsc2UpO1xuICAgIHNldElzRm9jdXNlZChmYWxzZSk7XG4gICAgc2V0Rm9jdXNlZEluZGV4KC0xKTtcbiAgICBzZXRGb2N1c2VkT3B0aW9uSWQodW5kZWZpbmVkKTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiB7XG4gICAgLy8gU3RhdGVcbiAgICBzZWFyY2hUZXh0LFxuICAgIGhhc1RleHQsXG4gICAgaXNGb2N1c2VkLFxuICAgIGZvY3VzZWRJbmRleCxcbiAgICBmb2N1c2VkT3B0aW9uSWQsXG4gICAgYXV0b2NvbXBsZXRlUmVzdWx0cyxcbiAgICBzaG91bGRTaG93QXV0b2NvbXBsZXRlLFxuXG4gICAgLy8gSGFuZGxlcnNcbiAgICBoYW5kbGVTZWFyY2hJbnB1dENoYW5nZSxcbiAgICBoYW5kbGVTZWFyY2hJbnB1dEZvY3VzLFxuICAgIGhhbmRsZVNlYXJjaElucHV0Qmx1cixcbiAgICBoYW5kbGVLZXlEb3duLFxuICAgIGhhbmRsZUF1dG9jb21wbGV0ZVNlbGVjdCxcbiAgICBoYW5kbGVTdWJtaXRTZWFyY2gsXG5cbiAgICAvLyBVdGlsaXRpZXNcbiAgICBzZXRTZWFyY2hUZXh0OiBzZXRTZWFyY2hUZXh0VXRpbGl0eSxcbiAgICByZXNldFNlYXJjaCxcbiAgfTtcbn07IiwiaW1wb3J0IHsgUHJvZHVjdFJldHJpZXZhbFBhcmFtcywgUHJvZHVjdFJldHJpZXZhbFJlc3VsdCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIFRoaXMgd2lsbCBiZSBzZXQgYnkgdGhlIFByb2R1Y3RSZXRyaWV2YWxQcm92aWRlciB3aGVuIGl0IGluaXRpYWxpemVzXG5sZXQgcHJvZHVjdFJldHJpZXZhbEZ1bmN0aW9uOlxuICB8ICgocGFyYW1zOiBQcm9kdWN0UmV0cmlldmFsUGFyYW1zKSA9PiBQcm9taXNlPFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQ+KVxuICB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgY29uc3Qgc2V0UHJvZHVjdFJldHJpZXZhbEZ1bmN0aW9uID0gKFxuICBmbjogKHBhcmFtczogUHJvZHVjdFJldHJpZXZhbFBhcmFtcykgPT4gUHJvbWlzZTxQcm9kdWN0UmV0cmlldmFsUmVzdWx0PlxuKSA9PiB7XG4gIHByb2R1Y3RSZXRyaWV2YWxGdW5jdGlvbiA9IGZuO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFByb2R1Y3RSZXRyaWV2YWxGdW5jdGlvbiA9ICgpID0+IHtcbiAgaWYgKCFwcm9kdWN0UmV0cmlldmFsRnVuY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIlByb2R1Y3QgcmV0cmlldmFsIGZ1bmN0aW9uIG5vdCBpbml0aWFsaXplZC4gTWFrZSBzdXJlIFByb2R1Y3RSZXRyaWV2YWxQcm92aWRlciBpcyBtb3VudGVkLlwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcHJvZHVjdFJldHJpZXZhbEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyUHJvZHVjdFJldHJpZXZhbEZ1bmN0aW9uID0gKCkgPT4ge1xuICBwcm9kdWN0UmV0cmlldmFsRnVuY3Rpb24gPSBudWxsO1xufTsiLCJcbmltcG9ydCB7IGF0b20gfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IGdldFByb2R1Y3RSZXRyaWV2YWxGdW5jdGlvbiB9IGZyb20gXCIuL3Byb2R1Y3RSZXRyaWV2YWxBZGFwdGVyXCI7XG5pbXBvcnQgeyBQcm9kdWN0UmV0cmlldmFsUGFyYW1zLCBQcm9kdWN0UmV0cmlldmFsUmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW50ZXJmYWNlIFByb2R1Y3RSZXRyaWV2YWxTdGF0ZSB7XG4gIGRhdGE6IFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQgfCBudWxsO1xuICBsb2FkaW5nOiBib29sZWFuO1xuICBlcnJvcjogc3RyaW5nIHwgbnVsbDtcbiAgbGFzdFByb2R1Y3RJZHM6IHN0cmluZ1tdIHwgbnVsbDtcbn1cblxuZXhwb3J0IGNvbnN0IHByb2R1Y3RSZXRyaWV2YWxBdG9tID0gYXRvbTxQcm9kdWN0UmV0cmlldmFsU3RhdGU+KHtcbiAgZGF0YTogbnVsbCxcbiAgbG9hZGluZzogZmFsc2UsXG4gIGVycm9yOiBudWxsLFxuICBsYXN0UHJvZHVjdElkczogbnVsbCxcbn0pO1xuXG5leHBvcnQgY29uc3QgcGVyZm9ybVByb2R1Y3RSZXRyaWV2YWxBdG9tID0gYXRvbShcbiAgbnVsbCxcbiAgYXN5bmMgKGdldCwgc2V0LCBwYXJhbXM6IFByb2R1Y3RSZXRyaWV2YWxQYXJhbXMpID0+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBnZXQocHJvZHVjdFJldHJpZXZhbEF0b20pO1xuXG4gICAgaWYgKGN1cnJlbnRTdGF0ZS5sb2FkaW5nKSB7XG4gICAgICByZXR1cm47IC8vIFByZXZlbnQgY29uY3VycmVudCByZXRyaWV2YWxzXG4gICAgfVxuXG4gICAgc2V0KHByb2R1Y3RSZXRyaWV2YWxBdG9tLCB7XG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgbGFzdFByb2R1Y3RJZHM6IHBhcmFtcy5wcm9kdWN0SWRzLFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldHJpZXZlUHJvZHVjdHMgPSBnZXRQcm9kdWN0UmV0cmlldmFsRnVuY3Rpb24oKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJldHJpZXZlUHJvZHVjdHMocGFyYW1zKTtcbiAgICAgIHNldChwcm9kdWN0UmV0cmlldmFsQXRvbSwge1xuICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgbGFzdFByb2R1Y3RJZHM6IHBhcmFtcy5wcm9kdWN0SWRzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJBbiB1bmtub3duIGVycm9yIG9jY3VycmVkXCI7XG4gICAgICBzZXQocHJvZHVjdFJldHJpZXZhbEF0b20sIHtcbiAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgIGxhc3RQcm9kdWN0SWRzOiBwYXJhbXMucHJvZHVjdElkcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuKTtcblxuLy8gR2V0IGp1c3QgdGhlIHByb2R1Y3RzIGFycmF5IChhbHJlYWR5IG5vcm1hbGl6ZWQgYnkgc2VydmljZSlcbmV4cG9ydCBjb25zdCByZXRyaWV2ZWRQcm9kdWN0c0F0b20gPSBhdG9tKChnZXQpID0+IHtcbiAgY29uc3QgcmV0cmlldmFsRGF0YSA9IGdldChwcm9kdWN0UmV0cmlldmFsQXRvbSkuZGF0YTtcbiAgcmV0dXJuIHJldHJpZXZhbERhdGE/LnByb2R1Y3RzIHx8IFtdO1xufSk7XG5cbmV4cG9ydCBjb25zdCBwcm9kdWN0UmV0cmlldmFsTG9hZGluZ0F0b20gPSBhdG9tKChnZXQpID0+IHtcbiAgcmV0dXJuIGdldChwcm9kdWN0UmV0cmlldmFsQXRvbSkubG9hZGluZztcbn0pO1xuXG5leHBvcnQgY29uc3QgcHJvZHVjdFJldHJpZXZhbEVycm9yQXRvbSA9IGF0b20oKGdldCkgPT4ge1xuICByZXR1cm4gZ2V0KHByb2R1Y3RSZXRyaWV2YWxBdG9tKS5lcnJvcjtcbn0pOyIsImltcG9ydCB7IHVzZUF0b21WYWx1ZSwgdXNlU2V0QXRvbSB9IGZyb20gXCJqb3RhaVwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VGZWF0dXJlRmxhZ1NlcnZpY2UgfSBmcm9tIFwic3JjL2NvbnRleHRzL2ZlYXR1cmVGbGFnU2VydmljZUNvbnRleHQvZmVhdHVyZUZsYWdTZXJ2aWNlQ29udGV4dFwiO1xuaW1wb3J0IHtcbiAgcmV0cmlldmVkUHJvZHVjdHNBdG9tLFxuICBwZXJmb3JtUHJvZHVjdFJldHJpZXZhbEF0b20sXG4gIHByb2R1Y3RSZXRyaWV2YWxBdG9tLFxufSBmcm9tIFwic3JjL2F0b21zL3NlYXJjaC9wcm9kdWN0UmV0cmlldmFsQVBJXCI7XG5pbXBvcnQgeyB1c2VOZXdPcmdDb25maWcgfSBmcm9tIFwiLi4vTmV3T3JnQ29uZmlnXCI7XG5pbXBvcnQgeyBTZWFyY2hSZXNwb25zZVByb2R1Y3RBdHRyaWJ1dGVzIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvYXBpL3Jlc3BvbnNlXCI7XG5pbXBvcnQgeyBGZWF0dXJlR2F0ZXMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVsc1wiO1xuXG4vKipcbiAqIEEgaG9vayB0byBnZXQgcmVjb21tZW5kZWQgcHJvZHVjdHMuXG4gKiBJdCBjaGVja3MgdGhlIGBJc1JlY29tbWVuZGVkUHJvZHVjdHNFbmFibGVkYCBmZWF0dXJlIGdhdGUgYW5kIHRyaWdnZXJzIGZldGNoaW5nIGlmIG5lZWRlZC5cbiAqIElmIHRoZSBnYXRlIGlzIGVuYWJsZWQsIGl0IHJldHVybnMgdGhlIGxpc3Qgb2YgcmVjb21tZW5kZWQgcHJvZHVjdHMuXG4gKiBJZiB0aGUgZ2F0ZSBpcyBkaXNhYmxlZCwgaXQgcmV0dXJucyBhbiBlbXB0eSBhcnJheS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbGlzdCBvZiByZWNvbW1lbmRlZCBwcm9kdWN0cyBvciBhbiBlbXB0eSBhcnJheS5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVJlY29tbWVuZGVkUHJvZHVjdHMgPVxuICAoKTogU2VhcmNoUmVzcG9uc2VQcm9kdWN0QXR0cmlidXRlc1tcImF0dHJpYnV0ZXNcIl1bXSA9PiB7XG4gICAgY29uc3QgeyBmZWF0dXJlRmxhZ1NlcnZpY2UgfSA9IHVzZUZlYXR1cmVGbGFnU2VydmljZSgpO1xuICAgIGNvbnN0IGlzRW5hYmxlZCA9IGZlYXR1cmVGbGFnU2VydmljZT8uaXNGZWF0dXJlR2F0ZUVuYWJsZWQoXG4gICAgICBGZWF0dXJlR2F0ZXMuSXNSZWNvbW1lbmRlZFByb2R1Y3RzRW5hYmxlZFxuICAgICk7XG4gICAgY29uc3QgcmVjb21tZW5kZWRQcm9kdWN0cyA9IHVzZUF0b21WYWx1ZShyZXRyaWV2ZWRQcm9kdWN0c0F0b20pO1xuICAgIGNvbnN0IHBlcmZvcm1Qcm9kdWN0UmV0cmlldmFsID0gdXNlU2V0QXRvbShwZXJmb3JtUHJvZHVjdFJldHJpZXZhbEF0b20pO1xuICAgIGNvbnN0IHsgbGFzdFByb2R1Y3RJZHMgfSA9IHVzZUF0b21WYWx1ZShwcm9kdWN0UmV0cmlldmFsQXRvbSk7XG4gICAgY29uc3Qgb3JnVUlDb25maWcgPSB1c2VOZXdPcmdDb25maWcoKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByZWNvbW1lbmRlZFByb2R1Y3RJZHMgPSBvcmdVSUNvbmZpZy5mcm9udGVuZENvbmZpZz8udWlDb25maWdzPy5zZWFyY2hDb25maWdcbiAgICAgICAgPyBvcmdVSUNvbmZpZy5mcm9udGVuZENvbmZpZz8udWlDb25maWdzPy5zZWFyY2hDb25maWcucmVjb21tZW5kZWRQcm9kdWN0c1xuICAgICAgICA6IFtdO1xuICAgICAgLy8gRmV0Y2ggb25seSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLCB0aGVyZSBhcmUgSURzIHRvIGZldGNoLCBhbmQgd2UgaGF2ZW4ndCBhbHJlYWR5IGZldGNoZWQgdGhlbS5cbiAgICAgIGlmIChcbiAgICAgICAgaXNFbmFibGVkICYmXG4gICAgICAgIHJlY29tbWVuZGVkUHJvZHVjdElkcyAmJlxuICAgICAgICByZWNvbW1lbmRlZFByb2R1Y3RJZHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAhbGFzdFByb2R1Y3RJZHNcbiAgICAgICkge1xuICAgICAgICBwZXJmb3JtUHJvZHVjdFJldHJpZXZhbCh7IHByb2R1Y3RJZHM6IHJlY29tbWVuZGVkUHJvZHVjdElkcyB9KTtcbiAgICAgIH1cbiAgICB9LCBbaXNFbmFibGVkLCBwZXJmb3JtUHJvZHVjdFJldHJpZXZhbCwgbGFzdFByb2R1Y3RJZHMsIG9yZ1VJQ29uZmlnXSk7XG5cbiAgICByZXR1cm4gaXNFbmFibGVkID8gcmVjb21tZW5kZWRQcm9kdWN0cyA6IFtdO1xuICB9OyIsImltcG9ydCB7IHVzZUF0b20sIHVzZUF0b21WYWx1ZSwgdXNlU2V0QXRvbSB9IGZyb20gXCJqb3RhaVwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7XG4gIGFkZFNlYXJjaEZpbHRlckF0b20sXG4gIGNsZWFyU2VhcmNoRmlsdGVyc0F0b20sXG4gIGNyZWF0ZUZpbHRlck9wdGlvbixcbiAgZmlsdGVyZWRTZWFyY2hQcm9kdWN0c0F0b20sXG4gIHBlcmZvcm1TZWFyY2hBdG9tLFxuICByZW1vdmVTZWFyY2hGaWx0ZXJBdG9tLFxuICBzZWFyY2hBdG9tLFxuICBzZWFyY2hGaWx0ZXJzQXRvbSxcbiAgc2VhcmNoUGFyYW1zQXRvbSxcbiAgc2VhcmNoUHJvZHVjdFNvcnRpbmdBdG9tLFxuICBzZWFyY2hTZWxlY3RlZEZpbHRlcnNBdG9tLFxuICBTZWxlY3RlZEZpbHRlck9wdGlvbixcbn0gZnJvbSBcInNyYy9hdG9tcy9zZWFyY2hcIjtcbmltcG9ydCB7XG4gIGlzRmlsdGVyT3BlbkF0b20sXG59IGZyb20gXCJzcmMvYXRvbXMvZ2xvYmFsU2VhcmNoL2dsb2JhbFNlYXJjaFwiO1xuaW1wb3J0IHsgZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUgfSBmcm9tIFwic3JjL2F0b21zL3NlYXJjaC91dGlsc1wiO1xuaW1wb3J0IHsgUHJvZHVjdFNvcnRpbmcgfSBmcm9tIFwic3JjL2F0b21zL3NlYXJjaC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSxcbiAgdXNlQW1wbGl0dWRlLFxufSBmcm9tIFwic3JjL2NvbnRleHRzL2FtcGxpdHVkZUNvbnRleHQvYW1wbGl0dWRlQ29udGV4dFwiO1xuaW1wb3J0IHsgU3BpZmZ5V2lkZ2V0cyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL3NwaWZmeVdpZGdldHNcIjtcbmltcG9ydCB7IFByb2R1Y3RDYXJkQ29uZmlnIH0gZnJvbSBcInNyYy9jb250ZXh0cy90eXBlc1wiO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvYXBpL3NlYXJjaFwiO1xuaW1wb3J0IHsgU2VhcmNoUmVzcG9uc2VQcm9kdWN0IH0gZnJvbSBcIkBzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudFwiO1xuaW1wb3J0IHtcbiAgU2VhcmNoRmlsdGVyRGF0dW0sXG4gIFNlbGVjdEZpbHRlckl0ZW0sXG59IGZyb20gXCJzcmMvdHlwZXMvc2VhcmNoLWZpbHRlci10eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U2VhcmNoUmVzdWx0c1N0YXRlLCBTZWFyY2hSZXN1bHRzU3RhdGUgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IG9yZ1Nob3J0TmFtZUF0b20gfSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCB7IHVzZVRyYWNrQ29tcG9uZW50VmlzaWJsZUV2ZW50IH0gZnJvbSBcIi4uL1RyYWNrQ29tcG9uZW50VmlzaWJsZUV2ZW50XCI7XG5pbXBvcnQgeyBhbXBsaXR1ZGVUcmFja0V2ZW50QXRvbSB9IGZyb20gXCJzcmMvYXRvbXMvYW1wbGl0dWRlL2FtcGxpdHVkZVRyYWNrRXZlbnRBdG9tXCI7XG5pbXBvcnQgeyBuZXdPcmdDb25maWdBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9vcmdcIjtcbmltcG9ydCB7IHJldHJpZXZlZFByb2R1Y3RzQXRvbSB9IGZyb20gXCJzcmMvYXRvbXMvc2VhcmNoL3Byb2R1Y3RSZXRyaWV2YWxBUElcIjtcbmltcG9ydCB7IHVzZVNlYXJjaElucHV0IH0gZnJvbSBcIi4vdXNlU2VhcmNoSW5wdXRcIjtcbmltcG9ydCB7IFNlYXJjaFJlc3BvbnNlUHJvZHVjdEF0dHJpYnV0ZXMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVsc1wiO1xuaW1wb3J0IHsgdXNlTmV3T3JnQ29uZmlnIH0gZnJvbSBcIi4uL05ld09yZ0NvbmZpZ1wiO1xuaW1wb3J0IHsgdXNlUmVjb21tZW5kZWRQcm9kdWN0cyB9IGZyb20gXCIuL3VzZVJlY29tbWVuZGVkUHJvZHVjdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHRzSG9jUHJvcHMge1xuICAvLyBEYXRhXG4gIHNlYXJjaERhdGE6IFNlYXJjaFJlc3VsdCB8IG51bGw7XG4gIHNlYXJjaFJlc3BvbnNlSWQ6IHN0cmluZztcbiAgbWVyY2hhbnRTaG9ydE5hbWU6IHN0cmluZztcbiAgcHJvZHVjdENhcmRDb25maWc6IFByb2R1Y3RDYXJkQ29uZmlnO1xuICBwcm9kdWN0TGlzdDogU2VhcmNoUmVzcG9uc2VQcm9kdWN0W107XG4gIGF1dG9jb21wbGV0ZVJlc3VsdHM6IHN0cmluZ1tdO1xuICBzZWFyY2hGaWx0ZXJzOiBTZWFyY2hGaWx0ZXJEYXR1bVtdO1xuICBhdmFpbGFibGVEeW5hbWljRmlsdGVyczogeyBuYW1lOiBzdHJpbmc7IGRpc3BsYXlOYW1lOiBzdHJpbmcgfVtdO1xuICBzZWxlY3RlZEZpbHRlck9wdGlvbnM6IFNlbGVjdGVkRmlsdGVyT3B0aW9uW107XG4gIHJlY29tbWVuZGVkUHJvZHVjdHM6IFNlYXJjaFJlc3BvbnNlUHJvZHVjdEF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXVtdO1xuXG4gIC8vIFN0YXRlXG4gIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgcXVlcnk6IHN0cmluZztcbiAgc2VhcmNoUmVzdWx0c1N0YXRlOiBTZWFyY2hSZXN1bHRzU3RhdGU7XG4gIGlzTG9hZGluZ1NlYXJjaDogYm9vbGVhbjtcbiAgaXNGaWx0ZXJPcGVuOiBib29sZWFuO1xuICBzaG91bGRTaG93QXV0b2NvbXBsZXRlOiBib29sZWFuO1xuICBmb2N1c2VkSW5kZXg6IG51bWJlcjtcbiAgZm9jdXNlZE9wdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gVUlcbiAgZmlsdGVyQnV0dG9uVGV4dDogc3RyaW5nO1xuXG4gIC8vIEV2ZW50IEhhbmRsZXJzXG4gIG9uU2VhcmNoSW5wdXRDaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICBvblN1Ym1pdFNlYXJjaDogKCkgPT4gdm9pZDtcbiAgb25BdXRvY29tcGxldGVTZWxlY3Q6IChzdWdnZXN0aW9uOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uS2V5RG93bjogKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB2b2lkO1xuICBvblNlYXJjaElucHV0Rm9jdXM6ICgpID0+IHZvaWQ7XG4gIG9uU2VhcmNoSW5wdXRCbHVyOiAoKSA9PiB2b2lkO1xuICBvblRvZ2dsZUR5bmFtaWNGaWx0ZXI6ICh7IGZpbHRlciwgZHluYW1pY0ZpbHRlckRpc3BsYXlOYW1lIH06IHsgZmlsdGVyOiBzdHJpbmc7IGR5bmFtaWNGaWx0ZXJEaXNwbGF5TmFtZTogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIG9uU2VsZWN0RmlsdGVySXRlbTogU2VsZWN0RmlsdGVySXRlbTtcbiAgb25SZW1vdmVGaWx0ZXI6IChmaWx0ZXI6IFNlbGVjdGVkRmlsdGVyT3B0aW9uKSA9PiB2b2lkO1xuICBvbkNsZWFyQWxsRmlsdGVyczogKCkgPT4gdm9pZDtcbiAgc2V0SXNGaWx0ZXJPcGVuOiAoaXNGaWx0ZXJPcGVuOiBib29sZWFuKSA9PiB2b2lkO1xuXG4gIC8vIFJlZnNcbiAgc2VhcmNoUmVzdWx0c1JlZjogUmVhY3QuUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50Pjtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVNlYXJjaCA9ICgpOiBTZWFyY2hSZXN1bHRzSG9jUHJvcHMgPT4ge1xuICAvLyBBdG9tc1xuICBjb25zdCBjb25maWcgPSB1c2VOZXdPcmdDb25maWcoKTtcbiAgY29uc3Qgb3JnU2hvcnROYW1lID0gdXNlQXRvbVZhbHVlKG9yZ1Nob3J0TmFtZUF0b20pO1xuICBjb25zdCB7IGRhdGE6IHNlYXJjaERhdGEsIGxvYWRpbmc6IGlzTG9hZGluZ1NlYXJjaCB9ID1cbiAgICB1c2VBdG9tVmFsdWUoc2VhcmNoQXRvbSk7XG4gIGNvbnN0IHByb2R1Y3RMaXN0ID0gdXNlQXRvbVZhbHVlKGZpbHRlcmVkU2VhcmNoUHJvZHVjdHNBdG9tKTtcbiAgY29uc3QgcGVyZm9ybVNlYXJjaCA9IHVzZVNldEF0b20ocGVyZm9ybVNlYXJjaEF0b20pO1xuICBjb25zdCBbeyBxdWVyeSB9XSA9IHVzZUF0b20oc2VhcmNoUGFyYW1zQXRvbSk7XG4gIGNvbnN0IFtpc0ZpbHRlck9wZW4sIHNldElzRmlsdGVyT3Blbl0gPSB1c2VBdG9tKGlzRmlsdGVyT3BlbkF0b20pO1xuICBjb25zdCBbc2VsZWN0ZWRGaWx0ZXJPcHRpb25zXSA9IHVzZUF0b20oc2VhcmNoU2VsZWN0ZWRGaWx0ZXJzQXRvbSk7XG4gIGNvbnN0IGFkZEZpbHRlciA9IHVzZVNldEF0b20oYWRkU2VhcmNoRmlsdGVyQXRvbSk7XG4gIGNvbnN0IHJlbW92ZUZpbHRlciA9IHVzZVNldEF0b20ocmVtb3ZlU2VhcmNoRmlsdGVyQXRvbSk7XG4gIGNvbnN0IFtwcm9kdWN0U29ydGluZywgc2V0UHJvZHVjdFNvcnRpbmddID0gdXNlQXRvbShzZWFyY2hQcm9kdWN0U29ydGluZ0F0b20pO1xuICBjb25zdCBjbGVhckZpbHRlcnMgPSB1c2VTZXRBdG9tKGNsZWFyU2VhcmNoRmlsdGVyc0F0b20pO1xuICBjb25zdCBzZWFyY2hGaWx0ZXJzID0gdXNlQXRvbVZhbHVlKHNlYXJjaEZpbHRlcnNBdG9tKTtcbiAgY29uc3QgcmVjb21tZW5kZWRQcm9kdWN0cyA9IHVzZVJlY29tbWVuZGVkUHJvZHVjdHMoKTtcblxuICAvLyBSZWZzXG4gIGNvbnN0IHNlYXJjaFJlc3VsdHNSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBcbiAgLy8gVXRpbGl0aWVzXG4gIGNvbnN0IHNjcm9sbFRvVG9wID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHNlYXJjaFJlc3VsdHNSZWYuY3VycmVudDtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgfVxuICB9LCBbXSk7XG4gIFxuICAvLyBTZWFyY2ggSW5wdXQgSG9va1xuICBjb25zdCBzZWFyY2hJbnB1dCA9IHVzZVNlYXJjaElucHV0KHtcbiAgICBpbml0aWFsU2VhcmNoVGV4dDogcXVlcnkgfHwgJycsXG4gICAgc2VhcmNoT3JpZ2luOiBTcGlmZnlXaWRnZXRzLlNlYXJjaFJlc3VsdHMsXG4gICAgb25TZWFyY2hTdWJtaXQ6IChzZWFyY2hRdWVyeSkgPT4ge1xuICAgICAgcGVyZm9ybVNlYXJjaCh7IHF1ZXJ5OiBzZWFyY2hRdWVyeSB9KTtcbiAgICB9LFxuICB9KTtcbiAgXG4gIGNvbnN0IHtcbiAgICBzZWFyY2hUZXh0LFxuICAgIGZvY3VzZWRJbmRleCxcbiAgICBmb2N1c2VkT3B0aW9uSWQsXG4gICAgYXV0b2NvbXBsZXRlUmVzdWx0cyxcbiAgICBzaG91bGRTaG93QXV0b2NvbXBsZXRlLFxuICAgIGhhbmRsZVNlYXJjaElucHV0Q2hhbmdlLFxuICAgIGhhbmRsZVNlYXJjaElucHV0Rm9jdXMsXG4gICAgaGFuZGxlU2VhcmNoSW5wdXRCbHVyLFxuICAgIGhhbmRsZUtleURvd24sXG4gICAgaGFuZGxlQXV0b2NvbXBsZXRlU2VsZWN0LFxuICAgIGhhbmRsZVN1Ym1pdFNlYXJjaCxcbiAgICBzZXRTZWFyY2hUZXh0LFxuICB9ID0gc2VhcmNoSW5wdXQ7XG4gIGNvbnN0IHNlYXJjaFJlc3VsdHNTdGF0ZSA9IGdldFNlYXJjaFJlc3VsdHNTdGF0ZShpc0xvYWRpbmdTZWFyY2gsIHNlYXJjaERhdGEpO1xuXG4gIGNvbnN0IGR5bmFtaWNGaWx0ZXJzID0gc2VhcmNoRGF0YT8uZmlsdGVycyB8fCBbXTtcblxuICAvLyBQcm92aWRlIGZhbGxiYWNrIHZhbHVlcyB3aGVuIG9yZ1VJQ29uZmlnIGlzIG5vdCB5ZXQgYXZhaWxhYmxlXG4gIGNvbnN0IHNhZmVQcm9kdWN0Q2FyZENvbmZpZyA9IGNvbmZpZz8uZnJvbnRlbmRDb25maWc/LnVpQ29uZmlnc1xuICAgID8ucHJvZHVjdENhcmRDb25maWcgfHwge1xuICAgIHZhcmlhbnQ6IFwibWluaW1hbFwiLFxuICAgIGhvdmVyVmFyaWFudDogXCJub25lXCIsXG4gICAgbGF5b3V0VmFyaWFudDogXCJzcXVhcmVcIixcbiAgfTtcbiAgY29uc3Qgc2FmZU1lcmNoYW50U2hvcnROYW1lID0gb3JnU2hvcnROYW1lIHx8IFwiXCI7XG5cbiAgY29uc3QgYXZhaWxhYmxlRHluYW1pY0ZpbHRlcnMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gZHluYW1pY0ZpbHRlcnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChkeW5hbWljRmlsdGVyTmFtZSkgPT5cbiAgICAgICAgICAhc2VsZWN0ZWRGaWx0ZXJPcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLmlkID09PSBgZHluYW1pYzoke2R5bmFtaWNGaWx0ZXJOYW1lfWApLFxuICAgICAgKVxuICAgICAgLm1hcCgoZHluYW1pY0ZpbHRlck5hbWUpID0+ICh7XG4gICAgICAgIG5hbWU6IGR5bmFtaWNGaWx0ZXJOYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUoZHluYW1pY0ZpbHRlck5hbWUpLFxuICAgICAgfSkpO1xuICB9LCBbZHluYW1pY0ZpbHRlcnMsIHNlbGVjdGVkRmlsdGVyT3B0aW9uc10pO1xuXG4gIGNvbnN0IGZpbHRlcnMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzb3J0T3B0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZmlsdGVySXRlbUlkOiBTdHJpbmcoUHJvZHVjdFNvcnRpbmcuRkVBVFVSRUQpLFxuICAgICAgICBkaXNwbGF5TmFtZTogJ1JlbGV2YW5jZScsXG4gICAgICAgIHByb2R1Y3RDb3VudDogMCxcbiAgICAgICAgaXNTZWxlY3RlZDogcHJvZHVjdFNvcnRpbmcgPT09IFByb2R1Y3RTb3J0aW5nLkZFQVRVUkVELFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmlsdGVySXRlbUlkOiBTdHJpbmcoUHJvZHVjdFNvcnRpbmcuUFJJQ0VfQVNDKSxcbiAgICAgICAgZGlzcGxheU5hbWU6ICdQcmljZTogTG93IHRvIEhpZ2gnLFxuICAgICAgICBwcm9kdWN0Q291bnQ6IDAsXG4gICAgICAgIGlzU2VsZWN0ZWQ6IHByb2R1Y3RTb3J0aW5nID09PSBQcm9kdWN0U29ydGluZy5QUklDRV9BU0MsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmaWx0ZXJJdGVtSWQ6IFN0cmluZyhQcm9kdWN0U29ydGluZy5QUklDRV9ERVNDKSxcbiAgICAgICAgZGlzcGxheU5hbWU6ICdQcmljZTogSGlnaCB0byBMb3cnLFxuICAgICAgICBwcm9kdWN0Q291bnQ6IDAsXG4gICAgICAgIGlzU2VsZWN0ZWQ6IHByb2R1Y3RTb3J0aW5nID09PSBQcm9kdWN0U29ydGluZy5QUklDRV9ERVNDLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIFt7IGZpbHRlcklkOiAnc29ydCcsIGRpc3BsYXlOYW1lOiAnU09SVCcsIGl0ZW1zOiBzb3J0T3B0aW9ucyB9LCAuLi5zZWFyY2hGaWx0ZXJzXSBhcyBTZWFyY2hGaWx0ZXJEYXR1bVtdO1xuICB9LCBbcHJvZHVjdFNvcnRpbmcsIHNlYXJjaEZpbHRlcnNdKTtcblxuICBjb25zdCBmaWx0ZXJCdXR0b25UZXh0ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IGZpbHRlcnMucmVkdWNlKChhY2M6IG51bWJlciwgZmlsdGVyKSA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmZpbHRlcklkID09PSAnc29ydCcpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2MgKyBmaWx0ZXIuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzU2VsZWN0ZWQpLmxlbmd0aDtcbiAgICB9LCAwKTtcbiAgICBpZiAoc2VsZWN0ZWRDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuICdGaWx0ZXIgJiBTb3J0JztcbiAgICB9XG4gICAgcmV0dXJuIGBGaWx0ZXIgJiBTb3J0ICgke3NlbGVjdGVkQ291bnR9KWA7XG4gIH0sIFtmaWx0ZXJzXSk7XG5cbiAgLy8gQ2FsbGJhY2tzXG4gIGNvbnN0IHsgdHJhY2tFdmVudCB9ID0gdXNlQW1wbGl0dWRlKCk7XG5cblxuICBjb25zdCBoYW5kbGVUb2dnbGVEeW5hbWljRmlsdGVyID0gdXNlQ2FsbGJhY2soXG4gICAgKHsgZmlsdGVyLCBkeW5hbWljRmlsdGVyRGlzcGxheU5hbWUgfTogeyBmaWx0ZXI6IHN0cmluZzsgZHluYW1pY0ZpbHRlckRpc3BsYXlOYW1lOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgdHJhY2tFdmVudCh7XG4gICAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5TZWFyY2hGaWx0ZXJDbGlja2VkLFxuICAgICAgICBldmVudFByb3BzOiB7XG4gICAgICAgICAgZmlsdGVyVHlwZTogJ0R5bmFtaWMnLFxuICAgICAgICAgIGZpbHRlclZhbHVlOiBmaWx0ZXIsXG4gICAgICAgICAgcXVlcnlUZXh0OiBzZWFyY2hUZXh0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhZGRGaWx0ZXIoY3JlYXRlRmlsdGVyT3B0aW9uKCdkeW5hbWljJywgZmlsdGVyLCBkeW5hbWljRmlsdGVyRGlzcGxheU5hbWUpKTtcbiAgICAgIHNjcm9sbFRvVG9wKCk7XG4gICAgfSxcbiAgICBbYWRkRmlsdGVyLCBzZWFyY2hUZXh0LCBzY3JvbGxUb1RvcF0sXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlUmVtb3ZlRmlsdGVyID0gdXNlQ2FsbGJhY2soXG4gICAgKGZpbHRlcjogU2VsZWN0ZWRGaWx0ZXJPcHRpb24pID0+IHtcbiAgICAgIHJlbW92ZUZpbHRlcihmaWx0ZXIuaWQpO1xuICAgICAgc2Nyb2xsVG9Ub3AoKTtcbiAgICB9LFxuICAgIFtyZW1vdmVGaWx0ZXIsIHNjcm9sbFRvVG9wXSxcbiAgKTtcblxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdEZpbHRlckl0ZW06IFNlbGVjdEZpbHRlckl0ZW0gPSB1c2VDYWxsYmFjayhcbiAgICAoe1xuICAgICAgZmlsdGVySWQsXG4gICAgICBmaWx0ZXJJdGVtSWQsXG4gICAgICBpc1NlbGVjdGVkLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgfToge1xuICAgICAgZmlsdGVySWQ6IHN0cmluZztcbiAgICAgIGZpbHRlckl0ZW1JZDogc3RyaW5nO1xuICAgICAgaXNTZWxlY3RlZDogYm9vbGVhbjtcbiAgICAgIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKGZpbHRlcklkID09PSAnc29ydCcpIHtcbiAgICAgICAgY29uc3QgbmV3U29ydCA9IGZpbHRlckl0ZW1JZCBhcyBQcm9kdWN0U29ydGluZztcbiAgICAgICAgdHJhY2tFdmVudCh7XG4gICAgICAgICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLlNlYXJjaFNvcnRDbGlja2VkLFxuICAgICAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgICAgIHNvcnRUeXBlOiBuZXdTb3J0LFxuICAgICAgICAgICAgcXVlcnlUZXh0OiBzZWFyY2hUZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRQcm9kdWN0U29ydGluZyhuZXdTb3J0KTtcbiAgICAgICAgc2Nyb2xsVG9Ub3AoKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzU2VsZWN0ZWQpIHtcbiAgICAgICAgcmVtb3ZlRmlsdGVyKGAke2ZpbHRlcklkfToke2ZpbHRlckl0ZW1JZH1gKTtcbiAgICAgICAgc2Nyb2xsVG9Ub3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYWNrRXZlbnQoe1xuICAgICAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5TZWFyY2hGaWx0ZXJDbGlja2VkLFxuICAgICAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgICAgIGZpbHRlclR5cGU6ICdTdGF0aWMnLFxuICAgICAgICAgICAgZmlsdGVyQ2F0ZWdvcnk6IGZpbHRlcklkLFxuICAgICAgICAgICAgZmlsdGVyVmFsdWU6IGZpbHRlckl0ZW1JZCxcbiAgICAgICAgICAgIHF1ZXJ5VGV4dDogc2VhcmNoVGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYWRkRmlsdGVyKGNyZWF0ZUZpbHRlck9wdGlvbihmaWx0ZXJJZCwgZmlsdGVySXRlbUlkLCBkaXNwbGF5TmFtZSkpO1xuICAgICAgICBzY3JvbGxUb1RvcCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZEZpbHRlciwgcmVtb3ZlRmlsdGVyLCBzZXRQcm9kdWN0U29ydGluZywgc2VhcmNoVGV4dCwgc2Nyb2xsVG9Ub3BdLFxuICApO1xuXG5cbiAgY29uc3QgaGFuZGxlQ2xlYXJBbGxGaWx0ZXJzID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFByb2R1Y3RTb3J0aW5nKFByb2R1Y3RTb3J0aW5nLkZFQVRVUkVEKTtcbiAgICBjbGVhckZpbHRlcnMoKTtcbiAgICBzY3JvbGxUb1RvcCgpO1xuICB9LCBbc2V0UHJvZHVjdFNvcnRpbmcsIGNsZWFyRmlsdGVycywgc2Nyb2xsVG9Ub3BdKTtcblxuICAvLyBTaWRlIEVmZmVjdHNcbiAgdXNlVHJhY2tDb21wb25lbnRWaXNpYmxlRXZlbnQoXG4gICAgU3BpZmZ5V2lkZ2V0cy5TZWFyY2hSZXN1bHRzLFxuICAgIHNlYXJjaFJlc3VsdHNSZWYsXG4gICAge30sXG4gICAgU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5TZWFyY2hDb21wb25lbnRWaXNpYmxlLFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNlYXJjaFJlc3VsdHNTdGF0ZSA9PT0gU2VhcmNoUmVzdWx0c1N0YXRlLlJlc3VsdHMgfHwgc2VhcmNoUmVzdWx0c1N0YXRlID09PSBTZWFyY2hSZXN1bHRzU3RhdGUuTm9SZXN1bHRzKSB7XG4gICAgICB0cmFja0V2ZW50KHtcbiAgICAgICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLlNlYXJjaFJlc3VsdHNWaWV3ZWQsXG4gICAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgICBxdWVyeVRleHQ6IHNlYXJjaFRleHQsXG4gICAgICAgICAgcmVzdWx0c0NvdW50OiBwcm9kdWN0TGlzdC5sZW5ndGgsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtwcm9kdWN0TGlzdC5sZW5ndGgsIHNlYXJjaFJlc3VsdHNTdGF0ZV0pO1xuXG4gIC8vIFRoaXMgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBzZWFyY2ggdGV4dCB0cmlnZ2VyaW5nIGEgc2VhcmNoXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5ICE9PSBzZWFyY2hUZXh0KSB7XG4gICAgICBjb25zdCBlc3EgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnZXNxJyk7XG4gICAgICBzZXRTZWFyY2hUZXh0KHF1ZXJ5KTtcbiAgICAgIHBlcmZvcm1TZWFyY2goeyBxdWVyeTogZXNxID8/IHF1ZXJ5IH0pO1xuICAgIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbcGVyZm9ybVNlYXJjaCwgcXVlcnksIHNldFNlYXJjaFRleHRdKTtcblxuICByZXR1cm4ge1xuICAgIHNlYXJjaERhdGEsXG4gICAgc2VhcmNoUmVzcG9uc2VJZDogc2VhcmNoRGF0YT8uc2VhcmNoUmVzcG9uc2VJZCA/PyAnJyxcbiAgICBtZXJjaGFudFNob3J0TmFtZTogc2FmZU1lcmNoYW50U2hvcnROYW1lLFxuICAgIHByb2R1Y3RDYXJkQ29uZmlnOiBzYWZlUHJvZHVjdENhcmRDb25maWcsXG4gICAgcHJvZHVjdExpc3QsXG4gICAgcmVjb21tZW5kZWRQcm9kdWN0cyxcbiAgICBhdXRvY29tcGxldGVSZXN1bHRzLFxuICAgIHNlYXJjaEZpbHRlcnM6IGZpbHRlcnMsXG4gICAgYXZhaWxhYmxlRHluYW1pY0ZpbHRlcnMsXG4gICAgc2VsZWN0ZWRGaWx0ZXJPcHRpb25zLFxuICAgIHNlYXJjaFRleHQsXG4gICAgcXVlcnk6IHF1ZXJ5IHx8ICcnLFxuICAgIHNlYXJjaFJlc3VsdHNTdGF0ZSxcbiAgICBpc0xvYWRpbmdTZWFyY2gsXG4gICAgaXNGaWx0ZXJPcGVuLFxuICAgIHNob3VsZFNob3dBdXRvY29tcGxldGUsXG4gICAgZm9jdXNlZEluZGV4LFxuICAgIGZvY3VzZWRPcHRpb25JZCxcbiAgICBmaWx0ZXJCdXR0b25UZXh0LFxuICAgIG9uU2VhcmNoSW5wdXRDaGFuZ2U6IGhhbmRsZVNlYXJjaElucHV0Q2hhbmdlLFxuICAgIG9uU3VibWl0U2VhcmNoOiBoYW5kbGVTdWJtaXRTZWFyY2gsXG4gICAgb25BdXRvY29tcGxldGVTZWxlY3Q6IGhhbmRsZUF1dG9jb21wbGV0ZVNlbGVjdCxcbiAgICBvbktleURvd246IGhhbmRsZUtleURvd24sXG4gICAgb25TZWFyY2hJbnB1dEZvY3VzOiBoYW5kbGVTZWFyY2hJbnB1dEZvY3VzLFxuICAgIG9uU2VhcmNoSW5wdXRCbHVyOiBoYW5kbGVTZWFyY2hJbnB1dEJsdXIsXG4gICAgb25Ub2dnbGVEeW5hbWljRmlsdGVyOiBoYW5kbGVUb2dnbGVEeW5hbWljRmlsdGVyLFxuICAgIG9uU2VsZWN0RmlsdGVySXRlbTogaGFuZGxlU2VsZWN0RmlsdGVySXRlbSxcbiAgICBvblJlbW92ZUZpbHRlcjogaGFuZGxlUmVtb3ZlRmlsdGVyLFxuICAgIG9uQ2xlYXJBbGxGaWx0ZXJzOiBoYW5kbGVDbGVhckFsbEZpbHRlcnMsXG4gICAgc2V0SXNGaWx0ZXJPcGVuLFxuICAgIHNlYXJjaFJlc3VsdHNSZWYsXG4gIH07XG59OyJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMF0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLFNBQVMsUUFBUSxPQUFPO0FBQ3RCLFFBQU8sQ0FBQyxNQUFNLFVBQ1YsT0FBTyxNQUFNLEtBQUssbUJBQ2xCLE1BQU0sUUFBUSxNQUFNOztBQUkxQixNQUFNLFdBQVc7QUFDakIsU0FBUyxhQUFhLE9BQU87QUFFM0IsS0FBSSxPQUFPLFNBQVMsU0FDbEIsUUFBTztDQUVULElBQUksU0FBUyxRQUFRO0FBQ3JCLFFBQU8sVUFBVSxPQUFPLElBQUksU0FBUyxDQUFDLFdBQVcsT0FBTzs7QUFHMUQsU0FBUyxTQUFTLE9BQU87QUFDdkIsUUFBTyxTQUFTLE9BQU8sS0FBSyxhQUFhLE1BQU07O0FBR2pELFNBQVMsU0FBUyxPQUFPO0FBQ3ZCLFFBQU8sT0FBTyxVQUFVOztBQUcxQixTQUFTLFNBQVMsT0FBTztBQUN2QixRQUFPLE9BQU8sVUFBVTs7QUFJMUIsU0FBUyxVQUFVLE9BQU87QUFDeEIsUUFDRSxVQUFVLFFBQ1YsVUFBVSxTQUNULGFBQWEsTUFBTSxJQUFJLE9BQU8sTUFBTSxJQUFJOztBQUk3QyxTQUFTLFNBQVMsT0FBTztBQUN2QixRQUFPLE9BQU8sVUFBVTs7QUFJMUIsU0FBUyxhQUFhLE9BQU87QUFDM0IsUUFBTyxTQUFTLE1BQU0sSUFBSSxVQUFVOztBQUd0QyxTQUFTLFVBQVUsT0FBTztBQUN4QixRQUFPLFVBQVUsVUFBYSxVQUFVOztBQUcxQyxTQUFTLFFBQVEsT0FBTztBQUN0QixRQUFPLENBQUMsTUFBTSxNQUFNLENBQUM7O0FBS3ZCLFNBQVMsT0FBTyxPQUFPO0FBQ3JCLFFBQU8sU0FBUyxPQUNaLFVBQVUsU0FDUix1QkFDQSxrQkFDRixPQUFPLFVBQVUsU0FBUyxLQUFLLE1BQU07O0FBSzNDLE1BQU0sdUJBQXVCO0FBRTdCLE1BQU0sd0NBQXdDLFFBQzVDLHlCQUF5QjtBQUUzQixNQUFNLDRCQUE0QixRQUNoQyxpQ0FBaUMsSUFBSTtBQUV2QyxNQUFNLHdCQUF3QixTQUFTLFdBQVcsS0FBSztBQUV2RCxNQUFNLDRCQUE0QixRQUNoQyw2QkFBNkIsSUFBSTtBQUVuQyxNQUFNLFNBQVMsT0FBTyxVQUFVO0FBRWhDLElBQU0sV0FBTixNQUFlO0NBQ2IsWUFBWSxNQUFNO0FBQ2hCLE9BQUssUUFBUSxFQUFFO0FBQ2YsT0FBSyxVQUFVLEVBQUU7RUFFakIsSUFBSSxjQUFjO0FBRWxCLE9BQUssU0FBUyxRQUFRO0dBQ3BCLElBQUksTUFBTSxVQUFVLElBQUk7QUFFeEIsUUFBSyxNQUFNLEtBQUssSUFBSTtBQUNwQixRQUFLLFFBQVEsSUFBSSxNQUFNO0FBRXZCLGtCQUFlLElBQUk7SUFDbkI7QUFHRixPQUFLLE1BQU0sU0FBUyxRQUFRO0FBQzFCLE9BQUksVUFBVTtJQUNkOztDQUVKLElBQUksT0FBTztBQUNULFNBQU8sS0FBSyxRQUFROztDQUV0QixPQUFPO0FBQ0wsU0FBTyxLQUFLOztDQUVkLFNBQVM7QUFDUCxTQUFPLEtBQUssVUFBVSxLQUFLLE1BQU07OztBQUlyQyxTQUFTLFVBQVUsS0FBSztDQUN0QixJQUFJLE9BQU87Q0FDWCxJQUFJLEtBQUs7Q0FDVCxJQUFJLE1BQU07Q0FDVixJQUFJLFNBQVM7Q0FDYixJQUFJLFFBQVE7QUFFWixLQUFJLFNBQVMsSUFBSSxJQUFJLFFBQVEsSUFBSSxFQUFFO0FBQ2pDLFFBQU07QUFDTixTQUFPLGNBQWMsSUFBSTtBQUN6QixPQUFLLFlBQVksSUFBSTtRQUNoQjtBQUNMLE1BQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxPQUFPLENBQzNCLE9BQU0sSUFBSSxNQUFNLHFCQUFxQixPQUFPLENBQUM7RUFHL0MsTUFBTSxPQUFPLElBQUk7QUFDakIsUUFBTTtBQUVOLE1BQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFO0FBQzlCLFlBQVMsSUFBSTtBQUViLE9BQUksVUFBVSxFQUNaLE9BQU0sSUFBSSxNQUFNLHlCQUF5QixLQUFLLENBQUM7O0FBSW5ELFNBQU8sY0FBYyxLQUFLO0FBQzFCLE9BQUssWUFBWSxLQUFLO0FBQ3RCLFVBQVEsSUFBSTs7QUFHZCxRQUFPO0VBQUU7RUFBTTtFQUFJO0VBQVE7RUFBSztFQUFPOztBQUd6QyxTQUFTLGNBQWMsS0FBSztBQUMxQixRQUFPLFFBQVEsSUFBSSxHQUFHLE1BQU0sSUFBSSxNQUFNLElBQUk7O0FBRzVDLFNBQVMsWUFBWSxLQUFLO0FBQ3hCLFFBQU8sUUFBUSxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRzs7QUFHeEMsU0FBUyxJQUFJLEtBQUssTUFBTTtDQUN0QixJQUFJLE9BQU8sRUFBRTtDQUNiLElBQUksTUFBTTtDQUVWLE1BQU0sV0FBVyxPQUFLLFFBQU0sVUFBVTtBQUNwQyxNQUFJLENBQUMsVUFBVUEsTUFBSSxDQUNqQjtBQUVGLE1BQUksQ0FBQ0MsT0FBSyxPQUVSLE1BQUssS0FBS0QsTUFBSTtPQUNUO0dBQ0wsSUFBSSxNQUFNQyxPQUFLO0dBRWYsTUFBTSxRQUFRRCxNQUFJO0FBRWxCLE9BQUksQ0FBQyxVQUFVLE1BQU0sQ0FDbkI7QUFLRixPQUNFLFVBQVVDLE9BQUssU0FBUyxNQUN2QixTQUFTLE1BQU0sSUFBSSxTQUFTLE1BQU0sSUFBSSxVQUFVLE1BQU0sRUFFdkQsTUFBSyxLQUFLLFNBQVMsTUFBTSxDQUFDO1lBQ2pCLFFBQVEsTUFBTSxFQUFFO0FBQ3pCLFVBQU07QUFFTixTQUFLLElBQUksSUFBSSxHQUFHLE1BQU0sTUFBTSxRQUFRLElBQUksS0FBSyxLQUFLLEVBQ2hELFNBQVEsTUFBTSxJQUFJQSxRQUFNLFFBQVEsRUFBRTtjQUUzQkEsT0FBSyxPQUVkLFNBQVEsT0FBT0EsUUFBTSxRQUFRLEVBQUU7OztBQU1yQyxTQUFRLEtBQUssU0FBUyxLQUFLLEdBQUcsS0FBSyxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUU7QUFFeEQsUUFBTyxNQUFNLE9BQU8sS0FBSzs7QUFHM0IsTUFBTSxlQUFlO0NBSW5CLGdCQUFnQjtDQUdoQixnQkFBZ0I7Q0FFaEIsb0JBQW9CO0NBQ3JCO0FBRUQsTUFBTSxlQUFlO0NBR25CLGlCQUFpQjtDQUVqQixrQkFBa0I7Q0FFbEIsY0FBYztDQUVkLE1BQU0sRUFBRTtDQUVSLFlBQVk7Q0FFWixTQUFTLEdBQUcsTUFDVixFQUFFLFVBQVUsRUFBRSxRQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sS0FBSyxJQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsS0FBSztDQUM3RTtBQUVELE1BQU0sZUFBZTtDQUVuQixVQUFVO0NBR1YsV0FBVztDQU1YLFVBQVU7Q0FDWDtBQUVELE1BQU0sa0JBQWtCO0NBRXRCLG1CQUFtQjtDQUduQixPQUFPO0NBSVAsZ0JBQWdCO0NBSWhCLGlCQUFpQjtDQUVqQixpQkFBaUI7Q0FDbEI7QUFFRCxJQUFJLFNBQVM7Q0FDWCxHQUFHO0NBQ0gsR0FBRztDQUNILEdBQUc7Q0FDSCxHQUFHO0NBQ0o7QUFFRCxNQUFNLFFBQVE7QUFJZCxTQUFTLEtBQUssU0FBUyxHQUFHLFdBQVcsR0FBRztDQUN0QyxNQUFNLHdCQUFRLElBQUksS0FBSztDQUN2QixNQUFNLElBQUksS0FBSyxJQUFJLElBQUksU0FBUztBQUVoQyxRQUFPO0VBQ0wsSUFBSSxPQUFPO0dBQ1QsTUFBTSxZQUFZLE1BQU0sTUFBTSxNQUFNLENBQUM7QUFFckMsT0FBSSxNQUFNLElBQUksVUFBVSxDQUN0QixRQUFPLE1BQU0sSUFBSSxVQUFVO0dBSTdCLE1BQU1DLFNBQU8sSUFBSSxLQUFLLElBQUksV0FBVyxLQUFNLE9BQU87R0FHbEQsTUFBTSxJQUFJLFdBQVcsS0FBSyxNQUFNQSxTQUFPLEVBQUUsR0FBRyxFQUFFO0FBRTlDLFNBQU0sSUFBSSxXQUFXLEVBQUU7QUFFdkIsVUFBTzs7RUFFVCxRQUFRO0FBQ04sU0FBTSxPQUFPOztFQUVoQjs7QUFHSCxJQUFNLFlBQU4sTUFBZ0I7Q0FDZCxZQUFZLEVBQ1YsUUFBUSxPQUFPLE9BQ2Ysa0JBQWtCLE9BQU8sb0JBQ3ZCLEVBQUUsRUFBRTtBQUNOLE9BQUssT0FBTyxLQUFLLGlCQUFpQixFQUFFO0FBQ3BDLE9BQUssUUFBUTtBQUNiLE9BQUssWUFBWTtBQUVqQixPQUFLLGlCQUFpQjs7Q0FFeEIsV0FBVyxPQUFPLEVBQUUsRUFBRTtBQUNwQixPQUFLLE9BQU87O0NBRWQsZ0JBQWdCLFVBQVUsRUFBRSxFQUFFO0FBQzVCLE9BQUssVUFBVTs7Q0FFakIsUUFBUSxPQUFPLEVBQUUsRUFBRTtBQUNqQixPQUFLLE9BQU87QUFDWixPQUFLLFdBQVcsRUFBRTtBQUNsQixPQUFLLFNBQVMsS0FBSyxRQUFRO0FBQ3pCLFFBQUssU0FBUyxJQUFJLE1BQU07SUFDeEI7O0NBRUosU0FBUztBQUNQLE1BQUksS0FBSyxhQUFhLENBQUMsS0FBSyxLQUFLLE9BQy9CO0FBR0YsT0FBSyxZQUFZO0FBR2pCLE1BQUksU0FBUyxLQUFLLEtBQUssR0FBRyxDQUN4QixNQUFLLEtBQUssU0FBUyxLQUFLLGFBQWE7QUFDbkMsUUFBSyxXQUFXLEtBQUssU0FBUztJQUM5QjtNQUdGLE1BQUssS0FBSyxTQUFTLEtBQUssYUFBYTtBQUNuQyxRQUFLLFdBQVcsS0FBSyxTQUFTO0lBQzlCO0FBR0osT0FBSyxLQUFLLE9BQU87O0NBR25CLElBQUksS0FBSztFQUNQLE1BQU0sTUFBTSxLQUFLLE1BQU07QUFFdkIsTUFBSSxTQUFTLElBQUksQ0FDZixNQUFLLFdBQVcsS0FBSyxJQUFJO01BRXpCLE1BQUssV0FBVyxLQUFLLElBQUk7O0NBSTdCLFNBQVMsS0FBSztBQUNaLE9BQUssUUFBUSxPQUFPLEtBQUssRUFBRTtBQUczQixPQUFLLElBQUksSUFBSSxLQUFLLE1BQU0sS0FBSyxNQUFNLEVBQUUsSUFBSSxLQUFLLEtBQUssRUFDakQsTUFBSyxRQUFRLEdBQUcsS0FBSzs7Q0FHekIsdUJBQXVCLE1BQU0sT0FBTztBQUNsQyxTQUFPLEtBQUssS0FBSyxTQUFTOztDQUU1QixPQUFPO0FBQ0wsU0FBTyxLQUFLLFFBQVE7O0NBRXRCLFdBQVcsS0FBSyxVQUFVO0FBQ3hCLE1BQUksQ0FBQyxVQUFVLElBQUksSUFBSSxRQUFRLElBQUksQ0FDakM7RUFHRixJQUFJLFNBQVM7R0FDWCxHQUFHO0dBQ0gsR0FBRztHQUNILEdBQUcsS0FBSyxLQUFLLElBQUksSUFBSTtHQUN0QjtBQUVELE9BQUssUUFBUSxLQUFLLE9BQU87O0NBRTNCLFdBQVcsS0FBSyxVQUFVO0VBQ3hCLElBQUksU0FBUztHQUFFLEdBQUc7R0FBVSxHQUFHLEVBQUU7R0FBRTtBQUduQyxPQUFLLEtBQUssU0FBUyxLQUFLLGFBQWE7R0FDbkMsSUFBSSxRQUFRLElBQUksUUFBUSxJQUFJLE1BQU0sSUFBSSxHQUFHLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSztBQUVsRSxPQUFJLENBQUMsVUFBVSxNQUFNLENBQ25CO0FBR0YsT0FBSSxRQUFRLE1BQU0sRUFBRTtJQUNsQixJQUFJLGFBQWEsRUFBRTtJQUNuQixNQUFNLFFBQVEsQ0FBQztLQUFFLGdCQUFnQjtLQUFJO0tBQU8sQ0FBQztBQUU3QyxXQUFPLE1BQU0sUUFBUTtLQUNuQixNQUFNLEVBQUUsZ0JBQWdCLG1CQUFVLE1BQU0sS0FBSztBQUU3QyxTQUFJLENBQUMsVUFBVUMsUUFBTSxDQUNuQjtBQUdGLFNBQUksU0FBU0EsUUFBTSxJQUFJLENBQUMsUUFBUUEsUUFBTSxFQUFFO01BQ3RDLElBQUksWUFBWTtPQUNkLEdBQUdBO09BQ0gsR0FBRztPQUNILEdBQUcsS0FBSyxLQUFLLElBQUlBLFFBQU07T0FDeEI7QUFFRCxpQkFBVyxLQUFLLFVBQVU7Z0JBQ2pCLFFBQVFBLFFBQU0sQ0FDdkIsU0FBTSxTQUFTLE1BQU0sTUFBTTtBQUN6QixZQUFNLEtBQUs7T0FDVCxnQkFBZ0I7T0FDaEIsT0FBTztPQUNSLENBQUM7T0FDRjs7QUFHTixXQUFPLEVBQUUsWUFBWTtjQUNaLFNBQVMsTUFBTSxJQUFJLENBQUMsUUFBUSxNQUFNLEVBQUU7SUFDN0MsSUFBSSxZQUFZO0tBQ2QsR0FBRztLQUNILEdBQUcsS0FBSyxLQUFLLElBQUksTUFBTTtLQUN4QjtBQUVELFdBQU8sRUFBRSxZQUFZOztJQUV2QjtBQUVGLE9BQUssUUFBUSxLQUFLLE9BQU87O0NBRTNCLFNBQVM7QUFDUCxTQUFPO0dBQ0wsTUFBTSxLQUFLO0dBQ1gsU0FBUyxLQUFLO0dBQ2Y7OztBQUlMLFNBQVMsWUFDUCxNQUNBLE1BQ0EsRUFBRSxRQUFRLE9BQU8sT0FBTyxrQkFBa0IsT0FBTyxvQkFBb0IsRUFBRSxFQUN2RTtDQUNBLE1BQU0sVUFBVSxJQUFJLFVBQVU7RUFBRTtFQUFPO0VBQWlCLENBQUM7QUFDekQsU0FBUSxRQUFRLEtBQUssSUFBSSxVQUFVLENBQUM7QUFDcEMsU0FBUSxXQUFXLEtBQUs7QUFDeEIsU0FBUSxRQUFRO0FBQ2hCLFFBQU87O0FBR1QsU0FBUyxXQUNQLE1BQ0EsRUFBRSxRQUFRLE9BQU8sT0FBTyxrQkFBa0IsT0FBTyxvQkFBb0IsRUFBRSxFQUN2RTtDQUNBLE1BQU0sRUFBRSxNQUFNLFlBQVk7Q0FDMUIsTUFBTSxVQUFVLElBQUksVUFBVTtFQUFFO0VBQU87RUFBaUIsQ0FBQztBQUN6RCxTQUFRLFFBQVEsS0FBSztBQUNyQixTQUFRLGdCQUFnQixRQUFRO0FBQ2hDLFFBQU87O0FBR1QsU0FBUyxlQUNQLFNBQ0EsRUFDRSxTQUFTLEdBQ1Qsa0JBQWtCLEdBQ2xCLG1CQUFtQixHQUNuQixXQUFXLE9BQU8sVUFDbEIsaUJBQWlCLE9BQU8sbUJBQ3RCLEVBQUUsRUFDTjtDQUNBLE1BQU0sV0FBVyxTQUFTLFFBQVE7QUFFbEMsS0FBSSxlQUNGLFFBQU87Q0FHVCxNQUFNLFlBQVksS0FBSyxJQUFJLG1CQUFtQixnQkFBZ0I7QUFFOUQsS0FBSSxDQUFDLFNBRUgsUUFBTyxZQUFZLElBQU07QUFHM0IsUUFBTyxXQUFXLFlBQVk7O0FBR2hDLFNBQVMscUJBQ1AsWUFBWSxFQUFFLEVBQ2QscUJBQXFCLE9BQU8sb0JBQzVCO0NBQ0EsSUFBSSxVQUFVLEVBQUU7Q0FDaEIsSUFBSSxRQUFRO0NBQ1osSUFBSSxNQUFNO0NBQ1YsSUFBSSxJQUFJO0FBRVIsTUFBSyxJQUFJLE1BQU0sVUFBVSxRQUFRLElBQUksS0FBSyxLQUFLLEdBQUc7RUFDaEQsSUFBSSxRQUFRLFVBQVU7QUFDdEIsTUFBSSxTQUFTLFVBQVUsR0FDckIsU0FBUTtXQUNDLENBQUMsU0FBUyxVQUFVLElBQUk7QUFDakMsU0FBTSxJQUFJO0FBQ1YsT0FBSSxNQUFNLFFBQVEsS0FBSyxtQkFDckIsU0FBUSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUM7QUFFNUIsV0FBUTs7O0FBS1osS0FBSSxVQUFVLElBQUksTUFBTSxJQUFJLFNBQVMsbUJBQ25DLFNBQVEsS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFHOUIsUUFBTzs7QUFJVCxNQUFNLFdBQVc7QUFFakIsU0FBUyxPQUNQLE1BQ0EsU0FDQSxpQkFDQSxFQUNFLFdBQVcsT0FBTyxVQUNsQixXQUFXLE9BQU8sVUFDbEIsWUFBWSxPQUFPLFdBQ25CLGlCQUFpQixPQUFPLGdCQUN4QixxQkFBcUIsT0FBTyxvQkFDNUIsaUJBQWlCLE9BQU8sZ0JBQ3hCLGlCQUFpQixPQUFPLG1CQUN0QixFQUFFLEVBQ047QUFDQSxLQUFJLFFBQVEsU0FBUyxTQUNuQixPQUFNLElBQUksTUFBTSx5QkFBeUIsU0FBUyxDQUFDO0NBR3JELE1BQU0sYUFBYSxRQUFRO0NBRTNCLE1BQU0sVUFBVSxLQUFLO0NBRXJCLE1BQU0sbUJBQW1CLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxVQUFVLFFBQVEsQ0FBQztDQUVqRSxJQUFJLG1CQUFtQjtDQUV2QixJQUFJLGVBQWU7Q0FJbkIsTUFBTSxpQkFBaUIscUJBQXFCLEtBQUs7Q0FFakQsTUFBTSxZQUFZLGlCQUFpQixNQUFNLFFBQVEsR0FBRyxFQUFFO0NBRXRELElBQUk7QUFHSixTQUFRLFFBQVEsS0FBSyxRQUFRLFNBQVMsYUFBYSxJQUFJLElBQUk7RUFDekQsSUFBSSxRQUFRLGVBQWUsU0FBUztHQUNsQyxpQkFBaUI7R0FDakI7R0FDQTtHQUNBO0dBQ0QsQ0FBQztBQUVGLHFCQUFtQixLQUFLLElBQUksT0FBTyxpQkFBaUI7QUFDcEQsaUJBQWUsUUFBUTtBQUV2QixNQUFJLGdCQUFnQjtHQUNsQixJQUFJLElBQUk7QUFDUixVQUFPLElBQUksWUFBWTtBQUNyQixjQUFVLFFBQVEsS0FBSztBQUN2QixTQUFLOzs7O0FBTVgsZ0JBQWU7Q0FFZixJQUFJLGFBQWEsRUFBRTtDQUNuQixJQUFJLGFBQWE7Q0FDakIsSUFBSSxTQUFTLGFBQWE7Q0FFMUIsTUFBTSxPQUFPLEtBQU0sYUFBYTtBQUVoQyxNQUFLLElBQUksSUFBSSxHQUFHLElBQUksWUFBWSxLQUFLLEdBQUc7RUFJdEMsSUFBSSxTQUFTO0VBQ2IsSUFBSSxTQUFTO0FBRWIsU0FBTyxTQUFTLFFBQVE7QUFTdEIsT0FSYyxlQUFlLFNBQVM7SUFDcEMsUUFBUTtJQUNSLGlCQUFpQixtQkFBbUI7SUFDcEM7SUFDQTtJQUNBO0lBQ0QsQ0FBQyxJQUVXLGlCQUNYLFVBQVM7T0FFVCxVQUFTO0FBR1gsWUFBUyxLQUFLLE9BQU8sU0FBUyxVQUFVLElBQUksT0FBTzs7QUFJckQsV0FBUztFQUVULElBQUksUUFBUSxLQUFLLElBQUksR0FBRyxtQkFBbUIsU0FBUyxFQUFFO0VBQ3RELElBQUksU0FBUyxpQkFDVCxVQUNBLEtBQUssSUFBSSxtQkFBbUIsUUFBUSxRQUFRLEdBQUc7RUFHbkQsSUFBSSxTQUFTLE1BQU0sU0FBUyxFQUFFO0FBRTlCLFNBQU8sU0FBUyxNQUFNLEtBQUssS0FBSztBQUVoQyxPQUFLLElBQUksSUFBSSxRQUFRLEtBQUssT0FBTyxLQUFLLEdBQUc7R0FDdkMsSUFBSSxrQkFBa0IsSUFBSTtHQUMxQixJQUFJLFlBQVksZ0JBQWdCLEtBQUssT0FBTyxnQkFBZ0I7QUFFNUQsT0FBSSxlQUVGLFdBQVUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0FBSWxDLFVBQU8sTUFBTyxPQUFPLElBQUksTUFBTSxJQUFLLEtBQUs7QUFHekMsT0FBSSxFQUNGLFFBQU8sT0FDSCxXQUFXLElBQUksS0FBSyxXQUFXLE9BQU8sSUFBSyxJQUFJLFdBQVcsSUFBSTtBQUdwRSxPQUFJLE9BQU8sS0FBSyxNQUFNO0FBQ3BCLGlCQUFhLGVBQWUsU0FBUztLQUNuQyxRQUFRO0tBQ1I7S0FDQTtLQUNBO0tBQ0E7S0FDRCxDQUFDO0FBSUYsUUFBSSxjQUFjLGtCQUFrQjtBQUVsQyx3QkFBbUI7QUFDbkIsb0JBQWU7QUFHZixTQUFJLGdCQUFnQixpQkFDbEI7QUFJRixhQUFRLEtBQUssSUFBSSxHQUFHLElBQUksbUJBQW1CLGFBQWE7Ozs7QUFjOUQsTUFSYyxlQUFlLFNBQVM7R0FDcEMsUUFBUSxJQUFJO0dBQ1osaUJBQWlCO0dBQ2pCO0dBQ0E7R0FDQTtHQUNELENBQUMsR0FFVSxpQkFDVjtBQUdGLGVBQWE7O0NBR2YsTUFBTSxTQUFTO0VBQ2IsU0FBUyxnQkFBZ0I7RUFFekIsT0FBTyxLQUFLLElBQUksTUFBTyxXQUFXO0VBQ25DO0FBRUQsS0FBSSxnQkFBZ0I7RUFDbEIsTUFBTSxVQUFVLHFCQUFxQixXQUFXLG1CQUFtQjtBQUNuRSxNQUFJLENBQUMsUUFBUSxPQUNYLFFBQU8sVUFBVTtXQUNSLGVBQ1QsUUFBTyxVQUFVOztBQUlyQixRQUFPOztBQUdULFNBQVMsc0JBQXNCLFNBQVM7Q0FDdEMsSUFBSSxPQUFPLEVBQUU7QUFFYixNQUFLLElBQUksSUFBSSxHQUFHLE1BQU0sUUFBUSxRQUFRLElBQUksS0FBSyxLQUFLLEdBQUc7RUFDckQsTUFBTSxPQUFPLFFBQVEsT0FBTyxFQUFFO0FBQzlCLE9BQUssU0FBUyxLQUFLLFNBQVMsS0FBTSxLQUFNLE1BQU0sSUFBSTs7QUFHcEQsUUFBTzs7QUFHVCxNQUFNLGtCQUFrQixPQUFPLFVBQVUsY0FDakMsUUFBUSxJQUFJLFVBQVUsTUFBTSxDQUFDLFFBQVEsMGtFQUEwa0UsR0FBRyxNQUNsbkUsUUFBUTtBQUVoQixJQUFNLGNBQU4sTUFBa0I7Q0FDaEIsWUFDRSxTQUNBLEVBQ0UsV0FBVyxPQUFPLFVBQ2xCLFlBQVksT0FBTyxXQUNuQixXQUFXLE9BQU8sVUFDbEIsaUJBQWlCLE9BQU8sZ0JBQ3hCLGlCQUFpQixPQUFPLGdCQUN4QixxQkFBcUIsT0FBTyxvQkFDNUIsa0JBQWtCLE9BQU8saUJBQ3pCLG1CQUFtQixPQUFPLGtCQUMxQixpQkFBaUIsT0FBTyxtQkFDdEIsRUFBRSxFQUNOO0FBQ0EsT0FBSyxVQUFVO0dBQ2I7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0Q7QUFFRCxZQUFVLGtCQUFrQixVQUFVLFFBQVEsYUFBYTtBQUMzRCxZQUFVLG1CQUFtQixnQkFBZ0IsUUFBUSxHQUFHO0FBQ3hELE9BQUssVUFBVTtBQUVmLE9BQUssU0FBUyxFQUFFO0FBRWhCLE1BQUksQ0FBQyxLQUFLLFFBQVEsT0FDaEI7RUFHRixNQUFNLFlBQVksV0FBUyxlQUFlO0FBQ3hDLFFBQUssT0FBTyxLQUFLO0lBQ2Y7SUFDQSxVQUFVLHNCQUFzQkMsVUFBUTtJQUN4QztJQUNELENBQUM7O0VBR0osTUFBTSxNQUFNLEtBQUssUUFBUTtBQUV6QixNQUFJLE1BQU0sVUFBVTtHQUNsQixJQUFJLElBQUk7R0FDUixNQUFNLFlBQVksTUFBTTtHQUN4QixNQUFNLE1BQU0sTUFBTTtBQUVsQixVQUFPLElBQUksS0FBSztBQUNkLGFBQVMsS0FBSyxRQUFRLE9BQU8sR0FBRyxTQUFTLEVBQUUsRUFBRTtBQUM3QyxTQUFLOztBQUdQLE9BQUksV0FBVztJQUNiLE1BQU0sYUFBYSxNQUFNO0FBQ3pCLGFBQVMsS0FBSyxRQUFRLE9BQU8sV0FBVyxFQUFFLFdBQVc7O1FBR3ZELFVBQVMsS0FBSyxTQUFTLEVBQUU7O0NBSTdCLFNBQVMsTUFBTTtFQUNiLE1BQU0sRUFBRSxpQkFBaUIsa0JBQWtCLG1CQUFtQixLQUFLO0FBRW5FLFNBQU8sa0JBQWtCLE9BQU8sS0FBSyxhQUFhO0FBQ2xELFNBQU8sbUJBQW1CLGdCQUFnQixLQUFLLEdBQUc7QUFHbEQsTUFBSSxLQUFLLFlBQVksTUFBTTtHQUN6QixJQUFJQyxXQUFTO0lBQ1gsU0FBUztJQUNULE9BQU87SUFDUjtBQUVELE9BQUksZUFDRixVQUFPLFVBQVUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztBQUd6QyxVQUFPQTs7RUFJVCxNQUFNLEVBQ0osVUFDQSxVQUNBLFdBQ0EsZ0JBQ0Esb0JBQ0EsbUJBQ0UsS0FBSztFQUVULElBQUksYUFBYSxFQUFFO0VBQ25CLElBQUksYUFBYTtFQUNqQixJQUFJLGFBQWE7QUFFakIsT0FBSyxPQUFPLFNBQVMsRUFBRSxTQUFTLFVBQVUsaUJBQWlCO0dBQ3pELE1BQU0sRUFBRSxTQUFTLE9BQU8sWUFBWSxPQUFPLE1BQU0sU0FBUyxVQUFVO0lBQ2xFLFVBQVUsV0FBVztJQUNyQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDRCxDQUFDO0FBRUYsT0FBSSxRQUNGLGNBQWE7QUFHZixpQkFBYztBQUVkLE9BQUksV0FBVyxRQUNiLGNBQWEsQ0FBQyxHQUFHLFlBQVksR0FBRyxRQUFRO0lBRTFDO0VBRUYsSUFBSSxTQUFTO0dBQ1gsU0FBUztHQUNULE9BQU8sYUFBYSxhQUFhLEtBQUssT0FBTyxTQUFTO0dBQ3ZEO0FBRUQsTUFBSSxjQUFjLGVBQ2hCLFFBQU8sVUFBVTtBQUduQixTQUFPOzs7QUFJWCxJQUFNLFlBQU4sTUFBZ0I7Q0FDZCxZQUFZLFNBQVM7QUFDbkIsT0FBSyxVQUFVOztDQUVqQixPQUFPLGFBQWEsU0FBUztBQUMzQixTQUFPLFNBQVMsU0FBUyxLQUFLLFdBQVc7O0NBRTNDLE9BQU8sY0FBYyxTQUFTO0FBQzVCLFNBQU8sU0FBUyxTQUFTLEtBQUssWUFBWTs7Q0FFNUMsU0FBaUI7O0FBR25CLFNBQVMsU0FBUyxTQUFTLEtBQUs7Q0FDOUIsTUFBTSxVQUFVLFFBQVEsTUFBTSxJQUFJO0FBQ2xDLFFBQU8sVUFBVSxRQUFRLEtBQUs7O0FBS2hDLElBQU0sYUFBTixjQUF5QixVQUFVO0NBQ2pDLFlBQVksU0FBUztBQUNuQixRQUFNLFFBQVE7O0NBRWhCLFdBQVcsT0FBTztBQUNoQixTQUFPOztDQUVULFdBQVcsYUFBYTtBQUN0QixTQUFPOztDQUVULFdBQVcsY0FBYztBQUN2QixTQUFPOztDQUVULE9BQU8sTUFBTTtFQUNYLE1BQU0sVUFBVSxTQUFTLEtBQUs7QUFFOUIsU0FBTztHQUNMO0dBQ0EsT0FBTyxVQUFVLElBQUk7R0FDckIsU0FBUyxDQUFDLEdBQUcsS0FBSyxRQUFRLFNBQVMsRUFBRTtHQUN0Qzs7O0FBTUwsSUFBTSxvQkFBTixjQUFnQyxVQUFVO0NBQ3hDLFlBQVksU0FBUztBQUNuQixRQUFNLFFBQVE7O0NBRWhCLFdBQVcsT0FBTztBQUNoQixTQUFPOztDQUVULFdBQVcsYUFBYTtBQUN0QixTQUFPOztDQUVULFdBQVcsY0FBYztBQUN2QixTQUFPOztDQUVULE9BQU8sTUFBTTtFQUVYLE1BQU0sVUFEUSxLQUFLLFFBQVEsS0FBSyxRQUFRLEtBQ2Q7QUFFMUIsU0FBTztHQUNMO0dBQ0EsT0FBTyxVQUFVLElBQUk7R0FDckIsU0FBUyxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUU7R0FDOUI7OztBQU1MLElBQU0sbUJBQU4sY0FBK0IsVUFBVTtDQUN2QyxZQUFZLFNBQVM7QUFDbkIsUUFBTSxRQUFROztDQUVoQixXQUFXLE9BQU87QUFDaEIsU0FBTzs7Q0FFVCxXQUFXLGFBQWE7QUFDdEIsU0FBTzs7Q0FFVCxXQUFXLGNBQWM7QUFDdkIsU0FBTzs7Q0FFVCxPQUFPLE1BQU07RUFDWCxNQUFNLFVBQVUsS0FBSyxXQUFXLEtBQUssUUFBUTtBQUU3QyxTQUFPO0dBQ0w7R0FDQSxPQUFPLFVBQVUsSUFBSTtHQUNyQixTQUFTLENBQUMsR0FBRyxLQUFLLFFBQVEsU0FBUyxFQUFFO0dBQ3RDOzs7QUFNTCxJQUFNLDBCQUFOLGNBQXNDLFVBQVU7Q0FDOUMsWUFBWSxTQUFTO0FBQ25CLFFBQU0sUUFBUTs7Q0FFaEIsV0FBVyxPQUFPO0FBQ2hCLFNBQU87O0NBRVQsV0FBVyxhQUFhO0FBQ3RCLFNBQU87O0NBRVQsV0FBVyxjQUFjO0FBQ3ZCLFNBQU87O0NBRVQsT0FBTyxNQUFNO0VBQ1gsTUFBTSxVQUFVLENBQUMsS0FBSyxXQUFXLEtBQUssUUFBUTtBQUU5QyxTQUFPO0dBQ0w7R0FDQSxPQUFPLFVBQVUsSUFBSTtHQUNyQixTQUFTLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRTtHQUM5Qjs7O0FBTUwsSUFBTSxtQkFBTixjQUErQixVQUFVO0NBQ3ZDLFlBQVksU0FBUztBQUNuQixRQUFNLFFBQVE7O0NBRWhCLFdBQVcsT0FBTztBQUNoQixTQUFPOztDQUVULFdBQVcsYUFBYTtBQUN0QixTQUFPOztDQUVULFdBQVcsY0FBYztBQUN2QixTQUFPOztDQUVULE9BQU8sTUFBTTtFQUNYLE1BQU0sVUFBVSxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBRTNDLFNBQU87R0FDTDtHQUNBLE9BQU8sVUFBVSxJQUFJO0dBQ3JCLFNBQVMsQ0FBQyxLQUFLLFNBQVMsS0FBSyxRQUFRLFFBQVEsS0FBSyxTQUFTLEVBQUU7R0FDOUQ7OztBQU1MLElBQU0sMEJBQU4sY0FBc0MsVUFBVTtDQUM5QyxZQUFZLFNBQVM7QUFDbkIsUUFBTSxRQUFROztDQUVoQixXQUFXLE9BQU87QUFDaEIsU0FBTzs7Q0FFVCxXQUFXLGFBQWE7QUFDdEIsU0FBTzs7Q0FFVCxXQUFXLGNBQWM7QUFDdkIsU0FBTzs7Q0FFVCxPQUFPLE1BQU07RUFDWCxNQUFNLFVBQVUsQ0FBQyxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQzVDLFNBQU87R0FDTDtHQUNBLE9BQU8sVUFBVSxJQUFJO0dBQ3JCLFNBQVMsQ0FBQyxHQUFHLEtBQUssU0FBUyxFQUFFO0dBQzlCOzs7QUFJTCxJQUFNLGFBQU4sY0FBeUIsVUFBVTtDQUNqQyxZQUNFLFNBQ0EsRUFDRSxXQUFXLE9BQU8sVUFDbEIsWUFBWSxPQUFPLFdBQ25CLFdBQVcsT0FBTyxVQUNsQixpQkFBaUIsT0FBTyxnQkFDeEIsaUJBQWlCLE9BQU8sZ0JBQ3hCLHFCQUFxQixPQUFPLG9CQUM1QixrQkFBa0IsT0FBTyxpQkFDekIsbUJBQW1CLE9BQU8sa0JBQzFCLGlCQUFpQixPQUFPLG1CQUN0QixFQUFFLEVBQ047QUFDQSxRQUFNLFFBQVE7QUFDZCxPQUFLLGVBQWUsSUFBSSxZQUFZLFNBQVM7R0FDM0M7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0QsQ0FBQzs7Q0FFSixXQUFXLE9BQU87QUFDaEIsU0FBTzs7Q0FFVCxXQUFXLGFBQWE7QUFDdEIsU0FBTzs7Q0FFVCxXQUFXLGNBQWM7QUFDdkIsU0FBTzs7Q0FFVCxPQUFPLE1BQU07QUFDWCxTQUFPLEtBQUssYUFBYSxTQUFTLEtBQUs7OztBQU0zQyxJQUFNLGVBQU4sY0FBMkIsVUFBVTtDQUNuQyxZQUFZLFNBQVM7QUFDbkIsUUFBTSxRQUFROztDQUVoQixXQUFXLE9BQU87QUFDaEIsU0FBTzs7Q0FFVCxXQUFXLGFBQWE7QUFDdEIsU0FBTzs7Q0FFVCxXQUFXLGNBQWM7QUFDdkIsU0FBTzs7Q0FFVCxPQUFPLE1BQU07RUFDWCxJQUFJLFdBQVc7RUFDZixJQUFJO0VBRUosTUFBTSxVQUFVLEVBQUU7RUFDbEIsTUFBTSxhQUFhLEtBQUssUUFBUTtBQUdoQyxVQUFRLFFBQVEsS0FBSyxRQUFRLEtBQUssU0FBUyxTQUFTLElBQUksSUFBSTtBQUMxRCxjQUFXLFFBQVE7QUFDbkIsV0FBUSxLQUFLLENBQUMsT0FBTyxXQUFXLEVBQUUsQ0FBQzs7RUFHckMsTUFBTSxVQUFVLENBQUMsQ0FBQyxRQUFRO0FBRTFCLFNBQU87R0FDTDtHQUNBLE9BQU8sVUFBVSxJQUFJO0dBQ3JCO0dBQ0Q7OztBQUtMLE1BQU0sWUFBWTtDQUNoQjtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0Q7QUFFRCxNQUFNLGVBQWUsVUFBVTtBQUcvQixNQUFNLFdBQVc7QUFDakIsTUFBTSxXQUFXO0FBS2pCLFNBQVMsV0FBVyxTQUFTLFVBQVUsRUFBRSxFQUFFO0FBQ3pDLFFBQU8sUUFBUSxNQUFNLFNBQVMsQ0FBQyxLQUFLLFNBQVM7RUFDM0MsSUFBSSxRQUFRLEtBQ1QsTUFBTSxDQUNOLE1BQU0sU0FBUyxDQUNmLFFBQVEsV0FBU0MsVUFBUSxDQUFDLENBQUNBLE9BQUssTUFBTSxDQUFDO0VBRTFDLElBQUksVUFBVSxFQUFFO0FBQ2hCLE9BQUssSUFBSSxJQUFJLEdBQUcsTUFBTSxNQUFNLFFBQVEsSUFBSSxLQUFLLEtBQUssR0FBRztHQUNuRCxNQUFNLFlBQVksTUFBTTtHQUd4QixJQUFJLFFBQVE7R0FDWixJQUFJLE1BQU07QUFDVixVQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sY0FBYztJQUNyQyxNQUFNLFdBQVcsVUFBVTtJQUMzQixJQUFJLFFBQVEsU0FBUyxhQUFhLFVBQVU7QUFDNUMsUUFBSSxPQUFPO0FBQ1QsYUFBUSxLQUFLLElBQUksU0FBUyxPQUFPLFFBQVEsQ0FBQztBQUMxQyxhQUFROzs7QUFJWixPQUFJLE1BQ0Y7QUFJRixTQUFNO0FBQ04sVUFBTyxFQUFFLE1BQU0sY0FBYztJQUMzQixNQUFNLFdBQVcsVUFBVTtJQUMzQixJQUFJLFFBQVEsU0FBUyxjQUFjLFVBQVU7QUFDN0MsUUFBSSxPQUFPO0FBQ1QsYUFBUSxLQUFLLElBQUksU0FBUyxPQUFPLFFBQVEsQ0FBQztBQUMxQzs7OztBQUtOLFNBQU87R0FDUDs7QUFLSixNQUFNLGdCQUFnQixJQUFJLElBQUksQ0FBQyxXQUFXLE1BQU0sYUFBYSxLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEJuRSxJQUFNLGlCQUFOLE1BQXFCO0NBQ25CLFlBQ0UsU0FDQSxFQUNFLGtCQUFrQixPQUFPLGlCQUN6QixtQkFBbUIsT0FBTyxrQkFDMUIsaUJBQWlCLE9BQU8sZ0JBQ3hCLHFCQUFxQixPQUFPLG9CQUM1QixpQkFBaUIsT0FBTyxnQkFDeEIsaUJBQWlCLE9BQU8sZ0JBQ3hCLFdBQVcsT0FBTyxVQUNsQixZQUFZLE9BQU8sV0FDbkIsV0FBVyxPQUFPLGFBQ2hCLEVBQUUsRUFDTjtBQUNBLE9BQUssUUFBUTtBQUNiLE9BQUssVUFBVTtHQUNiO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNBO0dBQ0E7R0FDQTtHQUNEO0FBRUQsWUFBVSxrQkFBa0IsVUFBVSxRQUFRLGFBQWE7QUFDM0QsWUFBVSxtQkFBbUIsZ0JBQWdCLFFBQVEsR0FBRztBQUN4RCxPQUFLLFVBQVU7QUFDZixPQUFLLFFBQVEsV0FBVyxLQUFLLFNBQVMsS0FBSyxRQUFROztDQUdyRCxPQUFPLFVBQVUsR0FBRyxTQUFTO0FBQzNCLFNBQU8sUUFBUTs7Q0FHakIsU0FBUyxNQUFNO0VBQ2IsTUFBTSxRQUFRLEtBQUs7QUFFbkIsTUFBSSxDQUFDLE1BQ0gsUUFBTztHQUNMLFNBQVM7R0FDVCxPQUFPO0dBQ1I7RUFHSCxNQUFNLEVBQUUsZ0JBQWdCLGlCQUFpQixxQkFBcUIsS0FBSztBQUVuRSxTQUFPLGtCQUFrQixPQUFPLEtBQUssYUFBYTtBQUNsRCxTQUFPLG1CQUFtQixnQkFBZ0IsS0FBSyxHQUFHO0VBRWxELElBQUksYUFBYTtFQUNqQixJQUFJLGFBQWEsRUFBRTtFQUNuQixJQUFJLGFBQWE7QUFHakIsT0FBSyxJQUFJLElBQUksR0FBRyxPQUFPLE1BQU0sUUFBUSxJQUFJLE1BQU0sS0FBSyxHQUFHO0dBQ3JELE1BQU1DLGNBQVksTUFBTTtBQUd4QixjQUFXLFNBQVM7QUFDcEIsZ0JBQWE7QUFHYixRQUFLLElBQUksSUFBSSxHQUFHLE9BQU9BLFlBQVUsUUFBUSxJQUFJLE1BQU0sS0FBSyxHQUFHO0lBQ3pELE1BQU0sV0FBV0EsWUFBVTtJQUMzQixNQUFNLEVBQUUsU0FBUyxTQUFTLFVBQVUsU0FBUyxPQUFPLEtBQUs7QUFFekQsUUFBSSxTQUFTO0FBQ1gsbUJBQWM7QUFDZCxtQkFBYztBQUNkLFNBQUksZ0JBQWdCO01BQ2xCLE1BQU0sT0FBTyxTQUFTLFlBQVk7QUFDbEMsVUFBSSxjQUFjLElBQUksS0FBSyxDQUN6QixjQUFhLENBQUMsR0FBRyxZQUFZLEdBQUcsUUFBUTtVQUV4QyxZQUFXLEtBQUssUUFBUTs7V0FHdkI7QUFDTCxrQkFBYTtBQUNiLGtCQUFhO0FBQ2IsZ0JBQVcsU0FBUztBQUNwQjs7O0FBS0osT0FBSSxZQUFZO0lBQ2QsSUFBSSxTQUFTO0tBQ1gsU0FBUztLQUNULE9BQU8sYUFBYTtLQUNyQjtBQUVELFFBQUksZUFDRixRQUFPLFVBQVU7QUFHbkIsV0FBTzs7O0FBS1gsU0FBTztHQUNMLFNBQVM7R0FDVCxPQUFPO0dBQ1I7OztBQUlMLE1BQU0sc0JBQXNCLEVBQUU7QUFFOUIsU0FBUyxTQUFTLEdBQUcsTUFBTTtBQUN6QixxQkFBb0IsS0FBSyxHQUFHLEtBQUs7O0FBR25DLFNBQVMsZUFBZSxTQUFTLFNBQVM7QUFDeEMsTUFBSyxJQUFJLElBQUksR0FBRyxNQUFNLG9CQUFvQixRQUFRLElBQUksS0FBSyxLQUFLLEdBQUc7RUFDakUsSUFBSSxnQkFBZ0Isb0JBQW9CO0FBQ3hDLE1BQUksY0FBYyxVQUFVLFNBQVMsUUFBUSxDQUMzQyxRQUFPLElBQUksY0FBYyxTQUFTLFFBQVE7O0FBSTlDLFFBQU8sSUFBSSxZQUFZLFNBQVMsUUFBUTs7QUFHMUMsTUFBTSxrQkFBa0I7Q0FDdEIsS0FBSztDQUNMLElBQUk7Q0FDTDtBQUVELE1BQU0sVUFBVTtDQUNkLE1BQU07Q0FDTixTQUFTO0NBQ1Y7QUFFRCxNQUFNLGdCQUFnQixVQUNwQixDQUFDLEVBQUUsTUFBTSxnQkFBZ0IsUUFBUSxNQUFNLGdCQUFnQjtBQUV6RCxNQUFNLFVBQVUsVUFBVSxDQUFDLENBQUMsTUFBTSxRQUFRO0FBRTFDLE1BQU0sVUFBVSxVQUNkLENBQUMsUUFBUSxNQUFNLElBQUksU0FBUyxNQUFNLElBQUksQ0FBQyxhQUFhLE1BQU07QUFFNUQsTUFBTSxxQkFBcUIsV0FBVyxHQUNuQyxnQkFBZ0IsTUFBTSxPQUFPLEtBQUssTUFBTSxDQUFDLEtBQUssU0FBUyxHQUNyRCxNQUFNLE1BQU0sTUFDZCxFQUFFLEVBQ0o7QUFJRCxTQUFTLE1BQU0sT0FBTyxTQUFTLEVBQUUsT0FBTyxTQUFTLEVBQUUsRUFBRTtDQUNuRCxNQUFNLFFBQVEsWUFBVTtFQUN0QixJQUFJLE9BQU8sT0FBTyxLQUFLQyxRQUFNO0VBRTdCLE1BQU0sY0FBYyxPQUFPQSxRQUFNO0FBRWpDLE1BQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxLQUFLLENBQUMsYUFBYUEsUUFBTSxDQUN6RCxRQUFPLEtBQUssa0JBQWtCQSxRQUFNLENBQUM7QUFHdkMsTUFBSSxPQUFPQSxRQUFNLEVBQUU7R0FDakIsTUFBTSxNQUFNLGNBQWNBLFFBQU0sUUFBUSxRQUFRLEtBQUs7R0FFckQsTUFBTSxVQUFVLGNBQWNBLFFBQU0sUUFBUSxXQUFXQSxRQUFNO0FBRTdELE9BQUksQ0FBQyxTQUFTLFFBQVEsQ0FDcEIsT0FBTSxJQUFJLE1BQU0scUNBQXFDLElBQUksQ0FBQztHQUc1RCxNQUFNLE1BQU07SUFDVixPQUFPLFlBQVksSUFBSTtJQUN2QjtJQUNEO0FBRUQsT0FBSSxLQUNGLEtBQUksV0FBVyxlQUFlLFNBQVMsUUFBUTtBQUdqRCxVQUFPOztFQUdULElBQUksT0FBTztHQUNULFVBQVUsRUFBRTtHQUNaLFVBQVUsS0FBSztHQUNoQjtBQUVELE9BQUssU0FBUyxRQUFRO0dBQ3BCLE1BQU0sUUFBUUEsUUFBTTtBQUVwQixPQUFJLFFBQVEsTUFBTSxDQUNoQixPQUFNLFNBQVMsU0FBUztBQUN0QixTQUFLLFNBQVMsS0FBSyxLQUFLLEtBQUssQ0FBQztLQUM5QjtJQUVKO0FBRUYsU0FBTzs7QUFHVCxLQUFJLENBQUMsYUFBYSxNQUFNLENBQ3RCLFNBQVEsa0JBQWtCLE1BQU07QUFHbEMsUUFBTyxLQUFLLE1BQU07O0FBSXBCLFNBQVMsYUFDUCxTQUNBLEVBQUUsa0JBQWtCLE9BQU8sbUJBQzNCO0FBQ0EsU0FBUSxTQUFTLFdBQVc7RUFDMUIsSUFBSSxhQUFhO0FBRWpCLFNBQU8sUUFBUSxTQUFTLEVBQUUsS0FBSyxjQUFNLFlBQVk7R0FDL0MsTUFBTSxTQUFTLE1BQU0sSUFBSSxTQUFTO0FBRWxDLGlCQUFjLEtBQUssSUFDakIsVUFBVSxLQUFLLFNBQVMsT0FBTyxVQUFVLFFBQ3hDLFVBQVUsTUFBTSxrQkFBa0IsSUFBSU4sUUFDeEM7SUFDRDtBQUVGLFNBQU8sUUFBUTtHQUNmOztBQUdKLFNBQVMsaUJBQWlCLFFBQVEsTUFBTTtDQUN0QyxNQUFNLFVBQVUsT0FBTztBQUN2QixNQUFLLFVBQVUsRUFBRTtBQUVqQixLQUFJLENBQUMsVUFBVSxRQUFRLENBQ3JCO0FBR0YsU0FBUSxTQUFTLFVBQVU7QUFDekIsTUFBSSxDQUFDLFVBQVUsTUFBTSxRQUFRLElBQUksQ0FBQyxNQUFNLFFBQVEsT0FDOUM7RUFHRixNQUFNLEVBQUUsU0FBUyxVQUFVO0VBRTNCLElBQUksTUFBTTtHQUNSO0dBQ0E7R0FDRDtBQUVELE1BQUksTUFBTSxJQUNSLEtBQUksTUFBTSxNQUFNLElBQUk7QUFHdEIsTUFBSSxNQUFNLE1BQU0sR0FDZCxLQUFJLFdBQVcsTUFBTTtBQUd2QixPQUFLLFFBQVEsS0FBSyxJQUFJO0dBQ3RCOztBQUdKLFNBQVMsZUFBZSxRQUFRLE1BQU07QUFDcEMsTUFBSyxRQUFRLE9BQU87O0FBR3RCLFNBQVMsT0FDUCxTQUNBLE1BQ0EsRUFDRSxpQkFBaUIsT0FBTyxnQkFDeEIsZUFBZSxPQUFPLGlCQUNwQixFQUFFLEVBQ047Q0FDQSxNQUFNLGVBQWUsRUFBRTtBQUV2QixLQUFJLGVBQWdCLGNBQWEsS0FBSyxpQkFBaUI7QUFDdkQsS0FBSSxhQUFjLGNBQWEsS0FBSyxlQUFlO0FBRW5ELFFBQU8sUUFBUSxLQUFLLFdBQVc7RUFDN0IsTUFBTSxFQUFFLFFBQVE7RUFFaEIsTUFBTSxPQUFPO0dBQ1gsTUFBTSxLQUFLO0dBQ1gsVUFBVTtHQUNYO0FBRUQsTUFBSSxhQUFhLE9BQ2YsY0FBYSxTQUFTLGdCQUFnQjtBQUNwQyxlQUFZLFFBQVEsS0FBSztJQUN6QjtBQUdKLFNBQU87R0FDUDs7QUFHSixJQUFNLE9BQU4sTUFBVztDQUNULFlBQVksTUFBTSxVQUFVLEVBQUUsRUFBRSxPQUFPO0FBQ3JDLE9BQUssVUFBVTtHQUFFLEdBQUc7R0FBUSxHQUFHO0dBQVM7QUFFeEMsTUFDRSxLQUFLLFFBQVEscUJBQ2I7QUFLRixPQUFLLFlBQVksSUFBSSxTQUFTLEtBQUssUUFBUSxLQUFLO0FBRWhELE9BQUssY0FBYyxNQUFNLE1BQU07O0NBR2pDLGNBQWMsTUFBTSxPQUFPO0FBQ3pCLE9BQUssUUFBUTtBQUViLE1BQUksU0FBUyxFQUFFLGlCQUFpQixXQUM5QixPQUFNLElBQUksTUFBTSxxQkFBcUI7QUFHdkMsT0FBSyxXQUNILFNBQ0EsWUFBWSxLQUFLLFFBQVEsTUFBTSxLQUFLLE9BQU87R0FDekMsT0FBTyxLQUFLLFFBQVE7R0FDcEIsaUJBQWlCLEtBQUssUUFBUTtHQUMvQixDQUFDOztDQUdOLElBQUksS0FBSztBQUNQLE1BQUksQ0FBQyxVQUFVLElBQUksQ0FDakI7QUFHRixPQUFLLE1BQU0sS0FBSyxJQUFJO0FBQ3BCLE9BQUssU0FBUyxJQUFJLElBQUk7O0NBR3hCLE9BQU8sa0JBQWdDLE9BQU87RUFDNUMsTUFBTSxVQUFVLEVBQUU7QUFFbEIsT0FBSyxJQUFJLElBQUksR0FBRyxNQUFNLEtBQUssTUFBTSxRQUFRLElBQUksS0FBSyxLQUFLLEdBQUc7R0FDeEQsTUFBTSxNQUFNLEtBQUssTUFBTTtBQUN2QixPQUFJLFVBQVUsS0FBSyxFQUFFLEVBQUU7QUFDckIsU0FBSyxTQUFTLEVBQUU7QUFDaEIsU0FBSztBQUNMLFdBQU87QUFFUCxZQUFRLEtBQUssSUFBSTs7O0FBSXJCLFNBQU87O0NBR1QsU0FBUyxLQUFLO0FBQ1osT0FBSyxNQUFNLE9BQU8sS0FBSyxFQUFFO0FBQ3pCLE9BQUssU0FBUyxTQUFTLElBQUk7O0NBRzdCLFdBQVc7QUFDVCxTQUFPLEtBQUs7O0NBR2QsT0FBTyxPQUFPLEVBQUUsUUFBUSxPQUFPLEVBQUUsRUFBRTtFQUNqQyxNQUFNLEVBQ0osZ0JBQ0EsY0FDQSxZQUNBLFFBQ0Esb0JBQ0UsS0FBSztFQUVULElBQUksVUFBVSxTQUFTLE1BQU0sR0FDekIsU0FBUyxLQUFLLE1BQU0sR0FBRyxHQUNyQixLQUFLLGtCQUFrQixNQUFNLEdBQzdCLEtBQUssa0JBQWtCLE1BQU0sR0FDL0IsS0FBSyxlQUFlLE1BQU07QUFFOUIsZUFBYSxTQUFTLEVBQUUsaUJBQWlCLENBQUM7QUFFMUMsTUFBSSxXQUNGLFNBQVEsS0FBSyxPQUFPO0FBR3RCLE1BQUksU0FBUyxNQUFNLElBQUksUUFBUSxHQUM3QixXQUFVLFFBQVEsTUFBTSxHQUFHLE1BQU07QUFHbkMsU0FBTyxPQUFPLFNBQVMsS0FBSyxPQUFPO0dBQ2pDO0dBQ0E7R0FDRCxDQUFDOztDQUdKLGtCQUFrQixPQUFPO0VBQ3ZCLE1BQU0sV0FBVyxlQUFlLE9BQU8sS0FBSyxRQUFRO0VBQ3BELE1BQU0sRUFBRSxZQUFZLEtBQUs7RUFDekIsTUFBTSxVQUFVLEVBQUU7QUFHbEIsVUFBUSxTQUFTLEVBQUUsR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHQSxhQUFXO0FBQ2hELE9BQUksQ0FBQyxVQUFVLEtBQUssQ0FDbEI7R0FHRixNQUFNLEVBQUUsU0FBUyxPQUFPLFlBQVksU0FBUyxTQUFTLEtBQUs7QUFFM0QsT0FBSSxRQUNGLFNBQVEsS0FBSztJQUNYLE1BQU07SUFDTjtJQUNBLFNBQVMsQ0FBQztLQUFFO0tBQU8sT0FBTztLQUFNO0tBQU07S0FBUyxDQUFDO0lBQ2pELENBQUM7SUFFSjtBQUVGLFNBQU87O0NBR1QsZUFBZSxPQUFPO0VBRXBCLE1BQU0sYUFBYSxNQUFNLE9BQU8sS0FBSyxRQUFRO0VBRTdDLE1BQU0sWUFBWSxNQUFNLE1BQU0sUUFBUTtBQUNwQyxPQUFJLENBQUMsS0FBSyxVQUFVO0lBQ2xCLE1BQU0sRUFBRSxPQUFPLGFBQWE7SUFFNUIsTUFBTSxVQUFVLEtBQUssYUFBYTtLQUNoQyxLQUFLLEtBQUssVUFBVSxJQUFJLE1BQU07S0FDOUIsT0FBTyxLQUFLLFNBQVMsdUJBQXVCLE1BQU0sTUFBTTtLQUN4RDtLQUNELENBQUM7QUFFRixRQUFJLFdBQVcsUUFBUSxPQUNyQixRQUFPLENBQ0w7S0FDRTtLQUNBO0tBQ0E7S0FDRCxDQUNGO0FBR0gsV0FBTyxFQUFFOztHQUdYLE1BQU0sTUFBTSxFQUFFO0FBQ2QsUUFBSyxJQUFJLElBQUksR0FBRyxNQUFNLEtBQUssU0FBUyxRQUFRLElBQUksS0FBSyxLQUFLLEdBQUc7SUFDM0QsTUFBTSxRQUFRLEtBQUssU0FBUztJQUM1QixNQUFNLFNBQVMsU0FBUyxPQUFPLE1BQU0sSUFBSTtBQUN6QyxRQUFJLE9BQU8sT0FDVCxLQUFJLEtBQUssR0FBRyxPQUFPO2FBQ1YsS0FBSyxhQUFhLGdCQUFnQixJQUMzQyxRQUFPLEVBQUU7O0FBR2IsVUFBTzs7RUFHVCxNQUFNLFVBQVUsS0FBSyxTQUFTO0VBQzlCLE1BQU0sWUFBWSxFQUFFO0VBQ3BCLE1BQU0sVUFBVSxFQUFFO0FBRWxCLFVBQVEsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLFVBQVU7QUFDdkMsT0FBSSxVQUFVLEtBQUssRUFBRTtJQUNuQixJQUFJLGFBQWEsU0FBUyxZQUFZLE1BQU0sSUFBSTtBQUVoRCxRQUFJLFdBQVcsUUFBUTtBQUVyQixTQUFJLENBQUMsVUFBVSxNQUFNO0FBQ25CLGdCQUFVLE9BQU87T0FBRTtPQUFLO09BQU0sU0FBUyxFQUFFO09BQUU7QUFDM0MsY0FBUSxLQUFLLFVBQVUsS0FBSzs7QUFFOUIsZ0JBQVcsU0FBUyxFQUFFLGNBQWM7QUFDbEMsZ0JBQVUsS0FBSyxRQUFRLEtBQUssR0FBRyxRQUFRO09BQ3ZDOzs7SUFHTjtBQUVGLFNBQU87O0NBR1Qsa0JBQWtCLE9BQU87RUFDdkIsTUFBTSxXQUFXLGVBQWUsT0FBTyxLQUFLLFFBQVE7RUFDcEQsTUFBTSxFQUFFLE1BQU0sWUFBWSxLQUFLO0VBQy9CLE1BQU0sVUFBVSxFQUFFO0FBR2xCLFVBQVEsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLFVBQVU7QUFDdkMsT0FBSSxDQUFDLFVBQVUsS0FBSyxDQUNsQjtHQUdGLElBQUksVUFBVSxFQUFFO0FBR2hCLFFBQUssU0FBUyxLQUFLLGFBQWE7QUFDOUIsWUFBUSxLQUNOLEdBQUcsS0FBSyxhQUFhO0tBQ25CO0tBQ0EsT0FBTyxLQUFLO0tBQ1o7S0FDRCxDQUFDLENBQ0g7S0FDRDtBQUVGLE9BQUksUUFBUSxPQUNWLFNBQVEsS0FBSztJQUNYO0lBQ0E7SUFDQTtJQUNELENBQUM7SUFFSjtBQUVGLFNBQU87O0NBRVQsYUFBYSxFQUFFLEtBQUssT0FBTyxZQUFZO0FBQ3JDLE1BQUksQ0FBQyxVQUFVLE1BQU0sQ0FDbkIsUUFBTyxFQUFFO0VBR1gsSUFBSSxVQUFVLEVBQUU7QUFFaEIsTUFBSSxRQUFRLE1BQU0sQ0FDaEIsT0FBTSxTQUFTLEVBQUUsR0FBRyxNQUFNLEdBQUcsS0FBSyxHQUFHQSxhQUFXO0FBQzlDLE9BQUksQ0FBQyxVQUFVLEtBQUssQ0FDbEI7R0FHRixNQUFNLEVBQUUsU0FBUyxPQUFPLFlBQVksU0FBUyxTQUFTLEtBQUs7QUFFM0QsT0FBSSxRQUNGLFNBQVEsS0FBSztJQUNYO0lBQ0E7SUFDQSxPQUFPO0lBQ1A7SUFDQTtJQUNBO0lBQ0QsQ0FBQztJQUVKO09BQ0c7R0FDTCxNQUFNLEVBQUUsR0FBRyxNQUFNLEdBQUdBLFdBQVM7R0FFN0IsTUFBTSxFQUFFLFNBQVMsT0FBTyxZQUFZLFNBQVMsU0FBUyxLQUFLO0FBRTNELE9BQUksUUFDRixTQUFRLEtBQUs7SUFBRTtJQUFPO0lBQUssT0FBTztJQUFNO0lBQU07SUFBUyxDQUFDOztBQUk1RCxTQUFPOzs7QUFJWCxLQUFLLFVBQVU7QUFDZixLQUFLLGNBQWM7QUFDbkIsS0FBSyxhQUFhO0FBQ2xCLEtBQUssU0FBUztBQUdaLEtBQUssYUFBYTtBQUlsQixTQUFTLGVBQWU7Ozs7QUN4dEQxQixNQUFhLGtCQUFrQixFQUM3QixvQkFBb0IsSUFDcEIsY0FDQSxxQkFDK0M7Q0FDL0MsTUFBTSxnQ0FBcUJPLHFDQUF3QjtDQUduRCxNQUFNLENBQUMsWUFBWSxxQ0FBMEIsa0JBQWtCO0NBQy9ELE1BQU0sQ0FBQyxTQUFTLGtDQUF1QixrQkFBa0IsTUFBTSxDQUFDLFNBQVMsRUFBRTtDQUMzRSxNQUFNLENBQUMsV0FBVyxvQ0FBeUIsTUFBTTtDQUNqRCxNQUFNLENBQUMsY0FBYyx1Q0FBNEIsR0FBRztDQUNwRCxNQUFNLENBQUMsaUJBQWlCLDBDQUN0QixPQUNEO0NBRUQsTUFBTSxvREFEaUNDLDJDQUFzQixDQUNUO0NBQ3BELE1BQU0sd0JBQXdCLDBCQUEwQixTQUFTO0NBR2pFLE1BQU0sNENBQWlDLE1BQU07Q0FHN0MsTUFBTSx5QkFBeUIsV0FBVyxhQUFhO0NBRXZELE1BQU0sMkJBQTJCO0NBR2pDLE1BQU0sd0NBQ0c7RUFDTCxjQUFjO0VBQ2QsZ0JBQWdCO0VBRWhCLFdBQVc7RUFFWCxVQUFVO0VBRVYsVUFBVTtFQUVWLG9CQUFvQjtFQUVwQixNQUFNLEVBQUU7RUFFUixtQkFBbUI7RUFFbkIsZ0JBQWdCO0VBQ2pCLEdBQ0QsRUFBRSxDQUNIO0NBRUQsTUFBTSxnQ0FBcUI7QUFDekIsTUFBSSxDQUFDLDBCQUEwQixPQUFRLFFBQU87QUFDOUMsU0FBTyxJQUFJLEtBQUssMkJBQTJCLFlBQVk7SUFDdEQsQ0FBQywyQkFBMkIsWUFBWSxDQUFDO0NBRzVDLE1BQU0sK0NBQW9DO0FBQ3hDLE1BQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUM3QixRQUFPLEVBQUU7QUFHWCxNQUFJLENBQUMsV0FBVyxNQUFNLENBQ3BCLFFBQU8sRUFBRTtBQU1YLFNBSG9CLEtBQUssT0FBTyxXQUFXLENBSXhDLE1BQU0sR0FBRyx5QkFBeUIsQ0FDbEMsS0FBSyxXQUFXLE9BQU8sS0FBSztJQUM5QjtFQUFDO0VBQXVCO0VBQU07RUFBWTtFQUF5QixDQUFDO0NBR3ZFLE1BQU0sa0RBQ0gsYUFBcUI7QUFHcEIsTUFBSSxhQUFhLFdBQ2YsY0FBYSxLQUFLO0FBR3BCLE1BQUksU0FBUyxXQUFXLEVBQ3RCLFNBQVE7R0FDTixXQUFXQyxnREFBdUI7R0FDbEMsWUFBWSxFQUNWLGNBQ0Q7R0FDRixDQUFDO0FBRUosZ0JBQWMsU0FBUztBQUN2QixhQUFXLFNBQVMsTUFBTSxDQUFDLFNBQVMsRUFBRTtBQUN0QyxrQkFBZ0IsR0FBRztBQUNuQixxQkFBbUIsT0FBVTtJQUUvQjtFQUFDO0VBQWM7RUFBWTtFQUFNLENBQ2xDO0NBRUQsTUFBTSxzREFBMkM7QUFDL0MsZUFBYSxLQUFLO0lBQ2pCLEVBQUUsQ0FBQztDQUVOLE1BQU0scURBQTBDO0FBQzlDLG1CQUFpQjtBQUNmLE9BQUksQ0FBQyx3QkFBd0IsU0FBUztBQUNwQyxpQkFBYSxNQUFNO0FBQ25CLG9CQUFnQixHQUFHO0FBQ25CLHVCQUFtQixPQUFVOztLQUU5QixJQUFJO0lBQ04sRUFBRSxDQUFDO0NBRU4sTUFBTSxrREFBdUM7QUFDM0MsZUFBYSxNQUFNO0FBQ25CLE1BQUksV0FBVyxNQUFNLElBQUksZ0JBQWdCO0FBQ3ZDLFdBQVE7SUFDTixXQUFXQSxnREFBdUI7SUFDbEMsWUFBWTtLQUNWO0tBQ0EsV0FBVyxXQUFXLE1BQU07S0FDN0I7SUFDRCwyQkFBMkI7SUFDNUIsQ0FBQztBQUNGLGtCQUFlLFdBQVcsTUFBTSxDQUFDOztJQUVsQztFQUFDO0VBQVk7RUFBZ0I7RUFBYztFQUFNLENBQUM7Q0FFckQsTUFBTSxtREFDSCxZQUFvQixpQkFBMEI7QUFDN0MsMEJBQXdCLFVBQVU7QUFDbEMsZ0JBQWMsV0FBVztBQUN6QixhQUFXLFdBQVcsTUFBTSxDQUFDLFNBQVMsRUFBRTtBQUN4QyxlQUFhLE1BQU07QUFFbkIsVUFBUTtHQUNOLFdBQVdBLGdEQUF1QjtHQUNsQyxZQUFZLEVBQ1YsY0FDRDtHQUNGLENBQUM7QUFFRixNQUFJLGVBQ0YsZ0JBQWUsV0FBVyxNQUFNLENBQUM7QUFHbkMsbUJBQWlCO0FBQ2YsMkJBQXdCLFVBQVU7S0FDakMsSUFBSTtJQUVUO0VBQUM7RUFBZ0I7RUFBYztFQUFNLENBQ3RDO0NBRUQsTUFBTSx3Q0FDSCxVQUFpRDtBQUNoRCxNQUFJLE1BQU0sUUFBUSxhQUFhO0FBQzdCLFNBQU0sZ0JBQWdCO0dBQ3RCLE1BQU0sWUFBWSxlQUFlLEtBQUssb0JBQW9CO0FBQzFELG1CQUFnQixTQUFTO0FBQ3pCLHNCQUFtQixVQUFVLFdBQVc7YUFDL0IsTUFBTSxRQUFRLFdBQVc7QUFDbEMsU0FBTSxnQkFBZ0I7R0FDdEIsTUFBTSxZQUNILGVBQWUsSUFBSSxvQkFBb0IsVUFDeEMsb0JBQW9CO0FBQ3RCLG1CQUFnQixTQUFTO0FBQ3pCLHNCQUFtQixVQUFVLFdBQVc7YUFDL0IsTUFBTSxRQUFRLFFBQ3ZCLEtBQUksaUJBQWlCLElBQUk7QUFDdkIsU0FBTSxnQkFBZ0I7QUFDdEIsdUJBQW9CO1NBQ2Y7QUFDTCxTQUFNLGdCQUFnQjtHQUN0QixNQUFNLGlCQUFpQixvQkFBb0I7QUFDM0MsNEJBQXlCLGdCQUFnQixhQUFhOztXQUUvQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFNLGdCQUFnQjtBQUN0QixtQkFBZ0IsR0FBRztBQUNuQixzQkFBbUIsT0FBVTs7SUFHakM7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNELENBQ0Y7Q0FFRCxNQUFNLCtDQUFvQyxTQUFpQjtBQUN6RCxnQkFBYyxLQUFLO0FBQ25CLGFBQVcsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFO0lBQ2pDLEVBQUUsQ0FBQztDQUVOLE1BQU0sMkNBQWdDO0FBQ3BDLGdCQUFjLEdBQUc7QUFDakIsYUFBVyxNQUFNO0FBQ2pCLGVBQWEsTUFBTTtBQUNuQixrQkFBZ0IsR0FBRztBQUNuQixxQkFBbUIsT0FBVTtJQUM1QixFQUFFLENBQUM7QUFFTixRQUFPO0VBRUw7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQSxlQUFlO0VBQ2Y7RUFDRDs7Ozs7QUNsUUgsSUFBSUMsMkJBRU87QUFRWCxNQUFhLG9DQUFvQztBQUMvQyxLQUFJLENBQUMseUJBQ0gsT0FBTSxJQUFJLE1BQ1IsNkZBQ0Q7QUFFSCxRQUFPOzs7OztBQ1BULE1BQWEsdUNBQW1EO0NBQzlELE1BQU07Q0FDTixTQUFTO0NBQ1QsT0FBTztDQUNQLGdCQUFnQjtDQUNqQixDQUFDO0FBRUYsTUFBYSw4Q0FDWCxNQUNBLE9BQU8sT0FBSyxLQUFLLFdBQW1DO0FBR2xELEtBRnFCQyxNQUFJLHFCQUFxQixDQUU3QixRQUNmO0FBR0YsS0FBSSxzQkFBc0I7RUFDeEIsTUFBTTtFQUNOLFNBQVM7RUFDVCxPQUFPO0VBQ1AsZ0JBQWdCLE9BQU87RUFDeEIsQ0FBQztBQUVGLEtBQUk7RUFFRixNQUFNLFNBQVMsTUFEVSw2QkFBNkIsQ0FDaEIsT0FBTztBQUM3QyxNQUFJLHNCQUFzQjtHQUN4QixNQUFNO0dBQ04sU0FBUztHQUNULE9BQU87R0FDUCxnQkFBZ0IsT0FBTztHQUN4QixDQUFDO1VBQ0tDLE9BQWdCO0VBQ3ZCLE1BQU0sZUFDSixpQkFBaUIsUUFBUSxNQUFNLFVBQVU7QUFDM0MsTUFBSSxzQkFBc0I7R0FDeEIsTUFBTTtHQUNOLFNBQVM7R0FDVCxPQUFPO0dBQ1AsZ0JBQWdCLE9BQU87R0FDeEIsQ0FBQzs7RUFHUDtBQUdELE1BQWEseUNBQThCLFVBQVE7QUFFakQsUUFEc0JELE1BQUkscUJBQXFCLENBQUMsTUFDMUIsWUFBWSxFQUFFO0VBQ3BDO0FBRUYsTUFBYSwrQ0FBb0MsVUFBUTtBQUN2RCxRQUFPQSxNQUFJLHFCQUFxQixDQUFDO0VBQ2pDO0FBRUYsTUFBYSw2Q0FBa0MsVUFBUTtBQUNyRCxRQUFPQSxNQUFJLHFCQUFxQixDQUFDO0VBQ2pDOzs7Ozs7Ozs7Ozs7QUNqREYsTUFBYSwrQkFDNEM7Q0FDckQsTUFBTSxFQUFFLHVCQUF1QkUseURBQXVCO0NBQ3RELE1BQU0sWUFBWSxvQkFBb0IscUJBQ3BDQyxrQ0FBYSw2QkFDZDtDQUNELE1BQU0sOENBQW1DLHNCQUFzQjtDQUMvRCxNQUFNLGdEQUFxQyw0QkFBNEI7Q0FDdkUsTUFBTSxFQUFFLDJDQUFnQyxxQkFBcUI7Q0FDN0QsTUFBTSxjQUFjQyxzQ0FBaUI7QUFFckMsNEJBQWdCO0VBQ2QsTUFBTSx3QkFBd0IsWUFBWSxnQkFBZ0IsV0FBVyxlQUNqRSxZQUFZLGdCQUFnQixXQUFXLGFBQWEsc0JBQ3BELEVBQUU7QUFFTixNQUNFLGFBQ0EseUJBQ0Esc0JBQXNCLFNBQVMsS0FDL0IsQ0FBQyxlQUVELHlCQUF3QixFQUFFLFlBQVksdUJBQXVCLENBQUM7SUFFL0Q7RUFBQztFQUFXO0VBQXlCO0VBQWdCO0VBQVksQ0FBQztBQUVyRSxRQUFPLFlBQVksc0JBQXNCLEVBQUU7Ozs7O0FDMEMvQyxNQUFhLGtCQUF5QztDQUVwRCxNQUFNLFNBQVNDLHNDQUFpQjtDQUNoQyxNQUFNLHVDQUE0QkMsc0NBQWlCO0NBQ25ELE1BQU0sRUFBRSxNQUFNLFlBQVksU0FBUyw0Q0FDcEJDLDBCQUFXO0NBQzFCLE1BQU0sc0NBQTJCQywwQ0FBMkI7Q0FDNUQsTUFBTSxzQ0FBMkJDLGlDQUFrQjtDQUNuRCxNQUFNLENBQUMsRUFBRSw4QkFBbUJDLGdDQUFpQjtDQUM3QyxNQUFNLENBQUMsY0FBYyxzQ0FBMkJDLHNDQUFpQjtDQUNqRSxNQUFNLENBQUMsNENBQWlDQyx5Q0FBMEI7Q0FDbEUsTUFBTSxrQ0FBdUJDLG1DQUFvQjtDQUNqRCxNQUFNLHFDQUEwQkMsc0NBQXVCO0NBQ3ZELE1BQU0sQ0FBQyxnQkFBZ0Isd0NBQTZCQyx3Q0FBeUI7Q0FDN0UsTUFBTSxxQ0FBMEJDLHNDQUF1QjtDQUN2RCxNQUFNLHdDQUE2QkMsaUNBQWtCO0NBQ3JELE1BQU0sc0JBQXNCLHdCQUF3QjtDQUdwRCxNQUFNLHFDQUEwQyxLQUFLO0NBR3JELE1BQU0sMkNBQWdDO0VBQ3BDLE1BQU0sWUFBWSxpQkFBaUI7QUFDbkMsTUFBSSxVQUNGLFdBQVUsU0FBUztHQUFFLEtBQUs7R0FBRyxVQUFVO0dBQVUsQ0FBQztNQUVsRCxRQUFPLFNBQVM7R0FBRSxLQUFLO0dBQUcsVUFBVTtHQUFVLENBQUM7SUFFaEQsRUFBRSxDQUFDO0NBV04sTUFBTSxFQUNKLFlBQ0EsY0FDQSxpQkFDQSxxQkFDQSx3QkFDQSx5QkFDQSx3QkFDQSx1QkFDQSxlQUNBLDBCQUNBLG9CQUNBLGtCQXBCa0IsZUFBZTtFQUNqQyxtQkFBbUIsU0FBUztFQUM1QixjQUFjQyw2QkFBYztFQUM1QixpQkFBaUIsZ0JBQWdCO0FBQy9CLGlCQUFjLEVBQUUsT0FBTyxhQUFhLENBQUM7O0VBRXhDLENBQUM7Q0FnQkYsTUFBTSxxQkFBcUJDLG9DQUFzQixpQkFBaUIsV0FBVztDQUU3RSxNQUFNLGlCQUFpQixZQUFZLFdBQVcsRUFBRTtDQUdoRCxNQUFNLHdCQUF3QixRQUFRLGdCQUFnQixXQUNsRCxxQkFBcUI7RUFDdkIsU0FBUztFQUNULGNBQWM7RUFDZCxlQUFlO0VBQ2hCO0NBQ0QsTUFBTSx3QkFBd0IsZ0JBQWdCO0NBRTlDLE1BQU0sbURBQXdDO0FBQzVDLFNBQU8sZUFDSixRQUNFLHNCQUNDLENBQUMsc0JBQXNCLE1BQU0sV0FBVyxPQUFPLE9BQU8sV0FBVyxvQkFBb0IsQ0FDeEYsQ0FDQSxLQUFLLHVCQUF1QjtHQUMzQixNQUFNO0dBQ04sYUFBYUMsd0NBQXdCLGtCQUFrQjtHQUN4RCxFQUFFO0lBQ0osQ0FBQyxnQkFBZ0Isc0JBQXNCLENBQUM7Q0FFM0MsTUFBTSxtQ0FBd0I7QUFzQjVCLFNBQU8sQ0FBQztHQUFFLFVBQVU7R0FBUSxhQUFhO0dBQVEsT0FyQjdCO0lBQ2xCO0tBQ0UsY0FBYyxPQUFPQywrQkFBZSxTQUFTO0tBQzdDLGFBQWE7S0FDYixjQUFjO0tBQ2QsWUFBWSxtQkFBbUJBLCtCQUFlO0tBQy9DO0lBQ0Q7S0FDRSxjQUFjLE9BQU9BLCtCQUFlLFVBQVU7S0FDOUMsYUFBYTtLQUNiLGNBQWM7S0FDZCxZQUFZLG1CQUFtQkEsK0JBQWU7S0FDL0M7SUFDRDtLQUNFLGNBQWMsT0FBT0EsK0JBQWUsV0FBVztLQUMvQyxhQUFhO0tBQ2IsY0FBYztLQUNkLFlBQVksbUJBQW1CQSwrQkFBZTtLQUMvQztJQUNGO0dBRW9FLEVBQUUsR0FBRyxjQUFjO0lBQ3ZGLENBQUMsZ0JBQWdCLGNBQWMsQ0FBQztDQUVuQyxNQUFNLDRDQUFpQztFQUNyQyxNQUFNLGdCQUFnQixRQUFRLFFBQVEsS0FBYSxXQUFXO0FBQzVELE9BQUksT0FBTyxhQUFhLE9BQ3RCLFFBQU87QUFFVCxVQUFPLE1BQU0sT0FBTyxNQUFNLFFBQVEsU0FBUyxLQUFLLFdBQVcsQ0FBQztLQUMzRCxFQUFFO0FBQ0wsTUFBSSxrQkFBa0IsRUFDcEIsUUFBTztBQUVULFNBQU8sa0JBQWtCLGNBQWM7SUFDdEMsQ0FBQyxRQUFRLENBQUM7Q0FHYixNQUFNLEVBQUUsZUFBZUMsdUNBQWM7Q0FHckMsTUFBTSxvREFDSCxFQUFFLFFBQVEsK0JBQXFGO0FBQzlGLGFBQVc7R0FDVCxXQUFXQyxnREFBdUI7R0FDbEMsWUFBWTtJQUNWLFlBQVk7SUFDWixhQUFhO0lBQ2IsV0FBVztJQUNaO0dBQ0YsQ0FBQztBQUNGLFlBQVVDLGtDQUFtQixXQUFXLFFBQVEseUJBQXlCLENBQUM7QUFDMUUsZUFBYTtJQUVmO0VBQUM7RUFBVztFQUFZO0VBQVksQ0FDckM7Q0FFRCxNQUFNLDZDQUNILFdBQWlDO0FBQ2hDLGVBQWEsT0FBTyxHQUFHO0FBQ3ZCLGVBQWE7SUFFZixDQUFDLGNBQWMsWUFBWSxDQUM1QjtDQUdELE1BQU1DLGlEQUNILEVBQ0MsVUFDQSxjQUNBLFlBQ0Esa0JBTUk7QUFDSixNQUFJLGFBQWEsUUFBUTtHQUN2QixNQUFNLFVBQVU7QUFDaEIsY0FBVztJQUNULFdBQVdGLGdEQUF1QjtJQUNsQyxZQUFZO0tBQ1YsVUFBVTtLQUNWLFdBQVc7S0FDWjtJQUNGLENBQUM7QUFDRixxQkFBa0IsUUFBUTtBQUMxQixnQkFBYTthQUNKLENBQUMsWUFBWTtBQUN0QixnQkFBYSxHQUFHLFNBQVMsR0FBRyxlQUFlO0FBQzNDLGdCQUFhO1NBQ1I7QUFDTCxjQUFXO0lBQ1QsV0FBV0EsZ0RBQXVCO0lBQ2xDLFlBQVk7S0FDVixZQUFZO0tBQ1osZ0JBQWdCO0tBQ2hCLGFBQWE7S0FDYixXQUFXO0tBQ1o7SUFDRixDQUFDO0FBQ0YsYUFBVUMsa0NBQW1CLFVBQVUsY0FBYyxZQUFZLENBQUM7QUFDbEUsZ0JBQWE7O0lBR2pCO0VBQUM7RUFBVztFQUFjO0VBQW1CO0VBQVk7RUFBWSxDQUN0RTtDQUdELE1BQU0scURBQTBDO0FBQzlDLG9CQUFrQkgsK0JBQWUsU0FBUztBQUMxQyxnQkFBYztBQUNkLGVBQWE7SUFDWjtFQUFDO0VBQW1CO0VBQWM7RUFBWSxDQUFDO0FBR2xELGtFQUNFSCw2QkFBYyxlQUNkLGtCQUNBLEVBQUUsRUFDRkssZ0RBQXVCLHVCQUN4QjtBQUVELDRCQUFnQjtBQUNkLE1BQUksdUJBQXVCRyxpQ0FBbUIsV0FBVyx1QkFBdUJBLGlDQUFtQixVQUNqRyxZQUFXO0dBQ1QsV0FBV0gsZ0RBQXVCO0dBQ2xDLFlBQVk7SUFDVixXQUFXO0lBQ1gsY0FBYyxZQUFZO0lBQzNCO0dBQ0YsQ0FBQztJQUVILENBQUMsWUFBWSxRQUFRLG1CQUFtQixDQUFDO0FBRzVDLDRCQUFnQjtBQUNkLE1BQUksU0FBUyxVQUFVLFlBQVk7R0FDakMsTUFBTSxNQUFNLElBQUksZ0JBQWdCLE9BQU8sU0FBUyxPQUFPLENBQUMsSUFBSSxNQUFNO0FBQ2xFLGlCQUFjLE1BQU07QUFDcEIsaUJBQWMsRUFBRSxPQUFPLE9BQU8sT0FBTyxDQUFDOztJQUd2QztFQUFDO0VBQWU7RUFBTztFQUFjLENBQUM7QUFFekMsUUFBTztFQUNMO0VBQ0Esa0JBQWtCLFlBQVksb0JBQW9CO0VBQ2xELG1CQUFtQjtFQUNuQixtQkFBbUI7RUFDbkI7RUFDQTtFQUNBO0VBQ0EsZUFBZTtFQUNmO0VBQ0E7RUFDQTtFQUNBLE9BQU8sU0FBUztFQUNoQjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLHFCQUFxQjtFQUNyQixnQkFBZ0I7RUFDaEIsc0JBQXNCO0VBQ3RCLFdBQVc7RUFDWCxvQkFBb0I7RUFDcEIsbUJBQW1CO0VBQ25CLHVCQUF1QjtFQUN2QixvQkFBb0I7RUFDcEIsZ0JBQWdCO0VBQ2hCLG1CQUFtQjtFQUNuQjtFQUNBO0VBQ0QifQ==
497
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzIiwibmFtZXMiOlsiYW1wbGl0dWRlVHJhY2tFdmVudEF0b20iLCJhdXRvY29tcGxldGVTdGF0ZUF0b20iLCJGdXNlIiwiU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSIsInByb2R1Y3RSZXRyaWV2YWxGdW5jdGlvbjpcbiAgfCAoKHBhcmFtczogUHJvZHVjdFJldHJpZXZhbFBhcmFtcykgPT4gUHJvbWlzZTxQcm9kdWN0UmV0cmlldmFsUmVzdWx0PilcbiAgfCBudWxsIiwiZXJyb3I6IHVua25vd24iLCJ1c2VGZWF0dXJlRmxhZ1NlcnZpY2UiLCJGZWF0dXJlR2F0ZXMiLCJ1c2VOZXdPcmdDb25maWciLCJ1c2VOZXdPcmdDb25maWciLCJvcmdTaG9ydE5hbWVBdG9tIiwic2VhcmNoQXRvbSIsImZpbHRlcmVkU2VhcmNoUHJvZHVjdHNBdG9tIiwicGVyZm9ybVNlYXJjaEF0b20iLCJzZWFyY2hQYXJhbXNBdG9tIiwiaXNGaWx0ZXJPcGVuQXRvbSIsInNlYXJjaFNlbGVjdGVkRmlsdGVyc0F0b20iLCJhZGRTZWFyY2hGaWx0ZXJBdG9tIiwicmVtb3ZlU2VhcmNoRmlsdGVyQXRvbSIsInNlYXJjaFByb2R1Y3RTb3J0aW5nQXRvbSIsImNsZWFyU2VhcmNoRmlsdGVyc0F0b20iLCJzZWFyY2hGaWx0ZXJzQXRvbSIsIlNwaWZmeVdpZGdldHMiLCJnZXRTZWFyY2hSZXN1bHRzU3RhdGUiLCJmb3JtYXRGaWx0ZXJEaXNwbGF5TmFtZSIsIlByb2R1Y3RTb3J0aW5nIiwidXNlQW1wbGl0dWRlIiwiU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSIsImNyZWF0ZUZpbHRlck9wdGlvbiIsImhhbmRsZVNlbGVjdEZpbHRlckl0ZW06IFNlbGVjdEZpbHRlckl0ZW0iLCJTZWFyY2hSZXN1bHRzU3RhdGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaG9va3MvU2VhcmNoL3VzZVNlYXJjaElucHV0LnRzIiwiLi4vLi4vLi4vc3JjL2F0b21zL3NlYXJjaC9wcm9kdWN0UmV0cmlldmFsQWRhcHRlci50cyIsIi4uLy4uLy4uL3NyYy9hdG9tcy9zZWFyY2gvcHJvZHVjdFJldHJpZXZhbEFQSS50cyIsIi4uLy4uLy4uL3NyYy9ob29rcy9TZWFyY2gvdXNlUmVjb21tZW5kZWRQcm9kdWN0cy50cyIsIi4uLy4uLy4uL3NyYy9ob29rcy9TZWFyY2gvdXNlU2VhcmNoLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZVJlZiwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgdXNlQXRvbVZhbHVlIH0gZnJvbSBcImpvdGFpXCI7XG5pbXBvcnQgRnVzZSBmcm9tIFwiZnVzZS5qc1wiO1xuXG5pbXBvcnQgeyBhdXRvY29tcGxldGVTdGF0ZUF0b20gfSBmcm9tIFwic3JjL2F0b21zL2dsb2JhbFNlYXJjaFwiO1xuaW1wb3J0IHsgYW1wbGl0dWRlVHJhY2tFdmVudEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FtcGxpdHVkZS9hbXBsaXR1ZGVUcmFja0V2ZW50QXRvbVwiO1xuaW1wb3J0IHsgU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSB9IGZyb20gXCJzcmMvY29udGV4dHMvYW1wbGl0dWRlQ29udGV4dFwiO1xuaW1wb3J0IHsgU3BpZmZ5V2lkZ2V0cyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL3NwaWZmeVdpZGdldHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBVc2VTZWFyY2hJbnB1dFByb3BzIHtcbiAgaW5pdGlhbFNlYXJjaFRleHQ/OiBzdHJpbmc7XG4gIHNlYXJjaE9yaWdpbjogU3BpZmZ5V2lkZ2V0cztcbiAgb25TZWFyY2hTdWJtaXQ/OiAocXVlcnk6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VTZWFyY2hJbnB1dFJldHVybiB7XG4gIC8vIFN0YXRlXG4gIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgaGFzVGV4dDogYm9vbGVhbjtcbiAgaXNGb2N1c2VkOiBib29sZWFuO1xuICBmb2N1c2VkSW5kZXg6IG51bWJlcjtcbiAgZm9jdXNlZE9wdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGF1dG9jb21wbGV0ZVJlc3VsdHM6IHN0cmluZ1tdO1xuICBzaG91bGRTaG93QXV0b2NvbXBsZXRlOiBib29sZWFuO1xuICBcbiAgLy8gSGFuZGxlcnNcbiAgaGFuZGxlU2VhcmNoSW5wdXRDaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICBoYW5kbGVTZWFyY2hJbnB1dEZvY3VzOiAoKSA9PiB2b2lkO1xuICBoYW5kbGVTZWFyY2hJbnB1dEJsdXI6ICgpID0+IHZvaWQ7XG4gIGhhbmRsZUtleURvd246IChldmVudDogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4gdm9pZDtcbiAgaGFuZGxlQXV0b2NvbXBsZXRlU2VsZWN0OiAoc3VnZ2VzdGlvbjogc3RyaW5nLCByYW5rUG9zaXRpb24/OiBudW1iZXIpID0+IHZvaWQ7XG4gIGhhbmRsZVN1Ym1pdFNlYXJjaDogKCkgPT4gdm9pZDtcbiAgXG4gIC8vIFV0aWxpdGllc1xuICBzZXRTZWFyY2hUZXh0OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICByZXNldFNlYXJjaDogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVNlYXJjaElucHV0ID0gKHtcbiAgaW5pdGlhbFNlYXJjaFRleHQgPSBcIlwiLFxuICBzZWFyY2hPcmlnaW4sXG4gIG9uU2VhcmNoU3VibWl0LFxufTogVXNlU2VhcmNoSW5wdXRQcm9wcyk6IFVzZVNlYXJjaElucHV0UmV0dXJuID0+IHtcbiAgY29uc3QgdHJhY2sgPSB1c2VBdG9tVmFsdWUoYW1wbGl0dWRlVHJhY2tFdmVudEF0b20pO1xuXG4gIC8vIFN0YXRlXG4gIGNvbnN0IFtzZWFyY2hUZXh0LCBzZXRTZWFyY2hUZXh0XSA9IHVzZVN0YXRlKGluaXRpYWxTZWFyY2hUZXh0KTtcbiAgY29uc3QgW2hhc1RleHQsIHNldEhhc1RleHRdID0gdXNlU3RhdGUoaW5pdGlhbFNlYXJjaFRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuICBjb25zdCBbaXNGb2N1c2VkLCBzZXRJc0ZvY3VzZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbZm9jdXNlZEluZGV4LCBzZXRGb2N1c2VkSW5kZXhdID0gdXNlU3RhdGUoLTEpO1xuICBjb25zdCBbZm9jdXNlZE9wdGlvbklkLCBzZXRGb2N1c2VkT3B0aW9uSWRdID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgYXV0b2NvbXBsZXRlU3RhdGUgPSB1c2VBdG9tVmFsdWUoYXV0b2NvbXBsZXRlU3RhdGVBdG9tKTtcbiAgY29uc3QgZ2xvYmFsQXV0b2NvbXBsZXRlUmVzdWx0cyA9IGF1dG9jb21wbGV0ZVN0YXRlLnJlc3VsdHM7XG4gIGNvbnN0IGlzQXV0b2NvbXBsZXRlRW5hYmxlZCA9IGdsb2JhbEF1dG9jb21wbGV0ZVJlc3VsdHMubGVuZ3RoID4gMDtcblxuICAvLyBSZWZzXG4gIGNvbnN0IGlzU2VsZWN0aW5nQXV0b2NvbXBsZXRlID0gdXNlUmVmKGZhbHNlKTtcblxuICAvLyBDb21wdXRlZFxuICBjb25zdCBzaG91bGRTaG93QXV0b2NvbXBsZXRlID0gaGFzVGV4dCAmJiBpc0ZvY3VzZWQgJiYgaXNBdXRvY29tcGxldGVFbmFibGVkO1xuXG4gIGNvbnN0IGF1dG9jb21wbGV0ZVJlc3VsdHNMaW1pdCA9IDU7XG5cbiAgLy8gQ29uZmlndXJlIEZ1c2UuanMgZm9yIGZ1enp5IHNlYXJjaCB3aXRoIGN1c3RvbSBzY29yaW5nXG4gIGNvbnN0IGZ1c2VPcHRpb25zID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgaW5jbHVkZVNjb3JlOiB0cnVlLFxuICAgICAgaW5jbHVkZU1hdGNoZXM6IHRydWUsXG4gICAgICAvLyBGdXp6eSBtYXRjaGluZyB0aHJlc2hvbGQgKDAuMCA9IHBlcmZlY3QgbWF0Y2gsIDEuMCA9IG1hdGNoIGFueXRoaW5nKVxuICAgICAgdGhyZXNob2xkOiAwLjMsXG4gICAgICAvLyBMb2NhdGlvbiB3aGVyZSBtYXRjaCBpcyBleHBlY3RlZCAoMCA9IGJlZ2lubmluZylcbiAgICAgIGxvY2F0aW9uOiAwLFxuICAgICAgLy8gRGlzdGFuY2UgZnJvbSBsb2NhdGlvbiB3aGVyZSBtYXRjaCBjYW4gYmUgZm91bmQgLSBzbWFsbGVyIGZvciBwcmVmaXggcHJlZmVyZW5jZVxuICAgICAgZGlzdGFuY2U6IDQsXG4gICAgICAvLyBNaW5pbXVtIGNoYXJhY3RlciBsZW5ndGggYmVmb3JlIGZ1enp5IG1hdGNoaW5nIHN0YXJ0c1xuICAgICAgbWluTWF0Y2hDaGFyTGVuZ3RoOiAxLFxuICAgICAgLy8gS2V5cyB0byBzZWFyY2ggKHdlJ3JlIHNlYXJjaGluZyBzdHJpbmdzIGRpcmVjdGx5LCBzbyBubyBrZXlzIG5lZWRlZClcbiAgICAgIGtleXM6IFtdLFxuICAgICAgLy8gVXNlIGV4dGVuZGVkIHNlYXJjaCBmb3IgZXhhY3QgbWF0Y2hlcyBhbmQgcHJlZml4IG1hdGNoaW5nXG4gICAgICB1c2VFeHRlbmRlZFNlYXJjaDogZmFsc2UsXG4gICAgICAvLyBEb24ndCBpZ25vcmUgbG9jYXRpb24gLSB0aGlzIGhlbHBzIHByaW9yaXRpemUgbWF0Y2hlcyBhdCB0aGUgYmVnaW5uaW5nXG4gICAgICBpZ25vcmVMb2NhdGlvbjogZmFsc2UsXG4gICAgfSksXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBmdXNlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFnbG9iYWxBdXRvY29tcGxldGVSZXN1bHRzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG5ldyBGdXNlKGdsb2JhbEF1dG9jb21wbGV0ZVJlc3VsdHMsIGZ1c2VPcHRpb25zKTtcbiAgfSwgW2dsb2JhbEF1dG9jb21wbGV0ZVJlc3VsdHMsIGZ1c2VPcHRpb25zXSk7XG5cbiAgLy8gQXV0b2NvbXBsZXRlIGZ1enp5IHNlYXJjaCB1c2luZyBGdXNlLmpzXG4gIGNvbnN0IGF1dG9jb21wbGV0ZVJlc3VsdHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWlzQXV0b2NvbXBsZXRlRW5hYmxlZCB8fCAhZnVzZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICghc2VhcmNoVGV4dC50cmltKCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmdXNlUmVzdWx0cyA9IGZ1c2Uuc2VhcmNoKHNlYXJjaFRleHQpO1xuXG4gICAgLy8gVXNlIG9ubHkgRnVzZS5qcyBzY29yaW5nIChyZXN1bHRzIGFyZSBhbHJlYWR5IHNvcnRlZCBieSByZWxldmFuY2UpXG4gICAgcmV0dXJuIGZ1c2VSZXN1bHRzXG4gICAgICAuc2xpY2UoMCwgYXV0b2NvbXBsZXRlUmVzdWx0c0xpbWl0KVxuICAgICAgLm1hcCgocmVzdWx0KSA9PiByZXN1bHQuaXRlbSk7XG4gIH0sIFtpc0F1dG9jb21wbGV0ZUVuYWJsZWQsIGZ1c2UsIHNlYXJjaFRleHQsIGF1dG9jb21wbGV0ZVJlc3VsdHNMaW1pdF0pO1xuXG4gIC8vIEhhbmRsZXJzXG4gIGNvbnN0IGhhbmRsZVNlYXJjaElucHV0Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIGlzIGNoYW5naW5nIHRleHQsIHRoZXkgbXVzdCBiZSBpbnRlcmFjdGluZyB3aXRoIHRoZSBpbnB1dFxuICAgICAgLy8gU28gd2UgY2FuIHNhZmVseSBhc3N1bWUgdGhleSdyZSBmb2N1c2VkXG4gICAgICBpZiAobmV3VmFsdWUgIT09IHNlYXJjaFRleHQpIHtcbiAgICAgICAgc2V0SXNGb2N1c2VkKHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3VmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHRyYWNrPy4oe1xuICAgICAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5TZWFyY2hJbnB1dFN0YXJ0ZWQsXG4gICAgICAgICAgZXZlbnRQcm9wczoge1xuICAgICAgICAgICAgc2VhcmNoT3JpZ2luLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgc2V0U2VhcmNoVGV4dChuZXdWYWx1ZSk7XG4gICAgICBzZXRIYXNUZXh0KG5ld1ZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKTtcbiAgICAgIHNldEZvY3VzZWRJbmRleCgtMSk7XG4gICAgICBzZXRGb2N1c2VkT3B0aW9uSWQodW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIFtzZWFyY2hPcmlnaW4sIHNlYXJjaFRleHQsIHRyYWNrXVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVNlYXJjaElucHV0Rm9jdXMgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SXNGb2N1c2VkKHRydWUpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlU2VhcmNoSW5wdXRCbHVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFpc1NlbGVjdGluZ0F1dG9jb21wbGV0ZS5jdXJyZW50KSB7XG4gICAgICAgIHNldElzRm9jdXNlZChmYWxzZSk7XG4gICAgICAgIHNldEZvY3VzZWRJbmRleCgtMSk7XG4gICAgICAgIHNldEZvY3VzZWRPcHRpb25JZCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0sIDE1MCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVTdWJtaXRTZWFyY2ggPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SXNGb2N1c2VkKGZhbHNlKTtcbiAgICBpZiAoc2VhcmNoVGV4dC50cmltKCkgJiYgb25TZWFyY2hTdWJtaXQpIHtcbiAgICAgIHRyYWNrPy4oe1xuICAgICAgICBldmVudE5hbWU6IFNwaWZmeU1ldHJpY3NFdmVudE5hbWUuU2VhcmNoUXVlcnlTdWJtaXR0ZWQsXG4gICAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgICBzZWFyY2hPcmlnaW4sXG4gICAgICAgICAgcXVlcnlUZXh0OiBzZWFyY2hUZXh0LnRyaW0oKSxcbiAgICAgICAgfSxcbiAgICAgICAgYWxzb1NlbmRUb0dvb2dsZUFuYWx5dGljczogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgb25TZWFyY2hTdWJtaXQoc2VhcmNoVGV4dC50cmltKCkpO1xuICAgIH1cbiAgfSwgW3NlYXJjaFRleHQsIG9uU2VhcmNoU3VibWl0LCBzZWFyY2hPcmlnaW4sIHRyYWNrXSk7XG5cbiAgY29uc3QgaGFuZGxlQXV0b2NvbXBsZXRlU2VsZWN0ID0gdXNlQ2FsbGJhY2soXG4gICAgKHN1Z2dlc3Rpb246IHN0cmluZywgcmFua1Bvc2l0aW9uPzogbnVtYmVyKSA9PiB7XG4gICAgICBpc1NlbGVjdGluZ0F1dG9jb21wbGV0ZS5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHNldFNlYXJjaFRleHQoc3VnZ2VzdGlvbik7XG4gICAgICBzZXRIYXNUZXh0KHN1Z2dlc3Rpb24udHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgc2V0SXNGb2N1c2VkKGZhbHNlKTtcblxuICAgICAgdHJhY2s/Lih7XG4gICAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5TZWFyY2hJbnB1dFN0YXJ0ZWQsXG4gICAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgICBzZWFyY2hPcmlnaW4sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgaWYgKG9uU2VhcmNoU3VibWl0KSB7XG4gICAgICAgIG9uU2VhcmNoU3VibWl0KHN1Z2dlc3Rpb24udHJpbSgpKTtcbiAgICAgIH1cblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlzU2VsZWN0aW5nQXV0b2NvbXBsZXRlLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSxcbiAgICBbb25TZWFyY2hTdWJtaXQsIHNlYXJjaE9yaWdpbiwgdHJhY2tdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd0Rvd25cIikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IChmb2N1c2VkSW5kZXggKyAxKSAlIGF1dG9jb21wbGV0ZVJlc3VsdHMubGVuZ3RoO1xuICAgICAgICBzZXRGb2N1c2VkSW5kZXgobmV3SW5kZXgpO1xuICAgICAgICBzZXRGb2N1c2VkT3B0aW9uSWQoYG9wdGlvbi0ke25ld0luZGV4fWApO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dVcFwiKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID1cbiAgICAgICAgICAoZm9jdXNlZEluZGV4IC0gMSArIGF1dG9jb21wbGV0ZVJlc3VsdHMubGVuZ3RoKSAlXG4gICAgICAgICAgYXV0b2NvbXBsZXRlUmVzdWx0cy5sZW5ndGg7XG4gICAgICAgIHNldEZvY3VzZWRJbmRleChuZXdJbmRleCk7XG4gICAgICAgIHNldEZvY3VzZWRPcHRpb25JZChgb3B0aW9uLSR7bmV3SW5kZXh9YCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIGlmIChmb2N1c2VkSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBoYW5kbGVTdWJtaXRTZWFyY2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25UZXh0ID0gYXV0b2NvbXBsZXRlUmVzdWx0c1tmb2N1c2VkSW5kZXhdO1xuICAgICAgICAgIGhhbmRsZUF1dG9jb21wbGV0ZVNlbGVjdChzdWdnZXN0aW9uVGV4dCwgZm9jdXNlZEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0Rm9jdXNlZEluZGV4KC0xKTtcbiAgICAgICAgc2V0Rm9jdXNlZE9wdGlvbklkKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBhdXRvY29tcGxldGVSZXN1bHRzLFxuICAgICAgZm9jdXNlZEluZGV4LFxuICAgICAgaGFuZGxlQXV0b2NvbXBsZXRlU2VsZWN0LFxuICAgICAgaGFuZGxlU3VibWl0U2VhcmNoLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCBzZXRTZWFyY2hUZXh0VXRpbGl0eSA9IHVzZUNhbGxiYWNrKCh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICBzZXRTZWFyY2hUZXh0KHRleHQpO1xuICAgIHNldEhhc1RleHQodGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCByZXNldFNlYXJjaCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTZWFyY2hUZXh0KFwiXCIpO1xuICAgIHNldEhhc1RleHQoZmFsc2UpO1xuICAgIHNldElzRm9jdXNlZChmYWxzZSk7XG4gICAgc2V0Rm9jdXNlZEluZGV4KC0xKTtcbiAgICBzZXRGb2N1c2VkT3B0aW9uSWQodW5kZWZpbmVkKTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiB7XG4gICAgLy8gU3RhdGVcbiAgICBzZWFyY2hUZXh0LFxuICAgIGhhc1RleHQsXG4gICAgaXNGb2N1c2VkLFxuICAgIGZvY3VzZWRJbmRleCxcbiAgICBmb2N1c2VkT3B0aW9uSWQsXG4gICAgYXV0b2NvbXBsZXRlUmVzdWx0cyxcbiAgICBzaG91bGRTaG93QXV0b2NvbXBsZXRlLFxuXG4gICAgLy8gSGFuZGxlcnNcbiAgICBoYW5kbGVTZWFyY2hJbnB1dENoYW5nZSxcbiAgICBoYW5kbGVTZWFyY2hJbnB1dEZvY3VzLFxuICAgIGhhbmRsZVNlYXJjaElucHV0Qmx1cixcbiAgICBoYW5kbGVLZXlEb3duLFxuICAgIGhhbmRsZUF1dG9jb21wbGV0ZVNlbGVjdCxcbiAgICBoYW5kbGVTdWJtaXRTZWFyY2gsXG5cbiAgICAvLyBVdGlsaXRpZXNcbiAgICBzZXRTZWFyY2hUZXh0OiBzZXRTZWFyY2hUZXh0VXRpbGl0eSxcbiAgICByZXNldFNlYXJjaCxcbiAgfTtcbn07IiwiaW1wb3J0IHsgUHJvZHVjdFJldHJpZXZhbFBhcmFtcywgUHJvZHVjdFJldHJpZXZhbFJlc3VsdCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIFRoaXMgd2lsbCBiZSBzZXQgYnkgdGhlIFByb2R1Y3RSZXRyaWV2YWxQcm92aWRlciB3aGVuIGl0IGluaXRpYWxpemVzXG5sZXQgcHJvZHVjdFJldHJpZXZhbEZ1bmN0aW9uOlxuICB8ICgocGFyYW1zOiBQcm9kdWN0UmV0cmlldmFsUGFyYW1zKSA9PiBQcm9taXNlPFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQ+KVxuICB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgY29uc3Qgc2V0UHJvZHVjdFJldHJpZXZhbEZ1bmN0aW9uID0gKFxuICBmbjogKHBhcmFtczogUHJvZHVjdFJldHJpZXZhbFBhcmFtcykgPT4gUHJvbWlzZTxQcm9kdWN0UmV0cmlldmFsUmVzdWx0PlxuKSA9PiB7XG4gIHByb2R1Y3RSZXRyaWV2YWxGdW5jdGlvbiA9IGZuO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFByb2R1Y3RSZXRyaWV2YWxGdW5jdGlvbiA9ICgpID0+IHtcbiAgaWYgKCFwcm9kdWN0UmV0cmlldmFsRnVuY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIlByb2R1Y3QgcmV0cmlldmFsIGZ1bmN0aW9uIG5vdCBpbml0aWFsaXplZC4gTWFrZSBzdXJlIFByb2R1Y3RSZXRyaWV2YWxQcm92aWRlciBpcyBtb3VudGVkLlwiXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcHJvZHVjdFJldHJpZXZhbEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsZWFyUHJvZHVjdFJldHJpZXZhbEZ1bmN0aW9uID0gKCkgPT4ge1xuICBwcm9kdWN0UmV0cmlldmFsRnVuY3Rpb24gPSBudWxsO1xufTsiLCJcbmltcG9ydCB7IGF0b20gfSBmcm9tIFwiam90YWlcIjtcbmltcG9ydCB7IGdldFByb2R1Y3RSZXRyaWV2YWxGdW5jdGlvbiB9IGZyb20gXCIuL3Byb2R1Y3RSZXRyaWV2YWxBZGFwdGVyXCI7XG5pbXBvcnQgeyBQcm9kdWN0UmV0cmlldmFsUGFyYW1zLCBQcm9kdWN0UmV0cmlldmFsUmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW50ZXJmYWNlIFByb2R1Y3RSZXRyaWV2YWxTdGF0ZSB7XG4gIGRhdGE6IFByb2R1Y3RSZXRyaWV2YWxSZXN1bHQgfCBudWxsO1xuICBsb2FkaW5nOiBib29sZWFuO1xuICBlcnJvcjogc3RyaW5nIHwgbnVsbDtcbiAgbGFzdFByb2R1Y3RJZHM6IHN0cmluZ1tdIHwgbnVsbDtcbn1cblxuZXhwb3J0IGNvbnN0IHByb2R1Y3RSZXRyaWV2YWxBdG9tID0gYXRvbTxQcm9kdWN0UmV0cmlldmFsU3RhdGU+KHtcbiAgZGF0YTogbnVsbCxcbiAgbG9hZGluZzogZmFsc2UsXG4gIGVycm9yOiBudWxsLFxuICBsYXN0UHJvZHVjdElkczogbnVsbCxcbn0pO1xuXG5leHBvcnQgY29uc3QgcGVyZm9ybVByb2R1Y3RSZXRyaWV2YWxBdG9tID0gYXRvbShcbiAgbnVsbCxcbiAgYXN5bmMgKGdldCwgc2V0LCBwYXJhbXM6IFByb2R1Y3RSZXRyaWV2YWxQYXJhbXMpID0+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSBnZXQocHJvZHVjdFJldHJpZXZhbEF0b20pO1xuXG4gICAgaWYgKGN1cnJlbnRTdGF0ZS5sb2FkaW5nKSB7XG4gICAgICByZXR1cm47IC8vIFByZXZlbnQgY29uY3VycmVudCByZXRyaWV2YWxzXG4gICAgfVxuXG4gICAgc2V0KHByb2R1Y3RSZXRyaWV2YWxBdG9tLCB7XG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgbGFzdFByb2R1Y3RJZHM6IHBhcmFtcy5wcm9kdWN0SWRzLFxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldHJpZXZlUHJvZHVjdHMgPSBnZXRQcm9kdWN0UmV0cmlldmFsRnVuY3Rpb24oKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJldHJpZXZlUHJvZHVjdHMocGFyYW1zKTtcbiAgICAgIHNldChwcm9kdWN0UmV0cmlldmFsQXRvbSwge1xuICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgbGFzdFByb2R1Y3RJZHM6IHBhcmFtcy5wcm9kdWN0SWRzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJBbiB1bmtub3duIGVycm9yIG9jY3VycmVkXCI7XG4gICAgICBzZXQocHJvZHVjdFJldHJpZXZhbEF0b20sIHtcbiAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgIGxhc3RQcm9kdWN0SWRzOiBwYXJhbXMucHJvZHVjdElkcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuKTtcblxuLy8gR2V0IGp1c3QgdGhlIHByb2R1Y3RzIGFycmF5IChhbHJlYWR5IG5vcm1hbGl6ZWQgYnkgc2VydmljZSlcbmV4cG9ydCBjb25zdCByZXRyaWV2ZWRQcm9kdWN0c0F0b20gPSBhdG9tKChnZXQpID0+IHtcbiAgY29uc3QgcmV0cmlldmFsRGF0YSA9IGdldChwcm9kdWN0UmV0cmlldmFsQXRvbSkuZGF0YTtcbiAgcmV0dXJuIHJldHJpZXZhbERhdGE/LnByb2R1Y3RzIHx8IFtdO1xufSk7XG5cbmV4cG9ydCBjb25zdCBwcm9kdWN0UmV0cmlldmFsTG9hZGluZ0F0b20gPSBhdG9tKChnZXQpID0+IHtcbiAgcmV0dXJuIGdldChwcm9kdWN0UmV0cmlldmFsQXRvbSkubG9hZGluZztcbn0pO1xuXG5leHBvcnQgY29uc3QgcHJvZHVjdFJldHJpZXZhbEVycm9yQXRvbSA9IGF0b20oKGdldCkgPT4ge1xuICByZXR1cm4gZ2V0KHByb2R1Y3RSZXRyaWV2YWxBdG9tKS5lcnJvcjtcbn0pOyIsImltcG9ydCB7IHVzZUF0b21WYWx1ZSwgdXNlU2V0QXRvbSB9IGZyb20gXCJqb3RhaVwiO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyB1c2VGZWF0dXJlRmxhZ1NlcnZpY2UgfSBmcm9tIFwic3JjL2NvbnRleHRzL2ZlYXR1cmVGbGFnU2VydmljZUNvbnRleHQvZmVhdHVyZUZsYWdTZXJ2aWNlQ29udGV4dFwiO1xuaW1wb3J0IHtcbiAgcmV0cmlldmVkUHJvZHVjdHNBdG9tLFxuICBwZXJmb3JtUHJvZHVjdFJldHJpZXZhbEF0b20sXG4gIHByb2R1Y3RSZXRyaWV2YWxBdG9tLFxufSBmcm9tIFwic3JjL2F0b21zL3NlYXJjaC9wcm9kdWN0UmV0cmlldmFsQVBJXCI7XG5pbXBvcnQgeyB1c2VOZXdPcmdDb25maWcgfSBmcm9tIFwiLi4vTmV3T3JnQ29uZmlnXCI7XG5pbXBvcnQgeyBTZWFyY2hSZXNwb25zZVByb2R1Y3RBdHRyaWJ1dGVzIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvYXBpL3Jlc3BvbnNlXCI7XG5pbXBvcnQgeyBGZWF0dXJlR2F0ZXMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVsc1wiO1xuXG4vKipcbiAqIEEgaG9vayB0byBnZXQgcmVjb21tZW5kZWQgcHJvZHVjdHMuXG4gKiBJdCBjaGVja3MgdGhlIGBJc1JlY29tbWVuZGVkUHJvZHVjdHNFbmFibGVkYCBmZWF0dXJlIGdhdGUgYW5kIHRyaWdnZXJzIGZldGNoaW5nIGlmIG5lZWRlZC5cbiAqIElmIHRoZSBnYXRlIGlzIGVuYWJsZWQsIGl0IHJldHVybnMgdGhlIGxpc3Qgb2YgcmVjb21tZW5kZWQgcHJvZHVjdHMuXG4gKiBJZiB0aGUgZ2F0ZSBpcyBkaXNhYmxlZCwgaXQgcmV0dXJucyBhbiBlbXB0eSBhcnJheS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbGlzdCBvZiByZWNvbW1lbmRlZCBwcm9kdWN0cyBvciBhbiBlbXB0eSBhcnJheS5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVJlY29tbWVuZGVkUHJvZHVjdHMgPVxuICAoKTogU2VhcmNoUmVzcG9uc2VQcm9kdWN0QXR0cmlidXRlc1tcImF0dHJpYnV0ZXNcIl1bXSA9PiB7XG4gICAgY29uc3QgeyBmZWF0dXJlRmxhZ1NlcnZpY2UgfSA9IHVzZUZlYXR1cmVGbGFnU2VydmljZSgpO1xuICAgIGNvbnN0IGlzRW5hYmxlZCA9IGZlYXR1cmVGbGFnU2VydmljZT8uaXNGZWF0dXJlR2F0ZUVuYWJsZWQoXG4gICAgICBGZWF0dXJlR2F0ZXMuSXNSZWNvbW1lbmRlZFByb2R1Y3RzRW5hYmxlZFxuICAgICk7XG4gICAgY29uc3QgcmVjb21tZW5kZWRQcm9kdWN0cyA9IHVzZUF0b21WYWx1ZShyZXRyaWV2ZWRQcm9kdWN0c0F0b20pO1xuICAgIGNvbnN0IHBlcmZvcm1Qcm9kdWN0UmV0cmlldmFsID0gdXNlU2V0QXRvbShwZXJmb3JtUHJvZHVjdFJldHJpZXZhbEF0b20pO1xuICAgIGNvbnN0IHsgbGFzdFByb2R1Y3RJZHMgfSA9IHVzZUF0b21WYWx1ZShwcm9kdWN0UmV0cmlldmFsQXRvbSk7XG4gICAgY29uc3Qgb3JnVUlDb25maWcgPSB1c2VOZXdPcmdDb25maWcoKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByZWNvbW1lbmRlZFByb2R1Y3RJZHMgPSBvcmdVSUNvbmZpZy5mcm9udGVuZENvbmZpZz8udWlDb25maWdzPy5zZWFyY2hDb25maWdcbiAgICAgICAgPyBvcmdVSUNvbmZpZy5mcm9udGVuZENvbmZpZz8udWlDb25maWdzPy5zZWFyY2hDb25maWcucmVjb21tZW5kZWRQcm9kdWN0c1xuICAgICAgICA6IFtdO1xuICAgICAgLy8gRmV0Y2ggb25seSBpZiB0aGUgZmVhdHVyZSBpcyBlbmFibGVkLCB0aGVyZSBhcmUgSURzIHRvIGZldGNoLCBhbmQgd2UgaGF2ZW4ndCBhbHJlYWR5IGZldGNoZWQgdGhlbS5cbiAgICAgIGlmIChcbiAgICAgICAgaXNFbmFibGVkICYmXG4gICAgICAgIHJlY29tbWVuZGVkUHJvZHVjdElkcyAmJlxuICAgICAgICByZWNvbW1lbmRlZFByb2R1Y3RJZHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAhbGFzdFByb2R1Y3RJZHNcbiAgICAgICkge1xuICAgICAgICBwZXJmb3JtUHJvZHVjdFJldHJpZXZhbCh7IHByb2R1Y3RJZHM6IHJlY29tbWVuZGVkUHJvZHVjdElkcyB9KTtcbiAgICAgIH1cbiAgICB9LCBbaXNFbmFibGVkLCBwZXJmb3JtUHJvZHVjdFJldHJpZXZhbCwgbGFzdFByb2R1Y3RJZHMsIG9yZ1VJQ29uZmlnXSk7XG5cbiAgICByZXR1cm4gaXNFbmFibGVkID8gcmVjb21tZW5kZWRQcm9kdWN0cyA6IFtdO1xuICB9OyIsImltcG9ydCB7IHVzZUF0b20sIHVzZUF0b21WYWx1ZSwgdXNlU2V0QXRvbSB9IGZyb20gXCJqb3RhaVwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7XG4gIGFkZFNlYXJjaEZpbHRlckF0b20sXG4gIGNsZWFyU2VhcmNoRmlsdGVyc0F0b20sXG4gIGNyZWF0ZUZpbHRlck9wdGlvbixcbiAgZmlsdGVyZWRTZWFyY2hQcm9kdWN0c0F0b20sXG4gIHBlcmZvcm1TZWFyY2hBdG9tLFxuICByZW1vdmVTZWFyY2hGaWx0ZXJBdG9tLFxuICBzZWFyY2hBdG9tLFxuICBzZWFyY2hGaWx0ZXJzQXRvbSxcbiAgc2VhcmNoUGFyYW1zQXRvbSxcbiAgc2VhcmNoUHJvZHVjdFNvcnRpbmdBdG9tLFxuICBzZWFyY2hTZWxlY3RlZEZpbHRlcnNBdG9tLFxuICBTZWxlY3RlZEZpbHRlck9wdGlvbixcbn0gZnJvbSBcInNyYy9hdG9tcy9zZWFyY2hcIjtcbmltcG9ydCB7XG4gIGlzRmlsdGVyT3BlbkF0b20sXG59IGZyb20gXCJzcmMvYXRvbXMvZ2xvYmFsU2VhcmNoL2dsb2JhbFNlYXJjaFwiO1xuaW1wb3J0IHsgZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUgfSBmcm9tIFwic3JjL2F0b21zL3NlYXJjaC91dGlsc1wiO1xuaW1wb3J0IHsgUHJvZHVjdFNvcnRpbmcgfSBmcm9tIFwic3JjL2F0b21zL3NlYXJjaC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSxcbiAgdXNlQW1wbGl0dWRlLFxufSBmcm9tIFwic3JjL2NvbnRleHRzL2FtcGxpdHVkZUNvbnRleHQvYW1wbGl0dWRlQ29udGV4dFwiO1xuaW1wb3J0IHsgU3BpZmZ5V2lkZ2V0cyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL3NwaWZmeVdpZGdldHNcIjtcbmltcG9ydCB7IFByb2R1Y3RDYXJkQ29uZmlnIH0gZnJvbSBcInNyYy9jb250ZXh0cy90eXBlc1wiO1xuaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvYXBpL3NlYXJjaFwiO1xuaW1wb3J0IHsgU2VhcmNoUmVzcG9uc2VQcm9kdWN0IH0gZnJvbSBcIkBzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudFwiO1xuaW1wb3J0IHtcbiAgU2VhcmNoRmlsdGVyRGF0dW0sXG4gIFNlbGVjdEZpbHRlckl0ZW0sXG59IGZyb20gXCJzcmMvdHlwZXMvc2VhcmNoLWZpbHRlci10eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U2VhcmNoUmVzdWx0c1N0YXRlLCBTZWFyY2hSZXN1bHRzU3RhdGUgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IG9yZ1Nob3J0TmFtZUF0b20gfSBmcm9tIFwic3JjL2F0b21zL2Vudml2ZS9lbnZpdmVDb25maWdcIjtcbmltcG9ydCB7IHVzZVRyYWNrQ29tcG9uZW50VmlzaWJsZUV2ZW50IH0gZnJvbSBcIi4uL1RyYWNrQ29tcG9uZW50VmlzaWJsZUV2ZW50XCI7XG5pbXBvcnQgeyBhbXBsaXR1ZGVUcmFja0V2ZW50QXRvbSB9IGZyb20gXCJzcmMvYXRvbXMvYW1wbGl0dWRlL2FtcGxpdHVkZVRyYWNrRXZlbnRBdG9tXCI7XG5pbXBvcnQgeyBuZXdPcmdDb25maWdBdG9tIH0gZnJvbSBcInNyYy9hdG9tcy9vcmdcIjtcbmltcG9ydCB7IHJldHJpZXZlZFByb2R1Y3RzQXRvbSB9IGZyb20gXCJzcmMvYXRvbXMvc2VhcmNoL3Byb2R1Y3RSZXRyaWV2YWxBUElcIjtcbmltcG9ydCB7IHVzZVNlYXJjaElucHV0IH0gZnJvbSBcIi4vdXNlU2VhcmNoSW5wdXRcIjtcbmltcG9ydCB7IFNlYXJjaFJlc3BvbnNlUHJvZHVjdEF0dHJpYnV0ZXMgfSBmcm9tIFwic3JjL2FwcGxpY2F0aW9uL21vZGVsc1wiO1xuaW1wb3J0IHsgdXNlTmV3T3JnQ29uZmlnIH0gZnJvbSBcIi4uL05ld09yZ0NvbmZpZ1wiO1xuaW1wb3J0IHsgdXNlUmVjb21tZW5kZWRQcm9kdWN0cyB9IGZyb20gXCIuL3VzZVJlY29tbWVuZGVkUHJvZHVjdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHRzSG9jUHJvcHMge1xuICAvLyBEYXRhXG4gIHNlYXJjaERhdGE6IFNlYXJjaFJlc3VsdCB8IG51bGw7XG4gIHNlYXJjaFJlc3BvbnNlSWQ6IHN0cmluZztcbiAgbWVyY2hhbnRTaG9ydE5hbWU6IHN0cmluZztcbiAgcHJvZHVjdENhcmRDb25maWc6IFByb2R1Y3RDYXJkQ29uZmlnO1xuICBwcm9kdWN0TGlzdDogU2VhcmNoUmVzcG9uc2VQcm9kdWN0W107XG4gIGF1dG9jb21wbGV0ZVJlc3VsdHM6IHN0cmluZ1tdO1xuICBzZWFyY2hGaWx0ZXJzOiBTZWFyY2hGaWx0ZXJEYXR1bVtdO1xuICBhdmFpbGFibGVEeW5hbWljRmlsdGVyczogeyBuYW1lOiBzdHJpbmc7IGRpc3BsYXlOYW1lOiBzdHJpbmcgfVtdO1xuICBzZWxlY3RlZEZpbHRlck9wdGlvbnM6IFNlbGVjdGVkRmlsdGVyT3B0aW9uW107XG4gIHJlY29tbWVuZGVkUHJvZHVjdHM6IFNlYXJjaFJlc3BvbnNlUHJvZHVjdEF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXVtdO1xuXG4gIC8vIFN0YXRlXG4gIHNlYXJjaFRleHQ6IHN0cmluZztcbiAgcXVlcnk6IHN0cmluZztcbiAgc2VhcmNoUmVzdWx0c1N0YXRlOiBTZWFyY2hSZXN1bHRzU3RhdGU7XG4gIGlzTG9hZGluZ1NlYXJjaDogYm9vbGVhbjtcbiAgaXNGaWx0ZXJPcGVuOiBib29sZWFuO1xuICBzaG91bGRTaG93QXV0b2NvbXBsZXRlOiBib29sZWFuO1xuICBmb2N1c2VkSW5kZXg6IG51bWJlcjtcbiAgZm9jdXNlZE9wdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLy8gVUlcbiAgZmlsdGVyQnV0dG9uVGV4dDogc3RyaW5nO1xuXG4gIC8vIEV2ZW50IEhhbmRsZXJzXG4gIG9uU2VhcmNoSW5wdXRDaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkO1xuICBvblN1Ym1pdFNlYXJjaDogKCkgPT4gdm9pZDtcbiAgb25BdXRvY29tcGxldGVTZWxlY3Q6IChzdWdnZXN0aW9uOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uS2V5RG93bjogKGV2ZW50OiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB2b2lkO1xuICBvblNlYXJjaElucHV0Rm9jdXM6ICgpID0+IHZvaWQ7XG4gIG9uU2VhcmNoSW5wdXRCbHVyOiAoKSA9PiB2b2lkO1xuICBvblRvZ2dsZUR5bmFtaWNGaWx0ZXI6ICh7IGZpbHRlciwgZHluYW1pY0ZpbHRlckRpc3BsYXlOYW1lIH06IHsgZmlsdGVyOiBzdHJpbmc7IGR5bmFtaWNGaWx0ZXJEaXNwbGF5TmFtZTogc3RyaW5nIH0pID0+IHZvaWQ7XG4gIG9uU2VsZWN0RmlsdGVySXRlbTogU2VsZWN0RmlsdGVySXRlbTtcbiAgb25SZW1vdmVGaWx0ZXI6IChmaWx0ZXI6IFNlbGVjdGVkRmlsdGVyT3B0aW9uKSA9PiB2b2lkO1xuICBvbkNsZWFyQWxsRmlsdGVyczogKCkgPT4gdm9pZDtcbiAgc2V0SXNGaWx0ZXJPcGVuOiAoaXNGaWx0ZXJPcGVuOiBib29sZWFuKSA9PiB2b2lkO1xuXG4gIC8vIFJlZnNcbiAgc2VhcmNoUmVzdWx0c1JlZjogUmVhY3QuUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50Pjtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVNlYXJjaCA9ICgpOiBTZWFyY2hSZXN1bHRzSG9jUHJvcHMgPT4ge1xuICAvLyBBdG9tc1xuICBjb25zdCBjb25maWcgPSB1c2VOZXdPcmdDb25maWcoKTtcbiAgY29uc3Qgb3JnU2hvcnROYW1lID0gdXNlQXRvbVZhbHVlKG9yZ1Nob3J0TmFtZUF0b20pO1xuICBjb25zdCB7IGRhdGE6IHNlYXJjaERhdGEsIGxvYWRpbmc6IGlzTG9hZGluZ1NlYXJjaCB9ID1cbiAgICB1c2VBdG9tVmFsdWUoc2VhcmNoQXRvbSk7XG4gIGNvbnN0IHByb2R1Y3RMaXN0ID0gdXNlQXRvbVZhbHVlKGZpbHRlcmVkU2VhcmNoUHJvZHVjdHNBdG9tKTtcbiAgY29uc3QgcGVyZm9ybVNlYXJjaCA9IHVzZVNldEF0b20ocGVyZm9ybVNlYXJjaEF0b20pO1xuICBjb25zdCBbeyBxdWVyeSB9XSA9IHVzZUF0b20oc2VhcmNoUGFyYW1zQXRvbSk7XG4gIGNvbnN0IFtpc0ZpbHRlck9wZW4sIHNldElzRmlsdGVyT3Blbl0gPSB1c2VBdG9tKGlzRmlsdGVyT3BlbkF0b20pO1xuICBjb25zdCBbc2VsZWN0ZWRGaWx0ZXJPcHRpb25zXSA9IHVzZUF0b20oc2VhcmNoU2VsZWN0ZWRGaWx0ZXJzQXRvbSk7XG4gIGNvbnN0IGFkZEZpbHRlciA9IHVzZVNldEF0b20oYWRkU2VhcmNoRmlsdGVyQXRvbSk7XG4gIGNvbnN0IHJlbW92ZUZpbHRlciA9IHVzZVNldEF0b20ocmVtb3ZlU2VhcmNoRmlsdGVyQXRvbSk7XG4gIGNvbnN0IFtwcm9kdWN0U29ydGluZywgc2V0UHJvZHVjdFNvcnRpbmddID0gdXNlQXRvbShzZWFyY2hQcm9kdWN0U29ydGluZ0F0b20pO1xuICBjb25zdCBjbGVhckZpbHRlcnMgPSB1c2VTZXRBdG9tKGNsZWFyU2VhcmNoRmlsdGVyc0F0b20pO1xuICBjb25zdCBzZWFyY2hGaWx0ZXJzID0gdXNlQXRvbVZhbHVlKHNlYXJjaEZpbHRlcnNBdG9tKTtcbiAgY29uc3QgcmVjb21tZW5kZWRQcm9kdWN0cyA9IHVzZVJlY29tbWVuZGVkUHJvZHVjdHMoKTtcblxuICAvLyBSZWZzXG4gIGNvbnN0IHNlYXJjaFJlc3VsdHNSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBcbiAgLy8gVXRpbGl0aWVzXG4gIGNvbnN0IHNjcm9sbFRvVG9wID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHNlYXJjaFJlc3VsdHNSZWYuY3VycmVudDtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gICAgfVxuICB9LCBbXSk7XG4gIFxuICAvLyBTZWFyY2ggSW5wdXQgSG9va1xuICBjb25zdCBzZWFyY2hJbnB1dCA9IHVzZVNlYXJjaElucHV0KHtcbiAgICBpbml0aWFsU2VhcmNoVGV4dDogcXVlcnkgfHwgJycsXG4gICAgc2VhcmNoT3JpZ2luOiBTcGlmZnlXaWRnZXRzLlNlYXJjaFJlc3VsdHMsXG4gICAgb25TZWFyY2hTdWJtaXQ6IChzZWFyY2hRdWVyeSkgPT4ge1xuICAgICAgcGVyZm9ybVNlYXJjaCh7IHF1ZXJ5OiBzZWFyY2hRdWVyeSB9KTtcbiAgICB9LFxuICB9KTtcbiAgXG4gIGNvbnN0IHtcbiAgICBzZWFyY2hUZXh0LFxuICAgIGZvY3VzZWRJbmRleCxcbiAgICBmb2N1c2VkT3B0aW9uSWQsXG4gICAgYXV0b2NvbXBsZXRlUmVzdWx0cyxcbiAgICBzaG91bGRTaG93QXV0b2NvbXBsZXRlLFxuICAgIGhhbmRsZVNlYXJjaElucHV0Q2hhbmdlLFxuICAgIGhhbmRsZVNlYXJjaElucHV0Rm9jdXMsXG4gICAgaGFuZGxlU2VhcmNoSW5wdXRCbHVyLFxuICAgIGhhbmRsZUtleURvd24sXG4gICAgaGFuZGxlQXV0b2NvbXBsZXRlU2VsZWN0LFxuICAgIGhhbmRsZVN1Ym1pdFNlYXJjaCxcbiAgICBzZXRTZWFyY2hUZXh0LFxuICB9ID0gc2VhcmNoSW5wdXQ7XG4gIGNvbnN0IHNlYXJjaFJlc3VsdHNTdGF0ZSA9IGdldFNlYXJjaFJlc3VsdHNTdGF0ZShpc0xvYWRpbmdTZWFyY2gsIHNlYXJjaERhdGEpO1xuXG4gIGNvbnN0IGR5bmFtaWNGaWx0ZXJzID0gc2VhcmNoRGF0YT8uZmlsdGVycyB8fCBbXTtcblxuICAvLyBQcm92aWRlIGZhbGxiYWNrIHZhbHVlcyB3aGVuIG9yZ1VJQ29uZmlnIGlzIG5vdCB5ZXQgYXZhaWxhYmxlXG4gIGNvbnN0IHNhZmVQcm9kdWN0Q2FyZENvbmZpZyA9IGNvbmZpZz8uZnJvbnRlbmRDb25maWc/LnVpQ29uZmlnc1xuICAgID8ucHJvZHVjdENhcmRDb25maWcgfHwge1xuICAgIHZhcmlhbnQ6IFwibWluaW1hbFwiLFxuICAgIGhvdmVyVmFyaWFudDogXCJub25lXCIsXG4gICAgbGF5b3V0VmFyaWFudDogXCJzcXVhcmVcIixcbiAgfTtcbiAgY29uc3Qgc2FmZU1lcmNoYW50U2hvcnROYW1lID0gb3JnU2hvcnROYW1lIHx8IFwiXCI7XG5cbiAgY29uc3QgYXZhaWxhYmxlRHluYW1pY0ZpbHRlcnMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gZHluYW1pY0ZpbHRlcnNcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChkeW5hbWljRmlsdGVyTmFtZSkgPT5cbiAgICAgICAgICAhc2VsZWN0ZWRGaWx0ZXJPcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLmlkID09PSBgZHluYW1pYzoke2R5bmFtaWNGaWx0ZXJOYW1lfWApLFxuICAgICAgKVxuICAgICAgLm1hcCgoZHluYW1pY0ZpbHRlck5hbWUpID0+ICh7XG4gICAgICAgIG5hbWU6IGR5bmFtaWNGaWx0ZXJOYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogZm9ybWF0RmlsdGVyRGlzcGxheU5hbWUoZHluYW1pY0ZpbHRlck5hbWUpLFxuICAgICAgfSkpO1xuICB9LCBbZHluYW1pY0ZpbHRlcnMsIHNlbGVjdGVkRmlsdGVyT3B0aW9uc10pO1xuXG4gIGNvbnN0IGZpbHRlcnMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzb3J0T3B0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZmlsdGVySXRlbUlkOiBTdHJpbmcoUHJvZHVjdFNvcnRpbmcuRkVBVFVSRUQpLFxuICAgICAgICBkaXNwbGF5TmFtZTogJ1JlbGV2YW5jZScsXG4gICAgICAgIHByb2R1Y3RDb3VudDogMCxcbiAgICAgICAgaXNTZWxlY3RlZDogcHJvZHVjdFNvcnRpbmcgPT09IFByb2R1Y3RTb3J0aW5nLkZFQVRVUkVELFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmlsdGVySXRlbUlkOiBTdHJpbmcoUHJvZHVjdFNvcnRpbmcuUFJJQ0VfQVNDKSxcbiAgICAgICAgZGlzcGxheU5hbWU6ICdQcmljZTogTG93IHRvIEhpZ2gnLFxuICAgICAgICBwcm9kdWN0Q291bnQ6IDAsXG4gICAgICAgIGlzU2VsZWN0ZWQ6IHByb2R1Y3RTb3J0aW5nID09PSBQcm9kdWN0U29ydGluZy5QUklDRV9BU0MsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmaWx0ZXJJdGVtSWQ6IFN0cmluZyhQcm9kdWN0U29ydGluZy5QUklDRV9ERVNDKSxcbiAgICAgICAgZGlzcGxheU5hbWU6ICdQcmljZTogSGlnaCB0byBMb3cnLFxuICAgICAgICBwcm9kdWN0Q291bnQ6IDAsXG4gICAgICAgIGlzU2VsZWN0ZWQ6IHByb2R1Y3RTb3J0aW5nID09PSBQcm9kdWN0U29ydGluZy5QUklDRV9ERVNDLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIFt7IGZpbHRlcklkOiAnc29ydCcsIGRpc3BsYXlOYW1lOiAnU09SVCcsIGl0ZW1zOiBzb3J0T3B0aW9ucyB9LCAuLi5zZWFyY2hGaWx0ZXJzXSBhcyBTZWFyY2hGaWx0ZXJEYXR1bVtdO1xuICB9LCBbcHJvZHVjdFNvcnRpbmcsIHNlYXJjaEZpbHRlcnNdKTtcblxuICBjb25zdCBmaWx0ZXJCdXR0b25UZXh0ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRDb3VudCA9IGZpbHRlcnMucmVkdWNlKChhY2M6IG51bWJlciwgZmlsdGVyKSA9PiB7XG4gICAgICBpZiAoZmlsdGVyLmZpbHRlcklkID09PSAnc29ydCcpIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2MgKyBmaWx0ZXIuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzU2VsZWN0ZWQpLmxlbmd0aDtcbiAgICB9LCAwKTtcbiAgICBpZiAoc2VsZWN0ZWRDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuICdGaWx0ZXIgJiBTb3J0JztcbiAgICB9XG4gICAgcmV0dXJuIGBGaWx0ZXIgJiBTb3J0ICgke3NlbGVjdGVkQ291bnR9KWA7XG4gIH0sIFtmaWx0ZXJzXSk7XG5cbiAgLy8gQ2FsbGJhY2tzXG4gIGNvbnN0IHsgdHJhY2tFdmVudCB9ID0gdXNlQW1wbGl0dWRlKCk7XG5cblxuICBjb25zdCBoYW5kbGVUb2dnbGVEeW5hbWljRmlsdGVyID0gdXNlQ2FsbGJhY2soXG4gICAgKHsgZmlsdGVyLCBkeW5hbWljRmlsdGVyRGlzcGxheU5hbWUgfTogeyBmaWx0ZXI6IHN0cmluZzsgZHluYW1pY0ZpbHRlckRpc3BsYXlOYW1lOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgdHJhY2tFdmVudCh7XG4gICAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5TZWFyY2hGaWx0ZXJDbGlja2VkLFxuICAgICAgICBldmVudFByb3BzOiB7XG4gICAgICAgICAgZmlsdGVyVHlwZTogJ0R5bmFtaWMnLFxuICAgICAgICAgIGZpbHRlclZhbHVlOiBmaWx0ZXIsXG4gICAgICAgICAgcXVlcnlUZXh0OiBzZWFyY2hUZXh0LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhZGRGaWx0ZXIoY3JlYXRlRmlsdGVyT3B0aW9uKCdkeW5hbWljJywgZmlsdGVyLCBkeW5hbWljRmlsdGVyRGlzcGxheU5hbWUpKTtcbiAgICAgIHNjcm9sbFRvVG9wKCk7XG4gICAgfSxcbiAgICBbYWRkRmlsdGVyLCBzZWFyY2hUZXh0LCBzY3JvbGxUb1RvcF0sXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlUmVtb3ZlRmlsdGVyID0gdXNlQ2FsbGJhY2soXG4gICAgKGZpbHRlcjogU2VsZWN0ZWRGaWx0ZXJPcHRpb24pID0+IHtcbiAgICAgIHJlbW92ZUZpbHRlcihmaWx0ZXIuaWQpO1xuICAgICAgc2Nyb2xsVG9Ub3AoKTtcbiAgICB9LFxuICAgIFtyZW1vdmVGaWx0ZXIsIHNjcm9sbFRvVG9wXSxcbiAgKTtcblxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdEZpbHRlckl0ZW06IFNlbGVjdEZpbHRlckl0ZW0gPSB1c2VDYWxsYmFjayhcbiAgICAoe1xuICAgICAgZmlsdGVySWQsXG4gICAgICBmaWx0ZXJJdGVtSWQsXG4gICAgICBpc1NlbGVjdGVkLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgfToge1xuICAgICAgZmlsdGVySWQ6IHN0cmluZztcbiAgICAgIGZpbHRlckl0ZW1JZDogc3RyaW5nO1xuICAgICAgaXNTZWxlY3RlZDogYm9vbGVhbjtcbiAgICAgIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKGZpbHRlcklkID09PSAnc29ydCcpIHtcbiAgICAgICAgY29uc3QgbmV3U29ydCA9IGZpbHRlckl0ZW1JZCBhcyBQcm9kdWN0U29ydGluZztcbiAgICAgICAgdHJhY2tFdmVudCh7XG4gICAgICAgICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLlNlYXJjaFNvcnRDbGlja2VkLFxuICAgICAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgICAgIHNvcnRUeXBlOiBuZXdTb3J0LFxuICAgICAgICAgICAgcXVlcnlUZXh0OiBzZWFyY2hUZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRQcm9kdWN0U29ydGluZyhuZXdTb3J0KTtcbiAgICAgICAgc2Nyb2xsVG9Ub3AoKTtcbiAgICAgIH0gZWxzZSBpZiAoIWlzU2VsZWN0ZWQpIHtcbiAgICAgICAgcmVtb3ZlRmlsdGVyKGAke2ZpbHRlcklkfToke2ZpbHRlckl0ZW1JZH1gKTtcbiAgICAgICAgc2Nyb2xsVG9Ub3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYWNrRXZlbnQoe1xuICAgICAgICAgIGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5TZWFyY2hGaWx0ZXJDbGlja2VkLFxuICAgICAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgICAgIGZpbHRlclR5cGU6ICdTdGF0aWMnLFxuICAgICAgICAgICAgZmlsdGVyQ2F0ZWdvcnk6IGZpbHRlcklkLFxuICAgICAgICAgICAgZmlsdGVyVmFsdWU6IGZpbHRlckl0ZW1JZCxcbiAgICAgICAgICAgIHF1ZXJ5VGV4dDogc2VhcmNoVGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYWRkRmlsdGVyKGNyZWF0ZUZpbHRlck9wdGlvbihmaWx0ZXJJZCwgZmlsdGVySXRlbUlkLCBkaXNwbGF5TmFtZSkpO1xuICAgICAgICBzY3JvbGxUb1RvcCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2FkZEZpbHRlciwgcmVtb3ZlRmlsdGVyLCBzZXRQcm9kdWN0U29ydGluZywgc2VhcmNoVGV4dCwgc2Nyb2xsVG9Ub3BdLFxuICApO1xuXG5cbiAgY29uc3QgaGFuZGxlQ2xlYXJBbGxGaWx0ZXJzID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFByb2R1Y3RTb3J0aW5nKFByb2R1Y3RTb3J0aW5nLkZFQVRVUkVEKTtcbiAgICBjbGVhckZpbHRlcnMoKTtcbiAgICBzY3JvbGxUb1RvcCgpO1xuICB9LCBbc2V0UHJvZHVjdFNvcnRpbmcsIGNsZWFyRmlsdGVycywgc2Nyb2xsVG9Ub3BdKTtcblxuICAvLyBTaWRlIEVmZmVjdHNcbiAgdXNlVHJhY2tDb21wb25lbnRWaXNpYmxlRXZlbnQoXG4gICAgU3BpZmZ5V2lkZ2V0cy5TZWFyY2hSZXN1bHRzLFxuICAgIHNlYXJjaFJlc3VsdHNSZWYsXG4gICAge30sXG4gICAgU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5TZWFyY2hDb21wb25lbnRWaXNpYmxlLFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNlYXJjaFJlc3VsdHNTdGF0ZSA9PT0gU2VhcmNoUmVzdWx0c1N0YXRlLlJlc3VsdHMgfHwgc2VhcmNoUmVzdWx0c1N0YXRlID09PSBTZWFyY2hSZXN1bHRzU3RhdGUuTm9SZXN1bHRzKSB7XG4gICAgICB0cmFja0V2ZW50KHtcbiAgICAgICAgZXZlbnROYW1lOiBTcGlmZnlNZXRyaWNzRXZlbnROYW1lLlNlYXJjaFJlc3VsdHNWaWV3ZWQsXG4gICAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgICBxdWVyeVRleHQ6IHNlYXJjaFRleHQsXG4gICAgICAgICAgcmVzdWx0c0NvdW50OiBwcm9kdWN0TGlzdC5sZW5ndGgsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtwcm9kdWN0TGlzdC5sZW5ndGgsIHNlYXJjaFJlc3VsdHNTdGF0ZV0pO1xuXG4gIC8vIFRoaXMgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBzZWFyY2ggdGV4dCB0cmlnZ2VyaW5nIGEgc2VhcmNoXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5ICE9PSBzZWFyY2hUZXh0KSB7XG4gICAgICBjb25zdCBlc3EgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnZXNxJyk7XG4gICAgICBzZXRTZWFyY2hUZXh0KHF1ZXJ5KTtcbiAgICAgIHBlcmZvcm1TZWFyY2goeyBxdWVyeTogZXNxID8/IHF1ZXJ5IH0pO1xuICAgIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbcGVyZm9ybVNlYXJjaCwgcXVlcnksIHNldFNlYXJjaFRleHRdKTtcblxuICByZXR1cm4ge1xuICAgIHNlYXJjaERhdGEsXG4gICAgc2VhcmNoUmVzcG9uc2VJZDogc2VhcmNoRGF0YT8uc2VhcmNoUmVzcG9uc2VJZCA/PyAnJyxcbiAgICBtZXJjaGFudFNob3J0TmFtZTogc2FmZU1lcmNoYW50U2hvcnROYW1lLFxuICAgIHByb2R1Y3RDYXJkQ29uZmlnOiBzYWZlUHJvZHVjdENhcmRDb25maWcsXG4gICAgcHJvZHVjdExpc3QsXG4gICAgcmVjb21tZW5kZWRQcm9kdWN0cyxcbiAgICBhdXRvY29tcGxldGVSZXN1bHRzLFxuICAgIHNlYXJjaEZpbHRlcnM6IGZpbHRlcnMsXG4gICAgYXZhaWxhYmxlRHluYW1pY0ZpbHRlcnMsXG4gICAgc2VsZWN0ZWRGaWx0ZXJPcHRpb25zLFxuICAgIHNlYXJjaFRleHQsXG4gICAgcXVlcnk6IHF1ZXJ5IHx8ICcnLFxuICAgIHNlYXJjaFJlc3VsdHNTdGF0ZSxcbiAgICBpc0xvYWRpbmdTZWFyY2gsXG4gICAgaXNGaWx0ZXJPcGVuLFxuICAgIHNob3VsZFNob3dBdXRvY29tcGxldGUsXG4gICAgZm9jdXNlZEluZGV4LFxuICAgIGZvY3VzZWRPcHRpb25JZCxcbiAgICBmaWx0ZXJCdXR0b25UZXh0LFxuICAgIG9uU2VhcmNoSW5wdXRDaGFuZ2U6IGhhbmRsZVNlYXJjaElucHV0Q2hhbmdlLFxuICAgIG9uU3VibWl0U2VhcmNoOiBoYW5kbGVTdWJtaXRTZWFyY2gsXG4gICAgb25BdXRvY29tcGxldGVTZWxlY3Q6IGhhbmRsZUF1dG9jb21wbGV0ZVNlbGVjdCxcbiAgICBvbktleURvd246IGhhbmRsZUtleURvd24sXG4gICAgb25TZWFyY2hJbnB1dEZvY3VzOiBoYW5kbGVTZWFyY2hJbnB1dEZvY3VzLFxuICAgIG9uU2VhcmNoSW5wdXRCbHVyOiBoYW5kbGVTZWFyY2hJbnB1dEJsdXIsXG4gICAgb25Ub2dnbGVEeW5hbWljRmlsdGVyOiBoYW5kbGVUb2dnbGVEeW5hbWljRmlsdGVyLFxuICAgIG9uU2VsZWN0RmlsdGVySXRlbTogaGFuZGxlU2VsZWN0RmlsdGVySXRlbSxcbiAgICBvblJlbW92ZUZpbHRlcjogaGFuZGxlUmVtb3ZlRmlsdGVyLFxuICAgIG9uQ2xlYXJBbGxGaWx0ZXJzOiBoYW5kbGVDbGVhckFsbEZpbHRlcnMsXG4gICAgc2V0SXNGaWx0ZXJPcGVuLFxuICAgIHNlYXJjaFJlc3VsdHNSZWYsXG4gIH07XG59OyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQ0EsTUFBYSxrQkFBa0IsRUFDN0Isb0JBQW9CLElBQ3BCLGNBQ0EscUJBQytDO0NBQy9DLE1BQU0sZ0NBQXFCQSxxQ0FBd0I7Q0FHbkQsTUFBTSxDQUFDLFlBQVkscUNBQTBCLGtCQUFrQjtDQUMvRCxNQUFNLENBQUMsU0FBUyxrQ0FBdUIsa0JBQWtCLE1BQU0sQ0FBQyxTQUFTLEVBQUU7Q0FDM0UsTUFBTSxDQUFDLFdBQVcsb0NBQXlCLE1BQU07Q0FDakQsTUFBTSxDQUFDLGNBQWMsdUNBQTRCLEdBQUc7Q0FDcEQsTUFBTSxDQUFDLGlCQUFpQiwwQ0FDdEIs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