@ondewo/csi-client-angular 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +27 -0
  3. package/api/google/api/annotations.pb.d.ts +1 -0
  4. package/api/google/api/http.pb.d.ts +275 -0
  5. package/api/google/rpc/status.pb.d.ts +82 -0
  6. package/api/google/type/latlng.pb.d.ts +76 -0
  7. package/api/ondewo/csi/conversation.pb.d.ts +1312 -0
  8. package/api/ondewo/csi/conversation.pbconf.d.ts +6 -0
  9. package/api/ondewo/csi/conversation.pbsc.d.ts +167 -0
  10. package/api/ondewo/nlu/agent.pb.d.ts +3536 -0
  11. package/api/ondewo/nlu/agent.pbconf.d.ts +6 -0
  12. package/api/ondewo/nlu/agent.pbsc.d.ts +472 -0
  13. package/api/ondewo/nlu/aiservices.pb.d.ts +2472 -0
  14. package/api/ondewo/nlu/aiservices.pbconf.d.ts +6 -0
  15. package/api/ondewo/nlu/aiservices.pbsc.d.ts +150 -0
  16. package/api/ondewo/nlu/common.pb.d.ts +75 -0
  17. package/api/ondewo/nlu/context.pb.d.ts +756 -0
  18. package/api/ondewo/nlu/context.pbconf.d.ts +6 -0
  19. package/api/ondewo/nlu/context.pbsc.d.ts +119 -0
  20. package/api/ondewo/nlu/entity-type.pb.d.ts +2014 -0
  21. package/api/ondewo/nlu/entity-type.pbconf.d.ts +6 -0
  22. package/api/ondewo/nlu/entity-type.pbsc.d.ts +216 -0
  23. package/api/ondewo/nlu/intent.pb.d.ts +6236 -0
  24. package/api/ondewo/nlu/intent.pbconf.d.ts +6 -0
  25. package/api/ondewo/nlu/intent.pbsc.d.ts +456 -0
  26. package/api/ondewo/nlu/operation-metadata.pb.d.ts +166 -0
  27. package/api/ondewo/nlu/operations.pb.d.ts +578 -0
  28. package/api/ondewo/nlu/operations.pbconf.d.ts +6 -0
  29. package/api/ondewo/nlu/operations.pbsc.d.ts +87 -0
  30. package/api/ondewo/nlu/project-role.pb.d.ts +576 -0
  31. package/api/ondewo/nlu/project-role.pbconf.d.ts +6 -0
  32. package/api/ondewo/nlu/project-role.pbsc.d.ts +103 -0
  33. package/api/ondewo/nlu/project-statistics.pb.d.ts +295 -0
  34. package/api/ondewo/nlu/project-statistics.pbconf.d.ts +6 -0
  35. package/api/ondewo/nlu/project-statistics.pbsc.d.ts +151 -0
  36. package/api/ondewo/nlu/server-statistics.pb.d.ts +71 -0
  37. package/api/ondewo/nlu/server-statistics.pbconf.d.ts +6 -0
  38. package/api/ondewo/nlu/server-statistics.pbsc.d.ts +72 -0
  39. package/api/ondewo/nlu/session.pb.d.ts +2892 -0
  40. package/api/ondewo/nlu/session.pbconf.d.ts +6 -0
  41. package/api/ondewo/nlu/session.pbsc.d.ts +247 -0
  42. package/api/ondewo/nlu/user.pb.d.ts +1577 -0
  43. package/api/ondewo/nlu/user.pbconf.d.ts +6 -0
  44. package/api/ondewo/nlu/user.pbsc.d.ts +263 -0
  45. package/api/ondewo/nlu/utility.pb.d.ts +1814 -0
  46. package/api/ondewo/nlu/utility.pbconf.d.ts +6 -0
  47. package/api/ondewo/nlu/utility.pbsc.d.ts +150 -0
  48. package/api/ondewo/nlu/webhook.pb.d.ts +401 -0
  49. package/api/ondewo/nlu/webhook.pbconf.d.ts +6 -0
  50. package/api/ondewo/nlu/webhook.pbsc.d.ts +70 -0
  51. package/api/ondewo/s2t/speech-to-text.pb.d.ts +3710 -0
  52. package/api/ondewo/s2t/speech-to-text.pbconf.d.ts +6 -0
  53. package/api/ondewo/s2t/speech-to-text.pbsc.d.ts +263 -0
  54. package/api/ondewo/t2s/text-to-speech.pb.d.ts +3302 -0
  55. package/api/ondewo/t2s/text-to-speech.pbconf.d.ts +11 -0
  56. package/api/ondewo/t2s/text-to-speech.pbsc.d.ts +296 -0
  57. package/esm2020/api/google/api/annotations.pb.mjs +2 -0
  58. package/esm2020/api/google/api/http.pb.mjs +524 -0
  59. package/esm2020/api/google/rpc/status.pb.mjs +138 -0
  60. package/esm2020/api/google/type/latlng.pb.mjs +119 -0
  61. package/esm2020/api/ondewo/csi/conversation.pb.mjs +2232 -0
  62. package/esm2020/api/ondewo/csi/conversation.pbconf.mjs +13 -0
  63. package/esm2020/api/ondewo/csi/conversation.pbsc.mjs +315 -0
  64. package/esm2020/api/ondewo/nlu/agent.pb.mjs +6077 -0
  65. package/esm2020/api/ondewo/nlu/agent.pbconf.mjs +13 -0
  66. package/esm2020/api/ondewo/nlu/agent.pbsc.mjs +886 -0
  67. package/esm2020/api/ondewo/nlu/aiservices.pb.mjs +4371 -0
  68. package/esm2020/api/ondewo/nlu/aiservices.pbconf.mjs +13 -0
  69. package/esm2020/api/ondewo/nlu/aiservices.pbsc.mjs +284 -0
  70. package/esm2020/api/ondewo/nlu/common.pb.mjs +108 -0
  71. package/esm2020/api/ondewo/nlu/context.pb.mjs +1233 -0
  72. package/esm2020/api/ondewo/nlu/context.pbconf.mjs +13 -0
  73. package/esm2020/api/ondewo/nlu/context.pbsc.mjs +225 -0
  74. package/esm2020/api/ondewo/nlu/entity-type.pb.mjs +3466 -0
  75. package/esm2020/api/ondewo/nlu/entity-type.pbconf.mjs +13 -0
  76. package/esm2020/api/ondewo/nlu/entity-type.pbsc.mjs +406 -0
  77. package/esm2020/api/ondewo/nlu/intent.pb.mjs +10809 -0
  78. package/esm2020/api/ondewo/nlu/intent.pbconf.mjs +13 -0
  79. package/esm2020/api/ondewo/nlu/intent.pbsc.mjs +856 -0
  80. package/esm2020/api/ondewo/nlu/operation-metadata.pb.mjs +382 -0
  81. package/esm2020/api/ondewo/nlu/operations.pb.mjs +1003 -0
  82. package/esm2020/api/ondewo/nlu/operations.pbconf.mjs +13 -0
  83. package/esm2020/api/ondewo/nlu/operations.pbsc.mjs +165 -0
  84. package/esm2020/api/ondewo/nlu/project-role.pb.mjs +988 -0
  85. package/esm2020/api/ondewo/nlu/project-role.pbconf.mjs +13 -0
  86. package/esm2020/api/ondewo/nlu/project-role.pbsc.mjs +195 -0
  87. package/esm2020/api/ondewo/nlu/project-statistics.pb.mjs +460 -0
  88. package/esm2020/api/ondewo/nlu/project-statistics.pbconf.mjs +13 -0
  89. package/esm2020/api/ondewo/nlu/project-statistics.pbsc.mjs +285 -0
  90. package/esm2020/api/ondewo/nlu/server-statistics.pb.mjs +103 -0
  91. package/esm2020/api/ondewo/nlu/server-statistics.pbconf.mjs +13 -0
  92. package/esm2020/api/ondewo/nlu/server-statistics.pbsc.mjs +136 -0
  93. package/esm2020/api/ondewo/nlu/session.pb.mjs +5351 -0
  94. package/esm2020/api/ondewo/nlu/session.pbconf.mjs +13 -0
  95. package/esm2020/api/ondewo/nlu/session.pbsc.mjs +465 -0
  96. package/esm2020/api/ondewo/nlu/user.pb.mjs +2536 -0
  97. package/esm2020/api/ondewo/nlu/user.pbconf.mjs +13 -0
  98. package/esm2020/api/ondewo/nlu/user.pbsc.mjs +495 -0
  99. package/esm2020/api/ondewo/nlu/utility.pb.mjs +3302 -0
  100. package/esm2020/api/ondewo/nlu/utility.pbconf.mjs +13 -0
  101. package/esm2020/api/ondewo/nlu/utility.pbsc.mjs +284 -0
  102. package/esm2020/api/ondewo/nlu/webhook.pb.mjs +705 -0
  103. package/esm2020/api/ondewo/nlu/webhook.pbconf.mjs +13 -0
  104. package/esm2020/api/ondewo/nlu/webhook.pbsc.mjs +134 -0
  105. package/esm2020/api/ondewo/s2t/speech-to-text.pb.mjs +6452 -0
  106. package/esm2020/api/ondewo/s2t/speech-to-text.pbconf.mjs +13 -0
  107. package/esm2020/api/ondewo/s2t/speech-to-text.pbsc.mjs +495 -0
  108. package/esm2020/api/ondewo/t2s/text-to-speech.pb.mjs +5779 -0
  109. package/esm2020/api/ondewo/t2s/text-to-speech.pbconf.mjs +18 -0
  110. package/esm2020/api/ondewo/t2s/text-to-speech.pbsc.mjs +555 -0
  111. package/esm2020/ondewo-csi-client-angular.mjs +5 -0
  112. package/esm2020/public-api.mjs +55 -0
  113. package/fesm2015/ondewo-csi-client-angular.mjs +62142 -0
  114. package/fesm2015/ondewo-csi-client-angular.mjs.map +1 -0
  115. package/fesm2020/ondewo-csi-client-angular.mjs +62135 -0
  116. package/fesm2020/ondewo-csi-client-angular.mjs.map +1 -0
  117. package/index.d.ts +5 -0
  118. package/ondewo-csi-api/README.md +91 -0
  119. package/ondewo-csi-api/google/ads/googleads/README.md +21 -0
  120. package/ondewo-csi-api/google/api/README.md +5 -0
  121. package/ondewo-csi-api/google/api/servicecontrol/README.md +126 -0
  122. package/ondewo-csi-api/google/api/servicemanagement/README.md +102 -0
  123. package/ondewo-csi-api/google/appengine/README.md +12 -0
  124. package/ondewo-csi-api/google/assistant/embedded/README.md +3 -0
  125. package/ondewo-csi-api/google/cloud/functions/README.md +2 -0
  126. package/ondewo-csi-api/google/cloud/language/README.md +0 -0
  127. package/ondewo-csi-api/google/cloud/runtimeconfig/README.md +39 -0
  128. package/ondewo-csi-api/google/cloud/speech/README.md +3 -0
  129. package/ondewo-csi-api/google/container/README.md +0 -0
  130. package/ondewo-csi-api/google/datastore/README.md +0 -0
  131. package/ondewo-csi-api/google/devtools/cloudbuild/README.md +1 -0
  132. package/ondewo-csi-api/google/devtools/clouderrorreporting/README.md +1 -0
  133. package/ondewo-csi-api/google/example/library/README.md +4 -0
  134. package/ondewo-csi-api/google/firestore/README.md +0 -0
  135. package/ondewo-csi-api/google/genomics/README.md +14 -0
  136. package/ondewo-csi-api/google/iam/README.md +14 -0
  137. package/ondewo-csi-api/google/logging/README.md +3 -0
  138. package/ondewo-csi-api/google/longrunning/README.md +5 -0
  139. package/ondewo-csi-api/google/privacy/dlp/README.md +7 -0
  140. package/ondewo-csi-api/google/pubsub/v1beta2/README.md +136 -0
  141. package/ondewo-csi-api/google/rpc/README.md +5 -0
  142. package/ondewo-csi-api/google/streetview/publish/README.md +1 -0
  143. package/ondewo-csi-api/google/type/README.md +16 -0
  144. package/ondewo-csi-api/googleapis/README.md +87 -0
  145. package/ondewo-csi-api/googleapis/google/ads/googleads/README.md +21 -0
  146. package/ondewo-csi-api/googleapis/google/api/README.md +5 -0
  147. package/ondewo-csi-api/googleapis/google/api/servicecontrol/README.md +126 -0
  148. package/ondewo-csi-api/googleapis/google/api/servicemanagement/README.md +102 -0
  149. package/ondewo-csi-api/googleapis/google/appengine/README.md +12 -0
  150. package/ondewo-csi-api/googleapis/google/assistant/embedded/README.md +3 -0
  151. package/ondewo-csi-api/googleapis/google/cloud/functions/README.md +2 -0
  152. package/ondewo-csi-api/googleapis/google/cloud/language/README.md +0 -0
  153. package/ondewo-csi-api/googleapis/google/cloud/runtimeconfig/README.md +39 -0
  154. package/ondewo-csi-api/googleapis/google/cloud/speech/README.md +3 -0
  155. package/ondewo-csi-api/googleapis/google/container/README.md +0 -0
  156. package/ondewo-csi-api/googleapis/google/datastore/README.md +0 -0
  157. package/ondewo-csi-api/googleapis/google/devtools/cloudbuild/README.md +1 -0
  158. package/ondewo-csi-api/googleapis/google/devtools/clouderrorreporting/README.md +1 -0
  159. package/ondewo-csi-api/googleapis/google/example/library/README.md +4 -0
  160. package/ondewo-csi-api/googleapis/google/firestore/README.md +0 -0
  161. package/ondewo-csi-api/googleapis/google/genomics/README.md +14 -0
  162. package/ondewo-csi-api/googleapis/google/iam/README.md +14 -0
  163. package/ondewo-csi-api/googleapis/google/logging/README.md +3 -0
  164. package/ondewo-csi-api/googleapis/google/longrunning/README.md +5 -0
  165. package/ondewo-csi-api/googleapis/google/privacy/dlp/README.md +7 -0
  166. package/ondewo-csi-api/googleapis/google/pubsub/v1beta2/README.md +136 -0
  167. package/ondewo-csi-api/googleapis/google/rpc/README.md +5 -0
  168. package/ondewo-csi-api/googleapis/google/streetview/publish/README.md +1 -0
  169. package/ondewo-csi-api/googleapis/google/type/README.md +16 -0
  170. package/ondewo-csi-api/ondewo-nlu-api/README.md +117 -0
  171. package/ondewo-csi-api/ondewo-nlu-api/googleapis/README.md +87 -0
  172. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/ads/googleads/README.md +21 -0
  173. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/api/README.md +5 -0
  174. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/api/servicecontrol/README.md +126 -0
  175. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/api/servicemanagement/README.md +102 -0
  176. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/appengine/README.md +12 -0
  177. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/assistant/embedded/README.md +3 -0
  178. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/cloud/functions/README.md +2 -0
  179. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/cloud/language/README.md +0 -0
  180. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/cloud/runtimeconfig/README.md +39 -0
  181. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/cloud/speech/README.md +3 -0
  182. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/container/README.md +0 -0
  183. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/datastore/README.md +0 -0
  184. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/devtools/cloudbuild/README.md +1 -0
  185. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/devtools/clouderrorreporting/README.md +1 -0
  186. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/example/library/README.md +4 -0
  187. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/firestore/README.md +0 -0
  188. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/genomics/README.md +14 -0
  189. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/iam/README.md +14 -0
  190. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/logging/README.md +3 -0
  191. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/longrunning/README.md +5 -0
  192. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/privacy/dlp/README.md +7 -0
  193. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/pubsub/v1beta2/README.md +136 -0
  194. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/rpc/README.md +5 -0
  195. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/streetview/publish/README.md +1 -0
  196. package/ondewo-csi-api/ondewo-nlu-api/googleapis/google/type/README.md +16 -0
  197. package/ondewo-csi-api/ondewo-s2t-api/README.md +89 -0
  198. package/ondewo-csi-api/ondewo-t2s-api/README.md +89 -0
  199. package/package.json +49 -0
  200. package/public-api.d.ts +54 -0
@@ -0,0 +1,3466 @@
1
+ import { BinaryReader, BinaryWriter } from 'google-protobuf';
2
+ import * as googleProtobuf004 from '@ngx-grpc/well-known-types';
3
+ import * as googleProtobuf008 from '@ngx-grpc/well-known-types';
4
+ import * as ondewoNlu009 from '../../ondewo/nlu/common.pb';
5
+ export var EntityTypeView;
6
+ (function (EntityTypeView) {
7
+ EntityTypeView[EntityTypeView["ENTITY_TYPE_VIEW_UNSPECIFIED"] = 0] = "ENTITY_TYPE_VIEW_UNSPECIFIED";
8
+ EntityTypeView[EntityTypeView["ENTITY_TYPE_VIEW_FULL"] = 1] = "ENTITY_TYPE_VIEW_FULL";
9
+ EntityTypeView[EntityTypeView["ENTITY_TYPE_VIEW_PARTIAL"] = 2] = "ENTITY_TYPE_VIEW_PARTIAL";
10
+ EntityTypeView[EntityTypeView["ENTITY_TYPE_VIEW_SHALLOW"] = 3] = "ENTITY_TYPE_VIEW_SHALLOW";
11
+ })(EntityTypeView || (EntityTypeView = {}));
12
+ export var EntityTypeCategory;
13
+ (function (EntityTypeCategory) {
14
+ EntityTypeCategory[EntityTypeCategory["ALL_ENTITY_TYPES"] = 0] = "ALL_ENTITY_TYPES";
15
+ EntityTypeCategory[EntityTypeCategory["DEFAULT_ENTITY_TYPES"] = 1] = "DEFAULT_ENTITY_TYPES";
16
+ EntityTypeCategory[EntityTypeCategory["USER_DEFINED_ENTITY_TYPES"] = 2] = "USER_DEFINED_ENTITY_TYPES";
17
+ })(EntityTypeCategory || (EntityTypeCategory = {}));
18
+ /**
19
+ * Message implementation for ondewo.nlu.EntityType
20
+ */
21
+ export class EntityType {
22
+ /**
23
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
24
+ * @param _value initial values object or instance of EntityType to deeply clone from
25
+ */
26
+ constructor(_value) {
27
+ _value = _value || {};
28
+ this.name = _value.name;
29
+ this.displayName = _value.displayName;
30
+ this.kind = _value.kind;
31
+ this.autoExpansionMode = _value.autoExpansionMode;
32
+ this.entities = (_value.entities || []).map(m => new EntityType.Entity(m));
33
+ this.nextPageToken = _value.nextPageToken;
34
+ this.entityCount = _value.entityCount;
35
+ this.status = _value.status;
36
+ this.synonymCount = _value.synonymCount;
37
+ EntityType.refineValues(this);
38
+ }
39
+ /**
40
+ * Deserialize binary data to message
41
+ * @param instance message instance
42
+ */
43
+ static deserializeBinary(bytes) {
44
+ const instance = new EntityType();
45
+ EntityType.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
46
+ return instance;
47
+ }
48
+ /**
49
+ * Check all the properties and set default protobuf values if necessary
50
+ * @param _instance message instance
51
+ */
52
+ static refineValues(_instance) {
53
+ _instance.name = _instance.name || '';
54
+ _instance.displayName = _instance.displayName || '';
55
+ _instance.kind = _instance.kind || 0;
56
+ _instance.autoExpansionMode = _instance.autoExpansionMode || 0;
57
+ _instance.entities = _instance.entities || [];
58
+ _instance.nextPageToken = _instance.nextPageToken || '';
59
+ _instance.entityCount = _instance.entityCount || 0;
60
+ _instance.status = _instance.status || 0;
61
+ _instance.synonymCount = _instance.synonymCount || 0;
62
+ }
63
+ /**
64
+ * Deserializes / reads binary message into message instance using provided binary reader
65
+ * @param _instance message instance
66
+ * @param _reader binary reader instance
67
+ */
68
+ static deserializeBinaryFromReader(_instance, _reader) {
69
+ while (_reader.nextField()) {
70
+ if (_reader.isEndGroup())
71
+ break;
72
+ switch (_reader.getFieldNumber()) {
73
+ case 1:
74
+ _instance.name = _reader.readString();
75
+ break;
76
+ case 2:
77
+ _instance.displayName = _reader.readString();
78
+ break;
79
+ case 3:
80
+ _instance.kind = _reader.readEnum();
81
+ break;
82
+ case 4:
83
+ _instance.autoExpansionMode = _reader.readEnum();
84
+ break;
85
+ case 6:
86
+ const messageInitializer6 = new EntityType.Entity();
87
+ _reader.readMessage(messageInitializer6, EntityType.Entity.deserializeBinaryFromReader);
88
+ (_instance.entities = _instance.entities || []).push(messageInitializer6);
89
+ break;
90
+ case 10:
91
+ _instance.nextPageToken = _reader.readString();
92
+ break;
93
+ case 11:
94
+ _instance.entityCount = _reader.readInt32();
95
+ break;
96
+ case 12:
97
+ _instance.status = _reader.readEnum();
98
+ break;
99
+ case 13:
100
+ _instance.synonymCount = _reader.readInt32();
101
+ break;
102
+ default:
103
+ _reader.skipField();
104
+ }
105
+ }
106
+ EntityType.refineValues(_instance);
107
+ }
108
+ /**
109
+ * Serializes a message to binary format using provided binary reader
110
+ * @param _instance message instance
111
+ * @param _writer binary writer instance
112
+ */
113
+ static serializeBinaryToWriter(_instance, _writer) {
114
+ if (_instance.name) {
115
+ _writer.writeString(1, _instance.name);
116
+ }
117
+ if (_instance.displayName) {
118
+ _writer.writeString(2, _instance.displayName);
119
+ }
120
+ if (_instance.kind) {
121
+ _writer.writeEnum(3, _instance.kind);
122
+ }
123
+ if (_instance.autoExpansionMode) {
124
+ _writer.writeEnum(4, _instance.autoExpansionMode);
125
+ }
126
+ if (_instance.entities && _instance.entities.length) {
127
+ _writer.writeRepeatedMessage(6, _instance.entities, EntityType.Entity.serializeBinaryToWriter);
128
+ }
129
+ if (_instance.nextPageToken) {
130
+ _writer.writeString(10, _instance.nextPageToken);
131
+ }
132
+ if (_instance.entityCount) {
133
+ _writer.writeInt32(11, _instance.entityCount);
134
+ }
135
+ if (_instance.status) {
136
+ _writer.writeEnum(12, _instance.status);
137
+ }
138
+ if (_instance.synonymCount) {
139
+ _writer.writeInt32(13, _instance.synonymCount);
140
+ }
141
+ }
142
+ get name() {
143
+ return this._name;
144
+ }
145
+ set name(value) {
146
+ this._name = value;
147
+ }
148
+ get displayName() {
149
+ return this._displayName;
150
+ }
151
+ set displayName(value) {
152
+ this._displayName = value;
153
+ }
154
+ get kind() {
155
+ return this._kind;
156
+ }
157
+ set kind(value) {
158
+ this._kind = value;
159
+ }
160
+ get autoExpansionMode() {
161
+ return this._autoExpansionMode;
162
+ }
163
+ set autoExpansionMode(value) {
164
+ this._autoExpansionMode = value;
165
+ }
166
+ get entities() {
167
+ return this._entities;
168
+ }
169
+ set entities(value) {
170
+ this._entities = value;
171
+ }
172
+ get nextPageToken() {
173
+ return this._nextPageToken;
174
+ }
175
+ set nextPageToken(value) {
176
+ this._nextPageToken = value;
177
+ }
178
+ get entityCount() {
179
+ return this._entityCount;
180
+ }
181
+ set entityCount(value) {
182
+ this._entityCount = value;
183
+ }
184
+ get status() {
185
+ return this._status;
186
+ }
187
+ set status(value) {
188
+ this._status = value;
189
+ }
190
+ get synonymCount() {
191
+ return this._synonymCount;
192
+ }
193
+ set synonymCount(value) {
194
+ this._synonymCount = value;
195
+ }
196
+ /**
197
+ * Serialize message to binary data
198
+ * @param instance message instance
199
+ */
200
+ serializeBinary() {
201
+ const writer = new BinaryWriter();
202
+ EntityType.serializeBinaryToWriter(this, writer);
203
+ return writer.getResultBuffer();
204
+ }
205
+ /**
206
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
207
+ */
208
+ toObject() {
209
+ return {
210
+ name: this.name,
211
+ displayName: this.displayName,
212
+ kind: this.kind,
213
+ autoExpansionMode: this.autoExpansionMode,
214
+ entities: (this.entities || []).map(m => m.toObject()),
215
+ nextPageToken: this.nextPageToken,
216
+ entityCount: this.entityCount,
217
+ status: this.status,
218
+ synonymCount: this.synonymCount
219
+ };
220
+ }
221
+ /**
222
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
223
+ */
224
+ toJSON() {
225
+ return this.toObject();
226
+ }
227
+ /**
228
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
229
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
230
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
231
+ */
232
+ toProtobufJSON(
233
+ // @ts-ignore
234
+ options) {
235
+ return {
236
+ name: this.name,
237
+ displayName: this.displayName,
238
+ kind: EntityType.Kind[this.kind === null || this.kind === undefined ? 0 : this.kind],
239
+ autoExpansionMode: EntityType.AutoExpansionMode[this.autoExpansionMode === null ||
240
+ this.autoExpansionMode === undefined
241
+ ? 0
242
+ : this.autoExpansionMode],
243
+ entities: (this.entities || []).map(m => m.toProtobufJSON(options)),
244
+ nextPageToken: this.nextPageToken,
245
+ entityCount: this.entityCount,
246
+ status: EntityType.EntityTypeStatus[this.status === null || this.status === undefined ? 0 : this.status],
247
+ synonymCount: this.synonymCount
248
+ };
249
+ }
250
+ }
251
+ EntityType.id = 'ondewo.nlu.EntityType';
252
+ (function (EntityType) {
253
+ let Kind;
254
+ (function (Kind) {
255
+ Kind[Kind["KIND_UNSPECIFIED"] = 0] = "KIND_UNSPECIFIED";
256
+ Kind[Kind["KIND_MAP"] = 1] = "KIND_MAP";
257
+ Kind[Kind["KIND_LIST"] = 2] = "KIND_LIST";
258
+ })(Kind = EntityType.Kind || (EntityType.Kind = {}));
259
+ let EntityTypeStatus;
260
+ (function (EntityTypeStatus) {
261
+ EntityTypeStatus[EntityTypeStatus["ACTIVE"] = 0] = "ACTIVE";
262
+ EntityTypeStatus[EntityTypeStatus["INACTIVE"] = 1] = "INACTIVE";
263
+ })(EntityTypeStatus = EntityType.EntityTypeStatus || (EntityType.EntityTypeStatus = {}));
264
+ let AutoExpansionMode;
265
+ (function (AutoExpansionMode) {
266
+ AutoExpansionMode[AutoExpansionMode["AUTO_EXPANSION_MODE_UNSPECIFIED"] = 0] = "AUTO_EXPANSION_MODE_UNSPECIFIED";
267
+ AutoExpansionMode[AutoExpansionMode["AUTO_EXPANSION_MODE_DEFAULT"] = 1] = "AUTO_EXPANSION_MODE_DEFAULT";
268
+ })(AutoExpansionMode = EntityType.AutoExpansionMode || (EntityType.AutoExpansionMode = {}));
269
+ /**
270
+ * Message implementation for ondewo.nlu.Entity
271
+ */
272
+ class Entity {
273
+ /**
274
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
275
+ * @param _value initial values object or instance of Entity to deeply clone from
276
+ */
277
+ constructor(_value) {
278
+ _value = _value || {};
279
+ this.value = _value.value;
280
+ this.synonyms = (_value.synonyms || []).slice();
281
+ this.name = _value.name;
282
+ this.displayName = _value.displayName;
283
+ this.synonymCount = _value.synonymCount;
284
+ this.languageCode = _value.languageCode;
285
+ Entity.refineValues(this);
286
+ }
287
+ /**
288
+ * Deserialize binary data to message
289
+ * @param instance message instance
290
+ */
291
+ static deserializeBinary(bytes) {
292
+ const instance = new Entity();
293
+ Entity.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
294
+ return instance;
295
+ }
296
+ /**
297
+ * Check all the properties and set default protobuf values if necessary
298
+ * @param _instance message instance
299
+ */
300
+ static refineValues(_instance) {
301
+ _instance.value = _instance.value || '';
302
+ _instance.synonyms = _instance.synonyms || [];
303
+ _instance.name = _instance.name || '';
304
+ _instance.displayName = _instance.displayName || '';
305
+ _instance.synonymCount = _instance.synonymCount || 0;
306
+ _instance.languageCode = _instance.languageCode || '';
307
+ }
308
+ /**
309
+ * Deserializes / reads binary message into message instance using provided binary reader
310
+ * @param _instance message instance
311
+ * @param _reader binary reader instance
312
+ */
313
+ static deserializeBinaryFromReader(_instance, _reader) {
314
+ while (_reader.nextField()) {
315
+ if (_reader.isEndGroup())
316
+ break;
317
+ switch (_reader.getFieldNumber()) {
318
+ case 1:
319
+ _instance.value = _reader.readString();
320
+ break;
321
+ case 2:
322
+ (_instance.synonyms = _instance.synonyms || []).push(_reader.readString());
323
+ break;
324
+ case 3:
325
+ _instance.name = _reader.readString();
326
+ break;
327
+ case 4:
328
+ _instance.displayName = _reader.readString();
329
+ break;
330
+ case 5:
331
+ _instance.synonymCount = _reader.readInt32();
332
+ break;
333
+ case 6:
334
+ _instance.languageCode = _reader.readString();
335
+ break;
336
+ default:
337
+ _reader.skipField();
338
+ }
339
+ }
340
+ Entity.refineValues(_instance);
341
+ }
342
+ /**
343
+ * Serializes a message to binary format using provided binary reader
344
+ * @param _instance message instance
345
+ * @param _writer binary writer instance
346
+ */
347
+ static serializeBinaryToWriter(_instance, _writer) {
348
+ if (_instance.value) {
349
+ _writer.writeString(1, _instance.value);
350
+ }
351
+ if (_instance.synonyms && _instance.synonyms.length) {
352
+ _writer.writeRepeatedString(2, _instance.synonyms);
353
+ }
354
+ if (_instance.name) {
355
+ _writer.writeString(3, _instance.name);
356
+ }
357
+ if (_instance.displayName) {
358
+ _writer.writeString(4, _instance.displayName);
359
+ }
360
+ if (_instance.synonymCount) {
361
+ _writer.writeInt32(5, _instance.synonymCount);
362
+ }
363
+ if (_instance.languageCode) {
364
+ _writer.writeString(6, _instance.languageCode);
365
+ }
366
+ }
367
+ get value() {
368
+ return this._value;
369
+ }
370
+ set value(value) {
371
+ this._value = value;
372
+ }
373
+ get synonyms() {
374
+ return this._synonyms;
375
+ }
376
+ set synonyms(value) {
377
+ this._synonyms = value;
378
+ }
379
+ get name() {
380
+ return this._name;
381
+ }
382
+ set name(value) {
383
+ this._name = value;
384
+ }
385
+ get displayName() {
386
+ return this._displayName;
387
+ }
388
+ set displayName(value) {
389
+ this._displayName = value;
390
+ }
391
+ get synonymCount() {
392
+ return this._synonymCount;
393
+ }
394
+ set synonymCount(value) {
395
+ this._synonymCount = value;
396
+ }
397
+ get languageCode() {
398
+ return this._languageCode;
399
+ }
400
+ set languageCode(value) {
401
+ this._languageCode = value;
402
+ }
403
+ /**
404
+ * Serialize message to binary data
405
+ * @param instance message instance
406
+ */
407
+ serializeBinary() {
408
+ const writer = new BinaryWriter();
409
+ Entity.serializeBinaryToWriter(this, writer);
410
+ return writer.getResultBuffer();
411
+ }
412
+ /**
413
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
414
+ */
415
+ toObject() {
416
+ return {
417
+ value: this.value,
418
+ synonyms: (this.synonyms || []).slice(),
419
+ name: this.name,
420
+ displayName: this.displayName,
421
+ synonymCount: this.synonymCount,
422
+ languageCode: this.languageCode
423
+ };
424
+ }
425
+ /**
426
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
427
+ */
428
+ toJSON() {
429
+ return this.toObject();
430
+ }
431
+ /**
432
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
433
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
434
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
435
+ */
436
+ toProtobufJSON(
437
+ // @ts-ignore
438
+ options) {
439
+ return {
440
+ value: this.value,
441
+ synonyms: (this.synonyms || []).slice(),
442
+ name: this.name,
443
+ displayName: this.displayName,
444
+ synonymCount: this.synonymCount,
445
+ languageCode: this.languageCode
446
+ };
447
+ }
448
+ }
449
+ Entity.id = 'ondewo.nlu.Entity';
450
+ EntityType.Entity = Entity;
451
+ })(EntityType || (EntityType = {}));
452
+ /**
453
+ * Message implementation for ondewo.nlu.ListEntityTypesRequest
454
+ */
455
+ export class ListEntityTypesRequest {
456
+ /**
457
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
458
+ * @param _value initial values object or instance of ListEntityTypesRequest to deeply clone from
459
+ */
460
+ constructor(_value) {
461
+ _value = _value || {};
462
+ this.parent = _value.parent;
463
+ this.languageCode = _value.languageCode;
464
+ this.pageToken = _value.pageToken;
465
+ this.entityTypeView = _value.entityTypeView;
466
+ this.filterByCategory = _value.filterByCategory;
467
+ this.sortByField = _value.sortByField
468
+ ? new EntityTypeSorting(_value.sortByField)
469
+ : undefined;
470
+ ListEntityTypesRequest.refineValues(this);
471
+ }
472
+ /**
473
+ * Deserialize binary data to message
474
+ * @param instance message instance
475
+ */
476
+ static deserializeBinary(bytes) {
477
+ const instance = new ListEntityTypesRequest();
478
+ ListEntityTypesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
479
+ return instance;
480
+ }
481
+ /**
482
+ * Check all the properties and set default protobuf values if necessary
483
+ * @param _instance message instance
484
+ */
485
+ static refineValues(_instance) {
486
+ _instance.parent = _instance.parent || '';
487
+ _instance.languageCode = _instance.languageCode || '';
488
+ _instance.pageToken = _instance.pageToken || '';
489
+ _instance.entityTypeView = _instance.entityTypeView || 0;
490
+ _instance.filterByCategory = _instance.filterByCategory || 0;
491
+ _instance.sortByField = _instance.sortByField || undefined;
492
+ }
493
+ /**
494
+ * Deserializes / reads binary message into message instance using provided binary reader
495
+ * @param _instance message instance
496
+ * @param _reader binary reader instance
497
+ */
498
+ static deserializeBinaryFromReader(_instance, _reader) {
499
+ while (_reader.nextField()) {
500
+ if (_reader.isEndGroup())
501
+ break;
502
+ switch (_reader.getFieldNumber()) {
503
+ case 1:
504
+ _instance.parent = _reader.readString();
505
+ break;
506
+ case 2:
507
+ _instance.languageCode = _reader.readString();
508
+ break;
509
+ case 4:
510
+ _instance.pageToken = _reader.readString();
511
+ break;
512
+ case 5:
513
+ _instance.entityTypeView = _reader.readEnum();
514
+ break;
515
+ case 6:
516
+ _instance.filterByCategory = _reader.readEnum();
517
+ break;
518
+ case 7:
519
+ _instance.sortByField = new EntityTypeSorting();
520
+ _reader.readMessage(_instance.sortByField, EntityTypeSorting.deserializeBinaryFromReader);
521
+ break;
522
+ default:
523
+ _reader.skipField();
524
+ }
525
+ }
526
+ ListEntityTypesRequest.refineValues(_instance);
527
+ }
528
+ /**
529
+ * Serializes a message to binary format using provided binary reader
530
+ * @param _instance message instance
531
+ * @param _writer binary writer instance
532
+ */
533
+ static serializeBinaryToWriter(_instance, _writer) {
534
+ if (_instance.parent) {
535
+ _writer.writeString(1, _instance.parent);
536
+ }
537
+ if (_instance.languageCode) {
538
+ _writer.writeString(2, _instance.languageCode);
539
+ }
540
+ if (_instance.pageToken) {
541
+ _writer.writeString(4, _instance.pageToken);
542
+ }
543
+ if (_instance.entityTypeView) {
544
+ _writer.writeEnum(5, _instance.entityTypeView);
545
+ }
546
+ if (_instance.filterByCategory) {
547
+ _writer.writeEnum(6, _instance.filterByCategory);
548
+ }
549
+ if (_instance.sortByField) {
550
+ _writer.writeMessage(7, _instance.sortByField, EntityTypeSorting.serializeBinaryToWriter);
551
+ }
552
+ }
553
+ get parent() {
554
+ return this._parent;
555
+ }
556
+ set parent(value) {
557
+ this._parent = value;
558
+ }
559
+ get languageCode() {
560
+ return this._languageCode;
561
+ }
562
+ set languageCode(value) {
563
+ this._languageCode = value;
564
+ }
565
+ get pageToken() {
566
+ return this._pageToken;
567
+ }
568
+ set pageToken(value) {
569
+ this._pageToken = value;
570
+ }
571
+ get entityTypeView() {
572
+ return this._entityTypeView;
573
+ }
574
+ set entityTypeView(value) {
575
+ this._entityTypeView = value;
576
+ }
577
+ get filterByCategory() {
578
+ return this._filterByCategory;
579
+ }
580
+ set filterByCategory(value) {
581
+ this._filterByCategory = value;
582
+ }
583
+ get sortByField() {
584
+ return this._sortByField;
585
+ }
586
+ set sortByField(value) {
587
+ this._sortByField = value;
588
+ }
589
+ /**
590
+ * Serialize message to binary data
591
+ * @param instance message instance
592
+ */
593
+ serializeBinary() {
594
+ const writer = new BinaryWriter();
595
+ ListEntityTypesRequest.serializeBinaryToWriter(this, writer);
596
+ return writer.getResultBuffer();
597
+ }
598
+ /**
599
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
600
+ */
601
+ toObject() {
602
+ return {
603
+ parent: this.parent,
604
+ languageCode: this.languageCode,
605
+ pageToken: this.pageToken,
606
+ entityTypeView: this.entityTypeView,
607
+ filterByCategory: this.filterByCategory,
608
+ sortByField: this.sortByField ? this.sortByField.toObject() : undefined
609
+ };
610
+ }
611
+ /**
612
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
613
+ */
614
+ toJSON() {
615
+ return this.toObject();
616
+ }
617
+ /**
618
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
619
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
620
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
621
+ */
622
+ toProtobufJSON(
623
+ // @ts-ignore
624
+ options) {
625
+ return {
626
+ parent: this.parent,
627
+ languageCode: this.languageCode,
628
+ pageToken: this.pageToken,
629
+ entityTypeView: EntityTypeView[this.entityTypeView === null || this.entityTypeView === undefined
630
+ ? 0
631
+ : this.entityTypeView],
632
+ filterByCategory: EntityTypeCategory[this.filterByCategory === null || this.filterByCategory === undefined
633
+ ? 0
634
+ : this.filterByCategory],
635
+ sortByField: this.sortByField
636
+ ? this.sortByField.toProtobufJSON(options)
637
+ : null
638
+ };
639
+ }
640
+ }
641
+ ListEntityTypesRequest.id = 'ondewo.nlu.ListEntityTypesRequest';
642
+ /**
643
+ * Message implementation for ondewo.nlu.ListEntityTypesResponse
644
+ */
645
+ export class ListEntityTypesResponse {
646
+ /**
647
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
648
+ * @param _value initial values object or instance of ListEntityTypesResponse to deeply clone from
649
+ */
650
+ constructor(_value) {
651
+ _value = _value || {};
652
+ this.entityTypes = (_value.entityTypes || []).map(m => new EntityType(m));
653
+ this.nextPageToken = _value.nextPageToken;
654
+ ListEntityTypesResponse.refineValues(this);
655
+ }
656
+ /**
657
+ * Deserialize binary data to message
658
+ * @param instance message instance
659
+ */
660
+ static deserializeBinary(bytes) {
661
+ const instance = new ListEntityTypesResponse();
662
+ ListEntityTypesResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
663
+ return instance;
664
+ }
665
+ /**
666
+ * Check all the properties and set default protobuf values if necessary
667
+ * @param _instance message instance
668
+ */
669
+ static refineValues(_instance) {
670
+ _instance.entityTypes = _instance.entityTypes || [];
671
+ _instance.nextPageToken = _instance.nextPageToken || '';
672
+ }
673
+ /**
674
+ * Deserializes / reads binary message into message instance using provided binary reader
675
+ * @param _instance message instance
676
+ * @param _reader binary reader instance
677
+ */
678
+ static deserializeBinaryFromReader(_instance, _reader) {
679
+ while (_reader.nextField()) {
680
+ if (_reader.isEndGroup())
681
+ break;
682
+ switch (_reader.getFieldNumber()) {
683
+ case 1:
684
+ const messageInitializer1 = new EntityType();
685
+ _reader.readMessage(messageInitializer1, EntityType.deserializeBinaryFromReader);
686
+ (_instance.entityTypes = _instance.entityTypes || []).push(messageInitializer1);
687
+ break;
688
+ case 2:
689
+ _instance.nextPageToken = _reader.readString();
690
+ break;
691
+ default:
692
+ _reader.skipField();
693
+ }
694
+ }
695
+ ListEntityTypesResponse.refineValues(_instance);
696
+ }
697
+ /**
698
+ * Serializes a message to binary format using provided binary reader
699
+ * @param _instance message instance
700
+ * @param _writer binary writer instance
701
+ */
702
+ static serializeBinaryToWriter(_instance, _writer) {
703
+ if (_instance.entityTypes && _instance.entityTypes.length) {
704
+ _writer.writeRepeatedMessage(1, _instance.entityTypes, EntityType.serializeBinaryToWriter);
705
+ }
706
+ if (_instance.nextPageToken) {
707
+ _writer.writeString(2, _instance.nextPageToken);
708
+ }
709
+ }
710
+ get entityTypes() {
711
+ return this._entityTypes;
712
+ }
713
+ set entityTypes(value) {
714
+ this._entityTypes = value;
715
+ }
716
+ get nextPageToken() {
717
+ return this._nextPageToken;
718
+ }
719
+ set nextPageToken(value) {
720
+ this._nextPageToken = value;
721
+ }
722
+ /**
723
+ * Serialize message to binary data
724
+ * @param instance message instance
725
+ */
726
+ serializeBinary() {
727
+ const writer = new BinaryWriter();
728
+ ListEntityTypesResponse.serializeBinaryToWriter(this, writer);
729
+ return writer.getResultBuffer();
730
+ }
731
+ /**
732
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
733
+ */
734
+ toObject() {
735
+ return {
736
+ entityTypes: (this.entityTypes || []).map(m => m.toObject()),
737
+ nextPageToken: this.nextPageToken
738
+ };
739
+ }
740
+ /**
741
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
742
+ */
743
+ toJSON() {
744
+ return this.toObject();
745
+ }
746
+ /**
747
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
748
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
749
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
750
+ */
751
+ toProtobufJSON(
752
+ // @ts-ignore
753
+ options) {
754
+ return {
755
+ entityTypes: (this.entityTypes || []).map(m => m.toProtobufJSON(options)),
756
+ nextPageToken: this.nextPageToken
757
+ };
758
+ }
759
+ }
760
+ ListEntityTypesResponse.id = 'ondewo.nlu.ListEntityTypesResponse';
761
+ /**
762
+ * Message implementation for ondewo.nlu.GetEntityTypeRequest
763
+ */
764
+ export class GetEntityTypeRequest {
765
+ /**
766
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
767
+ * @param _value initial values object or instance of GetEntityTypeRequest to deeply clone from
768
+ */
769
+ constructor(_value) {
770
+ _value = _value || {};
771
+ this.name = _value.name;
772
+ this.languageCode = _value.languageCode;
773
+ this.pageToken = _value.pageToken;
774
+ this.entityTypeView = _value.entityTypeView;
775
+ GetEntityTypeRequest.refineValues(this);
776
+ }
777
+ /**
778
+ * Deserialize binary data to message
779
+ * @param instance message instance
780
+ */
781
+ static deserializeBinary(bytes) {
782
+ const instance = new GetEntityTypeRequest();
783
+ GetEntityTypeRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
784
+ return instance;
785
+ }
786
+ /**
787
+ * Check all the properties and set default protobuf values if necessary
788
+ * @param _instance message instance
789
+ */
790
+ static refineValues(_instance) {
791
+ _instance.name = _instance.name || '';
792
+ _instance.languageCode = _instance.languageCode || '';
793
+ _instance.pageToken = _instance.pageToken || '';
794
+ _instance.entityTypeView = _instance.entityTypeView || 0;
795
+ }
796
+ /**
797
+ * Deserializes / reads binary message into message instance using provided binary reader
798
+ * @param _instance message instance
799
+ * @param _reader binary reader instance
800
+ */
801
+ static deserializeBinaryFromReader(_instance, _reader) {
802
+ while (_reader.nextField()) {
803
+ if (_reader.isEndGroup())
804
+ break;
805
+ switch (_reader.getFieldNumber()) {
806
+ case 1:
807
+ _instance.name = _reader.readString();
808
+ break;
809
+ case 2:
810
+ _instance.languageCode = _reader.readString();
811
+ break;
812
+ case 5:
813
+ _instance.pageToken = _reader.readString();
814
+ break;
815
+ case 6:
816
+ _instance.entityTypeView = _reader.readEnum();
817
+ break;
818
+ default:
819
+ _reader.skipField();
820
+ }
821
+ }
822
+ GetEntityTypeRequest.refineValues(_instance);
823
+ }
824
+ /**
825
+ * Serializes a message to binary format using provided binary reader
826
+ * @param _instance message instance
827
+ * @param _writer binary writer instance
828
+ */
829
+ static serializeBinaryToWriter(_instance, _writer) {
830
+ if (_instance.name) {
831
+ _writer.writeString(1, _instance.name);
832
+ }
833
+ if (_instance.languageCode) {
834
+ _writer.writeString(2, _instance.languageCode);
835
+ }
836
+ if (_instance.pageToken) {
837
+ _writer.writeString(5, _instance.pageToken);
838
+ }
839
+ if (_instance.entityTypeView) {
840
+ _writer.writeEnum(6, _instance.entityTypeView);
841
+ }
842
+ }
843
+ get name() {
844
+ return this._name;
845
+ }
846
+ set name(value) {
847
+ this._name = value;
848
+ }
849
+ get languageCode() {
850
+ return this._languageCode;
851
+ }
852
+ set languageCode(value) {
853
+ this._languageCode = value;
854
+ }
855
+ get pageToken() {
856
+ return this._pageToken;
857
+ }
858
+ set pageToken(value) {
859
+ this._pageToken = value;
860
+ }
861
+ get entityTypeView() {
862
+ return this._entityTypeView;
863
+ }
864
+ set entityTypeView(value) {
865
+ this._entityTypeView = value;
866
+ }
867
+ /**
868
+ * Serialize message to binary data
869
+ * @param instance message instance
870
+ */
871
+ serializeBinary() {
872
+ const writer = new BinaryWriter();
873
+ GetEntityTypeRequest.serializeBinaryToWriter(this, writer);
874
+ return writer.getResultBuffer();
875
+ }
876
+ /**
877
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
878
+ */
879
+ toObject() {
880
+ return {
881
+ name: this.name,
882
+ languageCode: this.languageCode,
883
+ pageToken: this.pageToken,
884
+ entityTypeView: this.entityTypeView
885
+ };
886
+ }
887
+ /**
888
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
889
+ */
890
+ toJSON() {
891
+ return this.toObject();
892
+ }
893
+ /**
894
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
895
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
896
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
897
+ */
898
+ toProtobufJSON(
899
+ // @ts-ignore
900
+ options) {
901
+ return {
902
+ name: this.name,
903
+ languageCode: this.languageCode,
904
+ pageToken: this.pageToken,
905
+ entityTypeView: EntityTypeView[this.entityTypeView === null || this.entityTypeView === undefined
906
+ ? 0
907
+ : this.entityTypeView]
908
+ };
909
+ }
910
+ }
911
+ GetEntityTypeRequest.id = 'ondewo.nlu.GetEntityTypeRequest';
912
+ /**
913
+ * Message implementation for ondewo.nlu.CreateEntityTypeRequest
914
+ */
915
+ export class CreateEntityTypeRequest {
916
+ /**
917
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
918
+ * @param _value initial values object or instance of CreateEntityTypeRequest to deeply clone from
919
+ */
920
+ constructor(_value) {
921
+ _value = _value || {};
922
+ this.parent = _value.parent;
923
+ this.entityType = _value.entityType
924
+ ? new EntityType(_value.entityType)
925
+ : undefined;
926
+ this.languageCode = _value.languageCode;
927
+ this.entityTypeView = _value.entityTypeView;
928
+ CreateEntityTypeRequest.refineValues(this);
929
+ }
930
+ /**
931
+ * Deserialize binary data to message
932
+ * @param instance message instance
933
+ */
934
+ static deserializeBinary(bytes) {
935
+ const instance = new CreateEntityTypeRequest();
936
+ CreateEntityTypeRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
937
+ return instance;
938
+ }
939
+ /**
940
+ * Check all the properties and set default protobuf values if necessary
941
+ * @param _instance message instance
942
+ */
943
+ static refineValues(_instance) {
944
+ _instance.parent = _instance.parent || '';
945
+ _instance.entityType = _instance.entityType || undefined;
946
+ _instance.languageCode = _instance.languageCode || '';
947
+ _instance.entityTypeView = _instance.entityTypeView || 0;
948
+ }
949
+ /**
950
+ * Deserializes / reads binary message into message instance using provided binary reader
951
+ * @param _instance message instance
952
+ * @param _reader binary reader instance
953
+ */
954
+ static deserializeBinaryFromReader(_instance, _reader) {
955
+ while (_reader.nextField()) {
956
+ if (_reader.isEndGroup())
957
+ break;
958
+ switch (_reader.getFieldNumber()) {
959
+ case 1:
960
+ _instance.parent = _reader.readString();
961
+ break;
962
+ case 2:
963
+ _instance.entityType = new EntityType();
964
+ _reader.readMessage(_instance.entityType, EntityType.deserializeBinaryFromReader);
965
+ break;
966
+ case 3:
967
+ _instance.languageCode = _reader.readString();
968
+ break;
969
+ case 6:
970
+ _instance.entityTypeView = _reader.readEnum();
971
+ break;
972
+ default:
973
+ _reader.skipField();
974
+ }
975
+ }
976
+ CreateEntityTypeRequest.refineValues(_instance);
977
+ }
978
+ /**
979
+ * Serializes a message to binary format using provided binary reader
980
+ * @param _instance message instance
981
+ * @param _writer binary writer instance
982
+ */
983
+ static serializeBinaryToWriter(_instance, _writer) {
984
+ if (_instance.parent) {
985
+ _writer.writeString(1, _instance.parent);
986
+ }
987
+ if (_instance.entityType) {
988
+ _writer.writeMessage(2, _instance.entityType, EntityType.serializeBinaryToWriter);
989
+ }
990
+ if (_instance.languageCode) {
991
+ _writer.writeString(3, _instance.languageCode);
992
+ }
993
+ if (_instance.entityTypeView) {
994
+ _writer.writeEnum(6, _instance.entityTypeView);
995
+ }
996
+ }
997
+ get parent() {
998
+ return this._parent;
999
+ }
1000
+ set parent(value) {
1001
+ this._parent = value;
1002
+ }
1003
+ get entityType() {
1004
+ return this._entityType;
1005
+ }
1006
+ set entityType(value) {
1007
+ this._entityType = value;
1008
+ }
1009
+ get languageCode() {
1010
+ return this._languageCode;
1011
+ }
1012
+ set languageCode(value) {
1013
+ this._languageCode = value;
1014
+ }
1015
+ get entityTypeView() {
1016
+ return this._entityTypeView;
1017
+ }
1018
+ set entityTypeView(value) {
1019
+ this._entityTypeView = value;
1020
+ }
1021
+ /**
1022
+ * Serialize message to binary data
1023
+ * @param instance message instance
1024
+ */
1025
+ serializeBinary() {
1026
+ const writer = new BinaryWriter();
1027
+ CreateEntityTypeRequest.serializeBinaryToWriter(this, writer);
1028
+ return writer.getResultBuffer();
1029
+ }
1030
+ /**
1031
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1032
+ */
1033
+ toObject() {
1034
+ return {
1035
+ parent: this.parent,
1036
+ entityType: this.entityType ? this.entityType.toObject() : undefined,
1037
+ languageCode: this.languageCode,
1038
+ entityTypeView: this.entityTypeView
1039
+ };
1040
+ }
1041
+ /**
1042
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1043
+ */
1044
+ toJSON() {
1045
+ return this.toObject();
1046
+ }
1047
+ /**
1048
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1049
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1050
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1051
+ */
1052
+ toProtobufJSON(
1053
+ // @ts-ignore
1054
+ options) {
1055
+ return {
1056
+ parent: this.parent,
1057
+ entityType: this.entityType
1058
+ ? this.entityType.toProtobufJSON(options)
1059
+ : null,
1060
+ languageCode: this.languageCode,
1061
+ entityTypeView: EntityTypeView[this.entityTypeView === null || this.entityTypeView === undefined
1062
+ ? 0
1063
+ : this.entityTypeView]
1064
+ };
1065
+ }
1066
+ }
1067
+ CreateEntityTypeRequest.id = 'ondewo.nlu.CreateEntityTypeRequest';
1068
+ /**
1069
+ * Message implementation for ondewo.nlu.UpdateEntityTypeRequest
1070
+ */
1071
+ export class UpdateEntityTypeRequest {
1072
+ /**
1073
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1074
+ * @param _value initial values object or instance of UpdateEntityTypeRequest to deeply clone from
1075
+ */
1076
+ constructor(_value) {
1077
+ _value = _value || {};
1078
+ this.entityType = _value.entityType
1079
+ ? new EntityType(_value.entityType)
1080
+ : undefined;
1081
+ this.languageCode = _value.languageCode;
1082
+ this.updateMask = _value.updateMask
1083
+ ? new googleProtobuf008.FieldMask(_value.updateMask)
1084
+ : undefined;
1085
+ this.entityTypeView = _value.entityTypeView;
1086
+ UpdateEntityTypeRequest.refineValues(this);
1087
+ }
1088
+ /**
1089
+ * Deserialize binary data to message
1090
+ * @param instance message instance
1091
+ */
1092
+ static deserializeBinary(bytes) {
1093
+ const instance = new UpdateEntityTypeRequest();
1094
+ UpdateEntityTypeRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1095
+ return instance;
1096
+ }
1097
+ /**
1098
+ * Check all the properties and set default protobuf values if necessary
1099
+ * @param _instance message instance
1100
+ */
1101
+ static refineValues(_instance) {
1102
+ _instance.entityType = _instance.entityType || undefined;
1103
+ _instance.languageCode = _instance.languageCode || '';
1104
+ _instance.updateMask = _instance.updateMask || undefined;
1105
+ _instance.entityTypeView = _instance.entityTypeView || 0;
1106
+ }
1107
+ /**
1108
+ * Deserializes / reads binary message into message instance using provided binary reader
1109
+ * @param _instance message instance
1110
+ * @param _reader binary reader instance
1111
+ */
1112
+ static deserializeBinaryFromReader(_instance, _reader) {
1113
+ while (_reader.nextField()) {
1114
+ if (_reader.isEndGroup())
1115
+ break;
1116
+ switch (_reader.getFieldNumber()) {
1117
+ case 1:
1118
+ _instance.entityType = new EntityType();
1119
+ _reader.readMessage(_instance.entityType, EntityType.deserializeBinaryFromReader);
1120
+ break;
1121
+ case 2:
1122
+ _instance.languageCode = _reader.readString();
1123
+ break;
1124
+ case 3:
1125
+ _instance.updateMask = new googleProtobuf008.FieldMask();
1126
+ _reader.readMessage(_instance.updateMask, googleProtobuf008.FieldMask.deserializeBinaryFromReader);
1127
+ break;
1128
+ case 6:
1129
+ _instance.entityTypeView = _reader.readEnum();
1130
+ break;
1131
+ default:
1132
+ _reader.skipField();
1133
+ }
1134
+ }
1135
+ UpdateEntityTypeRequest.refineValues(_instance);
1136
+ }
1137
+ /**
1138
+ * Serializes a message to binary format using provided binary reader
1139
+ * @param _instance message instance
1140
+ * @param _writer binary writer instance
1141
+ */
1142
+ static serializeBinaryToWriter(_instance, _writer) {
1143
+ if (_instance.entityType) {
1144
+ _writer.writeMessage(1, _instance.entityType, EntityType.serializeBinaryToWriter);
1145
+ }
1146
+ if (_instance.languageCode) {
1147
+ _writer.writeString(2, _instance.languageCode);
1148
+ }
1149
+ if (_instance.updateMask) {
1150
+ _writer.writeMessage(3, _instance.updateMask, googleProtobuf008.FieldMask.serializeBinaryToWriter);
1151
+ }
1152
+ if (_instance.entityTypeView) {
1153
+ _writer.writeEnum(6, _instance.entityTypeView);
1154
+ }
1155
+ }
1156
+ get entityType() {
1157
+ return this._entityType;
1158
+ }
1159
+ set entityType(value) {
1160
+ this._entityType = value;
1161
+ }
1162
+ get languageCode() {
1163
+ return this._languageCode;
1164
+ }
1165
+ set languageCode(value) {
1166
+ this._languageCode = value;
1167
+ }
1168
+ get updateMask() {
1169
+ return this._updateMask;
1170
+ }
1171
+ set updateMask(value) {
1172
+ this._updateMask = value;
1173
+ }
1174
+ get entityTypeView() {
1175
+ return this._entityTypeView;
1176
+ }
1177
+ set entityTypeView(value) {
1178
+ this._entityTypeView = value;
1179
+ }
1180
+ /**
1181
+ * Serialize message to binary data
1182
+ * @param instance message instance
1183
+ */
1184
+ serializeBinary() {
1185
+ const writer = new BinaryWriter();
1186
+ UpdateEntityTypeRequest.serializeBinaryToWriter(this, writer);
1187
+ return writer.getResultBuffer();
1188
+ }
1189
+ /**
1190
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1191
+ */
1192
+ toObject() {
1193
+ return {
1194
+ entityType: this.entityType ? this.entityType.toObject() : undefined,
1195
+ languageCode: this.languageCode,
1196
+ updateMask: this.updateMask ? this.updateMask.toObject() : undefined,
1197
+ entityTypeView: this.entityTypeView
1198
+ };
1199
+ }
1200
+ /**
1201
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1202
+ */
1203
+ toJSON() {
1204
+ return this.toObject();
1205
+ }
1206
+ /**
1207
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1208
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1209
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1210
+ */
1211
+ toProtobufJSON(
1212
+ // @ts-ignore
1213
+ options) {
1214
+ return {
1215
+ entityType: this.entityType
1216
+ ? this.entityType.toProtobufJSON(options)
1217
+ : null,
1218
+ languageCode: this.languageCode,
1219
+ updateMask: this.updateMask
1220
+ ? this.updateMask.toProtobufJSON(options)
1221
+ : null,
1222
+ entityTypeView: EntityTypeView[this.entityTypeView === null || this.entityTypeView === undefined
1223
+ ? 0
1224
+ : this.entityTypeView]
1225
+ };
1226
+ }
1227
+ }
1228
+ UpdateEntityTypeRequest.id = 'ondewo.nlu.UpdateEntityTypeRequest';
1229
+ /**
1230
+ * Message implementation for ondewo.nlu.DeleteEntityTypeRequest
1231
+ */
1232
+ export class DeleteEntityTypeRequest {
1233
+ /**
1234
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1235
+ * @param _value initial values object or instance of DeleteEntityTypeRequest to deeply clone from
1236
+ */
1237
+ constructor(_value) {
1238
+ _value = _value || {};
1239
+ this.name = _value.name;
1240
+ DeleteEntityTypeRequest.refineValues(this);
1241
+ }
1242
+ /**
1243
+ * Deserialize binary data to message
1244
+ * @param instance message instance
1245
+ */
1246
+ static deserializeBinary(bytes) {
1247
+ const instance = new DeleteEntityTypeRequest();
1248
+ DeleteEntityTypeRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1249
+ return instance;
1250
+ }
1251
+ /**
1252
+ * Check all the properties and set default protobuf values if necessary
1253
+ * @param _instance message instance
1254
+ */
1255
+ static refineValues(_instance) {
1256
+ _instance.name = _instance.name || '';
1257
+ }
1258
+ /**
1259
+ * Deserializes / reads binary message into message instance using provided binary reader
1260
+ * @param _instance message instance
1261
+ * @param _reader binary reader instance
1262
+ */
1263
+ static deserializeBinaryFromReader(_instance, _reader) {
1264
+ while (_reader.nextField()) {
1265
+ if (_reader.isEndGroup())
1266
+ break;
1267
+ switch (_reader.getFieldNumber()) {
1268
+ case 1:
1269
+ _instance.name = _reader.readString();
1270
+ break;
1271
+ default:
1272
+ _reader.skipField();
1273
+ }
1274
+ }
1275
+ DeleteEntityTypeRequest.refineValues(_instance);
1276
+ }
1277
+ /**
1278
+ * Serializes a message to binary format using provided binary reader
1279
+ * @param _instance message instance
1280
+ * @param _writer binary writer instance
1281
+ */
1282
+ static serializeBinaryToWriter(_instance, _writer) {
1283
+ if (_instance.name) {
1284
+ _writer.writeString(1, _instance.name);
1285
+ }
1286
+ }
1287
+ get name() {
1288
+ return this._name;
1289
+ }
1290
+ set name(value) {
1291
+ this._name = value;
1292
+ }
1293
+ /**
1294
+ * Serialize message to binary data
1295
+ * @param instance message instance
1296
+ */
1297
+ serializeBinary() {
1298
+ const writer = new BinaryWriter();
1299
+ DeleteEntityTypeRequest.serializeBinaryToWriter(this, writer);
1300
+ return writer.getResultBuffer();
1301
+ }
1302
+ /**
1303
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1304
+ */
1305
+ toObject() {
1306
+ return {
1307
+ name: this.name
1308
+ };
1309
+ }
1310
+ /**
1311
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1312
+ */
1313
+ toJSON() {
1314
+ return this.toObject();
1315
+ }
1316
+ /**
1317
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1318
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1319
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1320
+ */
1321
+ toProtobufJSON(
1322
+ // @ts-ignore
1323
+ options) {
1324
+ return {
1325
+ name: this.name
1326
+ };
1327
+ }
1328
+ }
1329
+ DeleteEntityTypeRequest.id = 'ondewo.nlu.DeleteEntityTypeRequest';
1330
+ /**
1331
+ * Message implementation for ondewo.nlu.BatchUpdateEntityTypesRequest
1332
+ */
1333
+ export class BatchUpdateEntityTypesRequest {
1334
+ /**
1335
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1336
+ * @param _value initial values object or instance of BatchUpdateEntityTypesRequest to deeply clone from
1337
+ */
1338
+ constructor(_value) {
1339
+ this._entityTypeBatch = BatchUpdateEntityTypesRequest.EntityTypeBatchCase.none;
1340
+ _value = _value || {};
1341
+ this.parent = _value.parent;
1342
+ this.entityTypeBatchUri = _value.entityTypeBatchUri;
1343
+ this.entityTypeBatchInline = _value.entityTypeBatchInline
1344
+ ? new EntityTypeBatch(_value.entityTypeBatchInline)
1345
+ : undefined;
1346
+ this.languageCode = _value.languageCode;
1347
+ this.updateMask = _value.updateMask
1348
+ ? new googleProtobuf008.FieldMask(_value.updateMask)
1349
+ : undefined;
1350
+ BatchUpdateEntityTypesRequest.refineValues(this);
1351
+ }
1352
+ /**
1353
+ * Deserialize binary data to message
1354
+ * @param instance message instance
1355
+ */
1356
+ static deserializeBinary(bytes) {
1357
+ const instance = new BatchUpdateEntityTypesRequest();
1358
+ BatchUpdateEntityTypesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1359
+ return instance;
1360
+ }
1361
+ /**
1362
+ * Check all the properties and set default protobuf values if necessary
1363
+ * @param _instance message instance
1364
+ */
1365
+ static refineValues(_instance) {
1366
+ _instance.parent = _instance.parent || '';
1367
+ _instance.languageCode = _instance.languageCode || '';
1368
+ _instance.updateMask = _instance.updateMask || undefined;
1369
+ }
1370
+ /**
1371
+ * Deserializes / reads binary message into message instance using provided binary reader
1372
+ * @param _instance message instance
1373
+ * @param _reader binary reader instance
1374
+ */
1375
+ static deserializeBinaryFromReader(_instance, _reader) {
1376
+ while (_reader.nextField()) {
1377
+ if (_reader.isEndGroup())
1378
+ break;
1379
+ switch (_reader.getFieldNumber()) {
1380
+ case 1:
1381
+ _instance.parent = _reader.readString();
1382
+ break;
1383
+ case 2:
1384
+ _instance.entityTypeBatchUri = _reader.readString();
1385
+ break;
1386
+ case 3:
1387
+ _instance.entityTypeBatchInline = new EntityTypeBatch();
1388
+ _reader.readMessage(_instance.entityTypeBatchInline, EntityTypeBatch.deserializeBinaryFromReader);
1389
+ break;
1390
+ case 4:
1391
+ _instance.languageCode = _reader.readString();
1392
+ break;
1393
+ case 5:
1394
+ _instance.updateMask = new googleProtobuf008.FieldMask();
1395
+ _reader.readMessage(_instance.updateMask, googleProtobuf008.FieldMask.deserializeBinaryFromReader);
1396
+ break;
1397
+ default:
1398
+ _reader.skipField();
1399
+ }
1400
+ }
1401
+ BatchUpdateEntityTypesRequest.refineValues(_instance);
1402
+ }
1403
+ /**
1404
+ * Serializes a message to binary format using provided binary reader
1405
+ * @param _instance message instance
1406
+ * @param _writer binary writer instance
1407
+ */
1408
+ static serializeBinaryToWriter(_instance, _writer) {
1409
+ if (_instance.parent) {
1410
+ _writer.writeString(1, _instance.parent);
1411
+ }
1412
+ if (_instance.entityTypeBatchUri || _instance.entityTypeBatchUri === '') {
1413
+ _writer.writeString(2, _instance.entityTypeBatchUri);
1414
+ }
1415
+ if (_instance.entityTypeBatchInline) {
1416
+ _writer.writeMessage(3, _instance.entityTypeBatchInline, EntityTypeBatch.serializeBinaryToWriter);
1417
+ }
1418
+ if (_instance.languageCode) {
1419
+ _writer.writeString(4, _instance.languageCode);
1420
+ }
1421
+ if (_instance.updateMask) {
1422
+ _writer.writeMessage(5, _instance.updateMask, googleProtobuf008.FieldMask.serializeBinaryToWriter);
1423
+ }
1424
+ }
1425
+ get parent() {
1426
+ return this._parent;
1427
+ }
1428
+ set parent(value) {
1429
+ this._parent = value;
1430
+ }
1431
+ get entityTypeBatchUri() {
1432
+ return this._entityTypeBatchUri;
1433
+ }
1434
+ set entityTypeBatchUri(value) {
1435
+ if (value !== undefined && value !== null) {
1436
+ this._entityTypeBatchInline = undefined;
1437
+ this._entityTypeBatch =
1438
+ BatchUpdateEntityTypesRequest.EntityTypeBatchCase.entityTypeBatchUri;
1439
+ }
1440
+ this._entityTypeBatchUri = value;
1441
+ }
1442
+ get entityTypeBatchInline() {
1443
+ return this._entityTypeBatchInline;
1444
+ }
1445
+ set entityTypeBatchInline(value) {
1446
+ if (value !== undefined && value !== null) {
1447
+ this._entityTypeBatchUri = undefined;
1448
+ this._entityTypeBatch =
1449
+ BatchUpdateEntityTypesRequest.EntityTypeBatchCase.entityTypeBatchInline;
1450
+ }
1451
+ this._entityTypeBatchInline = value;
1452
+ }
1453
+ get languageCode() {
1454
+ return this._languageCode;
1455
+ }
1456
+ set languageCode(value) {
1457
+ this._languageCode = value;
1458
+ }
1459
+ get updateMask() {
1460
+ return this._updateMask;
1461
+ }
1462
+ set updateMask(value) {
1463
+ this._updateMask = value;
1464
+ }
1465
+ get entityTypeBatch() {
1466
+ return this._entityTypeBatch;
1467
+ }
1468
+ /**
1469
+ * Serialize message to binary data
1470
+ * @param instance message instance
1471
+ */
1472
+ serializeBinary() {
1473
+ const writer = new BinaryWriter();
1474
+ BatchUpdateEntityTypesRequest.serializeBinaryToWriter(this, writer);
1475
+ return writer.getResultBuffer();
1476
+ }
1477
+ /**
1478
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1479
+ */
1480
+ toObject() {
1481
+ return {
1482
+ parent: this.parent,
1483
+ entityTypeBatchUri: this.entityTypeBatchUri,
1484
+ entityTypeBatchInline: this.entityTypeBatchInline
1485
+ ? this.entityTypeBatchInline.toObject()
1486
+ : undefined,
1487
+ languageCode: this.languageCode,
1488
+ updateMask: this.updateMask ? this.updateMask.toObject() : undefined
1489
+ };
1490
+ }
1491
+ /**
1492
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1493
+ */
1494
+ toJSON() {
1495
+ return this.toObject();
1496
+ }
1497
+ /**
1498
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1499
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1500
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1501
+ */
1502
+ toProtobufJSON(
1503
+ // @ts-ignore
1504
+ options) {
1505
+ return {
1506
+ parent: this.parent,
1507
+ entityTypeBatchUri: this.entityTypeBatchUri === null ||
1508
+ this.entityTypeBatchUri === undefined
1509
+ ? null
1510
+ : this.entityTypeBatchUri,
1511
+ entityTypeBatchInline: this.entityTypeBatchInline
1512
+ ? this.entityTypeBatchInline.toProtobufJSON(options)
1513
+ : null,
1514
+ languageCode: this.languageCode,
1515
+ updateMask: this.updateMask
1516
+ ? this.updateMask.toProtobufJSON(options)
1517
+ : null
1518
+ };
1519
+ }
1520
+ }
1521
+ BatchUpdateEntityTypesRequest.id = 'ondewo.nlu.BatchUpdateEntityTypesRequest';
1522
+ (function (BatchUpdateEntityTypesRequest) {
1523
+ let EntityTypeBatchCase;
1524
+ (function (EntityTypeBatchCase) {
1525
+ EntityTypeBatchCase[EntityTypeBatchCase["none"] = 0] = "none";
1526
+ EntityTypeBatchCase[EntityTypeBatchCase["entityTypeBatchUri"] = 1] = "entityTypeBatchUri";
1527
+ EntityTypeBatchCase[EntityTypeBatchCase["entityTypeBatchInline"] = 2] = "entityTypeBatchInline";
1528
+ })(EntityTypeBatchCase = BatchUpdateEntityTypesRequest.EntityTypeBatchCase || (BatchUpdateEntityTypesRequest.EntityTypeBatchCase = {}));
1529
+ })(BatchUpdateEntityTypesRequest || (BatchUpdateEntityTypesRequest = {}));
1530
+ /**
1531
+ * Message implementation for ondewo.nlu.BatchUpdateEntityTypesResponse
1532
+ */
1533
+ export class BatchUpdateEntityTypesResponse {
1534
+ /**
1535
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1536
+ * @param _value initial values object or instance of BatchUpdateEntityTypesResponse to deeply clone from
1537
+ */
1538
+ constructor(_value) {
1539
+ _value = _value || {};
1540
+ this.entityTypes = (_value.entityTypes || []).map(m => new EntityType(m));
1541
+ BatchUpdateEntityTypesResponse.refineValues(this);
1542
+ }
1543
+ /**
1544
+ * Deserialize binary data to message
1545
+ * @param instance message instance
1546
+ */
1547
+ static deserializeBinary(bytes) {
1548
+ const instance = new BatchUpdateEntityTypesResponse();
1549
+ BatchUpdateEntityTypesResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1550
+ return instance;
1551
+ }
1552
+ /**
1553
+ * Check all the properties and set default protobuf values if necessary
1554
+ * @param _instance message instance
1555
+ */
1556
+ static refineValues(_instance) {
1557
+ _instance.entityTypes = _instance.entityTypes || [];
1558
+ }
1559
+ /**
1560
+ * Deserializes / reads binary message into message instance using provided binary reader
1561
+ * @param _instance message instance
1562
+ * @param _reader binary reader instance
1563
+ */
1564
+ static deserializeBinaryFromReader(_instance, _reader) {
1565
+ while (_reader.nextField()) {
1566
+ if (_reader.isEndGroup())
1567
+ break;
1568
+ switch (_reader.getFieldNumber()) {
1569
+ case 1:
1570
+ const messageInitializer1 = new EntityType();
1571
+ _reader.readMessage(messageInitializer1, EntityType.deserializeBinaryFromReader);
1572
+ (_instance.entityTypes = _instance.entityTypes || []).push(messageInitializer1);
1573
+ break;
1574
+ default:
1575
+ _reader.skipField();
1576
+ }
1577
+ }
1578
+ BatchUpdateEntityTypesResponse.refineValues(_instance);
1579
+ }
1580
+ /**
1581
+ * Serializes a message to binary format using provided binary reader
1582
+ * @param _instance message instance
1583
+ * @param _writer binary writer instance
1584
+ */
1585
+ static serializeBinaryToWriter(_instance, _writer) {
1586
+ if (_instance.entityTypes && _instance.entityTypes.length) {
1587
+ _writer.writeRepeatedMessage(1, _instance.entityTypes, EntityType.serializeBinaryToWriter);
1588
+ }
1589
+ }
1590
+ get entityTypes() {
1591
+ return this._entityTypes;
1592
+ }
1593
+ set entityTypes(value) {
1594
+ this._entityTypes = value;
1595
+ }
1596
+ /**
1597
+ * Serialize message to binary data
1598
+ * @param instance message instance
1599
+ */
1600
+ serializeBinary() {
1601
+ const writer = new BinaryWriter();
1602
+ BatchUpdateEntityTypesResponse.serializeBinaryToWriter(this, writer);
1603
+ return writer.getResultBuffer();
1604
+ }
1605
+ /**
1606
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1607
+ */
1608
+ toObject() {
1609
+ return {
1610
+ entityTypes: (this.entityTypes || []).map(m => m.toObject())
1611
+ };
1612
+ }
1613
+ /**
1614
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1615
+ */
1616
+ toJSON() {
1617
+ return this.toObject();
1618
+ }
1619
+ /**
1620
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1621
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1622
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1623
+ */
1624
+ toProtobufJSON(
1625
+ // @ts-ignore
1626
+ options) {
1627
+ return {
1628
+ entityTypes: (this.entityTypes || []).map(m => m.toProtobufJSON(options))
1629
+ };
1630
+ }
1631
+ }
1632
+ BatchUpdateEntityTypesResponse.id = 'ondewo.nlu.BatchUpdateEntityTypesResponse';
1633
+ /**
1634
+ * Message implementation for ondewo.nlu.BatchDeleteEntityTypesRequest
1635
+ */
1636
+ export class BatchDeleteEntityTypesRequest {
1637
+ /**
1638
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1639
+ * @param _value initial values object or instance of BatchDeleteEntityTypesRequest to deeply clone from
1640
+ */
1641
+ constructor(_value) {
1642
+ _value = _value || {};
1643
+ this.parent = _value.parent;
1644
+ this.entityTypeNames = (_value.entityTypeNames || []).slice();
1645
+ BatchDeleteEntityTypesRequest.refineValues(this);
1646
+ }
1647
+ /**
1648
+ * Deserialize binary data to message
1649
+ * @param instance message instance
1650
+ */
1651
+ static deserializeBinary(bytes) {
1652
+ const instance = new BatchDeleteEntityTypesRequest();
1653
+ BatchDeleteEntityTypesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1654
+ return instance;
1655
+ }
1656
+ /**
1657
+ * Check all the properties and set default protobuf values if necessary
1658
+ * @param _instance message instance
1659
+ */
1660
+ static refineValues(_instance) {
1661
+ _instance.parent = _instance.parent || '';
1662
+ _instance.entityTypeNames = _instance.entityTypeNames || [];
1663
+ }
1664
+ /**
1665
+ * Deserializes / reads binary message into message instance using provided binary reader
1666
+ * @param _instance message instance
1667
+ * @param _reader binary reader instance
1668
+ */
1669
+ static deserializeBinaryFromReader(_instance, _reader) {
1670
+ while (_reader.nextField()) {
1671
+ if (_reader.isEndGroup())
1672
+ break;
1673
+ switch (_reader.getFieldNumber()) {
1674
+ case 1:
1675
+ _instance.parent = _reader.readString();
1676
+ break;
1677
+ case 2:
1678
+ (_instance.entityTypeNames = _instance.entityTypeNames || []).push(_reader.readString());
1679
+ break;
1680
+ default:
1681
+ _reader.skipField();
1682
+ }
1683
+ }
1684
+ BatchDeleteEntityTypesRequest.refineValues(_instance);
1685
+ }
1686
+ /**
1687
+ * Serializes a message to binary format using provided binary reader
1688
+ * @param _instance message instance
1689
+ * @param _writer binary writer instance
1690
+ */
1691
+ static serializeBinaryToWriter(_instance, _writer) {
1692
+ if (_instance.parent) {
1693
+ _writer.writeString(1, _instance.parent);
1694
+ }
1695
+ if (_instance.entityTypeNames && _instance.entityTypeNames.length) {
1696
+ _writer.writeRepeatedString(2, _instance.entityTypeNames);
1697
+ }
1698
+ }
1699
+ get parent() {
1700
+ return this._parent;
1701
+ }
1702
+ set parent(value) {
1703
+ this._parent = value;
1704
+ }
1705
+ get entityTypeNames() {
1706
+ return this._entityTypeNames;
1707
+ }
1708
+ set entityTypeNames(value) {
1709
+ this._entityTypeNames = value;
1710
+ }
1711
+ /**
1712
+ * Serialize message to binary data
1713
+ * @param instance message instance
1714
+ */
1715
+ serializeBinary() {
1716
+ const writer = new BinaryWriter();
1717
+ BatchDeleteEntityTypesRequest.serializeBinaryToWriter(this, writer);
1718
+ return writer.getResultBuffer();
1719
+ }
1720
+ /**
1721
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1722
+ */
1723
+ toObject() {
1724
+ return {
1725
+ parent: this.parent,
1726
+ entityTypeNames: (this.entityTypeNames || []).slice()
1727
+ };
1728
+ }
1729
+ /**
1730
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1731
+ */
1732
+ toJSON() {
1733
+ return this.toObject();
1734
+ }
1735
+ /**
1736
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1737
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1738
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1739
+ */
1740
+ toProtobufJSON(
1741
+ // @ts-ignore
1742
+ options) {
1743
+ return {
1744
+ parent: this.parent,
1745
+ entityTypeNames: (this.entityTypeNames || []).slice()
1746
+ };
1747
+ }
1748
+ }
1749
+ BatchDeleteEntityTypesRequest.id = 'ondewo.nlu.BatchDeleteEntityTypesRequest';
1750
+ /**
1751
+ * Message implementation for ondewo.nlu.EntityTypeBatch
1752
+ */
1753
+ export class EntityTypeBatch {
1754
+ /**
1755
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1756
+ * @param _value initial values object or instance of EntityTypeBatch to deeply clone from
1757
+ */
1758
+ constructor(_value) {
1759
+ _value = _value || {};
1760
+ this.entityTypes = (_value.entityTypes || []).map(m => new EntityType(m));
1761
+ EntityTypeBatch.refineValues(this);
1762
+ }
1763
+ /**
1764
+ * Deserialize binary data to message
1765
+ * @param instance message instance
1766
+ */
1767
+ static deserializeBinary(bytes) {
1768
+ const instance = new EntityTypeBatch();
1769
+ EntityTypeBatch.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1770
+ return instance;
1771
+ }
1772
+ /**
1773
+ * Check all the properties and set default protobuf values if necessary
1774
+ * @param _instance message instance
1775
+ */
1776
+ static refineValues(_instance) {
1777
+ _instance.entityTypes = _instance.entityTypes || [];
1778
+ }
1779
+ /**
1780
+ * Deserializes / reads binary message into message instance using provided binary reader
1781
+ * @param _instance message instance
1782
+ * @param _reader binary reader instance
1783
+ */
1784
+ static deserializeBinaryFromReader(_instance, _reader) {
1785
+ while (_reader.nextField()) {
1786
+ if (_reader.isEndGroup())
1787
+ break;
1788
+ switch (_reader.getFieldNumber()) {
1789
+ case 1:
1790
+ const messageInitializer1 = new EntityType();
1791
+ _reader.readMessage(messageInitializer1, EntityType.deserializeBinaryFromReader);
1792
+ (_instance.entityTypes = _instance.entityTypes || []).push(messageInitializer1);
1793
+ break;
1794
+ default:
1795
+ _reader.skipField();
1796
+ }
1797
+ }
1798
+ EntityTypeBatch.refineValues(_instance);
1799
+ }
1800
+ /**
1801
+ * Serializes a message to binary format using provided binary reader
1802
+ * @param _instance message instance
1803
+ * @param _writer binary writer instance
1804
+ */
1805
+ static serializeBinaryToWriter(_instance, _writer) {
1806
+ if (_instance.entityTypes && _instance.entityTypes.length) {
1807
+ _writer.writeRepeatedMessage(1, _instance.entityTypes, EntityType.serializeBinaryToWriter);
1808
+ }
1809
+ }
1810
+ get entityTypes() {
1811
+ return this._entityTypes;
1812
+ }
1813
+ set entityTypes(value) {
1814
+ this._entityTypes = value;
1815
+ }
1816
+ /**
1817
+ * Serialize message to binary data
1818
+ * @param instance message instance
1819
+ */
1820
+ serializeBinary() {
1821
+ const writer = new BinaryWriter();
1822
+ EntityTypeBatch.serializeBinaryToWriter(this, writer);
1823
+ return writer.getResultBuffer();
1824
+ }
1825
+ /**
1826
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1827
+ */
1828
+ toObject() {
1829
+ return {
1830
+ entityTypes: (this.entityTypes || []).map(m => m.toObject())
1831
+ };
1832
+ }
1833
+ /**
1834
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1835
+ */
1836
+ toJSON() {
1837
+ return this.toObject();
1838
+ }
1839
+ /**
1840
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1841
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1842
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1843
+ */
1844
+ toProtobufJSON(
1845
+ // @ts-ignore
1846
+ options) {
1847
+ return {
1848
+ entityTypes: (this.entityTypes || []).map(m => m.toProtobufJSON(options))
1849
+ };
1850
+ }
1851
+ }
1852
+ EntityTypeBatch.id = 'ondewo.nlu.EntityTypeBatch';
1853
+ /**
1854
+ * Message implementation for ondewo.nlu.EntityTypeSorting
1855
+ */
1856
+ export class EntityTypeSorting {
1857
+ /**
1858
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1859
+ * @param _value initial values object or instance of EntityTypeSorting to deeply clone from
1860
+ */
1861
+ constructor(_value) {
1862
+ _value = _value || {};
1863
+ this.sortingField = _value.sortingField;
1864
+ this.sortingMode = _value.sortingMode;
1865
+ EntityTypeSorting.refineValues(this);
1866
+ }
1867
+ /**
1868
+ * Deserialize binary data to message
1869
+ * @param instance message instance
1870
+ */
1871
+ static deserializeBinary(bytes) {
1872
+ const instance = new EntityTypeSorting();
1873
+ EntityTypeSorting.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1874
+ return instance;
1875
+ }
1876
+ /**
1877
+ * Check all the properties and set default protobuf values if necessary
1878
+ * @param _instance message instance
1879
+ */
1880
+ static refineValues(_instance) {
1881
+ _instance.sortingField = _instance.sortingField || 0;
1882
+ _instance.sortingMode = _instance.sortingMode || 0;
1883
+ }
1884
+ /**
1885
+ * Deserializes / reads binary message into message instance using provided binary reader
1886
+ * @param _instance message instance
1887
+ * @param _reader binary reader instance
1888
+ */
1889
+ static deserializeBinaryFromReader(_instance, _reader) {
1890
+ while (_reader.nextField()) {
1891
+ if (_reader.isEndGroup())
1892
+ break;
1893
+ switch (_reader.getFieldNumber()) {
1894
+ case 1:
1895
+ _instance.sortingField = _reader.readEnum();
1896
+ break;
1897
+ case 2:
1898
+ _instance.sortingMode = _reader.readEnum();
1899
+ break;
1900
+ default:
1901
+ _reader.skipField();
1902
+ }
1903
+ }
1904
+ EntityTypeSorting.refineValues(_instance);
1905
+ }
1906
+ /**
1907
+ * Serializes a message to binary format using provided binary reader
1908
+ * @param _instance message instance
1909
+ * @param _writer binary writer instance
1910
+ */
1911
+ static serializeBinaryToWriter(_instance, _writer) {
1912
+ if (_instance.sortingField) {
1913
+ _writer.writeEnum(1, _instance.sortingField);
1914
+ }
1915
+ if (_instance.sortingMode) {
1916
+ _writer.writeEnum(2, _instance.sortingMode);
1917
+ }
1918
+ }
1919
+ get sortingField() {
1920
+ return this._sortingField;
1921
+ }
1922
+ set sortingField(value) {
1923
+ this._sortingField = value;
1924
+ }
1925
+ get sortingMode() {
1926
+ return this._sortingMode;
1927
+ }
1928
+ set sortingMode(value) {
1929
+ this._sortingMode = value;
1930
+ }
1931
+ /**
1932
+ * Serialize message to binary data
1933
+ * @param instance message instance
1934
+ */
1935
+ serializeBinary() {
1936
+ const writer = new BinaryWriter();
1937
+ EntityTypeSorting.serializeBinaryToWriter(this, writer);
1938
+ return writer.getResultBuffer();
1939
+ }
1940
+ /**
1941
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1942
+ */
1943
+ toObject() {
1944
+ return {
1945
+ sortingField: this.sortingField,
1946
+ sortingMode: this.sortingMode
1947
+ };
1948
+ }
1949
+ /**
1950
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1951
+ */
1952
+ toJSON() {
1953
+ return this.toObject();
1954
+ }
1955
+ /**
1956
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1957
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1958
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1959
+ */
1960
+ toProtobufJSON(
1961
+ // @ts-ignore
1962
+ options) {
1963
+ return {
1964
+ sortingField: EntityTypeSorting.EntityTypeSortingField[this.sortingField === null || this.sortingField === undefined
1965
+ ? 0
1966
+ : this.sortingField],
1967
+ sortingMode: ondewoNlu009.SortingMode[this.sortingMode === null || this.sortingMode === undefined
1968
+ ? 0
1969
+ : this.sortingMode]
1970
+ };
1971
+ }
1972
+ }
1973
+ EntityTypeSorting.id = 'ondewo.nlu.EntityTypeSorting';
1974
+ (function (EntityTypeSorting) {
1975
+ let EntityTypeSortingField;
1976
+ (function (EntityTypeSortingField) {
1977
+ EntityTypeSortingField[EntityTypeSortingField["NO_ENTITY_TYPE_SORTING"] = 0] = "NO_ENTITY_TYPE_SORTING";
1978
+ EntityTypeSortingField[EntityTypeSortingField["SORT_ENTITY_TYPE_BY_NAME"] = 1] = "SORT_ENTITY_TYPE_BY_NAME";
1979
+ EntityTypeSortingField[EntityTypeSortingField["SORT_ENTITY_TYPE_BY_CREATION_DATE"] = 2] = "SORT_ENTITY_TYPE_BY_CREATION_DATE";
1980
+ EntityTypeSortingField[EntityTypeSortingField["SORT_ENTITY_TYPE_BY_LAST_UPDATED"] = 3] = "SORT_ENTITY_TYPE_BY_LAST_UPDATED";
1981
+ EntityTypeSortingField[EntityTypeSortingField["SORT_ENTITY_TYPE_BY_ENTITY_VALUE_COUNT"] = 4] = "SORT_ENTITY_TYPE_BY_ENTITY_VALUE_COUNT";
1982
+ EntityTypeSortingField[EntityTypeSortingField["SORT_ENTITY_TYPE_BY_SYNONYM_COUNT"] = 5] = "SORT_ENTITY_TYPE_BY_SYNONYM_COUNT";
1983
+ })(EntityTypeSortingField = EntityTypeSorting.EntityTypeSortingField || (EntityTypeSorting.EntityTypeSortingField = {}));
1984
+ })(EntityTypeSorting || (EntityTypeSorting = {}));
1985
+ /**
1986
+ * Message implementation for ondewo.nlu.BatchEntitiesResponse
1987
+ */
1988
+ export class BatchEntitiesResponse {
1989
+ /**
1990
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1991
+ * @param _value initial values object or instance of BatchEntitiesResponse to deeply clone from
1992
+ */
1993
+ constructor(_value) {
1994
+ _value = _value || {};
1995
+ this.entityStatuses = (_value.entityStatuses || []).map(m => new BatchEntitiesResponse.EntityStatus(m));
1996
+ this.hasErrors = _value.hasErrors;
1997
+ BatchEntitiesResponse.refineValues(this);
1998
+ }
1999
+ /**
2000
+ * Deserialize binary data to message
2001
+ * @param instance message instance
2002
+ */
2003
+ static deserializeBinary(bytes) {
2004
+ const instance = new BatchEntitiesResponse();
2005
+ BatchEntitiesResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2006
+ return instance;
2007
+ }
2008
+ /**
2009
+ * Check all the properties and set default protobuf values if necessary
2010
+ * @param _instance message instance
2011
+ */
2012
+ static refineValues(_instance) {
2013
+ _instance.entityStatuses = _instance.entityStatuses || [];
2014
+ _instance.hasErrors = _instance.hasErrors || false;
2015
+ }
2016
+ /**
2017
+ * Deserializes / reads binary message into message instance using provided binary reader
2018
+ * @param _instance message instance
2019
+ * @param _reader binary reader instance
2020
+ */
2021
+ static deserializeBinaryFromReader(_instance, _reader) {
2022
+ while (_reader.nextField()) {
2023
+ if (_reader.isEndGroup())
2024
+ break;
2025
+ switch (_reader.getFieldNumber()) {
2026
+ case 1:
2027
+ const messageInitializer1 = new BatchEntitiesResponse.EntityStatus();
2028
+ _reader.readMessage(messageInitializer1, BatchEntitiesResponse.EntityStatus.deserializeBinaryFromReader);
2029
+ (_instance.entityStatuses = _instance.entityStatuses || []).push(messageInitializer1);
2030
+ break;
2031
+ case 2:
2032
+ _instance.hasErrors = _reader.readBool();
2033
+ break;
2034
+ default:
2035
+ _reader.skipField();
2036
+ }
2037
+ }
2038
+ BatchEntitiesResponse.refineValues(_instance);
2039
+ }
2040
+ /**
2041
+ * Serializes a message to binary format using provided binary reader
2042
+ * @param _instance message instance
2043
+ * @param _writer binary writer instance
2044
+ */
2045
+ static serializeBinaryToWriter(_instance, _writer) {
2046
+ if (_instance.entityStatuses && _instance.entityStatuses.length) {
2047
+ _writer.writeRepeatedMessage(1, _instance.entityStatuses, BatchEntitiesResponse.EntityStatus.serializeBinaryToWriter);
2048
+ }
2049
+ if (_instance.hasErrors) {
2050
+ _writer.writeBool(2, _instance.hasErrors);
2051
+ }
2052
+ }
2053
+ get entityStatuses() {
2054
+ return this._entityStatuses;
2055
+ }
2056
+ set entityStatuses(value) {
2057
+ this._entityStatuses = value;
2058
+ }
2059
+ get hasErrors() {
2060
+ return this._hasErrors;
2061
+ }
2062
+ set hasErrors(value) {
2063
+ this._hasErrors = value;
2064
+ }
2065
+ /**
2066
+ * Serialize message to binary data
2067
+ * @param instance message instance
2068
+ */
2069
+ serializeBinary() {
2070
+ const writer = new BinaryWriter();
2071
+ BatchEntitiesResponse.serializeBinaryToWriter(this, writer);
2072
+ return writer.getResultBuffer();
2073
+ }
2074
+ /**
2075
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2076
+ */
2077
+ toObject() {
2078
+ return {
2079
+ entityStatuses: (this.entityStatuses || []).map(m => m.toObject()),
2080
+ hasErrors: this.hasErrors
2081
+ };
2082
+ }
2083
+ /**
2084
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2085
+ */
2086
+ toJSON() {
2087
+ return this.toObject();
2088
+ }
2089
+ /**
2090
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2091
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2092
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2093
+ */
2094
+ toProtobufJSON(
2095
+ // @ts-ignore
2096
+ options) {
2097
+ return {
2098
+ entityStatuses: (this.entityStatuses || []).map(m => m.toProtobufJSON(options)),
2099
+ hasErrors: this.hasErrors
2100
+ };
2101
+ }
2102
+ }
2103
+ BatchEntitiesResponse.id = 'ondewo.nlu.BatchEntitiesResponse';
2104
+ (function (BatchEntitiesResponse) {
2105
+ /**
2106
+ * Message implementation for ondewo.nlu.EntityStatus
2107
+ */
2108
+ class EntityStatus {
2109
+ /**
2110
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2111
+ * @param _value initial values object or instance of EntityStatus to deeply clone from
2112
+ */
2113
+ constructor(_value) {
2114
+ this._entityOrStatus = EntityStatus.EntityOrStatusCase.none;
2115
+ _value = _value || {};
2116
+ this.entity = _value.entity
2117
+ ? new EntityType.Entity(_value.entity)
2118
+ : undefined;
2119
+ this.errorMessage = _value.errorMessage;
2120
+ EntityStatus.refineValues(this);
2121
+ }
2122
+ /**
2123
+ * Deserialize binary data to message
2124
+ * @param instance message instance
2125
+ */
2126
+ static deserializeBinary(bytes) {
2127
+ const instance = new EntityStatus();
2128
+ EntityStatus.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2129
+ return instance;
2130
+ }
2131
+ /**
2132
+ * Check all the properties and set default protobuf values if necessary
2133
+ * @param _instance message instance
2134
+ */
2135
+ static refineValues(_instance) { }
2136
+ /**
2137
+ * Deserializes / reads binary message into message instance using provided binary reader
2138
+ * @param _instance message instance
2139
+ * @param _reader binary reader instance
2140
+ */
2141
+ static deserializeBinaryFromReader(_instance, _reader) {
2142
+ while (_reader.nextField()) {
2143
+ if (_reader.isEndGroup())
2144
+ break;
2145
+ switch (_reader.getFieldNumber()) {
2146
+ case 1:
2147
+ _instance.entity = new EntityType.Entity();
2148
+ _reader.readMessage(_instance.entity, EntityType.Entity.deserializeBinaryFromReader);
2149
+ break;
2150
+ case 2:
2151
+ _instance.errorMessage = _reader.readString();
2152
+ break;
2153
+ default:
2154
+ _reader.skipField();
2155
+ }
2156
+ }
2157
+ EntityStatus.refineValues(_instance);
2158
+ }
2159
+ /**
2160
+ * Serializes a message to binary format using provided binary reader
2161
+ * @param _instance message instance
2162
+ * @param _writer binary writer instance
2163
+ */
2164
+ static serializeBinaryToWriter(_instance, _writer) {
2165
+ if (_instance.entity) {
2166
+ _writer.writeMessage(1, _instance.entity, EntityType.Entity.serializeBinaryToWriter);
2167
+ }
2168
+ if (_instance.errorMessage || _instance.errorMessage === '') {
2169
+ _writer.writeString(2, _instance.errorMessage);
2170
+ }
2171
+ }
2172
+ get entity() {
2173
+ return this._entity;
2174
+ }
2175
+ set entity(value) {
2176
+ if (value !== undefined && value !== null) {
2177
+ this._errorMessage = undefined;
2178
+ this._entityOrStatus = EntityStatus.EntityOrStatusCase.entity;
2179
+ }
2180
+ this._entity = value;
2181
+ }
2182
+ get errorMessage() {
2183
+ return this._errorMessage;
2184
+ }
2185
+ set errorMessage(value) {
2186
+ if (value !== undefined && value !== null) {
2187
+ this._entity = undefined;
2188
+ this._entityOrStatus = EntityStatus.EntityOrStatusCase.errorMessage;
2189
+ }
2190
+ this._errorMessage = value;
2191
+ }
2192
+ get entityOrStatus() {
2193
+ return this._entityOrStatus;
2194
+ }
2195
+ /**
2196
+ * Serialize message to binary data
2197
+ * @param instance message instance
2198
+ */
2199
+ serializeBinary() {
2200
+ const writer = new BinaryWriter();
2201
+ EntityStatus.serializeBinaryToWriter(this, writer);
2202
+ return writer.getResultBuffer();
2203
+ }
2204
+ /**
2205
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2206
+ */
2207
+ toObject() {
2208
+ return {
2209
+ entity: this.entity ? this.entity.toObject() : undefined,
2210
+ errorMessage: this.errorMessage
2211
+ };
2212
+ }
2213
+ /**
2214
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2215
+ */
2216
+ toJSON() {
2217
+ return this.toObject();
2218
+ }
2219
+ /**
2220
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2221
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2222
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2223
+ */
2224
+ toProtobufJSON(
2225
+ // @ts-ignore
2226
+ options) {
2227
+ return {
2228
+ entity: this.entity ? this.entity.toProtobufJSON(options) : null,
2229
+ errorMessage: this.errorMessage === null || this.errorMessage === undefined
2230
+ ? null
2231
+ : this.errorMessage
2232
+ };
2233
+ }
2234
+ }
2235
+ EntityStatus.id = 'ondewo.nlu.EntityStatus';
2236
+ BatchEntitiesResponse.EntityStatus = EntityStatus;
2237
+ (function (EntityStatus) {
2238
+ let EntityOrStatusCase;
2239
+ (function (EntityOrStatusCase) {
2240
+ EntityOrStatusCase[EntityOrStatusCase["none"] = 0] = "none";
2241
+ EntityOrStatusCase[EntityOrStatusCase["entity"] = 1] = "entity";
2242
+ EntityOrStatusCase[EntityOrStatusCase["errorMessage"] = 2] = "errorMessage";
2243
+ })(EntityOrStatusCase = EntityStatus.EntityOrStatusCase || (EntityStatus.EntityOrStatusCase = {}));
2244
+ })(EntityStatus = BatchEntitiesResponse.EntityStatus || (BatchEntitiesResponse.EntityStatus = {}));
2245
+ })(BatchEntitiesResponse || (BatchEntitiesResponse = {}));
2246
+ /**
2247
+ * Message implementation for ondewo.nlu.BatchCreateEntitiesRequest
2248
+ */
2249
+ export class BatchCreateEntitiesRequest {
2250
+ /**
2251
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2252
+ * @param _value initial values object or instance of BatchCreateEntitiesRequest to deeply clone from
2253
+ */
2254
+ constructor(_value) {
2255
+ _value = _value || {};
2256
+ this.createEntityRequests = (_value.createEntityRequests || []).map(m => new BatchCreateEntitiesRequest.CreateEntityRequest(m));
2257
+ BatchCreateEntitiesRequest.refineValues(this);
2258
+ }
2259
+ /**
2260
+ * Deserialize binary data to message
2261
+ * @param instance message instance
2262
+ */
2263
+ static deserializeBinary(bytes) {
2264
+ const instance = new BatchCreateEntitiesRequest();
2265
+ BatchCreateEntitiesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2266
+ return instance;
2267
+ }
2268
+ /**
2269
+ * Check all the properties and set default protobuf values if necessary
2270
+ * @param _instance message instance
2271
+ */
2272
+ static refineValues(_instance) {
2273
+ _instance.createEntityRequests = _instance.createEntityRequests || [];
2274
+ }
2275
+ /**
2276
+ * Deserializes / reads binary message into message instance using provided binary reader
2277
+ * @param _instance message instance
2278
+ * @param _reader binary reader instance
2279
+ */
2280
+ static deserializeBinaryFromReader(_instance, _reader) {
2281
+ while (_reader.nextField()) {
2282
+ if (_reader.isEndGroup())
2283
+ break;
2284
+ switch (_reader.getFieldNumber()) {
2285
+ case 1:
2286
+ const messageInitializer1 = new BatchCreateEntitiesRequest.CreateEntityRequest();
2287
+ _reader.readMessage(messageInitializer1, BatchCreateEntitiesRequest.CreateEntityRequest
2288
+ .deserializeBinaryFromReader);
2289
+ (_instance.createEntityRequests =
2290
+ _instance.createEntityRequests || []).push(messageInitializer1);
2291
+ break;
2292
+ default:
2293
+ _reader.skipField();
2294
+ }
2295
+ }
2296
+ BatchCreateEntitiesRequest.refineValues(_instance);
2297
+ }
2298
+ /**
2299
+ * Serializes a message to binary format using provided binary reader
2300
+ * @param _instance message instance
2301
+ * @param _writer binary writer instance
2302
+ */
2303
+ static serializeBinaryToWriter(_instance, _writer) {
2304
+ if (_instance.createEntityRequests &&
2305
+ _instance.createEntityRequests.length) {
2306
+ _writer.writeRepeatedMessage(1, _instance.createEntityRequests, BatchCreateEntitiesRequest.CreateEntityRequest.serializeBinaryToWriter);
2307
+ }
2308
+ }
2309
+ get createEntityRequests() {
2310
+ return this._createEntityRequests;
2311
+ }
2312
+ set createEntityRequests(value) {
2313
+ this._createEntityRequests = value;
2314
+ }
2315
+ /**
2316
+ * Serialize message to binary data
2317
+ * @param instance message instance
2318
+ */
2319
+ serializeBinary() {
2320
+ const writer = new BinaryWriter();
2321
+ BatchCreateEntitiesRequest.serializeBinaryToWriter(this, writer);
2322
+ return writer.getResultBuffer();
2323
+ }
2324
+ /**
2325
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2326
+ */
2327
+ toObject() {
2328
+ return {
2329
+ createEntityRequests: (this.createEntityRequests || []).map(m => m.toObject())
2330
+ };
2331
+ }
2332
+ /**
2333
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2334
+ */
2335
+ toJSON() {
2336
+ return this.toObject();
2337
+ }
2338
+ /**
2339
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2340
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2341
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2342
+ */
2343
+ toProtobufJSON(
2344
+ // @ts-ignore
2345
+ options) {
2346
+ return {
2347
+ createEntityRequests: (this.createEntityRequests || []).map(m => m.toProtobufJSON(options))
2348
+ };
2349
+ }
2350
+ }
2351
+ BatchCreateEntitiesRequest.id = 'ondewo.nlu.BatchCreateEntitiesRequest';
2352
+ (function (BatchCreateEntitiesRequest) {
2353
+ /**
2354
+ * Message implementation for ondewo.nlu.CreateEntityRequest
2355
+ */
2356
+ class CreateEntityRequest {
2357
+ /**
2358
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2359
+ * @param _value initial values object or instance of CreateEntityRequest to deeply clone from
2360
+ */
2361
+ constructor(_value) {
2362
+ _value = _value || {};
2363
+ this.entityTypeName = _value.entityTypeName;
2364
+ this.entity = _value.entity
2365
+ ? new EntityType.Entity(_value.entity)
2366
+ : undefined;
2367
+ CreateEntityRequest.refineValues(this);
2368
+ }
2369
+ /**
2370
+ * Deserialize binary data to message
2371
+ * @param instance message instance
2372
+ */
2373
+ static deserializeBinary(bytes) {
2374
+ const instance = new CreateEntityRequest();
2375
+ CreateEntityRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2376
+ return instance;
2377
+ }
2378
+ /**
2379
+ * Check all the properties and set default protobuf values if necessary
2380
+ * @param _instance message instance
2381
+ */
2382
+ static refineValues(_instance) {
2383
+ _instance.entityTypeName = _instance.entityTypeName || '';
2384
+ _instance.entity = _instance.entity || undefined;
2385
+ }
2386
+ /**
2387
+ * Deserializes / reads binary message into message instance using provided binary reader
2388
+ * @param _instance message instance
2389
+ * @param _reader binary reader instance
2390
+ */
2391
+ static deserializeBinaryFromReader(_instance, _reader) {
2392
+ while (_reader.nextField()) {
2393
+ if (_reader.isEndGroup())
2394
+ break;
2395
+ switch (_reader.getFieldNumber()) {
2396
+ case 1:
2397
+ _instance.entityTypeName = _reader.readString();
2398
+ break;
2399
+ case 2:
2400
+ _instance.entity = new EntityType.Entity();
2401
+ _reader.readMessage(_instance.entity, EntityType.Entity.deserializeBinaryFromReader);
2402
+ break;
2403
+ default:
2404
+ _reader.skipField();
2405
+ }
2406
+ }
2407
+ CreateEntityRequest.refineValues(_instance);
2408
+ }
2409
+ /**
2410
+ * Serializes a message to binary format using provided binary reader
2411
+ * @param _instance message instance
2412
+ * @param _writer binary writer instance
2413
+ */
2414
+ static serializeBinaryToWriter(_instance, _writer) {
2415
+ if (_instance.entityTypeName) {
2416
+ _writer.writeString(1, _instance.entityTypeName);
2417
+ }
2418
+ if (_instance.entity) {
2419
+ _writer.writeMessage(2, _instance.entity, EntityType.Entity.serializeBinaryToWriter);
2420
+ }
2421
+ }
2422
+ get entityTypeName() {
2423
+ return this._entityTypeName;
2424
+ }
2425
+ set entityTypeName(value) {
2426
+ this._entityTypeName = value;
2427
+ }
2428
+ get entity() {
2429
+ return this._entity;
2430
+ }
2431
+ set entity(value) {
2432
+ this._entity = value;
2433
+ }
2434
+ /**
2435
+ * Serialize message to binary data
2436
+ * @param instance message instance
2437
+ */
2438
+ serializeBinary() {
2439
+ const writer = new BinaryWriter();
2440
+ CreateEntityRequest.serializeBinaryToWriter(this, writer);
2441
+ return writer.getResultBuffer();
2442
+ }
2443
+ /**
2444
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2445
+ */
2446
+ toObject() {
2447
+ return {
2448
+ entityTypeName: this.entityTypeName,
2449
+ entity: this.entity ? this.entity.toObject() : undefined
2450
+ };
2451
+ }
2452
+ /**
2453
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2454
+ */
2455
+ toJSON() {
2456
+ return this.toObject();
2457
+ }
2458
+ /**
2459
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2460
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2461
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2462
+ */
2463
+ toProtobufJSON(
2464
+ // @ts-ignore
2465
+ options) {
2466
+ return {
2467
+ entityTypeName: this.entityTypeName,
2468
+ entity: this.entity ? this.entity.toProtobufJSON(options) : null
2469
+ };
2470
+ }
2471
+ }
2472
+ CreateEntityRequest.id = 'ondewo.nlu.CreateEntityRequest';
2473
+ BatchCreateEntitiesRequest.CreateEntityRequest = CreateEntityRequest;
2474
+ })(BatchCreateEntitiesRequest || (BatchCreateEntitiesRequest = {}));
2475
+ /**
2476
+ * Message implementation for ondewo.nlu.BatchUpdateEntitiesRequest
2477
+ */
2478
+ export class BatchUpdateEntitiesRequest {
2479
+ /**
2480
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2481
+ * @param _value initial values object or instance of BatchUpdateEntitiesRequest to deeply clone from
2482
+ */
2483
+ constructor(_value) {
2484
+ _value = _value || {};
2485
+ this.entities = (_value.entities || []).map(m => new EntityType.Entity(m));
2486
+ BatchUpdateEntitiesRequest.refineValues(this);
2487
+ }
2488
+ /**
2489
+ * Deserialize binary data to message
2490
+ * @param instance message instance
2491
+ */
2492
+ static deserializeBinary(bytes) {
2493
+ const instance = new BatchUpdateEntitiesRequest();
2494
+ BatchUpdateEntitiesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2495
+ return instance;
2496
+ }
2497
+ /**
2498
+ * Check all the properties and set default protobuf values if necessary
2499
+ * @param _instance message instance
2500
+ */
2501
+ static refineValues(_instance) {
2502
+ _instance.entities = _instance.entities || [];
2503
+ }
2504
+ /**
2505
+ * Deserializes / reads binary message into message instance using provided binary reader
2506
+ * @param _instance message instance
2507
+ * @param _reader binary reader instance
2508
+ */
2509
+ static deserializeBinaryFromReader(_instance, _reader) {
2510
+ while (_reader.nextField()) {
2511
+ if (_reader.isEndGroup())
2512
+ break;
2513
+ switch (_reader.getFieldNumber()) {
2514
+ case 1:
2515
+ const messageInitializer1 = new EntityType.Entity();
2516
+ _reader.readMessage(messageInitializer1, EntityType.Entity.deserializeBinaryFromReader);
2517
+ (_instance.entities = _instance.entities || []).push(messageInitializer1);
2518
+ break;
2519
+ default:
2520
+ _reader.skipField();
2521
+ }
2522
+ }
2523
+ BatchUpdateEntitiesRequest.refineValues(_instance);
2524
+ }
2525
+ /**
2526
+ * Serializes a message to binary format using provided binary reader
2527
+ * @param _instance message instance
2528
+ * @param _writer binary writer instance
2529
+ */
2530
+ static serializeBinaryToWriter(_instance, _writer) {
2531
+ if (_instance.entities && _instance.entities.length) {
2532
+ _writer.writeRepeatedMessage(1, _instance.entities, EntityType.Entity.serializeBinaryToWriter);
2533
+ }
2534
+ }
2535
+ get entities() {
2536
+ return this._entities;
2537
+ }
2538
+ set entities(value) {
2539
+ this._entities = value;
2540
+ }
2541
+ /**
2542
+ * Serialize message to binary data
2543
+ * @param instance message instance
2544
+ */
2545
+ serializeBinary() {
2546
+ const writer = new BinaryWriter();
2547
+ BatchUpdateEntitiesRequest.serializeBinaryToWriter(this, writer);
2548
+ return writer.getResultBuffer();
2549
+ }
2550
+ /**
2551
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2552
+ */
2553
+ toObject() {
2554
+ return {
2555
+ entities: (this.entities || []).map(m => m.toObject())
2556
+ };
2557
+ }
2558
+ /**
2559
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2560
+ */
2561
+ toJSON() {
2562
+ return this.toObject();
2563
+ }
2564
+ /**
2565
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2566
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2567
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2568
+ */
2569
+ toProtobufJSON(
2570
+ // @ts-ignore
2571
+ options) {
2572
+ return {
2573
+ entities: (this.entities || []).map(m => m.toProtobufJSON(options))
2574
+ };
2575
+ }
2576
+ }
2577
+ BatchUpdateEntitiesRequest.id = 'ondewo.nlu.BatchUpdateEntitiesRequest';
2578
+ /**
2579
+ * Message implementation for ondewo.nlu.BatchGetEntitiesRequest
2580
+ */
2581
+ export class BatchGetEntitiesRequest {
2582
+ /**
2583
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2584
+ * @param _value initial values object or instance of BatchGetEntitiesRequest to deeply clone from
2585
+ */
2586
+ constructor(_value) {
2587
+ _value = _value || {};
2588
+ this.names = (_value.names || []).slice();
2589
+ BatchGetEntitiesRequest.refineValues(this);
2590
+ }
2591
+ /**
2592
+ * Deserialize binary data to message
2593
+ * @param instance message instance
2594
+ */
2595
+ static deserializeBinary(bytes) {
2596
+ const instance = new BatchGetEntitiesRequest();
2597
+ BatchGetEntitiesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2598
+ return instance;
2599
+ }
2600
+ /**
2601
+ * Check all the properties and set default protobuf values if necessary
2602
+ * @param _instance message instance
2603
+ */
2604
+ static refineValues(_instance) {
2605
+ _instance.names = _instance.names || [];
2606
+ }
2607
+ /**
2608
+ * Deserializes / reads binary message into message instance using provided binary reader
2609
+ * @param _instance message instance
2610
+ * @param _reader binary reader instance
2611
+ */
2612
+ static deserializeBinaryFromReader(_instance, _reader) {
2613
+ while (_reader.nextField()) {
2614
+ if (_reader.isEndGroup())
2615
+ break;
2616
+ switch (_reader.getFieldNumber()) {
2617
+ case 1:
2618
+ (_instance.names = _instance.names || []).push(_reader.readString());
2619
+ break;
2620
+ default:
2621
+ _reader.skipField();
2622
+ }
2623
+ }
2624
+ BatchGetEntitiesRequest.refineValues(_instance);
2625
+ }
2626
+ /**
2627
+ * Serializes a message to binary format using provided binary reader
2628
+ * @param _instance message instance
2629
+ * @param _writer binary writer instance
2630
+ */
2631
+ static serializeBinaryToWriter(_instance, _writer) {
2632
+ if (_instance.names && _instance.names.length) {
2633
+ _writer.writeRepeatedString(1, _instance.names);
2634
+ }
2635
+ }
2636
+ get names() {
2637
+ return this._names;
2638
+ }
2639
+ set names(value) {
2640
+ this._names = value;
2641
+ }
2642
+ /**
2643
+ * Serialize message to binary data
2644
+ * @param instance message instance
2645
+ */
2646
+ serializeBinary() {
2647
+ const writer = new BinaryWriter();
2648
+ BatchGetEntitiesRequest.serializeBinaryToWriter(this, writer);
2649
+ return writer.getResultBuffer();
2650
+ }
2651
+ /**
2652
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2653
+ */
2654
+ toObject() {
2655
+ return {
2656
+ names: (this.names || []).slice()
2657
+ };
2658
+ }
2659
+ /**
2660
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2661
+ */
2662
+ toJSON() {
2663
+ return this.toObject();
2664
+ }
2665
+ /**
2666
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2667
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2668
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2669
+ */
2670
+ toProtobufJSON(
2671
+ // @ts-ignore
2672
+ options) {
2673
+ return {
2674
+ names: (this.names || []).slice()
2675
+ };
2676
+ }
2677
+ }
2678
+ BatchGetEntitiesRequest.id = 'ondewo.nlu.BatchGetEntitiesRequest';
2679
+ /**
2680
+ * Message implementation for ondewo.nlu.BatchDeleteEntitiesRequest
2681
+ */
2682
+ export class BatchDeleteEntitiesRequest {
2683
+ /**
2684
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2685
+ * @param _value initial values object or instance of BatchDeleteEntitiesRequest to deeply clone from
2686
+ */
2687
+ constructor(_value) {
2688
+ _value = _value || {};
2689
+ this.names = (_value.names || []).slice();
2690
+ BatchDeleteEntitiesRequest.refineValues(this);
2691
+ }
2692
+ /**
2693
+ * Deserialize binary data to message
2694
+ * @param instance message instance
2695
+ */
2696
+ static deserializeBinary(bytes) {
2697
+ const instance = new BatchDeleteEntitiesRequest();
2698
+ BatchDeleteEntitiesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2699
+ return instance;
2700
+ }
2701
+ /**
2702
+ * Check all the properties and set default protobuf values if necessary
2703
+ * @param _instance message instance
2704
+ */
2705
+ static refineValues(_instance) {
2706
+ _instance.names = _instance.names || [];
2707
+ }
2708
+ /**
2709
+ * Deserializes / reads binary message into message instance using provided binary reader
2710
+ * @param _instance message instance
2711
+ * @param _reader binary reader instance
2712
+ */
2713
+ static deserializeBinaryFromReader(_instance, _reader) {
2714
+ while (_reader.nextField()) {
2715
+ if (_reader.isEndGroup())
2716
+ break;
2717
+ switch (_reader.getFieldNumber()) {
2718
+ case 1:
2719
+ (_instance.names = _instance.names || []).push(_reader.readString());
2720
+ break;
2721
+ default:
2722
+ _reader.skipField();
2723
+ }
2724
+ }
2725
+ BatchDeleteEntitiesRequest.refineValues(_instance);
2726
+ }
2727
+ /**
2728
+ * Serializes a message to binary format using provided binary reader
2729
+ * @param _instance message instance
2730
+ * @param _writer binary writer instance
2731
+ */
2732
+ static serializeBinaryToWriter(_instance, _writer) {
2733
+ if (_instance.names && _instance.names.length) {
2734
+ _writer.writeRepeatedString(1, _instance.names);
2735
+ }
2736
+ }
2737
+ get names() {
2738
+ return this._names;
2739
+ }
2740
+ set names(value) {
2741
+ this._names = value;
2742
+ }
2743
+ /**
2744
+ * Serialize message to binary data
2745
+ * @param instance message instance
2746
+ */
2747
+ serializeBinary() {
2748
+ const writer = new BinaryWriter();
2749
+ BatchDeleteEntitiesRequest.serializeBinaryToWriter(this, writer);
2750
+ return writer.getResultBuffer();
2751
+ }
2752
+ /**
2753
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2754
+ */
2755
+ toObject() {
2756
+ return {
2757
+ names: (this.names || []).slice()
2758
+ };
2759
+ }
2760
+ /**
2761
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2762
+ */
2763
+ toJSON() {
2764
+ return this.toObject();
2765
+ }
2766
+ /**
2767
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2768
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2769
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2770
+ */
2771
+ toProtobufJSON(
2772
+ // @ts-ignore
2773
+ options) {
2774
+ return {
2775
+ names: (this.names || []).slice()
2776
+ };
2777
+ }
2778
+ }
2779
+ BatchDeleteEntitiesRequest.id = 'ondewo.nlu.BatchDeleteEntitiesRequest';
2780
+ /**
2781
+ * Message implementation for ondewo.nlu.BatchDeleteEntitiesResponse
2782
+ */
2783
+ export class BatchDeleteEntitiesResponse {
2784
+ /**
2785
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2786
+ * @param _value initial values object or instance of BatchDeleteEntitiesResponse to deeply clone from
2787
+ */
2788
+ constructor(_value) {
2789
+ _value = _value || {};
2790
+ this.deleteStatuses = (_value.deleteStatuses || []).map(m => new BatchDeleteEntitiesResponse.DeleteEntityStatus(m));
2791
+ this.hasErrors = _value.hasErrors;
2792
+ BatchDeleteEntitiesResponse.refineValues(this);
2793
+ }
2794
+ /**
2795
+ * Deserialize binary data to message
2796
+ * @param instance message instance
2797
+ */
2798
+ static deserializeBinary(bytes) {
2799
+ const instance = new BatchDeleteEntitiesResponse();
2800
+ BatchDeleteEntitiesResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2801
+ return instance;
2802
+ }
2803
+ /**
2804
+ * Check all the properties and set default protobuf values if necessary
2805
+ * @param _instance message instance
2806
+ */
2807
+ static refineValues(_instance) {
2808
+ _instance.deleteStatuses = _instance.deleteStatuses || [];
2809
+ _instance.hasErrors = _instance.hasErrors || false;
2810
+ }
2811
+ /**
2812
+ * Deserializes / reads binary message into message instance using provided binary reader
2813
+ * @param _instance message instance
2814
+ * @param _reader binary reader instance
2815
+ */
2816
+ static deserializeBinaryFromReader(_instance, _reader) {
2817
+ while (_reader.nextField()) {
2818
+ if (_reader.isEndGroup())
2819
+ break;
2820
+ switch (_reader.getFieldNumber()) {
2821
+ case 1:
2822
+ const messageInitializer1 = new BatchDeleteEntitiesResponse.DeleteEntityStatus();
2823
+ _reader.readMessage(messageInitializer1, BatchDeleteEntitiesResponse.DeleteEntityStatus
2824
+ .deserializeBinaryFromReader);
2825
+ (_instance.deleteStatuses = _instance.deleteStatuses || []).push(messageInitializer1);
2826
+ break;
2827
+ case 2:
2828
+ _instance.hasErrors = _reader.readBool();
2829
+ break;
2830
+ default:
2831
+ _reader.skipField();
2832
+ }
2833
+ }
2834
+ BatchDeleteEntitiesResponse.refineValues(_instance);
2835
+ }
2836
+ /**
2837
+ * Serializes a message to binary format using provided binary reader
2838
+ * @param _instance message instance
2839
+ * @param _writer binary writer instance
2840
+ */
2841
+ static serializeBinaryToWriter(_instance, _writer) {
2842
+ if (_instance.deleteStatuses && _instance.deleteStatuses.length) {
2843
+ _writer.writeRepeatedMessage(1, _instance.deleteStatuses, BatchDeleteEntitiesResponse.DeleteEntityStatus.serializeBinaryToWriter);
2844
+ }
2845
+ if (_instance.hasErrors) {
2846
+ _writer.writeBool(2, _instance.hasErrors);
2847
+ }
2848
+ }
2849
+ get deleteStatuses() {
2850
+ return this._deleteStatuses;
2851
+ }
2852
+ set deleteStatuses(value) {
2853
+ this._deleteStatuses = value;
2854
+ }
2855
+ get hasErrors() {
2856
+ return this._hasErrors;
2857
+ }
2858
+ set hasErrors(value) {
2859
+ this._hasErrors = value;
2860
+ }
2861
+ /**
2862
+ * Serialize message to binary data
2863
+ * @param instance message instance
2864
+ */
2865
+ serializeBinary() {
2866
+ const writer = new BinaryWriter();
2867
+ BatchDeleteEntitiesResponse.serializeBinaryToWriter(this, writer);
2868
+ return writer.getResultBuffer();
2869
+ }
2870
+ /**
2871
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2872
+ */
2873
+ toObject() {
2874
+ return {
2875
+ deleteStatuses: (this.deleteStatuses || []).map(m => m.toObject()),
2876
+ hasErrors: this.hasErrors
2877
+ };
2878
+ }
2879
+ /**
2880
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2881
+ */
2882
+ toJSON() {
2883
+ return this.toObject();
2884
+ }
2885
+ /**
2886
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2887
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2888
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
2889
+ */
2890
+ toProtobufJSON(
2891
+ // @ts-ignore
2892
+ options) {
2893
+ return {
2894
+ deleteStatuses: (this.deleteStatuses || []).map(m => m.toProtobufJSON(options)),
2895
+ hasErrors: this.hasErrors
2896
+ };
2897
+ }
2898
+ }
2899
+ BatchDeleteEntitiesResponse.id = 'ondewo.nlu.BatchDeleteEntitiesResponse';
2900
+ (function (BatchDeleteEntitiesResponse) {
2901
+ /**
2902
+ * Message implementation for ondewo.nlu.DeleteEntityStatus
2903
+ */
2904
+ class DeleteEntityStatus {
2905
+ /**
2906
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2907
+ * @param _value initial values object or instance of DeleteEntityStatus to deeply clone from
2908
+ */
2909
+ constructor(_value) {
2910
+ this._deleteStatus = DeleteEntityStatus.DeleteStatusCase.none;
2911
+ _value = _value || {};
2912
+ this.successfullyDeleted = _value.successfullyDeleted
2913
+ ? new googleProtobuf004.Empty(_value.successfullyDeleted)
2914
+ : undefined;
2915
+ this.errorMessage = _value.errorMessage;
2916
+ DeleteEntityStatus.refineValues(this);
2917
+ }
2918
+ /**
2919
+ * Deserialize binary data to message
2920
+ * @param instance message instance
2921
+ */
2922
+ static deserializeBinary(bytes) {
2923
+ const instance = new DeleteEntityStatus();
2924
+ DeleteEntityStatus.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2925
+ return instance;
2926
+ }
2927
+ /**
2928
+ * Check all the properties and set default protobuf values if necessary
2929
+ * @param _instance message instance
2930
+ */
2931
+ static refineValues(_instance) { }
2932
+ /**
2933
+ * Deserializes / reads binary message into message instance using provided binary reader
2934
+ * @param _instance message instance
2935
+ * @param _reader binary reader instance
2936
+ */
2937
+ static deserializeBinaryFromReader(_instance, _reader) {
2938
+ while (_reader.nextField()) {
2939
+ if (_reader.isEndGroup())
2940
+ break;
2941
+ switch (_reader.getFieldNumber()) {
2942
+ case 1:
2943
+ _instance.successfullyDeleted = new googleProtobuf004.Empty();
2944
+ _reader.readMessage(_instance.successfullyDeleted, googleProtobuf004.Empty.deserializeBinaryFromReader);
2945
+ break;
2946
+ case 2:
2947
+ _instance.errorMessage = _reader.readString();
2948
+ break;
2949
+ default:
2950
+ _reader.skipField();
2951
+ }
2952
+ }
2953
+ DeleteEntityStatus.refineValues(_instance);
2954
+ }
2955
+ /**
2956
+ * Serializes a message to binary format using provided binary reader
2957
+ * @param _instance message instance
2958
+ * @param _writer binary writer instance
2959
+ */
2960
+ static serializeBinaryToWriter(_instance, _writer) {
2961
+ if (_instance.successfullyDeleted) {
2962
+ _writer.writeMessage(1, _instance.successfullyDeleted, googleProtobuf004.Empty.serializeBinaryToWriter);
2963
+ }
2964
+ if (_instance.errorMessage || _instance.errorMessage === '') {
2965
+ _writer.writeString(2, _instance.errorMessage);
2966
+ }
2967
+ }
2968
+ get successfullyDeleted() {
2969
+ return this._successfullyDeleted;
2970
+ }
2971
+ set successfullyDeleted(value) {
2972
+ if (value !== undefined && value !== null) {
2973
+ this._errorMessage = undefined;
2974
+ this._deleteStatus =
2975
+ DeleteEntityStatus.DeleteStatusCase.successfullyDeleted;
2976
+ }
2977
+ this._successfullyDeleted = value;
2978
+ }
2979
+ get errorMessage() {
2980
+ return this._errorMessage;
2981
+ }
2982
+ set errorMessage(value) {
2983
+ if (value !== undefined && value !== null) {
2984
+ this._successfullyDeleted = undefined;
2985
+ this._deleteStatus = DeleteEntityStatus.DeleteStatusCase.errorMessage;
2986
+ }
2987
+ this._errorMessage = value;
2988
+ }
2989
+ get deleteStatus() {
2990
+ return this._deleteStatus;
2991
+ }
2992
+ /**
2993
+ * Serialize message to binary data
2994
+ * @param instance message instance
2995
+ */
2996
+ serializeBinary() {
2997
+ const writer = new BinaryWriter();
2998
+ DeleteEntityStatus.serializeBinaryToWriter(this, writer);
2999
+ return writer.getResultBuffer();
3000
+ }
3001
+ /**
3002
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
3003
+ */
3004
+ toObject() {
3005
+ return {
3006
+ successfullyDeleted: this.successfullyDeleted
3007
+ ? this.successfullyDeleted.toObject()
3008
+ : undefined,
3009
+ errorMessage: this.errorMessage
3010
+ };
3011
+ }
3012
+ /**
3013
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
3014
+ */
3015
+ toJSON() {
3016
+ return this.toObject();
3017
+ }
3018
+ /**
3019
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
3020
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
3021
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
3022
+ */
3023
+ toProtobufJSON(
3024
+ // @ts-ignore
3025
+ options) {
3026
+ return {
3027
+ successfullyDeleted: this.successfullyDeleted
3028
+ ? this.successfullyDeleted.toProtobufJSON(options)
3029
+ : null,
3030
+ errorMessage: this.errorMessage === null || this.errorMessage === undefined
3031
+ ? null
3032
+ : this.errorMessage
3033
+ };
3034
+ }
3035
+ }
3036
+ DeleteEntityStatus.id = 'ondewo.nlu.DeleteEntityStatus';
3037
+ BatchDeleteEntitiesResponse.DeleteEntityStatus = DeleteEntityStatus;
3038
+ (function (DeleteEntityStatus) {
3039
+ let DeleteStatusCase;
3040
+ (function (DeleteStatusCase) {
3041
+ DeleteStatusCase[DeleteStatusCase["none"] = 0] = "none";
3042
+ DeleteStatusCase[DeleteStatusCase["successfullyDeleted"] = 1] = "successfullyDeleted";
3043
+ DeleteStatusCase[DeleteStatusCase["errorMessage"] = 2] = "errorMessage";
3044
+ })(DeleteStatusCase = DeleteEntityStatus.DeleteStatusCase || (DeleteEntityStatus.DeleteStatusCase = {}));
3045
+ })(DeleteEntityStatus = BatchDeleteEntitiesResponse.DeleteEntityStatus || (BatchDeleteEntitiesResponse.DeleteEntityStatus = {}));
3046
+ })(BatchDeleteEntitiesResponse || (BatchDeleteEntitiesResponse = {}));
3047
+ /**
3048
+ * Message implementation for ondewo.nlu.ListEntitiesRequest
3049
+ */
3050
+ export class ListEntitiesRequest {
3051
+ /**
3052
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
3053
+ * @param _value initial values object or instance of ListEntitiesRequest to deeply clone from
3054
+ */
3055
+ constructor(_value) {
3056
+ _value = _value || {};
3057
+ this.entityTypeName = _value.entityTypeName;
3058
+ this.languageCode = _value.languageCode;
3059
+ this.pageToken = _value.pageToken;
3060
+ this.sortByField = _value.sortByField
3061
+ ? new EntityValueSorting(_value.sortByField)
3062
+ : undefined;
3063
+ this.searchByPattern = _value.searchByPattern;
3064
+ ListEntitiesRequest.refineValues(this);
3065
+ }
3066
+ /**
3067
+ * Deserialize binary data to message
3068
+ * @param instance message instance
3069
+ */
3070
+ static deserializeBinary(bytes) {
3071
+ const instance = new ListEntitiesRequest();
3072
+ ListEntitiesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
3073
+ return instance;
3074
+ }
3075
+ /**
3076
+ * Check all the properties and set default protobuf values if necessary
3077
+ * @param _instance message instance
3078
+ */
3079
+ static refineValues(_instance) {
3080
+ _instance.entityTypeName = _instance.entityTypeName || '';
3081
+ _instance.languageCode = _instance.languageCode || '';
3082
+ _instance.pageToken = _instance.pageToken || '';
3083
+ _instance.sortByField = _instance.sortByField || undefined;
3084
+ _instance.searchByPattern = _instance.searchByPattern || '';
3085
+ }
3086
+ /**
3087
+ * Deserializes / reads binary message into message instance using provided binary reader
3088
+ * @param _instance message instance
3089
+ * @param _reader binary reader instance
3090
+ */
3091
+ static deserializeBinaryFromReader(_instance, _reader) {
3092
+ while (_reader.nextField()) {
3093
+ if (_reader.isEndGroup())
3094
+ break;
3095
+ switch (_reader.getFieldNumber()) {
3096
+ case 1:
3097
+ _instance.entityTypeName = _reader.readString();
3098
+ break;
3099
+ case 2:
3100
+ _instance.languageCode = _reader.readString();
3101
+ break;
3102
+ case 3:
3103
+ _instance.pageToken = _reader.readString();
3104
+ break;
3105
+ case 5:
3106
+ _instance.sortByField = new EntityValueSorting();
3107
+ _reader.readMessage(_instance.sortByField, EntityValueSorting.deserializeBinaryFromReader);
3108
+ break;
3109
+ case 6:
3110
+ _instance.searchByPattern = _reader.readString();
3111
+ break;
3112
+ default:
3113
+ _reader.skipField();
3114
+ }
3115
+ }
3116
+ ListEntitiesRequest.refineValues(_instance);
3117
+ }
3118
+ /**
3119
+ * Serializes a message to binary format using provided binary reader
3120
+ * @param _instance message instance
3121
+ * @param _writer binary writer instance
3122
+ */
3123
+ static serializeBinaryToWriter(_instance, _writer) {
3124
+ if (_instance.entityTypeName) {
3125
+ _writer.writeString(1, _instance.entityTypeName);
3126
+ }
3127
+ if (_instance.languageCode) {
3128
+ _writer.writeString(2, _instance.languageCode);
3129
+ }
3130
+ if (_instance.pageToken) {
3131
+ _writer.writeString(3, _instance.pageToken);
3132
+ }
3133
+ if (_instance.sortByField) {
3134
+ _writer.writeMessage(5, _instance.sortByField, EntityValueSorting.serializeBinaryToWriter);
3135
+ }
3136
+ if (_instance.searchByPattern) {
3137
+ _writer.writeString(6, _instance.searchByPattern);
3138
+ }
3139
+ }
3140
+ get entityTypeName() {
3141
+ return this._entityTypeName;
3142
+ }
3143
+ set entityTypeName(value) {
3144
+ this._entityTypeName = value;
3145
+ }
3146
+ get languageCode() {
3147
+ return this._languageCode;
3148
+ }
3149
+ set languageCode(value) {
3150
+ this._languageCode = value;
3151
+ }
3152
+ get pageToken() {
3153
+ return this._pageToken;
3154
+ }
3155
+ set pageToken(value) {
3156
+ this._pageToken = value;
3157
+ }
3158
+ get sortByField() {
3159
+ return this._sortByField;
3160
+ }
3161
+ set sortByField(value) {
3162
+ this._sortByField = value;
3163
+ }
3164
+ get searchByPattern() {
3165
+ return this._searchByPattern;
3166
+ }
3167
+ set searchByPattern(value) {
3168
+ this._searchByPattern = value;
3169
+ }
3170
+ /**
3171
+ * Serialize message to binary data
3172
+ * @param instance message instance
3173
+ */
3174
+ serializeBinary() {
3175
+ const writer = new BinaryWriter();
3176
+ ListEntitiesRequest.serializeBinaryToWriter(this, writer);
3177
+ return writer.getResultBuffer();
3178
+ }
3179
+ /**
3180
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
3181
+ */
3182
+ toObject() {
3183
+ return {
3184
+ entityTypeName: this.entityTypeName,
3185
+ languageCode: this.languageCode,
3186
+ pageToken: this.pageToken,
3187
+ sortByField: this.sortByField ? this.sortByField.toObject() : undefined,
3188
+ searchByPattern: this.searchByPattern
3189
+ };
3190
+ }
3191
+ /**
3192
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
3193
+ */
3194
+ toJSON() {
3195
+ return this.toObject();
3196
+ }
3197
+ /**
3198
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
3199
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
3200
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
3201
+ */
3202
+ toProtobufJSON(
3203
+ // @ts-ignore
3204
+ options) {
3205
+ return {
3206
+ entityTypeName: this.entityTypeName,
3207
+ languageCode: this.languageCode,
3208
+ pageToken: this.pageToken,
3209
+ sortByField: this.sortByField
3210
+ ? this.sortByField.toProtobufJSON(options)
3211
+ : null,
3212
+ searchByPattern: this.searchByPattern
3213
+ };
3214
+ }
3215
+ }
3216
+ ListEntitiesRequest.id = 'ondewo.nlu.ListEntitiesRequest';
3217
+ /**
3218
+ * Message implementation for ondewo.nlu.ListEntitiesResponse
3219
+ */
3220
+ export class ListEntitiesResponse {
3221
+ /**
3222
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
3223
+ * @param _value initial values object or instance of ListEntitiesResponse to deeply clone from
3224
+ */
3225
+ constructor(_value) {
3226
+ _value = _value || {};
3227
+ this.entities = (_value.entities || []).map(m => new EntityType.Entity(m));
3228
+ this.nextPageToken = _value.nextPageToken;
3229
+ ListEntitiesResponse.refineValues(this);
3230
+ }
3231
+ /**
3232
+ * Deserialize binary data to message
3233
+ * @param instance message instance
3234
+ */
3235
+ static deserializeBinary(bytes) {
3236
+ const instance = new ListEntitiesResponse();
3237
+ ListEntitiesResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
3238
+ return instance;
3239
+ }
3240
+ /**
3241
+ * Check all the properties and set default protobuf values if necessary
3242
+ * @param _instance message instance
3243
+ */
3244
+ static refineValues(_instance) {
3245
+ _instance.entities = _instance.entities || [];
3246
+ _instance.nextPageToken = _instance.nextPageToken || '';
3247
+ }
3248
+ /**
3249
+ * Deserializes / reads binary message into message instance using provided binary reader
3250
+ * @param _instance message instance
3251
+ * @param _reader binary reader instance
3252
+ */
3253
+ static deserializeBinaryFromReader(_instance, _reader) {
3254
+ while (_reader.nextField()) {
3255
+ if (_reader.isEndGroup())
3256
+ break;
3257
+ switch (_reader.getFieldNumber()) {
3258
+ case 1:
3259
+ const messageInitializer1 = new EntityType.Entity();
3260
+ _reader.readMessage(messageInitializer1, EntityType.Entity.deserializeBinaryFromReader);
3261
+ (_instance.entities = _instance.entities || []).push(messageInitializer1);
3262
+ break;
3263
+ case 2:
3264
+ _instance.nextPageToken = _reader.readString();
3265
+ break;
3266
+ default:
3267
+ _reader.skipField();
3268
+ }
3269
+ }
3270
+ ListEntitiesResponse.refineValues(_instance);
3271
+ }
3272
+ /**
3273
+ * Serializes a message to binary format using provided binary reader
3274
+ * @param _instance message instance
3275
+ * @param _writer binary writer instance
3276
+ */
3277
+ static serializeBinaryToWriter(_instance, _writer) {
3278
+ if (_instance.entities && _instance.entities.length) {
3279
+ _writer.writeRepeatedMessage(1, _instance.entities, EntityType.Entity.serializeBinaryToWriter);
3280
+ }
3281
+ if (_instance.nextPageToken) {
3282
+ _writer.writeString(2, _instance.nextPageToken);
3283
+ }
3284
+ }
3285
+ get entities() {
3286
+ return this._entities;
3287
+ }
3288
+ set entities(value) {
3289
+ this._entities = value;
3290
+ }
3291
+ get nextPageToken() {
3292
+ return this._nextPageToken;
3293
+ }
3294
+ set nextPageToken(value) {
3295
+ this._nextPageToken = value;
3296
+ }
3297
+ /**
3298
+ * Serialize message to binary data
3299
+ * @param instance message instance
3300
+ */
3301
+ serializeBinary() {
3302
+ const writer = new BinaryWriter();
3303
+ ListEntitiesResponse.serializeBinaryToWriter(this, writer);
3304
+ return writer.getResultBuffer();
3305
+ }
3306
+ /**
3307
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
3308
+ */
3309
+ toObject() {
3310
+ return {
3311
+ entities: (this.entities || []).map(m => m.toObject()),
3312
+ nextPageToken: this.nextPageToken
3313
+ };
3314
+ }
3315
+ /**
3316
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
3317
+ */
3318
+ toJSON() {
3319
+ return this.toObject();
3320
+ }
3321
+ /**
3322
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
3323
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
3324
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
3325
+ */
3326
+ toProtobufJSON(
3327
+ // @ts-ignore
3328
+ options) {
3329
+ return {
3330
+ entities: (this.entities || []).map(m => m.toProtobufJSON(options)),
3331
+ nextPageToken: this.nextPageToken
3332
+ };
3333
+ }
3334
+ }
3335
+ ListEntitiesResponse.id = 'ondewo.nlu.ListEntitiesResponse';
3336
+ /**
3337
+ * Message implementation for ondewo.nlu.EntityValueSorting
3338
+ */
3339
+ export class EntityValueSorting {
3340
+ /**
3341
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
3342
+ * @param _value initial values object or instance of EntityValueSorting to deeply clone from
3343
+ */
3344
+ constructor(_value) {
3345
+ _value = _value || {};
3346
+ this.sortingField = _value.sortingField;
3347
+ this.sortingMode = _value.sortingMode;
3348
+ EntityValueSorting.refineValues(this);
3349
+ }
3350
+ /**
3351
+ * Deserialize binary data to message
3352
+ * @param instance message instance
3353
+ */
3354
+ static deserializeBinary(bytes) {
3355
+ const instance = new EntityValueSorting();
3356
+ EntityValueSorting.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
3357
+ return instance;
3358
+ }
3359
+ /**
3360
+ * Check all the properties and set default protobuf values if necessary
3361
+ * @param _instance message instance
3362
+ */
3363
+ static refineValues(_instance) {
3364
+ _instance.sortingField = _instance.sortingField || 0;
3365
+ _instance.sortingMode = _instance.sortingMode || 0;
3366
+ }
3367
+ /**
3368
+ * Deserializes / reads binary message into message instance using provided binary reader
3369
+ * @param _instance message instance
3370
+ * @param _reader binary reader instance
3371
+ */
3372
+ static deserializeBinaryFromReader(_instance, _reader) {
3373
+ while (_reader.nextField()) {
3374
+ if (_reader.isEndGroup())
3375
+ break;
3376
+ switch (_reader.getFieldNumber()) {
3377
+ case 7:
3378
+ _instance.sortingField = _reader.readEnum();
3379
+ break;
3380
+ case 8:
3381
+ _instance.sortingMode = _reader.readEnum();
3382
+ break;
3383
+ default:
3384
+ _reader.skipField();
3385
+ }
3386
+ }
3387
+ EntityValueSorting.refineValues(_instance);
3388
+ }
3389
+ /**
3390
+ * Serializes a message to binary format using provided binary reader
3391
+ * @param _instance message instance
3392
+ * @param _writer binary writer instance
3393
+ */
3394
+ static serializeBinaryToWriter(_instance, _writer) {
3395
+ if (_instance.sortingField) {
3396
+ _writer.writeEnum(7, _instance.sortingField);
3397
+ }
3398
+ if (_instance.sortingMode) {
3399
+ _writer.writeEnum(8, _instance.sortingMode);
3400
+ }
3401
+ }
3402
+ get sortingField() {
3403
+ return this._sortingField;
3404
+ }
3405
+ set sortingField(value) {
3406
+ this._sortingField = value;
3407
+ }
3408
+ get sortingMode() {
3409
+ return this._sortingMode;
3410
+ }
3411
+ set sortingMode(value) {
3412
+ this._sortingMode = value;
3413
+ }
3414
+ /**
3415
+ * Serialize message to binary data
3416
+ * @param instance message instance
3417
+ */
3418
+ serializeBinary() {
3419
+ const writer = new BinaryWriter();
3420
+ EntityValueSorting.serializeBinaryToWriter(this, writer);
3421
+ return writer.getResultBuffer();
3422
+ }
3423
+ /**
3424
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
3425
+ */
3426
+ toObject() {
3427
+ return {
3428
+ sortingField: this.sortingField,
3429
+ sortingMode: this.sortingMode
3430
+ };
3431
+ }
3432
+ /**
3433
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
3434
+ */
3435
+ toJSON() {
3436
+ return this.toObject();
3437
+ }
3438
+ /**
3439
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
3440
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
3441
+ * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
3442
+ */
3443
+ toProtobufJSON(
3444
+ // @ts-ignore
3445
+ options) {
3446
+ return {
3447
+ sortingField: EntityValueSorting.EntityValueSortingField[this.sortingField === null || this.sortingField === undefined
3448
+ ? 0
3449
+ : this.sortingField],
3450
+ sortingMode: ondewoNlu009.SortingMode[this.sortingMode === null || this.sortingMode === undefined
3451
+ ? 0
3452
+ : this.sortingMode]
3453
+ };
3454
+ }
3455
+ }
3456
+ EntityValueSorting.id = 'ondewo.nlu.EntityValueSorting';
3457
+ (function (EntityValueSorting) {
3458
+ let EntityValueSortingField;
3459
+ (function (EntityValueSortingField) {
3460
+ EntityValueSortingField[EntityValueSortingField["NO_ENTITY_VALUE_SORTING"] = 0] = "NO_ENTITY_VALUE_SORTING";
3461
+ EntityValueSortingField[EntityValueSortingField["SORT_ENTITY_VALUE_BY_DISPLAY_NAME"] = 1] = "SORT_ENTITY_VALUE_BY_DISPLAY_NAME";
3462
+ EntityValueSortingField[EntityValueSortingField["SORT_ENTITY_VALUE_BY_VALUE"] = 2] = "SORT_ENTITY_VALUE_BY_VALUE";
3463
+ EntityValueSortingField[EntityValueSortingField["SORT_ENTITY_VALUE_BY_SYNONYM_COUNT"] = 3] = "SORT_ENTITY_VALUE_BY_SYNONYM_COUNT";
3464
+ })(EntityValueSortingField = EntityValueSorting.EntityValueSortingField || (EntityValueSorting.EntityValueSortingField = {}));
3465
+ })(EntityValueSorting || (EntityValueSorting = {}));
3466
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXR5cGUucGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9hcGkvb25kZXdvL25sdS9lbnRpdHktdHlwZS5wYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBS3pFLE9BQU8sS0FBSyxpQkFBaUIsTUFBTSw0QkFBNEIsQ0FBQztBQUloRSxPQUFPLEtBQUssaUJBQWlCLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxLQUFLLFlBQVksTUFBTSw0QkFBNEIsQ0FBQztBQUUzRCxNQUFNLENBQU4sSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3hCLG1HQUFnQyxDQUFBO0lBQ2hDLHFGQUF5QixDQUFBO0lBQ3pCLDJGQUE0QixDQUFBO0lBQzVCLDJGQUE0QixDQUFBO0FBQzlCLENBQUMsRUFMVyxjQUFjLEtBQWQsY0FBYyxRQUt6QjtBQUNELE1BQU0sQ0FBTixJQUFZLGtCQUlYO0FBSkQsV0FBWSxrQkFBa0I7SUFDNUIsbUZBQW9CLENBQUE7SUFDcEIsMkZBQXdCLENBQUE7SUFDeEIscUdBQTZCLENBQUE7QUFDL0IsQ0FBQyxFQUpXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFJN0I7QUFDRDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBcUlyQjs7O09BR0c7SUFDSCxZQUFZLE1BQThDO1FBQ3hELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7UUFDbEQsSUFBSSxDQUFD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M0QsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQ3RCO1lBQ0gsV0FBVyxFQUNULFlBQVksQ0FBQyxXQUFXLENBQ3RCLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUztnQkFDekQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQ3JCO1NBQ0osQ0FBQztJQUNKLENBQUM7O0FBbEpNLHFCQUFFLEdBQUcsK0JBQStCLENBQUM7QUFvSjlDLFdBQWMsa0JBQWtCO0lBZ0I5QixJQUFZLHVCQUtYO0lBTEQsV0FBWSx1QkFBdUI7UUFDakMsMkdBQTJCLENBQUE7UUFDM0IsK0hBQXFDLENBQUE7UUFDckMsaUhBQThCLENBQUE7UUFDOUIsaUlBQXNDLENBQUE7SUFDeEMsQ0FBQyxFQUxXLHVCQUF1QixHQUF2QiwwQ0FBdUIsS0FBdkIsMENBQXVCLFFBS2xDO0FBQ0gsQ0FBQyxFQXRCYSxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBc0IvQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gQHRzLW5vY2hlY2tcbi8vXG4vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEVcbi8vIERPIE5PVCBNT0RJRlkgSVQhIFlPVVIgQ0hBTkdFUyBXSUxMIEJFIExPU1RcbmltcG9ydCB7XG4gIEdycGNNZXNzYWdlLFxuICBSZWN1cnNpdmVQYXJ0aWFsLFxuICBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbn0gZnJvbSAnQG5neC1ncnBjL2NvbW1vbic7XG5pbXBvcnQgeyBCaW5hcnlSZWFkZXIsIEJpbmFyeVdyaXRlciwgQnl0ZVNvdXJjZSB9IGZyb20gJ2dvb2dsZS1wcm90b2J1Zic7XG5pbXBvcnQgKiBhcyBnb29nbGVBcGkwMDAgZnJvbSAnLi4vLi4vZ29vZ2xlL2FwaS9odHRwLnBiJztcbmltcG9ydCAqIGFzIGdvb2dsZVByb3RvYnVmMDAxIGZyb20gJ0BuZ3gtZ3JwYy93ZWxsLWtub3duLXR5cGVzJztcbmltcG9ydCAqIGFzIGdvb2dsZUFwaTAwMiBmcm9tICcuLi8uLi9nb29nbGUvYXBpL2Fubm90YXRpb25zLnBiJztcbmltcG9ydCAqIGFzIGdvb2dsZVByb3RvYnVmMDAzIGZyb20gJ0BuZ3gtZ3JwYy93ZWxsLWtub3duLXR5cGVzJztcbmltcG9ydCAqIGFzIGdvb2dsZVByb3RvYnVmMDA0IGZyb20gJ0BuZ3gtZ3JwYy93ZWxsLWtub3duLXR5cGVzJztcbmltcG9ydCAqIGFzIGdvb2dsZVJwYzAwNSBmcm9tICcuLi8uLi9nb29nbGUvcnBjL3N0YXR1cy5wYic7XG5pbXBvcnQgKiBhcyBnb29nbGVQcm90b2J1ZjAwNiBmcm9tICdAbmd4LWdycGMvd2VsbC1rbm93bi10eXBlcyc7XG5pbXBvcnQgKiBhcyBvbmRld29ObHUwMDcgZnJvbSAnLi4vLi4vb25kZXdvL25sdS9vcGVyYXRpb24tbWV0YWRhdGEucGInO1xuaW1wb3J0ICogYXMgZ29vZ2xlUHJvdG9idWYwMDggZnJvbSAnQG5neC1ncnBjL3dlbGwta25vd24tdHlwZXMnO1xuaW1wb3J0ICogYXMgb25kZXdvTmx1MDA5IGZyb20gJy4uLy4uL29uZGV3by9ubHUvY29tbW9uLnBiJztcbmltcG9ydCAqIGFzIG9uZGV3b05sdTAxMCBmcm9tICcuLi8uLi9vbmRld28vbmx1L29wZXJhdGlvbnMucGInO1xuZXhwb3J0IGVudW0gRW50aXR5VHlwZVZpZXcge1xuICBFTlRJVFlfVFlQRV9WSUVXX1VOU1BFQ0lGSUVEID0gMCxcbiAgRU5USVRZX1RZUEVfVklFV19GVUxMID0gMSxcbiAgRU5USVRZX1RZUEVfVklFV19QQVJUSUFMID0gMixcbiAgRU5USVRZX1RZUEVfVklFV19TSEFMTE9XID0gM1xufVxuZXhwb3J0IGVudW0gRW50aXR5VHlwZUNhdGVnb3J5IHtcbiAgQUxMX0VOVElUWV9UWVBFUyA9IDAsXG4gIERFRkFVTFRfRU5USVRZX1RZUEVTID0gMSxcbiAgVVNFUl9ERUZJTkVEX0VOVElUWV9UWVBFUyA9IDJcbn1cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5FbnRpdHlUeXBlXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnRpdHlUeXBlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5FbnRpdHlUeXBlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRW50aXR5VHlwZSgpO1xuICAgIEVudGl0eVR5cGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBFbnRpdHlUeXBlKSB7XG4gICAgX2luc3RhbmNlLm5hbWUgPSBfaW5zdGFuY2UubmFtZSB8fCAnJztcbiAgICBfaW5zdGFuY2UuZGlzcGxheU5hbWUgPSBfaW5zdGFuY2UuZGlzcGxheU5hbWUgfHwgJyc7XG4gICAgX2luc3RhbmNlLmtpbmQgPSBfaW5zdGFuY2Uua2luZCB8fCAwO1xuICAgIF9pbnN0YW5jZS5hdXRvRXhwYW5zaW9uTW9kZSA9IF9pbnN0YW5jZS5hdXRvRXhwYW5zaW9uTW9kZSB8fCAwO1xuICAgIF9pbnN0YW5jZS5lbnRpdGllcyA9IF9pbnN0YW5jZS5lbnRpdGllcyB8fCBbXTtcbiAgICBfaW5zdGFuY2UubmV4dFBhZ2VUb2tlbiA9IF9pbnN0YW5jZS5uZXh0UGFnZVRva2VuIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5lbnRpdHlDb3VudCA9IF9pbnN0YW5jZS5lbnRpdHlDb3VudCB8fCAwO1xuICAgIF9pbnN0YW5jZS5zdGF0dXMgPSBfaW5zdGFuY2Uuc3RhdHVzIHx8IDA7XG4gICAgX2luc3RhbmNlLnN5bm9ueW1Db3VudCA9IF9pbnN0YW5jZS5zeW5vbnltQ291bnQgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IEVudGl0eVR5cGUsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLm5hbWUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5kaXNwbGF5TmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgX2luc3RhbmNlLmtpbmQgPSBfcmVhZGVyLnJlYWRFbnVtKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBfaW5zdGFuY2UuYXV0b0V4cGFuc2lvbk1vZGUgPSBfcmVhZGVyLnJlYWRFbnVtKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXI2ID0gbmV3IEVudGl0eVR5cGUuRW50aXR5KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjYsXG4gICAgICAgICAgICBFbnRpdHlUeXBlLkVudGl0eS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UuZW50aXRpZXMgPSBfaW5zdGFuY2UuZW50aXRpZXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXI2XG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBfaW5zdGFuY2UubmV4dFBhZ2VUb2tlbiA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlDb3VudCA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgX2luc3RhbmNlLnN0YXR1cyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3lub255bUNvdW50ID0gX3JlYWRlci5yZWFkSW50MzIoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEVudGl0eVR5cGUucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoX2luc3RhbmNlOiBFbnRpdHlUeXBlLCBfd3JpdGVyOiBCaW5hcnlXcml0ZXIpIHtcbiAgICBpZiAoX2luc3RhbmNlLm5hbWUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLm5hbWUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmRpc3BsYXlOYW1lKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5kaXNwbGF5TmFtZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uua2luZCkge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oMywgX2luc3RhbmNlLmtpbmQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmF1dG9FeHBhbnNpb25Nb2RlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlRW51bSg0LCBfaW5zdGFuY2UuYXV0b0V4cGFuc2lvbk1vZGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmVudGl0aWVzICYmIF9pbnN0YW5jZS5lbnRpdGllcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDYsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdGllcyBhcyBhbnksXG4gICAgICAgIEVudGl0eVR5cGUuRW50aXR5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLm5leHRQYWdlVG9rZW4pIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMTAsIF9pbnN0YW5jZS5uZXh0UGFnZVRva2VuKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlDb3VudCkge1xuICAgICAgX3dyaXRlci53cml0ZUludDMyKDExLCBfaW5zdGFuY2UuZW50aXR5Q291bnQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnN0YXR1cykge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oMTIsIF9pbnN0YW5jZS5zdGF0dXMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnN5bm9ueW1Db3VudCkge1xuICAgICAgX3dyaXRlci53cml0ZUludDMyKDEzLCBfaW5zdGFuY2Uuc3lub255bUNvdW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9uYW1lPzogc3RyaW5nO1xuICBwcml2YXRlIF9kaXNwbGF5TmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfa2luZD86IEVudGl0eVR5cGUuS2luZDtcbiAgcHJpdmF0ZSBfYXV0b0V4cGFuc2lvbk1vZGU/OiBFbnRpdHlUeXBlLkF1dG9FeHBhbnNpb25Nb2RlO1xuICBwcml2YXRlIF9lbnRpdGllcz86IEVudGl0eVR5cGUuRW50aXR5W107XG4gIHByaXZhdGUgX25leHRQYWdlVG9rZW4/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2VudGl0eUNvdW50PzogbnVtYmVyO1xuICBwcml2YXRlIF9zdGF0dXM/OiBFbnRpdHlUeXBlLkVudGl0eVR5cGVTdGF0dXM7XG4gIHByaXZhdGUgX3N5bm9ueW1Db3VudD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEVudGl0eVR5cGUgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8RW50aXR5VHlwZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5uYW1lID0gX3ZhbHVlLm5hbWU7XG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IF92YWx1ZS5kaXNwbGF5TmFtZTtcbiAgICB0aGlzLmtpbmQgPSBfdmFsdWUua2luZDtcbiAgICB0aGlzLmF1dG9FeHBhbnNpb25Nb2RlID0gX3ZhbHVlLmF1dG9FeHBhbnNpb25Nb2RlO1xuICAgIHRoaXMuZW50aXRpZXMgPSAoX3ZhbHVlLmVudGl0aWVzIHx8IFtdKS5tYXAobSA9PiBuZXcgRW50aXR5VHlwZS5FbnRpdHkobSkpO1xuICAgIHRoaXMubmV4dFBhZ2VUb2tlbiA9IF92YWx1ZS5uZXh0UGFnZVRva2VuO1xuICAgIHRoaXMuZW50aXR5Q291bnQgPSBfdmFsdWUuZW50aXR5Q291bnQ7XG4gICAgdGhpcy5zdGF0dXMgPSBfdmFsdWUuc3RhdHVzO1xuICAgIHRoaXMuc3lub255bUNvdW50ID0gX3ZhbHVlLnN5bm9ueW1Db3VudDtcbiAgICBFbnRpdHlUeXBlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgbmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG4gIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9uYW1lID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGRpc3BsYXlOYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BsYXlOYW1lO1xuICB9XG4gIHNldCBkaXNwbGF5TmFtZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZGlzcGxheU5hbWUgPSB2YWx1ZTtcbiAgfVxuICBnZXQga2luZCgpOiBFbnRpdHlUeXBlLktpbmQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9raW5kO1xuICB9XG4gIHNldCBraW5kKHZhbHVlOiBFbnRpdHlUeXBlLktpbmQgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9raW5kID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGF1dG9FeHBhbnNpb25Nb2RlKCk6IEVudGl0eVR5cGUuQXV0b0V4cGFuc2lvbk1vZGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hdXRvRXhwYW5zaW9uTW9kZTtcbiAgfVxuICBzZXQgYXV0b0V4cGFuc2lvbk1vZGUodmFsdWU6IEVudGl0eVR5cGUuQXV0b0V4cGFuc2lvbk1vZGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9hdXRvRXhwYW5zaW9uTW9kZSA9IHZhbHVlO1xuICB9XG4gIGdldCBlbnRpdGllcygpOiBFbnRpdHlUeXBlLkVudGl0eVtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZW50aXRpZXM7XG4gIH1cbiAgc2V0IGVudGl0aWVzKHZhbHVlOiBFbnRpdHlUeXBlLkVudGl0eVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXRpZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbmV4dFBhZ2VUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9uZXh0UGFnZVRva2VuO1xuICB9XG4gIHNldCBuZXh0UGFnZVRva2VuKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9uZXh0UGFnZVRva2VuID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGVudGl0eUNvdW50KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eUNvdW50O1xuICB9XG4gIHNldCBlbnRpdHlDb3VudCh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXR5Q291bnQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3RhdHVzKCk6IEVudGl0eVR5cGUuRW50aXR5VHlwZVN0YXR1cyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgfVxuICBzZXQgc3RhdHVzKHZhbHVlOiBFbnRpdHlUeXBlLkVudGl0eVR5cGVTdGF0dXMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zdGF0dXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3lub255bUNvdW50KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3N5bm9ueW1Db3VudDtcbiAgfVxuICBzZXQgc3lub255bUNvdW50KHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zeW5vbnltQ291bnQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBFbnRpdHlUeXBlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEVudGl0eVR5cGUuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBkaXNwbGF5TmFtZTogdGhpcy5kaXNwbGF5TmFtZSxcbiAgICAgIGtpbmQ6IHRoaXMua2luZCxcbiAgICAgIGF1dG9FeHBhbnNpb25Nb2RlOiB0aGlzLmF1dG9FeHBhbnNpb25Nb2RlLFxuICAgICAgZW50aXRpZXM6ICh0aGlzLmVudGl0aWVzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpLFxuICAgICAgbmV4dFBhZ2VUb2tlbjogdGhpcy5uZXh0UGFnZVRva2VuLFxuICAgICAgZW50aXR5Q291bnQ6IHRoaXMuZW50aXR5Q291bnQsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgc3lub255bUNvdW50OiB0aGlzLnN5bm9ueW1Db3VudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEVudGl0eVR5cGUuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBkaXNwbGF5TmFtZTogdGhpcy5kaXNwbGF5TmFtZSxcbiAgICAgIGtpbmQ6XG4gICAgICAgIEVudGl0eVR5cGUuS2luZFtcbiAgICAgICAgICB0aGlzLmtpbmQgPT09IG51bGwgfHwgdGhpcy5raW5kID09PSB1bmRlZmluZWQgPyAwIDogdGhpcy5raW5kXG4gICAgICAgIF0sXG4gICAgICBhdXRvRXhwYW5zaW9uTW9kZTpcbiAgICAgICAgRW50aXR5VHlwZS5BdXRvRXhwYW5zaW9uTW9kZVtcbiAgICAgICAgICB0aGlzLmF1dG9FeHBhbnNpb25Nb2RlID09PSBudWxsIHx8XG4gICAgICAgICAgdGhpcy5hdXRvRXhwYW5zaW9uTW9kZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogdGhpcy5hdXRvRXhwYW5zaW9uTW9kZVxuICAgICAgICBdLFxuICAgICAgZW50aXRpZXM6ICh0aGlzLmVudGl0aWVzIHx8IFtdKS5tYXAobSA9PiBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpKSxcbiAgICAgIG5leHRQYWdlVG9rZW46IHRoaXMubmV4dFBhZ2VUb2tlbixcbiAgICAgIGVudGl0eUNvdW50OiB0aGlzLmVudGl0eUNvdW50LFxuICAgICAgc3RhdHVzOlxuICAgICAgICBFbnRpdHlUeXBlLkVudGl0eVR5cGVTdGF0dXNbXG4gICAgICAgICAgdGhpcy5zdGF0dXMgPT09IG51bGwgfHwgdGhpcy5zdGF0dXMgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLnN0YXR1c1xuICAgICAgICBdLFxuICAgICAgc3lub255bUNvdW50OiB0aGlzLnN5bm9ueW1Db3VudFxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgRW50aXR5VHlwZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgRW50aXR5VHlwZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgICBraW5kPzogRW50aXR5VHlwZS5LaW5kO1xuICAgIGF1dG9FeHBhbnNpb25Nb2RlPzogRW50aXR5VHlwZS5BdXRvRXhwYW5zaW9uTW9kZTtcbiAgICBlbnRpdGllcz86IEVudGl0eVR5cGUuRW50aXR5LkFzT2JqZWN0W107XG4gICAgbmV4dFBhZ2VUb2tlbj86IHN0cmluZztcbiAgICBlbnRpdHlDb3VudD86IG51bWJlcjtcbiAgICBzdGF0dXM/OiBFbnRpdHlUeXBlLkVudGl0eVR5cGVTdGF0dXM7XG4gICAgc3lub255bUNvdW50PzogbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEVudGl0eVR5cGVcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAga2luZD86IHN0cmluZztcbiAgICBhdXRvRXhwYW5zaW9uTW9kZT86IHN0cmluZztcbiAgICBlbnRpdGllcz86IEVudGl0eVR5cGUuRW50aXR5LkFzUHJvdG9idWZKU09OW10gfCBudWxsO1xuICAgIG5leHRQYWdlVG9rZW4/OiBzdHJpbmc7XG4gICAgZW50aXR5Q291bnQ/OiBudW1iZXI7XG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIHN5bm9ueW1Db3VudD86IG51bWJlcjtcbiAgfVxuICBleHBvcnQgZW51bSBLaW5kIHtcbiAgICBLSU5EX1VOU1BFQ0lGSUVEID0gMCxcbiAgICBLSU5EX01BUCA9IDEsXG4gICAgS0lORF9MSVNUID0gMlxuICB9XG4gIGV4cG9ydCBlbnVtIEVudGl0eVR5cGVTdGF0dXMge1xuICAgIEFDVElWRSA9IDAsXG4gICAgSU5BQ1RJVkUgPSAxXG4gIH1cbiAgZXhwb3J0IGVudW0gQXV0b0V4cGFuc2lvbk1vZGUge1xuICAgIEFVVE9fRVhQQU5TSU9OX01PREVfVU5TUEVDSUZJRUQgPSAwLFxuICAgIEFVVE9fRVhQQU5TSU9OX01PREVfREVGQVVMVCA9IDFcbiAgfVxuICAvKipcbiAgICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5FbnRpdHlcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBFbnRpdHkgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuRW50aXR5JztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRW50aXR5KCk7XG4gICAgICBFbnRpdHkuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEVudGl0eSkge1xuICAgICAgX2luc3RhbmNlLnZhbHVlID0gX2luc3RhbmNlLnZhbHVlIHx8ICcnO1xuICAgICAgX2luc3RhbmNlLnN5bm9ueW1zID0gX2luc3RhbmNlLnN5bm9ueW1zIHx8IFtdO1xuICAgICAgX2luc3RhbmNlLm5hbWUgPSBfaW5zdGFuY2UubmFtZSB8fCAnJztcbiAgICAgIF9pbnN0YW5jZS5kaXNwbGF5TmFtZSA9IF9pbnN0YW5jZS5kaXNwbGF5TmFtZSB8fCAnJztcbiAgICAgIF9pbnN0YW5jZS5zeW5vbnltQ291bnQgPSBfaW5zdGFuY2Uuc3lub255bUNvdW50IHx8IDA7XG4gICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX2luc3RhbmNlLmxhbmd1YWdlQ29kZSB8fCAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgX2luc3RhbmNlOiBFbnRpdHksXG4gICAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgICApIHtcbiAgICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBfaW5zdGFuY2UudmFsdWUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIChfaW5zdGFuY2Uuc3lub255bXMgPSBfaW5zdGFuY2Uuc3lub255bXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICAgIF9yZWFkZXIucmVhZFN0cmluZygpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgX2luc3RhbmNlLm5hbWUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5kaXNwbGF5TmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgX2luc3RhbmNlLnN5bm9ueW1Db3VudCA9IF9yZWFkZXIucmVhZEludDMyKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBFbnRpdHkucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihfaW5zdGFuY2U6IEVudGl0eSwgX3dyaXRlcjogQmluYXJ5V3JpdGVyKSB7XG4gICAgICBpZiAoX2luc3RhbmNlLnZhbHVlKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2Uuc3lub255bXMgJiYgX2luc3RhbmNlLnN5bm9ueW1zLmxlbmd0aCkge1xuICAgICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoMiwgX2luc3RhbmNlLnN5bm9ueW1zKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2UubmFtZSkge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMsIF9pbnN0YW5jZS5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2UuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg0LCBfaW5zdGFuY2UuZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5zeW5vbnltQ291bnQpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZUludDMyKDUsIF9pbnN0YW5jZS5zeW5vbnltQ291bnQpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg2LCBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF92YWx1ZT86IHN0cmluZztcbiAgICBwcml2YXRlIF9zeW5vbnltcz86IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgX25hbWU/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfc3lub255bUNvdW50PzogbnVtYmVyO1xuICAgIHByaXZhdGUgX2xhbmd1YWdlQ29kZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEVudGl0eSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8RW50aXR5LkFzT2JqZWN0Pikge1xuICAgICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgICAgdGhpcy52YWx1ZSA9IF92YWx1ZS52YWx1ZTtcbiAgICAgIHRoaXMuc3lub255bXMgPSAoX3ZhbHVlLnN5bm9ueW1zIHx8IFtdKS5zbGljZSgpO1xuICAgICAgdGhpcy5uYW1lID0gX3ZhbHVlLm5hbWU7XG4gICAgICB0aGlzLmRpc3BsYXlOYW1lID0gX3ZhbHVlLmRpc3BsYXlOYW1lO1xuICAgICAgdGhpcy5zeW5vbnltQ291bnQgPSBfdmFsdWUuc3lub255bUNvdW50O1xuICAgICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfdmFsdWUubGFuZ3VhZ2VDb2RlO1xuICAgICAgRW50aXR5LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgc3lub255bXMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuX3N5bm9ueW1zO1xuICAgIH1cbiAgICBzZXQgc3lub255bXModmFsdWU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zeW5vbnltcyA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgbmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gICAgfVxuICAgIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX25hbWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IGRpc3BsYXlOYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGxheU5hbWU7XG4gICAgfVxuICAgIHNldCBkaXNwbGF5TmFtZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9kaXNwbGF5TmFtZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgc3lub255bUNvdW50KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fc3lub255bUNvdW50O1xuICAgIH1cbiAgICBzZXQgc3lub255bUNvdW50KHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3N5bm9ueW1Db3VudCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VDb2RlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VDb2RlO1xuICAgIH1cbiAgICBzZXQgbGFuZ3VhZ2VDb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2xhbmd1YWdlQ29kZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgICBFbnRpdHkuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAgICovXG4gICAgdG9PYmplY3QoKTogRW50aXR5LkFzT2JqZWN0IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICBzeW5vbnltczogKHRoaXMuc3lub255bXMgfHwgW10pLnNsaWNlKCksXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuZGlzcGxheU5hbWUsXG4gICAgICAgIHN5bm9ueW1Db3VudDogdGhpcy5zeW5vbnltQ291bnQsXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAgICovXG4gICAgdG9Qcm90b2J1ZkpTT04oXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICAgKTogRW50aXR5LkFzUHJvdG9idWZKU09OIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICBzeW5vbnltczogKHRoaXMuc3lub255bXMgfHwgW10pLnNsaWNlKCksXG4gICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuZGlzcGxheU5hbWUsXG4gICAgICAgIHN5bm9ueW1Db3VudDogdGhpcy5zeW5vbnltQ291bnQsXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGVcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgRW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgRW50aXR5XG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgICB2YWx1ZT86IHN0cmluZztcbiAgICAgIHN5bm9ueW1zPzogc3RyaW5nW107XG4gICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgICBzeW5vbnltQ291bnQ/OiBudW1iZXI7XG4gICAgICBsYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRW50aXR5XG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgICB2YWx1ZT86IHN0cmluZztcbiAgICAgIHN5bm9ueW1zPzogc3RyaW5nW107XG4gICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgICBzeW5vbnltQ291bnQ/OiBudW1iZXI7XG4gICAgICBsYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5MaXN0RW50aXR5VHlwZXNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBMaXN0RW50aXR5VHlwZXNSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5MaXN0RW50aXR5VHlwZXNSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTGlzdEVudGl0eVR5cGVzUmVxdWVzdCgpO1xuICAgIExpc3RFbnRpdHlUeXBlc1JlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBMaXN0RW50aXR5VHlwZXNSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnBhcmVudCA9IF9pbnN0YW5jZS5wYXJlbnQgfHwgJyc7XG4gICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLnBhZ2VUb2tlbiA9IF9pbnN0YW5jZS5wYWdlVG9rZW4gfHwgJyc7XG4gICAgX2luc3RhbmNlLmVudGl0eVR5cGVWaWV3ID0gX2luc3RhbmNlLmVudGl0eVR5cGVWaWV3IHx8IDA7XG4gICAgX2luc3RhbmNlLmZpbHRlckJ5Q2F0ZWdvcnkgPSBfaW5zdGFuY2UuZmlsdGVyQnlDYXRlZ29yeSB8fCAwO1xuICAgIF9pbnN0YW5jZS5zb3J0QnlGaWVsZCA9IF9pbnN0YW5jZS5zb3J0QnlGaWVsZCB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBMaXN0RW50aXR5VHlwZXNSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIF9pbnN0YW5jZS5wYWdlVG9rZW4gPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlVmlldyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9pbnN0YW5jZS5maWx0ZXJCeUNhdGVnb3J5ID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgX2luc3RhbmNlLnNvcnRCeUZpZWxkID0gbmV3IEVudGl0eVR5cGVTb3J0aW5nKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5zb3J0QnlGaWVsZCxcbiAgICAgICAgICAgIEVudGl0eVR5cGVTb3J0aW5nLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBMaXN0RW50aXR5VHlwZXNSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogTGlzdEVudGl0eVR5cGVzUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5wYXJlbnQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLnBhcmVudCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnBhZ2VUb2tlbikge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg0LCBfaW5zdGFuY2UucGFnZVRva2VuKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlUeXBlVmlldykge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oNSwgX2luc3RhbmNlLmVudGl0eVR5cGVWaWV3KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5maWx0ZXJCeUNhdGVnb3J5KSB7XG4gICAgICBfd3JpdGVyLndyaXRlRW51bSg2LCBfaW5zdGFuY2UuZmlsdGVyQnlDYXRlZ29yeSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc29ydEJ5RmllbGQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICA3LFxuICAgICAgICBfaW5zdGFuY2Uuc29ydEJ5RmllbGQgYXMgYW55LFxuICAgICAgICBFbnRpdHlUeXBlU29ydGluZy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2xhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfcGFnZVRva2VuPzogc3RyaW5nO1xuICBwcml2YXRlIF9lbnRpdHlUeXBlVmlldz86IEVudGl0eVR5cGVWaWV3O1xuICBwcml2YXRlIF9maWx0ZXJCeUNhdGVnb3J5PzogRW50aXR5VHlwZUNhdGVnb3J5O1xuICBwcml2YXRlIF9zb3J0QnlGaWVsZD86IEVudGl0eVR5cGVTb3J0aW5nO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgTGlzdEVudGl0eVR5cGVzUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxMaXN0RW50aXR5VHlwZXNSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnBhcmVudCA9IF92YWx1ZS5wYXJlbnQ7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfdmFsdWUubGFuZ3VhZ2VDb2RlO1xuICAgIHRoaXMucGFnZVRva2VuID0gX3ZhbHVlLnBhZ2VUb2tlbjtcbiAgICB0aGlzLmVudGl0eVR5cGVWaWV3ID0gX3ZhbHVlLmVudGl0eVR5cGVWaWV3O1xuICAgIHRoaXMuZmlsdGVyQnlDYXRlZ29yeSA9IF92YWx1ZS5maWx0ZXJCeUNhdGVnb3J5O1xuICAgIHRoaXMuc29ydEJ5RmllbGQgPSBfdmFsdWUuc29ydEJ5RmllbGRcbiAgICAgID8gbmV3IEVudGl0eVR5cGVTb3J0aW5nKF92YWx1ZS5zb3J0QnlGaWVsZClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIExpc3RFbnRpdHlUeXBlc1JlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBwYXJlbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG4gIHNldCBwYXJlbnQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhcmVudCA9IHZhbHVlO1xuICB9XG4gIGdldCBsYW5ndWFnZUNvZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VDb2RlO1xuICB9XG4gIHNldCBsYW5ndWFnZUNvZGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2xhbmd1YWdlQ29kZSA9IHZhbHVlO1xuICB9XG4gIGdldCBwYWdlVG9rZW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFnZVRva2VuO1xuICB9XG4gIHNldCBwYWdlVG9rZW4odmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhZ2VUb2tlbiA9IHZhbHVlO1xuICB9XG4gIGdldCBlbnRpdHlUeXBlVmlldygpOiBFbnRpdHlUeXBlVmlldyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVWaWV3O1xuICB9XG4gIHNldCBlbnRpdHlUeXBlVmlldyh2YWx1ZTogRW50aXR5VHlwZVZpZXcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdHlUeXBlVmlldyA9IHZhbHVlO1xuICB9XG4gIGdldCBmaWx0ZXJCeUNhdGVnb3J5KCk6IEVudGl0eVR5cGVDYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckJ5Q2F0ZWdvcnk7XG4gIH1cbiAgc2V0IGZpbHRlckJ5Q2F0ZWdvcnkodmFsdWU6IEVudGl0eVR5cGVDYXRlZ29yeSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2ZpbHRlckJ5Q2F0ZWdvcnkgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc29ydEJ5RmllbGQoKTogRW50aXR5VHlwZVNvcnRpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zb3J0QnlGaWVsZDtcbiAgfVxuICBzZXQgc29ydEJ5RmllbGQodmFsdWU6IEVudGl0eVR5cGVTb3J0aW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc29ydEJ5RmllbGQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBMaXN0RW50aXR5VHlwZXNSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IExpc3RFbnRpdHlUeXBlc1JlcXVlc3QuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSxcbiAgICAgIHBhZ2VUb2tlbjogdGhpcy5wYWdlVG9rZW4sXG4gICAgICBlbnRpdHlUeXBlVmlldzogdGhpcy5lbnRpdHlUeXBlVmlldyxcbiAgICAgIGZpbHRlckJ5Q2F0ZWdvcnk6IHRoaXMuZmlsdGVyQnlDYXRlZ29yeSxcbiAgICAgIHNvcnRCeUZpZWxkOiB0aGlzLnNvcnRCeUZpZWxkID8gdGhpcy5zb3J0QnlGaWVsZC50b09iamVjdCgpIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogTGlzdEVudGl0eVR5cGVzUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlLFxuICAgICAgcGFnZVRva2VuOiB0aGlzLnBhZ2VUb2tlbixcbiAgICAgIGVudGl0eVR5cGVWaWV3OlxuICAgICAgICBFbnRpdHlUeXBlVmlld1tcbiAgICAgICAgICB0aGlzLmVudGl0eVR5cGVWaWV3ID09PSBudWxsIHx8IHRoaXMuZW50aXR5VHlwZVZpZXcgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IHRoaXMuZW50aXR5VHlwZVZpZXdcbiAgICAgICAgXSxcbiAgICAgIGZpbHRlckJ5Q2F0ZWdvcnk6XG4gICAgICAgIEVudGl0eVR5cGVDYXRlZ29yeVtcbiAgICAgICAgICB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnkgPT09IG51bGwgfHwgdGhpcy5maWx0ZXJCeUNhdGVnb3J5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiB0aGlzLmZpbHRlckJ5Q2F0ZWdvcnlcbiAgICAgICAgXSxcbiAgICAgIHNvcnRCeUZpZWxkOiB0aGlzLnNvcnRCeUZpZWxkXG4gICAgICAgID8gdGhpcy5zb3J0QnlGaWVsZC50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIExpc3RFbnRpdHlUeXBlc1JlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIExpc3RFbnRpdHlUeXBlc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHBhcmVudD86IHN0cmluZztcbiAgICBsYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gICAgcGFnZVRva2VuPzogc3RyaW5nO1xuICAgIGVudGl0eVR5cGVWaWV3PzogRW50aXR5VHlwZVZpZXc7XG4gICAgZmlsdGVyQnlDYXRlZ29yeT86IEVudGl0eVR5cGVDYXRlZ29yeTtcbiAgICBzb3J0QnlGaWVsZD86IEVudGl0eVR5cGVTb3J0aW5nLkFzT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIExpc3RFbnRpdHlUeXBlc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHBhcmVudD86IHN0cmluZztcbiAgICBsYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gICAgcGFnZVRva2VuPzogc3RyaW5nO1xuICAgIGVudGl0eVR5cGVWaWV3Pzogc3RyaW5nO1xuICAgIGZpbHRlckJ5Q2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgc29ydEJ5RmllbGQ/OiBFbnRpdHlUeXBlU29ydGluZy5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1Lkxpc3RFbnRpdHlUeXBlc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBMaXN0RW50aXR5VHlwZXNSZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuTGlzdEVudGl0eVR5cGVzUmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBMaXN0RW50aXR5VHlwZXNSZXNwb25zZSgpO1xuICAgIExpc3RFbnRpdHlUeXBlc1Jlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogTGlzdEVudGl0eVR5cGVzUmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UuZW50aXR5VHlwZXMgPSBfaW5zdGFuY2UuZW50aXR5VHlwZXMgfHwgW107XG4gICAgX2luc3RhbmNlLm5leHRQYWdlVG9rZW4gPSBfaW5zdGFuY2UubmV4dFBhZ2VUb2tlbiB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IExpc3RFbnRpdHlUeXBlc1Jlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjEgPSBuZXcgRW50aXR5VHlwZSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIxLFxuICAgICAgICAgICAgRW50aXR5VHlwZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UuZW50aXR5VHlwZXMgPSBfaW5zdGFuY2UuZW50aXR5VHlwZXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIxXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5uZXh0UGFnZVRva2VuID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBMaXN0RW50aXR5VHlwZXNSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IExpc3RFbnRpdHlUeXBlc1Jlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmVudGl0eVR5cGVzICYmIF9pbnN0YW5jZS5lbnRpdHlUeXBlcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlcyBhcyBhbnksXG4gICAgICAgIEVudGl0eVR5cGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubmV4dFBhZ2VUb2tlbikge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UubmV4dFBhZ2VUb2tlbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlW107XG4gIHByaXZhdGUgX25leHRQYWdlVG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBMaXN0RW50aXR5VHlwZXNSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxMaXN0RW50aXR5VHlwZXNSZXNwb25zZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5lbnRpdHlUeXBlcyA9IChfdmFsdWUuZW50aXR5VHlwZXMgfHwgW10pLm1hcChtID0+IG5ldyBFbnRpdHlUeXBlKG0pKTtcbiAgICB0aGlzLm5leHRQYWdlVG9rZW4gPSBfdmFsdWUubmV4dFBhZ2VUb2tlbjtcbiAgICBMaXN0RW50aXR5VHlwZXNSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVudGl0eVR5cGVzKCk6IEVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVzO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlcyh2YWx1ZTogRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXR5VHlwZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbmV4dFBhZ2VUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9uZXh0UGFnZVRva2VuO1xuICB9XG4gIHNldCBuZXh0UGFnZVRva2VuKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9uZXh0UGFnZVRva2VuID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgTGlzdEVudGl0eVR5cGVzUmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogTGlzdEVudGl0eVR5cGVzUmVzcG9uc2UuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBlbnRpdHlUeXBlczogKHRoaXMuZW50aXR5VHlwZXMgfHwgW10pLm1hcChtID0+IG0udG9PYmplY3QoKSksXG4gICAgICBuZXh0UGFnZVRva2VuOiB0aGlzLm5leHRQYWdlVG9rZW5cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBMaXN0RW50aXR5VHlwZXNSZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0eVR5cGVzOiAodGhpcy5lbnRpdHlUeXBlcyB8fCBbXSkubWFwKG0gPT4gbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKSksXG4gICAgICBuZXh0UGFnZVRva2VuOiB0aGlzLm5leHRQYWdlVG9rZW5cbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIExpc3RFbnRpdHlUeXBlc1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBMaXN0RW50aXR5VHlwZXNSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlLkFzT2JqZWN0W107XG4gICAgbmV4dFBhZ2VUb2tlbj86IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBMaXN0RW50aXR5VHlwZXNSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlLkFzUHJvdG9idWZKU09OW10gfCBudWxsO1xuICAgIG5leHRQYWdlVG9rZW4/OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkdldEVudGl0eVR5cGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBHZXRFbnRpdHlUeXBlUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuR2V0RW50aXR5VHlwZVJlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBHZXRFbnRpdHlUeXBlUmVxdWVzdCgpO1xuICAgIEdldEVudGl0eVR5cGVSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogR2V0RW50aXR5VHlwZVJlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UubmFtZSA9IF9pbnN0YW5jZS5uYW1lIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgPSBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5wYWdlVG9rZW4gPSBfaW5zdGFuY2UucGFnZVRva2VuIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlVmlldyA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlVmlldyB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogR2V0RW50aXR5VHlwZVJlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLm5hbWUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF9pbnN0YW5jZS5wYWdlVG9rZW4gPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlVmlldyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEdldEVudGl0eVR5cGVSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogR2V0RW50aXR5VHlwZVJlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UubmFtZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UubmFtZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnBhZ2VUb2tlbikge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg1LCBfaW5zdGFuY2UucGFnZVRva2VuKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlUeXBlVmlldykge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oNiwgX2luc3RhbmNlLmVudGl0eVR5cGVWaWV3KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9uYW1lPzogc3RyaW5nO1xuICBwcml2YXRlIF9sYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX3BhZ2VUb2tlbj86IHN0cmluZztcbiAgcHJpdmF0ZSBfZW50aXR5VHlwZVZpZXc/OiBFbnRpdHlUeXBlVmlldztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEdldEVudGl0eVR5cGVSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPEdldEVudGl0eVR5cGVSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLm5hbWUgPSBfdmFsdWUubmFtZTtcbiAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IF92YWx1ZS5sYW5ndWFnZUNvZGU7XG4gICAgdGhpcy5wYWdlVG9rZW4gPSBfdmFsdWUucGFnZVRva2VuO1xuICAgIHRoaXMuZW50aXR5VHlwZVZpZXcgPSBfdmFsdWUuZW50aXR5VHlwZVZpZXc7XG4gICAgR2V0RW50aXR5VHlwZVJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBuYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cbiAgc2V0IG5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX25hbWUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbGFuZ3VhZ2VDb2RlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlQ29kZTtcbiAgfVxuICBzZXQgbGFuZ3VhZ2VDb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9sYW5ndWFnZUNvZGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcGFnZVRva2VuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VUb2tlbjtcbiAgfVxuICBzZXQgcGFnZVRva2VuKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYWdlVG9rZW4gPSB2YWx1ZTtcbiAgfVxuICBnZXQgZW50aXR5VHlwZVZpZXcoKTogRW50aXR5VHlwZVZpZXcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlUeXBlVmlldztcbiAgfVxuICBzZXQgZW50aXR5VHlwZVZpZXcodmFsdWU6IEVudGl0eVR5cGVWaWV3IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXR5VHlwZVZpZXcgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBHZXRFbnRpdHlUeXBlUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBHZXRFbnRpdHlUeXBlUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBwYWdlVG9rZW46IHRoaXMucGFnZVRva2VuLFxuICAgICAgZW50aXR5VHlwZVZpZXc6IHRoaXMuZW50aXR5VHlwZVZpZXdcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBHZXRFbnRpdHlUeXBlUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBwYWdlVG9rZW46IHRoaXMucGFnZVRva2VuLFxuICAgICAgZW50aXR5VHlwZVZpZXc6XG4gICAgICAgIEVudGl0eVR5cGVWaWV3W1xuICAgICAgICAgIHRoaXMuZW50aXR5VHlwZVZpZXcgPT09IG51bGwgfHwgdGhpcy5lbnRpdHlUeXBlVmlldyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogdGhpcy5lbnRpdHlUeXBlVmlld1xuICAgICAgICBdXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBHZXRFbnRpdHlUeXBlUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgR2V0RW50aXR5VHlwZVJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAgIHBhZ2VUb2tlbj86IHN0cmluZztcbiAgICBlbnRpdHlUeXBlVmlldz86IEVudGl0eVR5cGVWaWV3O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEdldEVudGl0eVR5cGVSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICBwYWdlVG9rZW4/OiBzdHJpbmc7XG4gICAgZW50aXR5VHlwZVZpZXc/OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkNyZWF0ZUVudGl0eVR5cGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDcmVhdGVFbnRpdHlUeXBlUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQ3JlYXRlRW50aXR5VHlwZVJlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDcmVhdGVFbnRpdHlUeXBlUmVxdWVzdCgpO1xuICAgIENyZWF0ZUVudGl0eVR5cGVSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ3JlYXRlRW50aXR5VHlwZVJlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UucGFyZW50ID0gX2luc3RhbmNlLnBhcmVudCB8fCAnJztcbiAgICBfaW5zdGFuY2UuZW50aXR5VHlwZSA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX2luc3RhbmNlLmxhbmd1YWdlQ29kZSB8fCAnJztcbiAgICBfaW5zdGFuY2UuZW50aXR5VHlwZVZpZXcgPSBfaW5zdGFuY2UuZW50aXR5VHlwZVZpZXcgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IENyZWF0ZUVudGl0eVR5cGVSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlID0gbmV3IEVudGl0eVR5cGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGUsXG4gICAgICAgICAgICBFbnRpdHlUeXBlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZVZpZXcgPSBfcmVhZGVyLnJlYWRFbnVtKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDcmVhdGVFbnRpdHlUeXBlUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENyZWF0ZUVudGl0eVR5cGVSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnBhcmVudCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UucGFyZW50KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlUeXBlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMixcbiAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGUgYXMgYW55LFxuICAgICAgICBFbnRpdHlUeXBlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmxhbmd1YWdlQ29kZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygzLCBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlUeXBlVmlldykge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oNiwgX2luc3RhbmNlLmVudGl0eVR5cGVWaWV3KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2VudGl0eVR5cGU/OiBFbnRpdHlUeXBlO1xuICBwcml2YXRlIF9sYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2VudGl0eVR5cGVWaWV3PzogRW50aXR5VHlwZVZpZXc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDcmVhdGVFbnRpdHlUeXBlUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDcmVhdGVFbnRpdHlUeXBlUmVxdWVzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5wYXJlbnQgPSBfdmFsdWUucGFyZW50O1xuICAgIHRoaXMuZW50aXR5VHlwZSA9IF92YWx1ZS5lbnRpdHlUeXBlXG4gICAgICA/IG5ldyBFbnRpdHlUeXBlKF92YWx1ZS5lbnRpdHlUeXBlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfdmFsdWUubGFuZ3VhZ2VDb2RlO1xuICAgIHRoaXMuZW50aXR5VHlwZVZpZXcgPSBfdmFsdWUuZW50aXR5VHlwZVZpZXc7XG4gICAgQ3JlYXRlRW50aXR5VHlwZVJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBwYXJlbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG4gIHNldCBwYXJlbnQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BhcmVudCA9IHZhbHVlO1xuICB9XG4gIGdldCBlbnRpdHlUeXBlKCk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlUeXBlO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlKHZhbHVlOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXR5VHlwZSA9IHZhbHVlO1xuICB9XG4gIGdldCBsYW5ndWFnZUNvZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VDb2RlO1xuICB9XG4gIHNldCBsYW5ndWFnZUNvZGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2xhbmd1YWdlQ29kZSA9IHZhbHVlO1xuICB9XG4gIGdldCBlbnRpdHlUeXBlVmlldygpOiBFbnRpdHlUeXBlVmlldyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVWaWV3O1xuICB9XG4gIHNldCBlbnRpdHlUeXBlVmlldyh2YWx1ZTogRW50aXR5VHlwZVZpZXcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdHlUeXBlVmlldyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENyZWF0ZUVudGl0eVR5cGVSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENyZWF0ZUVudGl0eVR5cGVSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGVudGl0eVR5cGU6IHRoaXMuZW50aXR5VHlwZSA/IHRoaXMuZW50aXR5VHlwZS50b09iamVjdCgpIDogdW5kZWZpbmVkLFxuICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSxcbiAgICAgIGVudGl0eVR5cGVWaWV3OiB0aGlzLmVudGl0eVR5cGVWaWV3XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ3JlYXRlRW50aXR5VHlwZVJlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgZW50aXR5VHlwZTogdGhpcy5lbnRpdHlUeXBlXG4gICAgICAgID8gdGhpcy5lbnRpdHlUeXBlLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBlbnRpdHlUeXBlVmlldzpcbiAgICAgICAgRW50aXR5VHlwZVZpZXdbXG4gICAgICAgICAgdGhpcy5lbnRpdHlUeXBlVmlldyA9PT0gbnVsbCB8fCB0aGlzLmVudGl0eVR5cGVWaWV3ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiB0aGlzLmVudGl0eVR5cGVWaWV3XG4gICAgICAgIF1cbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENyZWF0ZUVudGl0eVR5cGVSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBDcmVhdGVFbnRpdHlUeXBlUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgcGFyZW50Pzogc3RyaW5nO1xuICAgIGVudGl0eVR5cGU/OiBFbnRpdHlUeXBlLkFzT2JqZWN0O1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICBlbnRpdHlUeXBlVmlldz86IEVudGl0eVR5cGVWaWV3O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENyZWF0ZUVudGl0eVR5cGVSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgZW50aXR5VHlwZT86IEVudGl0eVR5cGUuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICBlbnRpdHlUeXBlVmlldz86IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuVXBkYXRlRW50aXR5VHlwZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIFVwZGF0ZUVudGl0eVR5cGVSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5VcGRhdGVFbnRpdHlUeXBlUmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFVwZGF0ZUVudGl0eVR5cGVSZXF1ZXN0KCk7XG4gICAgVXBkYXRlRW50aXR5VHlwZVJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBVcGRhdGVFbnRpdHlUeXBlUmVxdWVzdCkge1xuICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlID0gX2luc3RhbmNlLmVudGl0eVR5cGUgfHwgdW5kZWZpbmVkO1xuICAgIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgPSBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlIHx8ICcnO1xuICAgIF9pbnN0YW5jZS51cGRhdGVNYXNrID0gX2luc3RhbmNlLnVwZGF0ZU1hc2sgfHwgdW5kZWZpbmVkO1xuICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlVmlldyA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlVmlldyB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogVXBkYXRlRW50aXR5VHlwZVJlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGUgPSBuZXcgRW50aXR5VHlwZSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZSxcbiAgICAgICAgICAgIEVudGl0eVR5cGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIF9pbnN0YW5jZS51cGRhdGVNYXNrID0gbmV3IGdvb2dsZVByb3RvYnVmMDA4LkZpZWxkTWFzaygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UudXBkYXRlTWFzayxcbiAgICAgICAgICAgIGdvb2dsZVByb3RvYnVmMDA4LkZpZWxkTWFzay5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGVWaWV3ID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgVXBkYXRlRW50aXR5VHlwZVJlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBVcGRhdGVFbnRpdHlUeXBlUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlUeXBlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGUgYXMgYW55LFxuICAgICAgICBFbnRpdHlUeXBlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmxhbmd1YWdlQ29kZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS51cGRhdGVNYXNrKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMyxcbiAgICAgICAgX2luc3RhbmNlLnVwZGF0ZU1hc2sgYXMgYW55LFxuICAgICAgICBnb29nbGVQcm90b2J1ZjAwOC5GaWVsZE1hc2suc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZW50aXR5VHlwZVZpZXcpIHtcbiAgICAgIF93cml0ZXIud3JpdGVFbnVtKDYsIF9pbnN0YW5jZS5lbnRpdHlUeXBlVmlldyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZW50aXR5VHlwZT86IEVudGl0eVR5cGU7XG4gIHByaXZhdGUgX2xhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfdXBkYXRlTWFzaz86IGdvb2dsZVByb3RvYnVmMDA4LkZpZWxkTWFzaztcbiAgcHJpdmF0ZSBfZW50aXR5VHlwZVZpZXc/OiBFbnRpdHlUeXBlVmlldztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFVwZGF0ZUVudGl0eVR5cGVSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFVwZGF0ZUVudGl0eVR5cGVSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmVudGl0eVR5cGUgPSBfdmFsdWUuZW50aXR5VHlwZVxuICAgICAgPyBuZXcgRW50aXR5VHlwZShfdmFsdWUuZW50aXR5VHlwZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMubGFuZ3VhZ2VDb2RlID0gX3ZhbHVlLmxhbmd1YWdlQ29kZTtcbiAgICB0aGlzLnVwZGF0ZU1hc2sgPSBfdmFsdWUudXBkYXRlTWFza1xuICAgICAgPyBuZXcgZ29vZ2xlUHJvdG9idWYwMDguRmllbGRNYXNrKF92YWx1ZS51cGRhdGVNYXNrKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnRpdHlUeXBlVmlldyA9IF92YWx1ZS5lbnRpdHlUeXBlVmlldztcbiAgICBVcGRhdGVFbnRpdHlUeXBlUmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVudGl0eVR5cGUoKTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGU7XG4gIH1cbiAgc2V0IGVudGl0eVR5cGUodmFsdWU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdHlUeXBlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxhbmd1YWdlQ29kZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUNvZGU7XG4gIH1cbiAgc2V0IGxhbmd1YWdlQ29kZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2VDb2RlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHVwZGF0ZU1hc2soKTogZ29vZ2xlUHJvdG9idWYwMDguRmllbGRNYXNrIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlTWFzaztcbiAgfVxuICBzZXQgdXBkYXRlTWFzayh2YWx1ZTogZ29vZ2xlUHJvdG9idWYwMDguRmllbGRNYXNrIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdXBkYXRlTWFzayA9IHZhbHVlO1xuICB9XG4gIGdldCBlbnRpdHlUeXBlVmlldygpOiBFbnRpdHlUeXBlVmlldyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVWaWV3O1xuICB9XG4gIHNldCBlbnRpdHlUeXBlVmlldyh2YWx1ZTogRW50aXR5VHlwZVZpZXcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdHlUeXBlVmlldyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFVwZGF0ZUVudGl0eVR5cGVSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFVwZGF0ZUVudGl0eVR5cGVSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5VHlwZTogdGhpcy5lbnRpdHlUeXBlID8gdGhpcy5lbnRpdHlUeXBlLnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlLFxuICAgICAgdXBkYXRlTWFzazogdGhpcy51cGRhdGVNYXNrID8gdGhpcy51cGRhdGVNYXNrLnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICBlbnRpdHlUeXBlVmlldzogdGhpcy5lbnRpdHlUeXBlVmlld1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFVwZGF0ZUVudGl0eVR5cGVSZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5VHlwZTogdGhpcy5lbnRpdHlUeXBlXG4gICAgICAgID8gdGhpcy5lbnRpdHlUeXBlLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICB1cGRhdGVNYXNrOiB0aGlzLnVwZGF0ZU1hc2tcbiAgICAgICAgPyB0aGlzLnVwZGF0ZU1hc2sudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgOiBudWxsLFxuICAgICAgZW50aXR5VHlwZVZpZXc6XG4gICAgICAgIEVudGl0eVR5cGVWaWV3W1xuICAgICAgICAgIHRoaXMuZW50aXR5VHlwZVZpZXcgPT09IG51bGwgfHwgdGhpcy5lbnRpdHlUeXBlVmlldyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogdGhpcy5lbnRpdHlUeXBlVmlld1xuICAgICAgICBdXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBVcGRhdGVFbnRpdHlUeXBlUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgVXBkYXRlRW50aXR5VHlwZVJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGVudGl0eVR5cGU/OiBFbnRpdHlUeXBlLkFzT2JqZWN0O1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICB1cGRhdGVNYXNrPzogZ29vZ2xlUHJvdG9idWYwMDguRmllbGRNYXNrLkFzT2JqZWN0O1xuICAgIGVudGl0eVR5cGVWaWV3PzogRW50aXR5VHlwZVZpZXc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgVXBkYXRlRW50aXR5VHlwZVJlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGVudGl0eVR5cGU/OiBFbnRpdHlUeXBlLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICBsYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gICAgdXBkYXRlTWFzaz86IGdvb2dsZVByb3RvYnVmMDA4LkZpZWxkTWFzay5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgZW50aXR5VHlwZVZpZXc/OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkRlbGV0ZUVudGl0eVR5cGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWxldGVFbnRpdHlUeXBlUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuRGVsZXRlRW50aXR5VHlwZVJlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBEZWxldGVFbnRpdHlUeXBlUmVxdWVzdCgpO1xuICAgIERlbGV0ZUVudGl0eVR5cGVSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogRGVsZXRlRW50aXR5VHlwZVJlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UubmFtZSA9IF9pbnN0YW5jZS5uYW1lIHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogRGVsZXRlRW50aXR5VHlwZVJlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLm5hbWUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIERlbGV0ZUVudGl0eVR5cGVSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogRGVsZXRlRW50aXR5VHlwZVJlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UubmFtZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIERlbGV0ZUVudGl0eVR5cGVSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPERlbGV0ZUVudGl0eVR5cGVSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLm5hbWUgPSBfdmFsdWUubmFtZTtcbiAgICBEZWxldGVFbnRpdHlUeXBlUmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuICBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIERlbGV0ZUVudGl0eVR5cGVSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IERlbGV0ZUVudGl0eVR5cGVSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5uYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogRGVsZXRlRW50aXR5VHlwZVJlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWVcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIERlbGV0ZUVudGl0eVR5cGVSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBEZWxldGVFbnRpdHlUeXBlUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBEZWxldGVFbnRpdHlUeXBlUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1JlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5CYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXF1ZXN0KCk7XG4gICAgQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1JlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVxdWVzdCkge1xuICAgIF9pbnN0YW5jZS5wYXJlbnQgPSBfaW5zdGFuY2UucGFyZW50IHx8ICcnO1xuXG4gICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLnVwZGF0ZU1hc2sgPSBfaW5zdGFuY2UudXBkYXRlTWFzayB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucGFyZW50ID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZUJhdGNoVXJpID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZUJhdGNoSW5saW5lID0gbmV3IEVudGl0eVR5cGVCYXRjaCgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZUJhdGNoSW5saW5lLFxuICAgICAgICAgICAgRW50aXR5VHlwZUJhdGNoLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBfaW5zdGFuY2UudXBkYXRlTWFzayA9IG5ldyBnb29nbGVQcm90b2J1ZjAwOC5GaWVsZE1hc2soKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnVwZGF0ZU1hc2ssXG4gICAgICAgICAgICBnb29nbGVQcm90b2J1ZjAwOC5GaWVsZE1hc2suZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1JlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5wYXJlbnQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmVudGl0eVR5cGVCYXRjaFVyaSB8fCBfaW5zdGFuY2UuZW50aXR5VHlwZUJhdGNoVXJpID09PSAnJykge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UuZW50aXR5VHlwZUJhdGNoVXJpKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlUeXBlQmF0Y2hJbmxpbmUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAzLFxuICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZUJhdGNoSW5saW5lIGFzIGFueSxcbiAgICAgICAgRW50aXR5VHlwZUJhdGNoLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmxhbmd1YWdlQ29kZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg0LCBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS51cGRhdGVNYXNrKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgNSxcbiAgICAgICAgX2luc3RhbmNlLnVwZGF0ZU1hc2sgYXMgYW55LFxuICAgICAgICBnb29nbGVQcm90b2J1ZjAwOC5GaWVsZE1hc2suc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyZW50Pzogc3RyaW5nO1xuICBwcml2YXRlIF9lbnRpdHlUeXBlQmF0Y2hVcmk/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2VudGl0eVR5cGVCYXRjaElubGluZT86IEVudGl0eVR5cGVCYXRjaDtcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICBwcml2YXRlIF91cGRhdGVNYXNrPzogZ29vZ2xlUHJvdG9idWYwMDguRmllbGRNYXNrO1xuXG4gIHByaXZhdGUgX2VudGl0eVR5cGVCYXRjaDogQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1JlcXVlc3QuRW50aXR5VHlwZUJhdGNoQ2FzZSA9XG4gICAgQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1JlcXVlc3QuRW50aXR5VHlwZUJhdGNoQ2FzZS5ub25lO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1JlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8QmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1JlcXVlc3QuQXNPYmplY3Q+XG4gICkge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnBhcmVudCA9IF92YWx1ZS5wYXJlbnQ7XG4gICAgdGhpcy5lbnRpdHlUeXBlQmF0Y2hVcmkgPSBfdmFsdWUuZW50aXR5VHlwZUJhdGNoVXJpO1xuICAgIHRoaXMuZW50aXR5VHlwZUJhdGNoSW5saW5lID0gX3ZhbHVlLmVudGl0eVR5cGVCYXRjaElubGluZVxuICAgICAgPyBuZXcgRW50aXR5VHlwZUJhdGNoKF92YWx1ZS5lbnRpdHlUeXBlQmF0Y2hJbmxpbmUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IF92YWx1ZS5sYW5ndWFnZUNvZGU7XG4gICAgdGhpcy51cGRhdGVNYXNrID0gX3ZhbHVlLnVwZGF0ZU1hc2tcbiAgICAgID8gbmV3IGdvb2dsZVByb3RvYnVmMDA4LkZpZWxkTWFzayhfdmFsdWUudXBkYXRlTWFzaylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgcGFyZW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuICBzZXQgcGFyZW50KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYXJlbnQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZW50aXR5VHlwZUJhdGNoVXJpKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVCYXRjaFVyaTtcbiAgfVxuICBzZXQgZW50aXR5VHlwZUJhdGNoVXJpKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fZW50aXR5VHlwZUJhdGNoSW5saW5lID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZW50aXR5VHlwZUJhdGNoID1cbiAgICAgICAgQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1JlcXVlc3QuRW50aXR5VHlwZUJhdGNoQ2FzZS5lbnRpdHlUeXBlQmF0Y2hVcmk7XG4gICAgfVxuICAgIHRoaXMuX2VudGl0eVR5cGVCYXRjaFVyaSA9IHZhbHVlO1xuICB9XG4gIGdldCBlbnRpdHlUeXBlQmF0Y2hJbmxpbmUoKTogRW50aXR5VHlwZUJhdGNoIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZW50aXR5VHlwZUJhdGNoSW5saW5lO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlQmF0Y2hJbmxpbmUodmFsdWU6IEVudGl0eVR5cGVCYXRjaCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9lbnRpdHlUeXBlQmF0Y2hVcmkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9lbnRpdHlUeXBlQmF0Y2ggPVxuICAgICAgICBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVxdWVzdC5FbnRpdHlUeXBlQmF0Y2hDYXNlLmVudGl0eVR5cGVCYXRjaElubGluZTtcbiAgICB9XG4gICAgdGhpcy5fZW50aXR5VHlwZUJhdGNoSW5saW5lID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxhbmd1YWdlQ29kZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUNvZGU7XG4gIH1cbiAgc2V0IGxhbmd1YWdlQ29kZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2VDb2RlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHVwZGF0ZU1hc2soKTogZ29vZ2xlUHJvdG9idWYwMDguRmllbGRNYXNrIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlTWFzaztcbiAgfVxuICBzZXQgdXBkYXRlTWFzayh2YWx1ZTogZ29vZ2xlUHJvdG9idWYwMDguRmllbGRNYXNrIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdXBkYXRlTWFzayA9IHZhbHVlO1xuICB9XG4gIGdldCBlbnRpdHlUeXBlQmF0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVCYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBlbnRpdHlUeXBlQmF0Y2hVcmk6IHRoaXMuZW50aXR5VHlwZUJhdGNoVXJpLFxuICAgICAgZW50aXR5VHlwZUJhdGNoSW5saW5lOiB0aGlzLmVudGl0eVR5cGVCYXRjaElubGluZVxuICAgICAgICA/IHRoaXMuZW50aXR5VHlwZUJhdGNoSW5saW5lLnRvT2JqZWN0KClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlLFxuICAgICAgdXBkYXRlTWFzazogdGhpcy51cGRhdGVNYXNrID8gdGhpcy51cGRhdGVNYXNrLnRvT2JqZWN0KCkgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcy5wYXJlbnQsXG4gICAgICBlbnRpdHlUeXBlQmF0Y2hVcmk6XG4gICAgICAgIHRoaXMuZW50aXR5VHlwZUJhdGNoVXJpID09PSBudWxsIHx8XG4gICAgICAgIHRoaXMuZW50aXR5VHlwZUJhdGNoVXJpID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHRoaXMuZW50aXR5VHlwZUJhdGNoVXJpLFxuICAgICAgZW50aXR5VHlwZUJhdGNoSW5saW5lOiB0aGlzLmVudGl0eVR5cGVCYXRjaElubGluZVxuICAgICAgICA/IHRoaXMuZW50aXR5VHlwZUJhdGNoSW5saW5lLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICB1cGRhdGVNYXNrOiB0aGlzLnVwZGF0ZU1hc2tcbiAgICAgICAgPyB0aGlzLnVwZGF0ZU1hc2sudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgOiBudWxsXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHBhcmVudD86IHN0cmluZztcbiAgICBlbnRpdHlUeXBlQmF0Y2hVcmk/OiBzdHJpbmc7XG4gICAgZW50aXR5VHlwZUJhdGNoSW5saW5lPzogRW50aXR5VHlwZUJhdGNoLkFzT2JqZWN0O1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICB1cGRhdGVNYXNrPzogZ29vZ2xlUHJvdG9idWYwMDguRmllbGRNYXNrLkFzT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgZW50aXR5VHlwZUJhdGNoVXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgICBlbnRpdHlUeXBlQmF0Y2hJbmxpbmU/OiBFbnRpdHlUeXBlQmF0Y2guQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgIGxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICB1cGRhdGVNYXNrPzogZ29vZ2xlUHJvdG9idWYwMDguRmllbGRNYXNrLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgfVxuICBleHBvcnQgZW51bSBFbnRpdHlUeXBlQmF0Y2hDYXNlIHtcbiAgICBub25lID0gMCxcbiAgICBlbnRpdHlUeXBlQmF0Y2hVcmkgPSAxLFxuICAgIGVudGl0eVR5cGVCYXRjaElubGluZSA9IDJcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXNwb25zZSgpO1xuICAgIEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlcyA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIxID0gbmV3IEVudGl0eVR5cGUoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIEVudGl0eVR5cGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICAoX2luc3RhbmNlLmVudGl0eVR5cGVzID0gX2luc3RhbmNlLmVudGl0eVR5cGVzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVzcG9uc2UucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuZW50aXR5VHlwZXMgJiYgX2luc3RhbmNlLmVudGl0eVR5cGVzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGVzIGFzIGFueSxcbiAgICAgICAgRW50aXR5VHlwZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9lbnRpdHlUeXBlcz86IEVudGl0eVR5cGVbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVzcG9uc2UuQXNPYmplY3Q+XG4gICkge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmVudGl0eVR5cGVzID0gKF92YWx1ZS5lbnRpdHlUeXBlcyB8fCBbXSkubWFwKG0gPT4gbmV3IEVudGl0eVR5cGUobSkpO1xuICAgIEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVudGl0eVR5cGVzKCk6IEVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVzO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlcyh2YWx1ZTogRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXR5VHlwZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1Jlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5VHlwZXM6ICh0aGlzLmVudGl0eVR5cGVzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1Jlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5VHlwZXM6ICh0aGlzLmVudGl0eVR5cGVzIHx8IFtdKS5tYXAobSA9PiBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQmF0Y2hVcGRhdGVFbnRpdHlUeXBlc1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBCYXRjaFVwZGF0ZUVudGl0eVR5cGVzUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGVudGl0eVR5cGVzPzogRW50aXR5VHlwZS5Bc09iamVjdFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEJhdGNoVXBkYXRlRW50aXR5VHlwZXNSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlLkFzUHJvdG9idWZKU09OW10gfCBudWxsO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5CYXRjaERlbGV0ZUVudGl0eVR5cGVzUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgQmF0Y2hEZWxldGVFbnRpdHlUeXBlc1JlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkJhdGNoRGVsZXRlRW50aXR5VHlwZXNSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQmF0Y2hEZWxldGVFbnRpdHlUeXBlc1JlcXVlc3QoKTtcbiAgICBCYXRjaERlbGV0ZUVudGl0eVR5cGVzUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEJhdGNoRGVsZXRlRW50aXR5VHlwZXNSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnBhcmVudCA9IF9pbnN0YW5jZS5wYXJlbnQgfHwgJyc7XG4gICAgX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lcyA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBCYXRjaERlbGV0ZUVudGl0eVR5cGVzUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UucGFyZW50ID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAoX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lcyA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBCYXRjaERlbGV0ZUVudGl0eVR5cGVzUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEJhdGNoRGVsZXRlRW50aXR5VHlwZXNSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnBhcmVudCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UucGFyZW50KTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZXMgJiYgX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZygyLCBfaW5zdGFuY2UuZW50aXR5VHlwZU5hbWVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJlbnQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2VudGl0eVR5cGVOYW1lcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQmF0Y2hEZWxldGVFbnRpdHlUeXBlc1JlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8QmF0Y2hEZWxldGVFbnRpdHlUeXBlc1JlcXVlc3QuQXNPYmplY3Q+XG4gICkge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnBhcmVudCA9IF92YWx1ZS5wYXJlbnQ7XG4gICAgdGhpcy5lbnRpdHlUeXBlTmFtZXMgPSAoX3ZhbHVlLmVudGl0eVR5cGVOYW1lcyB8fCBbXSkuc2xpY2UoKTtcbiAgICBCYXRjaERlbGV0ZUVudGl0eVR5cGVzUmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHBhcmVudCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gIH1cbiAgc2V0IHBhcmVudCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGFyZW50ID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGVudGl0eVR5cGVOYW1lcygpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVOYW1lcztcbiAgfVxuICBzZXQgZW50aXR5VHlwZU5hbWVzKHZhbHVlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2VudGl0eVR5cGVOYW1lcyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIEJhdGNoRGVsZXRlRW50aXR5VHlwZXNSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEJhdGNoRGVsZXRlRW50aXR5VHlwZXNSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50OiB0aGlzLnBhcmVudCxcbiAgICAgIGVudGl0eVR5cGVOYW1lczogKHRoaXMuZW50aXR5VHlwZU5hbWVzIHx8IFtdKS5zbGljZSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQmF0Y2hEZWxldGVFbnRpdHlUeXBlc1JlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBwYXJlbnQ6IHRoaXMucGFyZW50LFxuICAgICAgZW50aXR5VHlwZU5hbWVzOiAodGhpcy5lbnRpdHlUeXBlTmFtZXMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEJhdGNoRGVsZXRlRW50aXR5VHlwZXNSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBCYXRjaERlbGV0ZUVudGl0eVR5cGVzUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgcGFyZW50Pzogc3RyaW5nO1xuICAgIGVudGl0eVR5cGVOYW1lcz86IHN0cmluZ1tdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEJhdGNoRGVsZXRlRW50aXR5VHlwZXNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgZW50aXR5VHlwZU5hbWVzPzogc3RyaW5nW107XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkVudGl0eVR5cGVCYXRjaFxuICovXG5leHBvcnQgY2xhc3MgRW50aXR5VHlwZUJhdGNoIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5FbnRpdHlUeXBlQmF0Y2gnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBFbnRpdHlUeXBlQmF0Y2goKTtcbiAgICBFbnRpdHlUeXBlQmF0Y2guZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBFbnRpdHlUeXBlQmF0Y2gpIHtcbiAgICBfaW5zdGFuY2UuZW50aXR5VHlwZXMgPSBfaW5zdGFuY2UuZW50aXR5VHlwZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBFbnRpdHlUeXBlQmF0Y2gsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMSA9IG5ldyBFbnRpdHlUeXBlKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjEsXG4gICAgICAgICAgICBFbnRpdHlUeXBlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS5lbnRpdHlUeXBlcyA9IF9pbnN0YW5jZS5lbnRpdHlUeXBlcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjFcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRW50aXR5VHlwZUJhdGNoLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogRW50aXR5VHlwZUJhdGNoLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmVudGl0eVR5cGVzICYmIF9pbnN0YW5jZS5lbnRpdHlUeXBlcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdHlUeXBlcyBhcyBhbnksXG4gICAgICAgIEVudGl0eVR5cGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlW107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBFbnRpdHlUeXBlQmF0Y2ggdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8RW50aXR5VHlwZUJhdGNoLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmVudGl0eVR5cGVzID0gKF92YWx1ZS5lbnRpdHlUeXBlcyB8fCBbXSkubWFwKG0gPT4gbmV3IEVudGl0eVR5cGUobSkpO1xuICAgIEVudGl0eVR5cGVCYXRjaC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVudGl0eVR5cGVzKCk6IEVudGl0eVR5cGVbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVR5cGVzO1xuICB9XG4gIHNldCBlbnRpdHlUeXBlcyh2YWx1ZTogRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZW50aXR5VHlwZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBFbnRpdHlUeXBlQmF0Y2guc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogRW50aXR5VHlwZUJhdGNoLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5VHlwZXM6ICh0aGlzLmVudGl0eVR5cGVzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogRW50aXR5VHlwZUJhdGNoLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXR5VHlwZXM6ICh0aGlzLmVudGl0eVR5cGVzIHx8IFtdKS5tYXAobSA9PiBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgRW50aXR5VHlwZUJhdGNoIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBFbnRpdHlUeXBlQmF0Y2hcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGVudGl0eVR5cGVzPzogRW50aXR5VHlwZS5Bc09iamVjdFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEVudGl0eVR5cGVCYXRjaFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZW50aXR5VHlwZXM/OiBFbnRpdHlUeXBlLkFzUHJvdG9idWZKU09OW10gfCBudWxsO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5FbnRpdHlUeXBlU29ydGluZ1xuICovXG5leHBvcnQgY2xhc3MgRW50aXR5VHlwZVNvcnRpbmcgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkVudGl0eVR5cGVTb3J0aW5nJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRW50aXR5VHlwZVNvcnRpbmcoKTtcbiAgICBFbnRpdHlUeXBlU29ydGluZy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEVudGl0eVR5cGVTb3J0aW5nKSB7XG4gICAgX2luc3RhbmNlLnNvcnRpbmdGaWVsZCA9IF9pbnN0YW5jZS5zb3J0aW5nRmllbGQgfHwgMDtcbiAgICBfaW5zdGFuY2Uuc29ydGluZ01vZGUgPSBfaW5zdGFuY2Uuc29ydGluZ01vZGUgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IEVudGl0eVR5cGVTb3J0aW5nLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5zb3J0aW5nRmllbGQgPSBfcmVhZGVyLnJlYWRFbnVtKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2Uuc29ydGluZ01vZGUgPSBfcmVhZGVyLnJlYWRFbnVtKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBFbnRpdHlUeXBlU29ydGluZy5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEVudGl0eVR5cGVTb3J0aW5nLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnNvcnRpbmdGaWVsZCkge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oMSwgX2luc3RhbmNlLnNvcnRpbmdGaWVsZCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc29ydGluZ01vZGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVFbnVtKDIsIF9pbnN0YW5jZS5zb3J0aW5nTW9kZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc29ydGluZ0ZpZWxkPzogRW50aXR5VHlwZVNvcnRpbmcuRW50aXR5VHlwZVNvcnRpbmdGaWVsZDtcbiAgcHJpdmF0ZSBfc29ydGluZ01vZGU/OiBvbmRld29ObHUwMDkuU29ydGluZ01vZGU7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBFbnRpdHlUeXBlU29ydGluZyB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxFbnRpdHlUeXBlU29ydGluZy5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5zb3J0aW5nRmllbGQgPSBfdmFsdWUuc29ydGluZ0ZpZWxkO1xuICAgIHRoaXMuc29ydGluZ01vZGUgPSBfdmFsdWUuc29ydGluZ01vZGU7XG4gICAgRW50aXR5VHlwZVNvcnRpbmcucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBzb3J0aW5nRmllbGQoKTogRW50aXR5VHlwZVNvcnRpbmcuRW50aXR5VHlwZVNvcnRpbmdGaWVsZCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRpbmdGaWVsZDtcbiAgfVxuICBzZXQgc29ydGluZ0ZpZWxkKFxuICAgIHZhbHVlOiBFbnRpdHlUeXBlU29ydGluZy5FbnRpdHlUeXBlU29ydGluZ0ZpZWxkIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX3NvcnRpbmdGaWVsZCA9IHZhbHVlO1xuICB9XG4gIGdldCBzb3J0aW5nTW9kZSgpOiBvbmRld29ObHUwMDkuU29ydGluZ01vZGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zb3J0aW5nTW9kZTtcbiAgfVxuICBzZXQgc29ydGluZ01vZGUodmFsdWU6IG9uZGV3b05sdTAwOS5Tb3J0aW5nTW9kZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3NvcnRpbmdNb2RlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgRW50aXR5VHlwZVNvcnRpbmcuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogRW50aXR5VHlwZVNvcnRpbmcuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBzb3J0aW5nRmllbGQ6IHRoaXMuc29ydGluZ0ZpZWxkLFxuICAgICAgc29ydGluZ01vZGU6IHRoaXMuc29ydGluZ01vZGVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBFbnRpdHlUeXBlU29ydGluZy5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNvcnRpbmdGaWVsZDpcbiAgICAgICAgRW50aXR5VHlwZVNvcnRpbmcuRW50aXR5VHlwZVNvcnRpbmdGaWVsZFtcbiAgICAgICAgICB0aGlzLnNvcnRpbmdGaWVsZCA9PT0gbnVsbCB8fCB0aGlzLnNvcnRpbmdGaWVsZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogdGhpcy5zb3J0aW5nRmllbGRcbiAgICAgICAgXSxcbiAgICAgIHNvcnRpbmdNb2RlOlxuICAgICAgICBvbmRld29ObHUwMDkuU29ydGluZ01vZGVbXG4gICAgICAgICAgdGhpcy5zb3J0aW5nTW9kZSA9PT0gbnVsbCB8fCB0aGlzLnNvcnRpbmdNb2RlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiB0aGlzLnNvcnRpbmdNb2RlXG4gICAgICAgIF1cbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEVudGl0eVR5cGVTb3J0aW5nIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBFbnRpdHlUeXBlU29ydGluZ1xuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgc29ydGluZ0ZpZWxkPzogRW50aXR5VHlwZVNvcnRpbmcuRW50aXR5VHlwZVNvcnRpbmdGaWVsZDtcbiAgICBzb3J0aW5nTW9kZT86IG9uZGV3b05sdTAwOS5Tb3J0aW5nTW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBFbnRpdHlUeXBlU29ydGluZ1xuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgc29ydGluZ0ZpZWxkPzogc3RyaW5nO1xuICAgIHNvcnRpbmdNb2RlPzogc3RyaW5nO1xuICB9XG4gIGV4cG9ydCBlbnVtIEVudGl0eVR5cGVTb3J0aW5nRmllbGQge1xuICAgIE5PX0VOVElUWV9UWVBFX1NPUlRJTkcgPSAwLFxuICAgIFNPUlRfRU5USVRZX1RZUEVfQllfTkFNRSA9IDEsXG4gICAgU09SVF9FTlRJVFlfVFlQRV9CWV9DUkVBVElPTl9EQVRFID0gMixcbiAgICBTT1JUX0VOVElUWV9UWVBFX0JZX0xBU1RfVVBEQVRFRCA9IDMsXG4gICAgU09SVF9FTlRJVFlfVFlQRV9CWV9FTlRJVFlfVkFMVUVfQ09VTlQgPSA0LFxuICAgIFNPUlRfRU5USVRZX1RZUEVfQllfU1lOT05ZTV9DT1VOVCA9IDVcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQmF0Y2hFbnRpdGllc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXRjaEVudGl0aWVzUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkJhdGNoRW50aXRpZXNSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEJhdGNoRW50aXRpZXNSZXNwb25zZSgpO1xuICAgIEJhdGNoRW50aXRpZXNSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEJhdGNoRW50aXRpZXNSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5lbnRpdHlTdGF0dXNlcyA9IF9pbnN0YW5jZS5lbnRpdHlTdGF0dXNlcyB8fCBbXTtcbiAgICBfaW5zdGFuY2UuaGFzRXJyb3JzID0gX2luc3RhbmNlLmhhc0Vycm9ycyB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IEJhdGNoRW50aXRpZXNSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIxID0gbmV3IEJhdGNoRW50aXRpZXNSZXNwb25zZS5FbnRpdHlTdGF0dXMoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIEJhdGNoRW50aXRpZXNSZXNwb25zZS5FbnRpdHlTdGF0dXMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICAoX2luc3RhbmNlLmVudGl0eVN0YXR1c2VzID0gX2luc3RhbmNlLmVudGl0eVN0YXR1c2VzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UuaGFzRXJyb3JzID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQmF0Y2hFbnRpdGllc1Jlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQmF0Y2hFbnRpdGllc1Jlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmVudGl0eVN0YXR1c2VzICYmIF9pbnN0YW5jZS5lbnRpdHlTdGF0dXNlcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdHlTdGF0dXNlcyBhcyBhbnksXG4gICAgICAgIEJhdGNoRW50aXRpZXNSZXNwb25zZS5FbnRpdHlTdGF0dXMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuaGFzRXJyb3JzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCgyLCBfaW5zdGFuY2UuaGFzRXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9lbnRpdHlTdGF0dXNlcz86IEJhdGNoRW50aXRpZXNSZXNwb25zZS5FbnRpdHlTdGF0dXNbXTtcbiAgcHJpdmF0ZSBfaGFzRXJyb3JzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEJhdGNoRW50aXRpZXNSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxCYXRjaEVudGl0aWVzUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuZW50aXR5U3RhdHVzZXMgPSAoX3ZhbHVlLmVudGl0eVN0YXR1c2VzIHx8IFtdKS5tYXAoXG4gICAgICBtID0+IG5ldyBCYXRjaEVudGl0aWVzUmVzcG9uc2UuRW50aXR5U3RhdHVzKG0pXG4gICAgKTtcbiAgICB0aGlzLmhhc0Vycm9ycyA9IF92YWx1ZS5oYXNFcnJvcnM7XG4gICAgQmF0Y2hFbnRpdGllc1Jlc3BvbnNlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgZW50aXR5U3RhdHVzZXMoKTogQmF0Y2hFbnRpdGllc1Jlc3BvbnNlLkVudGl0eVN0YXR1c1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZW50aXR5U3RhdHVzZXM7XG4gIH1cbiAgc2V0IGVudGl0eVN0YXR1c2VzKHZhbHVlOiBCYXRjaEVudGl0aWVzUmVzcG9uc2UuRW50aXR5U3RhdHVzW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdHlTdGF0dXNlcyA9IHZhbHVlO1xuICB9XG4gIGdldCBoYXNFcnJvcnMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0Vycm9ycztcbiAgfVxuICBzZXQgaGFzRXJyb3JzKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5faGFzRXJyb3JzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQmF0Y2hFbnRpdGllc1Jlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEJhdGNoRW50aXRpZXNSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0eVN0YXR1c2VzOiAodGhpcy5lbnRpdHlTdGF0dXNlcyB8fCBbXSkubWFwKG0gPT4gbS50b09iamVjdCgpKSxcbiAgICAgIGhhc0Vycm9yczogdGhpcy5oYXNFcnJvcnNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBCYXRjaEVudGl0aWVzUmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBlbnRpdHlTdGF0dXNlczogKHRoaXMuZW50aXR5U3RhdHVzZXMgfHwgW10pLm1hcChtID0+XG4gICAgICAgIG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICksXG4gICAgICBoYXNFcnJvcnM6IHRoaXMuaGFzRXJyb3JzXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBCYXRjaEVudGl0aWVzUmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIEJhdGNoRW50aXRpZXNSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZW50aXR5U3RhdHVzZXM/OiBCYXRjaEVudGl0aWVzUmVzcG9uc2UuRW50aXR5U3RhdHVzLkFzT2JqZWN0W107XG4gICAgaGFzRXJyb3JzPzogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBCYXRjaEVudGl0aWVzUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGVudGl0eVN0YXR1c2VzPzogQmF0Y2hFbnRpdGllc1Jlc3BvbnNlLkVudGl0eVN0YXR1cy5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgICBoYXNFcnJvcnM/OiBib29sZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuRW50aXR5U3RhdHVzXG4gICAqL1xuICBleHBvcnQgY2xhc3MgRW50aXR5U3RhdHVzIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICAgIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkVudGl0eVN0YXR1cyc7XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEVudGl0eVN0YXR1cygpO1xuICAgICAgRW50aXR5U3RhdHVzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgICApO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBFbnRpdHlTdGF0dXMpIHt9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgX2luc3RhbmNlOiBFbnRpdHlTdGF0dXMsXG4gICAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgICApIHtcbiAgICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5ID0gbmV3IEVudGl0eVR5cGUuRW50aXR5KCk7XG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5LFxuICAgICAgICAgICAgICBFbnRpdHlUeXBlLkVudGl0eS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBFbnRpdHlTdGF0dXMucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICAgIF9pbnN0YW5jZTogRW50aXR5U3RhdHVzLFxuICAgICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICAgKSB7XG4gICAgICBpZiAoX2luc3RhbmNlLmVudGl0eSkge1xuICAgICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgICAxLFxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHkgYXMgYW55LFxuICAgICAgICAgIEVudGl0eVR5cGUuRW50aXR5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoX2luc3RhbmNlLmVycm9yTWVzc2FnZSB8fCBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlID09PSAnJykge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5lcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2VudGl0eT86IEVudGl0eVR5cGUuRW50aXR5O1xuICAgIHByaXZhdGUgX2Vycm9yTWVzc2FnZT86IHN0cmluZztcblxuICAgIHByaXZhdGUgX2VudGl0eU9yU3RhdHVzOiBFbnRpdHlTdGF0dXMuRW50aXR5T3JTdGF0dXNDYXNlID1cbiAgICAgIEVudGl0eVN0YXR1cy5FbnRpdHlPclN0YXR1c0Nhc2Uubm9uZTtcblxuICAgIC8qKlxuICAgICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEVudGl0eVN0YXR1cyB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8RW50aXR5U3RhdHVzLkFzT2JqZWN0Pikge1xuICAgICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgICAgdGhpcy5lbnRpdHkgPSBfdmFsdWUuZW50aXR5XG4gICAgICAgID8gbmV3IEVudGl0eVR5cGUuRW50aXR5KF92YWx1ZS5lbnRpdHkpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBfdmFsdWUuZXJyb3JNZXNzYWdlO1xuICAgICAgRW50aXR5U3RhdHVzLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IGVudGl0eSgpOiBFbnRpdHlUeXBlLkVudGl0eSB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fZW50aXR5O1xuICAgIH1cbiAgICBzZXQgZW50aXR5KHZhbHVlOiBFbnRpdHlUeXBlLkVudGl0eSB8IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9lbnRpdHlPclN0YXR1cyA9IEVudGl0eVN0YXR1cy5FbnRpdHlPclN0YXR1c0Nhc2UuZW50aXR5O1xuICAgICAgfVxuICAgICAgdGhpcy5fZW50aXR5ID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBlcnJvck1lc3NhZ2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9lcnJvck1lc3NhZ2U7XG4gICAgfVxuICAgIHNldCBlcnJvck1lc3NhZ2UodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fZW50aXR5ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9lbnRpdHlPclN0YXR1cyA9IEVudGl0eVN0YXR1cy5FbnRpdHlPclN0YXR1c0Nhc2UuZXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBlbnRpdHlPclN0YXR1cygpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRpdHlPclN0YXR1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgRW50aXR5U3RhdHVzLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgICAqL1xuICAgIHRvT2JqZWN0KCk6IEVudGl0eVN0YXR1cy5Bc09iamVjdCB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnRpdHk6IHRoaXMuZW50aXR5ID8gdGhpcy5lbnRpdHkudG9PYmplY3QoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiB0aGlzLmVycm9yTWVzc2FnZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICAgKi9cbiAgICB0b0pTT04oKSB7XG4gICAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICAgKi9cbiAgICB0b1Byb3RvYnVmSlNPTihcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgICApOiBFbnRpdHlTdGF0dXMuQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW50aXR5OiB0aGlzLmVudGl0eSA/IHRoaXMuZW50aXR5LnRvUHJvdG9idWZKU09OKG9wdGlvbnMpIDogbnVsbCxcbiAgICAgICAgZXJyb3JNZXNzYWdlOlxuICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID09PSBudWxsIHx8IHRoaXMuZXJyb3JNZXNzYWdlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgOiB0aGlzLmVycm9yTWVzc2FnZVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IG1vZHVsZSBFbnRpdHlTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBFbnRpdHlTdGF0dXNcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICAgIGVudGl0eT86IEVudGl0eVR5cGUuRW50aXR5LkFzT2JqZWN0O1xuICAgICAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEVudGl0eVN0YXR1c1xuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgICAgZW50aXR5PzogRW50aXR5VHlwZS5FbnRpdHkuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgICAgZXJyb3JNZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbiAgICB9XG4gICAgZXhwb3J0IGVudW0gRW50aXR5T3JTdGF0dXNDYXNlIHtcbiAgICAgIG5vbmUgPSAwLFxuICAgICAgZW50aXR5ID0gMSxcbiAgICAgIGVycm9yTWVzc2FnZSA9IDJcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkJhdGNoQ3JlYXRlRW50aXRpZXNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQmF0Y2hDcmVhdGVFbnRpdGllc1JlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdCgpO1xuICAgIEJhdGNoQ3JlYXRlRW50aXRpZXNSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQmF0Y2hDcmVhdGVFbnRpdGllc1JlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UuY3JlYXRlRW50aXR5UmVxdWVzdHMgPSBfaW5zdGFuY2UuY3JlYXRlRW50aXR5UmVxdWVzdHMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIxID0gbmV3IEJhdGNoQ3JlYXRlRW50aXRpZXNSZXF1ZXN0LkNyZWF0ZUVudGl0eVJlcXVlc3QoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMSxcbiAgICAgICAgICAgIEJhdGNoQ3JlYXRlRW50aXRpZXNSZXF1ZXN0LkNyZWF0ZUVudGl0eVJlcXVlc3RcbiAgICAgICAgICAgICAgLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgKF9pbnN0YW5jZS5jcmVhdGVFbnRpdHlSZXF1ZXN0cyA9XG4gICAgICAgICAgICBfaW5zdGFuY2UuY3JlYXRlRW50aXR5UmVxdWVzdHMgfHwgW10pLnB1c2gobWVzc2FnZUluaXRpYWxpemVyMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEJhdGNoQ3JlYXRlRW50aXRpZXNSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoXG4gICAgICBfaW5zdGFuY2UuY3JlYXRlRW50aXR5UmVxdWVzdHMgJiZcbiAgICAgIF9pbnN0YW5jZS5jcmVhdGVFbnRpdHlSZXF1ZXN0cy5sZW5ndGhcbiAgICApIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5jcmVhdGVFbnRpdHlSZXF1ZXN0cyBhcyBhbnksXG4gICAgICAgIEJhdGNoQ3JlYXRlRW50aXRpZXNSZXF1ZXN0LkNyZWF0ZUVudGl0eVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRW50aXR5UmVxdWVzdHM/OiBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdC5DcmVhdGVFbnRpdHlSZXF1ZXN0W107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5jcmVhdGVFbnRpdHlSZXF1ZXN0cyA9IChfdmFsdWUuY3JlYXRlRW50aXR5UmVxdWVzdHMgfHwgW10pLm1hcChcbiAgICAgIG0gPT4gbmV3IEJhdGNoQ3JlYXRlRW50aXRpZXNSZXF1ZXN0LkNyZWF0ZUVudGl0eVJlcXVlc3QobSlcbiAgICApO1xuICAgIEJhdGNoQ3JlYXRlRW50aXRpZXNSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgY3JlYXRlRW50aXR5UmVxdWVzdHMoKTpcbiAgICB8IEJhdGNoQ3JlYXRlRW50aXRpZXNSZXF1ZXN0LkNyZWF0ZUVudGl0eVJlcXVlc3RbXVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlRW50aXR5UmVxdWVzdHM7XG4gIH1cbiAgc2V0IGNyZWF0ZUVudGl0eVJlcXVlc3RzKFxuICAgIHZhbHVlOiBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdC5DcmVhdGVFbnRpdHlSZXF1ZXN0W10gfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fY3JlYXRlRW50aXR5UmVxdWVzdHMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWF0ZUVudGl0eVJlcXVlc3RzOiAodGhpcy5jcmVhdGVFbnRpdHlSZXF1ZXN0cyB8fCBbXSkubWFwKG0gPT5cbiAgICAgICAgbS50b09iamVjdCgpXG4gICAgICApXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQmF0Y2hDcmVhdGVFbnRpdGllc1JlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGVFbnRpdHlSZXF1ZXN0czogKHRoaXMuY3JlYXRlRW50aXR5UmVxdWVzdHMgfHwgW10pLm1hcChtID0+XG4gICAgICAgIG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgIClcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEJhdGNoQ3JlYXRlRW50aXRpZXNSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgY3JlYXRlRW50aXR5UmVxdWVzdHM/OiBCYXRjaENyZWF0ZUVudGl0aWVzUmVxdWVzdC5DcmVhdGVFbnRpdHlSZXF1ZXN0LkFzT2JqZWN0W107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQmF0Y2hDcmVhdGVFbnRpdGllc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGNyZWF0ZUVudGl0eVJlcXVlc3RzPzpcbiAgICAgIHwgQmF0Y2hDcmVhdGVFbnRpdGllc1JlcXVlc3QuQ3JlYXRlRW50aXR5UmVxdWVzdC5Bc1Byb3RvYnVmSlNPTltdXG4gICAgICB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5DcmVhdGVFbnRpdHlSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgY2xhc3MgQ3JlYXRlRW50aXR5UmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5DcmVhdGVFbnRpdHlSZXF1ZXN0JztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ3JlYXRlRW50aXR5UmVxdWVzdCgpO1xuICAgICAgQ3JlYXRlRW50aXR5UmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ3JlYXRlRW50aXR5UmVxdWVzdCkge1xuICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lID0gX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lIHx8ICcnO1xuICAgICAgX2luc3RhbmNlLmVudGl0eSA9IF9pbnN0YW5jZS5lbnRpdHkgfHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBfaW5zdGFuY2U6IENyZWF0ZUVudGl0eVJlcXVlc3QsXG4gICAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgICApIHtcbiAgICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBfaW5zdGFuY2UuZW50aXR5VHlwZU5hbWUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHkgPSBuZXcgRW50aXR5VHlwZS5FbnRpdHkoKTtcbiAgICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHksXG4gICAgICAgICAgICAgIEVudGl0eVR5cGUuRW50aXR5LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIENyZWF0ZUVudGl0eVJlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICAgIF9pbnN0YW5jZTogQ3JlYXRlRW50aXR5UmVxdWVzdCxcbiAgICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICAgICkge1xuICAgICAgaWYgKF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZSkge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5lbnRpdHlUeXBlTmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAoX2luc3RhbmNlLmVudGl0eSkge1xuICAgICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgICAyLFxuICAgICAgICAgIF9pbnN0YW5jZS5lbnRpdHkgYXMgYW55LFxuICAgICAgICAgIEVudGl0eVR5cGUuRW50aXR5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZW50aXR5VHlwZU5hbWU/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfZW50aXR5PzogRW50aXR5VHlwZS5FbnRpdHk7XG5cbiAgICAvKipcbiAgICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDcmVhdGVFbnRpdHlSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDcmVhdGVFbnRpdHlSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgICAgdGhpcy5lbnRpdHlUeXBlTmFtZSA9IF92YWx1ZS5lbnRpdHlUeXBlTmFtZTtcbiAgICAgIHRoaXMuZW50aXR5ID0gX3ZhbHVlLmVudGl0eVxuICAgICAgICA/IG5ldyBFbnRpdHlUeXBlLkVudGl0eShfdmFsdWUuZW50aXR5KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIENyZWF0ZUVudGl0eVJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgZW50aXR5VHlwZU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbnRpdHlUeXBlTmFtZTtcbiAgICB9XG4gICAgc2V0IGVudGl0eVR5cGVOYW1lKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2VudGl0eVR5cGVOYW1lID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBlbnRpdHkoKTogRW50aXR5VHlwZS5FbnRpdHkgfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuX2VudGl0eTtcbiAgICB9XG4gICAgc2V0IGVudGl0eSh2YWx1ZTogRW50aXR5VHlwZS5FbnRpdHkgfCB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2VudGl0eSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgICBDcmVhdGVFbnRpdHlSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgICAqL1xuICAgIHRvT2JqZWN0KCk6IENyZWF0ZUVudGl0eVJlcXVlc3QuQXNPYmplY3Qge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW50aXR5VHlwZU5hbWU6IHRoaXMuZW50aXR5VHlwZU5hbWUsXG4gICAgICAgIGVudGl0eTogdGhpcy5lbnRpdHkgPyB0aGlzLmVudGl0eS50b09iamVjdCgpIDogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IENyZWF0ZUVudGl0eVJlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW50aXR5VHlwZU5hbWU6IHRoaXMuZW50aXR5VHlwZU5hbWUsXG4gICAgICAgIGVudGl0eTogdGhpcy5lbnRpdHkgPyB0aGlzLmVudGl0eS50b1Byb3RvYnVmSlNPTihvcHRpb25zKSA6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgQ3JlYXRlRW50aXR5UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENyZWF0ZUVudGl0eVJlcXVlc3RcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICAgIGVudGl0eVR5cGVOYW1lPzogc3RyaW5nO1xuICAgICAgZW50aXR5PzogRW50aXR5VHlwZS5FbnRpdHkuQXNPYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ3JlYXRlRW50aXR5UmVxdWVzdFxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgICAgZW50aXR5VHlwZU5hbWU/OiBzdHJpbmc7XG4gICAgICBlbnRpdHk/OiBFbnRpdHlUeXBlLkVudGl0eS5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5CYXRjaFVwZGF0ZUVudGl0aWVzUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgQmF0Y2hVcGRhdGVFbnRpdGllc1JlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1LkJhdGNoVXBkYXRlRW50aXRpZXNSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQmF0Y2hVcGRhdGVFbnRpdGllc1JlcXVlc3QoKTtcbiAgICBCYXRjaFVwZGF0ZUVudGl0aWVzUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEJhdGNoVXBkYXRlRW50aXRpZXNSZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLmVudGl0aWVzID0gX2luc3RhbmNlLmVudGl0aWVzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQmF0Y2hVcGRhdGVFbnRpdGllc1JlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUluaXRpYWxpemVyMSA9IG5ldyBFbnRpdHlUeXBlLkVudGl0eSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIxLFxuICAgICAgICAgICAgRW50aXR5VHlwZS5FbnRpdHkuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICAoX2luc3RhbmNlLmVudGl0aWVzID0gX2luc3RhbmNlLmVudGl0aWVzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBCYXRjaFVwZGF0ZUVudGl0aWVzUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEJhdGNoVXBkYXRlRW50aXRpZXNSZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmVudGl0aWVzICYmIF9pbnN0YW5jZS5lbnRpdGllcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdGllcyBhcyBhbnksXG4gICAgICAgIEVudGl0eVR5cGUuRW50aXR5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2VudGl0aWVzPzogRW50aXR5VHlwZS5FbnRpdHlbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEJhdGNoVXBkYXRlRW50aXRpZXNSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPEJhdGNoVXBkYXRlRW50aXRpZXNSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmVudGl0aWVzID0gKF92YWx1ZS5lbnRpdGllcyB8fCBbXSkubWFwKG0gPT4gbmV3IEVudGl0eVR5cGUuRW50aXR5KG0pKTtcbiAgICBCYXRjaFVwZGF0ZUVudGl0aWVzUmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVudGl0aWVzKCk6IEVudGl0eVR5cGUuRW50aXR5W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdGllcztcbiAgfVxuICBzZXQgZW50aXRpZXModmFsdWU6IEVudGl0eVR5cGUuRW50aXR5W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdGllcyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIEJhdGNoVXBkYXRlRW50aXRpZXNSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEJhdGNoVXBkYXRlRW50aXRpZXNSZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXRpZXM6ICh0aGlzLmVudGl0aWVzIHx8IFtdKS5tYXAobSA9PiBtLnRvT2JqZWN0KCkpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQmF0Y2hVcGRhdGVFbnRpdGllc1JlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBlbnRpdGllczogKHRoaXMuZW50aXRpZXMgfHwgW10pLm1hcChtID0+IG0udG9Qcm90b2J1ZkpTT04ob3B0aW9ucykpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBCYXRjaFVwZGF0ZUVudGl0aWVzUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQmF0Y2hVcGRhdGVFbnRpdGllc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGVudGl0aWVzPzogRW50aXR5VHlwZS5FbnRpdHkuQXNPYmplY3RbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBCYXRjaFVwZGF0ZUVudGl0aWVzUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZW50aXRpZXM/OiBFbnRpdHlUeXBlLkVudGl0eS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5ubHUuQmF0Y2hHZXRFbnRpdGllc1JlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIEJhdGNoR2V0RW50aXRpZXNSZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLm5sdS5CYXRjaEdldEVudGl0aWVzUmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEJhdGNoR2V0RW50aXRpZXNSZXF1ZXN0KCk7XG4gICAgQmF0Y2hHZXRFbnRpdGllc1JlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBCYXRjaEdldEVudGl0aWVzUmVxdWVzdCkge1xuICAgIF9pbnN0YW5jZS5uYW1lcyA9IF9pbnN0YW5jZS5uYW1lcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IEJhdGNoR2V0RW50aXRpZXNSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIChfaW5zdGFuY2UubmFtZXMgPSBfaW5zdGFuY2UubmFtZXMgfHwgW10pLnB1c2goX3JlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQmF0Y2hHZXRFbnRpdGllc1JlcXVlc3QucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgX2luc3RhbmNlOiBCYXRjaEdldEVudGl0aWVzUmVxdWVzdCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5uYW1lcyAmJiBfaW5zdGFuY2UubmFtZXMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoMSwgX2luc3RhbmNlLm5hbWVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9uYW1lcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQmF0Y2hHZXRFbnRpdGllc1JlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8QmF0Y2hHZXRFbnRpdGllc1JlcXVlc3QuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMubmFtZXMgPSAoX3ZhbHVlLm5hbWVzIHx8IFtdKS5zbGljZSgpO1xuICAgIEJhdGNoR2V0RW50aXRpZXNSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgbmFtZXMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9uYW1lcztcbiAgfVxuICBzZXQgbmFtZXModmFsdWU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbmFtZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBCYXRjaEdldEVudGl0aWVzUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBCYXRjaEdldEVudGl0aWVzUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzOiAodGhpcy5uYW1lcyB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEJhdGNoR2V0RW50aXRpZXNSZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXM6ICh0aGlzLm5hbWVzIHx8IFtdKS5zbGljZSgpXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBCYXRjaEdldEVudGl0aWVzUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQmF0Y2hHZXRFbnRpdGllc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIG5hbWVzPzogc3RyaW5nW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQmF0Y2hHZXRFbnRpdGllc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIG5hbWVzPzogc3RyaW5nW107XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1LkJhdGNoRGVsZXRlRW50aXRpZXNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXRjaERlbGV0ZUVudGl0aWVzUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQmF0Y2hEZWxldGVFbnRpdGllc1JlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBCYXRjaERlbGV0ZUVudGl0aWVzUmVxdWVzdCgpO1xuICAgIEJhdGNoRGVsZXRlRW50aXRpZXNSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQmF0Y2hEZWxldGVFbnRpdGllc1JlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UubmFtZXMgPSBfaW5zdGFuY2UubmFtZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBCYXRjaERlbGV0ZUVudGl0aWVzUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAoX2luc3RhbmNlLm5hbWVzID0gX2luc3RhbmNlLm5hbWVzIHx8IFtdKS5wdXNoKF9yZWFkZXIucmVhZFN0cmluZygpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEJhdGNoRGVsZXRlRW50aXRpZXNSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQmF0Y2hEZWxldGVFbnRpdGllc1JlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UubmFtZXMgJiYgX2luc3RhbmNlLm5hbWVzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkU3RyaW5nKDEsIF9pbnN0YW5jZS5uYW1lcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbmFtZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEJhdGNoRGVsZXRlRW50aXRpZXNSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPEJhdGNoRGVsZXRlRW50aXRpZXNSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLm5hbWVzID0gKF92YWx1ZS5uYW1lcyB8fCBbXSkuc2xpY2UoKTtcbiAgICBCYXRjaERlbGV0ZUVudGl0aWVzUmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IG5hbWVzKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZXM7XG4gIH1cbiAgc2V0IG5hbWVzKHZhbHVlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX25hbWVzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQmF0Y2hEZWxldGVFbnRpdGllc1JlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQmF0Y2hEZWxldGVFbnRpdGllc1JlcXVlc3QuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lczogKHRoaXMubmFtZXMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBCYXRjaERlbGV0ZUVudGl0aWVzUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWVzOiAodGhpcy5uYW1lcyB8fCBbXSkuc2xpY2UoKVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQmF0Y2hEZWxldGVFbnRpdGllc1JlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIEJhdGNoRGVsZXRlRW50aXRpZXNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBuYW1lcz86IHN0cmluZ1tdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIEJhdGNoRGVsZXRlRW50aXRpZXNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBuYW1lcz86IHN0cmluZ1tdO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5CYXRjaERlbGV0ZUVudGl0aWVzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNsYXNzIEJhdGNoRGVsZXRlRW50aXRpZXNSZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlKCk7XG4gICAgQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlKSB7XG4gICAgX2luc3RhbmNlLmRlbGV0ZVN0YXR1c2VzID0gX2luc3RhbmNlLmRlbGV0ZVN0YXR1c2VzIHx8IFtdO1xuICAgIF9pbnN0YW5jZS5oYXNFcnJvcnMgPSBfaW5zdGFuY2UuaGFzRXJyb3JzIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJbml0aWFsaXplcjEgPSBuZXcgQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlLkRlbGV0ZUVudGl0eVN0YXR1cygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIxLFxuICAgICAgICAgICAgQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlLkRlbGV0ZUVudGl0eVN0YXR1c1xuICAgICAgICAgICAgICAuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICAoX2luc3RhbmNlLmRlbGV0ZVN0YXR1c2VzID0gX2luc3RhbmNlLmRlbGV0ZVN0YXR1c2VzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgbWVzc2FnZUluaXRpYWxpemVyMVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UuaGFzRXJyb3JzID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmRlbGV0ZVN0YXR1c2VzICYmIF9pbnN0YW5jZS5kZWxldGVTdGF0dXNlcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5kZWxldGVTdGF0dXNlcyBhcyBhbnksXG4gICAgICAgIEJhdGNoRGVsZXRlRW50aXRpZXNSZXNwb25zZS5EZWxldGVFbnRpdHlTdGF0dXMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuaGFzRXJyb3JzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCgyLCBfaW5zdGFuY2UuaGFzRXJyb3JzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZWxldGVTdGF0dXNlcz86IEJhdGNoRGVsZXRlRW50aXRpZXNSZXNwb25zZS5EZWxldGVFbnRpdHlTdGF0dXNbXTtcbiAgcHJpdmF0ZSBfaGFzRXJyb3JzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEJhdGNoRGVsZXRlRW50aXRpZXNSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxCYXRjaERlbGV0ZUVudGl0aWVzUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuZGVsZXRlU3RhdHVzZXMgPSAoX3ZhbHVlLmRlbGV0ZVN0YXR1c2VzIHx8IFtdKS5tYXAoXG4gICAgICBtID0+IG5ldyBCYXRjaERlbGV0ZUVudGl0aWVzUmVzcG9uc2UuRGVsZXRlRW50aXR5U3RhdHVzKG0pXG4gICAgKTtcbiAgICB0aGlzLmhhc0Vycm9ycyA9IF92YWx1ZS5oYXNFcnJvcnM7XG4gICAgQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgZGVsZXRlU3RhdHVzZXMoKTpcbiAgICB8IEJhdGNoRGVsZXRlRW50aXRpZXNSZXNwb25zZS5EZWxldGVFbnRpdHlTdGF0dXNbXVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsZXRlU3RhdHVzZXM7XG4gIH1cbiAgc2V0IGRlbGV0ZVN0YXR1c2VzKFxuICAgIHZhbHVlOiBCYXRjaERlbGV0ZUVudGl0aWVzUmVzcG9uc2UuRGVsZXRlRW50aXR5U3RhdHVzW10gfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5fZGVsZXRlU3RhdHVzZXMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgaGFzRXJyb3JzKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9oYXNFcnJvcnM7XG4gIH1cbiAgc2V0IGhhc0Vycm9ycyh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2hhc0Vycm9ycyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIEJhdGNoRGVsZXRlRW50aXRpZXNSZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBCYXRjaERlbGV0ZUVudGl0aWVzUmVzcG9uc2UuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBkZWxldGVTdGF0dXNlczogKHRoaXMuZGVsZXRlU3RhdHVzZXMgfHwgW10pLm1hcChtID0+IG0udG9PYmplY3QoKSksXG4gICAgICBoYXNFcnJvcnM6IHRoaXMuaGFzRXJyb3JzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVsZXRlU3RhdHVzZXM6ICh0aGlzLmRlbGV0ZVN0YXR1c2VzIHx8IFtdKS5tYXAobSA9PlxuICAgICAgICBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICApLFxuICAgICAgaGFzRXJyb3JzOiB0aGlzLmhhc0Vycm9yc1xuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBCYXRjaERlbGV0ZUVudGl0aWVzUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGRlbGV0ZVN0YXR1c2VzPzogQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlLkRlbGV0ZUVudGl0eVN0YXR1cy5Bc09iamVjdFtdO1xuICAgIGhhc0Vycm9ycz86IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQmF0Y2hEZWxldGVFbnRpdGllc1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBkZWxldGVTdGF0dXNlcz86XG4gICAgICB8IEJhdGNoRGVsZXRlRW50aXRpZXNSZXNwb25zZS5EZWxldGVFbnRpdHlTdGF0dXMuQXNQcm90b2J1ZkpTT05bXVxuICAgICAgfCBudWxsO1xuICAgIGhhc0Vycm9ycz86IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5EZWxldGVFbnRpdHlTdGF0dXNcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBEZWxldGVFbnRpdHlTdGF0dXMgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuRGVsZXRlRW50aXR5U3RhdHVzJztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRGVsZXRlRW50aXR5U3RhdHVzKCk7XG4gICAgICBEZWxldGVFbnRpdHlTdGF0dXMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICAgICk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IERlbGV0ZUVudGl0eVN0YXR1cykge31cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBfaW5zdGFuY2U6IERlbGV0ZUVudGl0eVN0YXR1cyxcbiAgICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICAgICkge1xuICAgICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5zdWNjZXNzZnVsbHlEZWxldGVkID0gbmV3IGdvb2dsZVByb3RvYnVmMDA0LkVtcHR5KCk7XG4gICAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgICBfaW5zdGFuY2Uuc3VjY2Vzc2Z1bGx5RGVsZXRlZCxcbiAgICAgICAgICAgICAgZ29vZ2xlUHJvdG9idWYwMDQuRW1wdHkuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgX2luc3RhbmNlLmVycm9yTWVzc2FnZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgRGVsZXRlRW50aXR5U3RhdHVzLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoXG4gICAgICBfaW5zdGFuY2U6IERlbGV0ZUVudGl0eVN0YXR1cyxcbiAgICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICAgICkge1xuICAgICAgaWYgKF9pbnN0YW5jZS5zdWNjZXNzZnVsbHlEZWxldGVkKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAgIDEsXG4gICAgICAgICAgX2luc3RhbmNlLnN1Y2Nlc3NmdWxseURlbGV0ZWQgYXMgYW55LFxuICAgICAgICAgIGdvb2dsZVByb3RvYnVmMDA0LkVtcHR5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoX2luc3RhbmNlLmVycm9yTWVzc2FnZSB8fCBfaW5zdGFuY2UuZXJyb3JNZXNzYWdlID09PSAnJykge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5lcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3N1Y2Nlc3NmdWxseURlbGV0ZWQ/OiBnb29nbGVQcm90b2J1ZjAwNC5FbXB0eTtcbiAgICBwcml2YXRlIF9lcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF9kZWxldGVTdGF0dXM6IERlbGV0ZUVudGl0eVN0YXR1cy5EZWxldGVTdGF0dXNDYXNlID1cbiAgICAgIERlbGV0ZUVudGl0eVN0YXR1cy5EZWxldGVTdGF0dXNDYXNlLm5vbmU7XG5cbiAgICAvKipcbiAgICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBEZWxldGVFbnRpdHlTdGF0dXMgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPERlbGV0ZUVudGl0eVN0YXR1cy5Bc09iamVjdD4pIHtcbiAgICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICAgIHRoaXMuc3VjY2Vzc2Z1bGx5RGVsZXRlZCA9IF92YWx1ZS5zdWNjZXNzZnVsbHlEZWxldGVkXG4gICAgICAgID8gbmV3IGdvb2dsZVByb3RvYnVmMDA0LkVtcHR5KF92YWx1ZS5zdWNjZXNzZnVsbHlEZWxldGVkKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gX3ZhbHVlLmVycm9yTWVzc2FnZTtcbiAgICAgIERlbGV0ZUVudGl0eVN0YXR1cy5yZWZpbmVWYWx1ZXModGhpcyk7XG4gICAgfVxuICAgIGdldCBzdWNjZXNzZnVsbHlEZWxldGVkKCk6IGdvb2dsZVByb3RvYnVmMDA0LkVtcHR5IHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9zdWNjZXNzZnVsbHlEZWxldGVkO1xuICAgIH1cbiAgICBzZXQgc3VjY2Vzc2Z1bGx5RGVsZXRlZCh2YWx1ZTogZ29vZ2xlUHJvdG9idWYwMDQuRW1wdHkgfCB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fZGVsZXRlU3RhdHVzID1cbiAgICAgICAgICBEZWxldGVFbnRpdHlTdGF0dXMuRGVsZXRlU3RhdHVzQ2FzZS5zdWNjZXNzZnVsbHlEZWxldGVkO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3VjY2Vzc2Z1bGx5RGVsZXRlZCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgZXJyb3JNZXNzYWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICByZXR1cm4gdGhpcy5fZXJyb3JNZXNzYWdlO1xuICAgIH1cbiAgICBzZXQgZXJyb3JNZXNzYWdlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3N1Y2Nlc3NmdWxseURlbGV0ZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX2RlbGV0ZVN0YXR1cyA9IERlbGV0ZUVudGl0eVN0YXR1cy5EZWxldGVTdGF0dXNDYXNlLmVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgZGVsZXRlU3RhdHVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlbGV0ZVN0YXR1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgRGVsZXRlRW50aXR5U3RhdHVzLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgICAqL1xuICAgIHRvT2JqZWN0KCk6IERlbGV0ZUVudGl0eVN0YXR1cy5Bc09iamVjdCB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzZnVsbHlEZWxldGVkOiB0aGlzLnN1Y2Nlc3NmdWxseURlbGV0ZWRcbiAgICAgICAgICA/IHRoaXMuc3VjY2Vzc2Z1bGx5RGVsZXRlZC50b09iamVjdCgpXG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGVycm9yTWVzc2FnZTogdGhpcy5lcnJvck1lc3NhZ2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAgICovXG4gICAgdG9Qcm90b2J1ZkpTT04oXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICAgKTogRGVsZXRlRW50aXR5U3RhdHVzLkFzUHJvdG9idWZKU09OIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3NmdWxseURlbGV0ZWQ6IHRoaXMuc3VjY2Vzc2Z1bGx5RGVsZXRlZFxuICAgICAgICAgID8gdGhpcy5zdWNjZXNzZnVsbHlEZWxldGVkLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPT09IG51bGwgfHwgdGhpcy5lcnJvck1lc3NhZ2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IHRoaXMuZXJyb3JNZXNzYWdlXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBleHBvcnQgbW9kdWxlIERlbGV0ZUVudGl0eVN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIERlbGV0ZUVudGl0eVN0YXR1c1xuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgICAgc3VjY2Vzc2Z1bGx5RGVsZXRlZD86IGdvb2dsZVByb3RvYnVmMDA0LkVtcHR5LkFzT2JqZWN0O1xuICAgICAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIERlbGV0ZUVudGl0eVN0YXR1c1xuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgICAgc3VjY2Vzc2Z1bGx5RGVsZXRlZD86IGdvb2dsZVByb3RvYnVmMDA0LkVtcHR5LkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICAgIGVycm9yTWVzc2FnZT86IHN0cmluZyB8IG51bGw7XG4gICAgfVxuICAgIGV4cG9ydCBlbnVtIERlbGV0ZVN0YXR1c0Nhc2Uge1xuICAgICAgbm9uZSA9IDAsXG4gICAgICBzdWNjZXNzZnVsbHlEZWxldGVkID0gMSxcbiAgICAgIGVycm9yTWVzc2FnZSA9IDJcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28ubmx1Lkxpc3RFbnRpdGllc1JlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIExpc3RFbnRpdGllc1JlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1Lkxpc3RFbnRpdGllc1JlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBMaXN0RW50aXRpZXNSZXF1ZXN0KCk7XG4gICAgTGlzdEVudGl0aWVzUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IExpc3RFbnRpdGllc1JlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UuZW50aXR5VHlwZU5hbWUgPSBfaW5zdGFuY2UuZW50aXR5VHlwZU5hbWUgfHwgJyc7XG4gICAgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLnBhZ2VUb2tlbiA9IF9pbnN0YW5jZS5wYWdlVG9rZW4gfHwgJyc7XG4gICAgX2luc3RhbmNlLnNvcnRCeUZpZWxkID0gX2luc3RhbmNlLnNvcnRCeUZpZWxkIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2Uuc2VhcmNoQnlQYXR0ZXJuID0gX2luc3RhbmNlLnNlYXJjaEJ5UGF0dGVybiB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IExpc3RFbnRpdGllc1JlcXVlc3QsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UubGFuZ3VhZ2VDb2RlID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UucGFnZVRva2VuID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBfaW5zdGFuY2Uuc29ydEJ5RmllbGQgPSBuZXcgRW50aXR5VmFsdWVTb3J0aW5nKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5zb3J0QnlGaWVsZCxcbiAgICAgICAgICAgIEVudGl0eVZhbHVlU29ydGluZy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgX2luc3RhbmNlLnNlYXJjaEJ5UGF0dGVybiA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgTGlzdEVudGl0aWVzUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IExpc3RFbnRpdGllc1JlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuZW50aXR5VHlwZU5hbWUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMSwgX2luc3RhbmNlLmVudGl0eVR5cGVOYW1lKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5sYW5ndWFnZUNvZGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLmxhbmd1YWdlQ29kZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UucGFnZVRva2VuKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMsIF9pbnN0YW5jZS5wYWdlVG9rZW4pO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNvcnRCeUZpZWxkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgNSxcbiAgICAgICAgX2luc3RhbmNlLnNvcnRCeUZpZWxkIGFzIGFueSxcbiAgICAgICAgRW50aXR5VmFsdWVTb3J0aW5nLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNlYXJjaEJ5UGF0dGVybikge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg2LCBfaW5zdGFuY2Uuc2VhcmNoQnlQYXR0ZXJuKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9lbnRpdHlUeXBlTmFtZT86IHN0cmluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICBwcml2YXRlIF9wYWdlVG9rZW4/OiBzdHJpbmc7XG4gIHByaXZhdGUgX3NvcnRCeUZpZWxkPzogRW50aXR5VmFsdWVTb3J0aW5nO1xuICBwcml2YXRlIF9zZWFyY2hCeVBhdHRlcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBMaXN0RW50aXRpZXNSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPExpc3RFbnRpdGllc1JlcXVlc3QuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuZW50aXR5VHlwZU5hbWUgPSBfdmFsdWUuZW50aXR5VHlwZU5hbWU7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfdmFsdWUubGFuZ3VhZ2VDb2RlO1xuICAgIHRoaXMucGFnZVRva2VuID0gX3ZhbHVlLnBhZ2VUb2tlbjtcbiAgICB0aGlzLnNvcnRCeUZpZWxkID0gX3ZhbHVlLnNvcnRCeUZpZWxkXG4gICAgICA/IG5ldyBFbnRpdHlWYWx1ZVNvcnRpbmcoX3ZhbHVlLnNvcnRCeUZpZWxkKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZWFyY2hCeVBhdHRlcm4gPSBfdmFsdWUuc2VhcmNoQnlQYXR0ZXJuO1xuICAgIExpc3RFbnRpdGllc1JlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBlbnRpdHlUeXBlTmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlUeXBlTmFtZTtcbiAgfVxuICBzZXQgZW50aXR5VHlwZU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2VudGl0eVR5cGVOYW1lID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGxhbmd1YWdlQ29kZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUNvZGU7XG4gIH1cbiAgc2V0IGxhbmd1YWdlQ29kZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbGFuZ3VhZ2VDb2RlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHBhZ2VUb2tlbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYWdlVG9rZW47XG4gIH1cbiAgc2V0IHBhZ2VUb2tlbih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGFnZVRva2VuID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHNvcnRCeUZpZWxkKCk6IEVudGl0eVZhbHVlU29ydGluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRCeUZpZWxkO1xuICB9XG4gIHNldCBzb3J0QnlGaWVsZCh2YWx1ZTogRW50aXR5VmFsdWVTb3J0aW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc29ydEJ5RmllbGQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc2VhcmNoQnlQYXR0ZXJuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaEJ5UGF0dGVybjtcbiAgfVxuICBzZXQgc2VhcmNoQnlQYXR0ZXJuKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zZWFyY2hCeVBhdHRlcm4gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBMaXN0RW50aXRpZXNSZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IExpc3RFbnRpdGllc1JlcXVlc3QuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBlbnRpdHlUeXBlTmFtZTogdGhpcy5lbnRpdHlUeXBlTmFtZSxcbiAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5sYW5ndWFnZUNvZGUsXG4gICAgICBwYWdlVG9rZW46IHRoaXMucGFnZVRva2VuLFxuICAgICAgc29ydEJ5RmllbGQ6IHRoaXMuc29ydEJ5RmllbGQgPyB0aGlzLnNvcnRCeUZpZWxkLnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICBzZWFyY2hCeVBhdHRlcm46IHRoaXMuc2VhcmNoQnlQYXR0ZXJuXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogTGlzdEVudGl0aWVzUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0eVR5cGVOYW1lOiB0aGlzLmVudGl0eVR5cGVOYW1lLFxuICAgICAgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSxcbiAgICAgIHBhZ2VUb2tlbjogdGhpcy5wYWdlVG9rZW4sXG4gICAgICBzb3J0QnlGaWVsZDogdGhpcy5zb3J0QnlGaWVsZFxuICAgICAgICA/IHRoaXMuc29ydEJ5RmllbGQudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgOiBudWxsLFxuICAgICAgc2VhcmNoQnlQYXR0ZXJuOiB0aGlzLnNlYXJjaEJ5UGF0dGVyblxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgTGlzdEVudGl0aWVzUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgTGlzdEVudGl0aWVzUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgZW50aXR5VHlwZU5hbWU/OiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAgIHBhZ2VUb2tlbj86IHN0cmluZztcbiAgICBzb3J0QnlGaWVsZD86IEVudGl0eVZhbHVlU29ydGluZy5Bc09iamVjdDtcbiAgICBzZWFyY2hCeVBhdHRlcm4/OiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgTGlzdEVudGl0aWVzUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZW50aXR5VHlwZU5hbWU/OiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nO1xuICAgIHBhZ2VUb2tlbj86IHN0cmluZztcbiAgICBzb3J0QnlGaWVsZD86IEVudGl0eVZhbHVlU29ydGluZy5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgc2VhcmNoQnlQYXR0ZXJuPzogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5MaXN0RW50aXRpZXNSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgTGlzdEVudGl0aWVzUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28ubmx1Lkxpc3RFbnRpdGllc1Jlc3BvbnNlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTGlzdEVudGl0aWVzUmVzcG9uc2UoKTtcbiAgICBMaXN0RW50aXRpZXNSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IExpc3RFbnRpdGllc1Jlc3BvbnNlKSB7XG4gICAgX2luc3RhbmNlLmVudGl0aWVzID0gX2luc3RhbmNlLmVudGl0aWVzIHx8IFtdO1xuICAgIF9pbnN0YW5jZS5uZXh0UGFnZVRva2VuID0gX2luc3RhbmNlLm5leHRQYWdlVG9rZW4gfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBMaXN0RW50aXRpZXNSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIxID0gbmV3IEVudGl0eVR5cGUuRW50aXR5KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjEsXG4gICAgICAgICAgICBFbnRpdHlUeXBlLkVudGl0eS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UuZW50aXRpZXMgPSBfaW5zdGFuY2UuZW50aXRpZXMgfHwgW10pLnB1c2goXG4gICAgICAgICAgICBtZXNzYWdlSW5pdGlhbGl6ZXIxXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5uZXh0UGFnZVRva2VuID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBMaXN0RW50aXRpZXNSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IExpc3RFbnRpdGllc1Jlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmVudGl0aWVzICYmIF9pbnN0YW5jZS5lbnRpdGllcy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZE1lc3NhZ2UoXG4gICAgICAgIDEsXG4gICAgICAgIF9pbnN0YW5jZS5lbnRpdGllcyBhcyBhbnksXG4gICAgICAgIEVudGl0eVR5cGUuRW50aXR5LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLm5leHRQYWdlVG9rZW4pIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLm5leHRQYWdlVG9rZW4pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2VudGl0aWVzPzogRW50aXR5VHlwZS5FbnRpdHlbXTtcbiAgcHJpdmF0ZSBfbmV4dFBhZ2VUb2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIExpc3RFbnRpdGllc1Jlc3BvbnNlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPExpc3RFbnRpdGllc1Jlc3BvbnNlLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmVudGl0aWVzID0gKF92YWx1ZS5lbnRpdGllcyB8fCBbXSkubWFwKG0gPT4gbmV3IEVudGl0eVR5cGUuRW50aXR5KG0pKTtcbiAgICB0aGlzLm5leHRQYWdlVG9rZW4gPSBfdmFsdWUubmV4dFBhZ2VUb2tlbjtcbiAgICBMaXN0RW50aXRpZXNSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGVudGl0aWVzKCk6IEVudGl0eVR5cGUuRW50aXR5W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdGllcztcbiAgfVxuICBzZXQgZW50aXRpZXModmFsdWU6IEVudGl0eVR5cGUuRW50aXR5W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbnRpdGllcyA9IHZhbHVlO1xuICB9XG4gIGdldCBuZXh0UGFnZVRva2VuKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX25leHRQYWdlVG9rZW47XG4gIH1cbiAgc2V0IG5leHRQYWdlVG9rZW4odmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX25leHRQYWdlVG9rZW4gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBMaXN0RW50aXRpZXNSZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBMaXN0RW50aXRpZXNSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudGl0aWVzOiAodGhpcy5lbnRpdGllcyB8fCBbXSkubWFwKG0gPT4gbS50b09iamVjdCgpKSxcbiAgICAgIG5leHRQYWdlVG9rZW46IHRoaXMubmV4dFBhZ2VUb2tlblxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IExpc3RFbnRpdGllc1Jlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50aXRpZXM6ICh0aGlzLmVudGl0aWVzIHx8IFtdKS5tYXAobSA9PiBtLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpKSxcbiAgICAgIG5leHRQYWdlVG9rZW46IHRoaXMubmV4dFBhZ2VUb2tlblxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgTGlzdEVudGl0aWVzUmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIExpc3RFbnRpdGllc1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBlbnRpdGllcz86IEVudGl0eVR5cGUuRW50aXR5LkFzT2JqZWN0W107XG4gICAgbmV4dFBhZ2VUb2tlbj86IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBMaXN0RW50aXRpZXNSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgZW50aXRpZXM/OiBFbnRpdHlUeXBlLkVudGl0eS5Bc1Byb3RvYnVmSlNPTltdIHwgbnVsbDtcbiAgICBuZXh0UGFnZVRva2VuPzogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLm5sdS5FbnRpdHlWYWx1ZVNvcnRpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIEVudGl0eVZhbHVlU29ydGluZyBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5ubHUuRW50aXR5VmFsdWVTb3J0aW5nJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRW50aXR5VmFsdWVTb3J0aW5nKCk7XG4gICAgRW50aXR5VmFsdWVTb3J0aW5nLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogRW50aXR5VmFsdWVTb3J0aW5nKSB7XG4gICAgX2luc3RhbmNlLnNvcnRpbmdGaWVsZCA9IF9pbnN0YW5jZS5zb3J0aW5nRmllbGQgfHwgMDtcbiAgICBfaW5zdGFuY2Uuc29ydGluZ01vZGUgPSBfaW5zdGFuY2Uuc29ydGluZ01vZGUgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IEVudGl0eVZhbHVlU29ydGluZyxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBfaW5zdGFuY2Uuc29ydGluZ0ZpZWxkID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgX2luc3RhbmNlLnNvcnRpbmdNb2RlID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRW50aXR5VmFsdWVTb3J0aW5nLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogRW50aXR5VmFsdWVTb3J0aW5nLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnNvcnRpbmdGaWVsZCkge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oNywgX2luc3RhbmNlLnNvcnRpbmdGaWVsZCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc29ydGluZ01vZGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVFbnVtKDgsIF9pbnN0YW5jZS5zb3J0aW5nTW9kZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc29ydGluZ0ZpZWxkPzogRW50aXR5VmFsdWVTb3J0aW5nLkVudGl0eVZhbHVlU29ydGluZ0ZpZWxkO1xuICBwcml2YXRlIF9zb3J0aW5nTW9kZT86IG9uZGV3b05sdTAwOS5Tb3J0aW5nTW9kZTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEVudGl0eVZhbHVlU29ydGluZyB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxFbnRpdHlWYWx1ZVNvcnRpbmcuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuc29ydGluZ0ZpZWxkID0gX3ZhbHVlLnNvcnRpbmdGaWVsZDtcbiAgICB0aGlzLnNvcnRpbmdNb2RlID0gX3ZhbHVlLnNvcnRpbmdNb2RlO1xuICAgIEVudGl0eVZhbHVlU29ydGluZy5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHNvcnRpbmdGaWVsZCgpOiBFbnRpdHlWYWx1ZVNvcnRpbmcuRW50aXR5VmFsdWVTb3J0aW5nRmllbGQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zb3J0aW5nRmllbGQ7XG4gIH1cbiAgc2V0IHNvcnRpbmdGaWVsZChcbiAgICB2YWx1ZTogRW50aXR5VmFsdWVTb3J0aW5nLkVudGl0eVZhbHVlU29ydGluZ0ZpZWxkIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHRoaXMuX3NvcnRpbmdGaWVsZCA9IHZhbHVlO1xuICB9XG4gIGdldCBzb3J0aW5nTW9kZSgpOiBvbmRld29ObHUwMDkuU29ydGluZ01vZGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zb3J0aW5nTW9kZTtcbiAgfVxuICBzZXQgc29ydGluZ01vZGUodmFsdWU6IG9uZGV3b05sdTAwOS5Tb3J0aW5nTW9kZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3NvcnRpbmdNb2RlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgRW50aXR5VmFsdWVTb3J0aW5nLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEVudGl0eVZhbHVlU29ydGluZy5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNvcnRpbmdGaWVsZDogdGhpcy5zb3J0aW5nRmllbGQsXG4gICAgICBzb3J0aW5nTW9kZTogdGhpcy5zb3J0aW5nTW9kZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEVudGl0eVZhbHVlU29ydGluZy5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNvcnRpbmdGaWVsZDpcbiAgICAgICAgRW50aXR5VmFsdWVTb3J0aW5nLkVudGl0eVZhbHVlU29ydGluZ0ZpZWxkW1xuICAgICAgICAgIHRoaXMuc29ydGluZ0ZpZWxkID09PSBudWxsIHx8IHRoaXMuc29ydGluZ0ZpZWxkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiB0aGlzLnNvcnRpbmdGaWVsZFxuICAgICAgICBdLFxuICAgICAgc29ydGluZ01vZGU6XG4gICAgICAgIG9uZGV3b05sdTAwOS5Tb3J0aW5nTW9kZVtcbiAgICAgICAgICB0aGlzLnNvcnRpbmdNb2RlID09PSBudWxsIHx8IHRoaXMuc29ydGluZ01vZGUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IHRoaXMuc29ydGluZ01vZGVcbiAgICAgICAgXVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgRW50aXR5VmFsdWVTb3J0aW5nIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBFbnRpdHlWYWx1ZVNvcnRpbmdcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHNvcnRpbmdGaWVsZD86IEVudGl0eVZhbHVlU29ydGluZy5FbnRpdHlWYWx1ZVNvcnRpbmdGaWVsZDtcbiAgICBzb3J0aW5nTW9kZT86IG9uZGV3b05sdTAwOS5Tb3J0aW5nTW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBFbnRpdHlWYWx1ZVNvcnRpbmdcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIHNvcnRpbmdGaWVsZD86IHN0cmluZztcbiAgICBzb3J0aW5nTW9kZT86IHN0cmluZztcbiAgfVxuICBleHBvcnQgZW51bSBFbnRpdHlWYWx1ZVNvcnRpbmdGaWVsZCB7XG4gICAgTk9fRU5USVRZX1ZBTFVFX1NPUlRJTkcgPSAwLFxuICAgIFNPUlRfRU5USVRZX1ZBTFVFX0JZX0RJU1BMQVlfTkFNRSA9IDEsXG4gICAgU09SVF9FTlRJVFlfVkFMVUVfQllfVkFMVUUgPSAyLFxuICAgIFNPUlRfRU5USVRZX1ZBTFVFX0JZX1NZTk9OWU1fQ09VTlQgPSAzXG4gIH1cbn1cbiJdfQ==