@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,2232 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ // @ts-nocheck
4
+ //
5
+ // THIS IS A GENERATED FILE
6
+ // DO NOT MODIFY IT! YOUR CHANGES WILL BE LOST
7
+ import { uint8ArrayToBase64 } from '@ngx-grpc/common';
8
+ import { BinaryReader, BinaryWriter } from 'google-protobuf';
9
+ import * as googleProtobuf003 from '@ngx-grpc/well-known-types';
10
+ import * as googleRpc004 from '../../google/rpc/status.pb';
11
+ import * as ondewoNlu006 from '../../ondewo/nlu/context.pb';
12
+ import * as googleProtobuf010 from '@ngx-grpc/well-known-types';
13
+ import * as ondewoNlu011 from '../../ondewo/nlu/session.pb';
14
+ import * as ondewoT2s012 from '../../ondewo/t2s/text-to-speech.pb';
15
+ import * as ondewoS2t013 from '../../ondewo/s2t/speech-to-text.pb';
16
+ export var ControlStatus;
17
+ (function (ControlStatus) {
18
+ ControlStatus[ControlStatus["OK"] = 0] = "OK";
19
+ ControlStatus[ControlStatus["EMERGENCY_STOP"] = 1] = "EMERGENCY_STOP";
20
+ })(ControlStatus || (ControlStatus = {}));
21
+ export var ControlMessageServiceName;
22
+ (function (ControlMessageServiceName) {
23
+ ControlMessageServiceName[ControlMessageServiceName["UNKNOWNNAME"] = 0] = "UNKNOWNNAME";
24
+ ControlMessageServiceName[ControlMessageServiceName["ondewo_s2t"] = 1] = "ondewo_s2t";
25
+ ControlMessageServiceName[ControlMessageServiceName["ondewo_t2s"] = 2] = "ondewo_t2s";
26
+ ControlMessageServiceName[ControlMessageServiceName["ondewo_nlu"] = 3] = "ondewo_nlu";
27
+ ControlMessageServiceName[ControlMessageServiceName["ondewo_sip"] = 4] = "ondewo_sip";
28
+ })(ControlMessageServiceName || (ControlMessageServiceName = {}));
29
+ export var ControlMessageServiceMethod;
30
+ (function (ControlMessageServiceMethod) {
31
+ ControlMessageServiceMethod[ControlMessageServiceMethod["UNKNOWNMETHOD"] = 0] = "UNKNOWNMETHOD";
32
+ ControlMessageServiceMethod[ControlMessageServiceMethod["update_config"] = 1] = "update_config";
33
+ ControlMessageServiceMethod[ControlMessageServiceMethod["undo_config"] = 2] = "undo_config";
34
+ ControlMessageServiceMethod[ControlMessageServiceMethod["reset_config"] = 3] = "reset_config";
35
+ ControlMessageServiceMethod[ControlMessageServiceMethod["end_call"] = 4] = "end_call";
36
+ ControlMessageServiceMethod[ControlMessageServiceMethod["transfer_call"] = 5] = "transfer_call";
37
+ ControlMessageServiceMethod[ControlMessageServiceMethod["play_wav_files"] = 6] = "play_wav_files";
38
+ ControlMessageServiceMethod[ControlMessageServiceMethod["play_text"] = 7] = "play_text";
39
+ ControlMessageServiceMethod[ControlMessageServiceMethod["mute"] = 8] = "mute";
40
+ ControlMessageServiceMethod[ControlMessageServiceMethod["un_mute"] = 9] = "un_mute";
41
+ ControlMessageServiceMethod[ControlMessageServiceMethod["stop_all_control_messages"] = 10] = "stop_all_control_messages";
42
+ ControlMessageServiceMethod[ControlMessageServiceMethod["train_agent"] = 11] = "train_agent";
43
+ ControlMessageServiceMethod[ControlMessageServiceMethod["cancel_train_agent"] = 12] = "cancel_train_agent";
44
+ ControlMessageServiceMethod[ControlMessageServiceMethod["delete_session"] = 13] = "delete_session";
45
+ ControlMessageServiceMethod[ControlMessageServiceMethod["delete_all_contexts"] = 14] = "delete_all_contexts";
46
+ ControlMessageServiceMethod[ControlMessageServiceMethod["create_context"] = 15] = "create_context";
47
+ ControlMessageServiceMethod[ControlMessageServiceMethod["update_context"] = 16] = "update_context";
48
+ ControlMessageServiceMethod[ControlMessageServiceMethod["delete_context"] = 17] = "delete_context";
49
+ ControlMessageServiceMethod[ControlMessageServiceMethod["detect_intent"] = 18] = "detect_intent";
50
+ })(ControlMessageServiceMethod || (ControlMessageServiceMethod = {}));
51
+ export var ConditionType;
52
+ (function (ConditionType) {
53
+ ConditionType[ConditionType["UNKNOWTYPE"] = 0] = "UNKNOWTYPE";
54
+ ConditionType[ConditionType["immediate"] = 1] = "immediate";
55
+ ConditionType[ConditionType["duration"] = 2] = "duration";
56
+ ConditionType[ConditionType["datetime"] = 3] = "datetime";
57
+ ConditionType[ConditionType["interactions"] = 4] = "interactions";
58
+ })(ConditionType || (ConditionType = {}));
59
+ /**
60
+ * Message implementation for ondewo.csi.S2sPipeline
61
+ */
62
+ export class S2sPipeline {
63
+ /**
64
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
65
+ * @param _value initial values object or instance of S2sPipeline to deeply clone from
66
+ */
67
+ constructor(_value) {
68
+ _value = _value || {};
69
+ this.id = _value.id;
70
+ this.s2tPipelineId = _value.s2tPipelineId;
71
+ this.nluProjectId = _value.nluProjectId;
72
+ this.nluLanguageCode = _value.nluLanguageCode;
73
+ this.t2sPipelineId = _value.t2sPipelineId;
74
+ S2sPipeline.refineValues(this);
75
+ }
76
+ /**
77
+ * Deserialize binary data to message
78
+ * @param instance message instance
79
+ */
80
+ static deserializeBinary(bytes) {
81
+ const instance = new S2sPipeline();
82
+ S2sPipeline.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
83
+ return instance;
84
+ }
85
+ /**
86
+ * Check all the properties and set default protobuf values if necessary
87
+ * @param _instance message instance
88
+ */
89
+ static refineValues(_instance) {
90
+ _instance.id = _instance.id || '';
91
+ _instance.s2tPipelineId = _instance.s2tPipelineId || '';
92
+ _instance.nluProjectId = _instance.nluProjectId || '';
93
+ _instance.nluLanguageCode = _instance.nluLanguageCode || '';
94
+ _instance.t2sPipelineId = _instance.t2sPipelineId || '';
95
+ }
96
+ /**
97
+ * Deserializes / reads binary message into message instance using provided binary reader
98
+ * @param _instance message instance
99
+ * @param _reader binary reader instance
100
+ */
101
+ static deserializeBinaryFromReader(_instance, _reader) {
102
+ while (_reader.nextField()) {
103
+ if (_reader.isEndGroup())
104
+ break;
105
+ switch (_reader.getFieldNumber()) {
106
+ case 1:
107
+ _instance.id = _reader.readString();
108
+ break;
109
+ case 2:
110
+ _instance.s2tPipelineId = _reader.readString();
111
+ break;
112
+ case 3:
113
+ _instance.nluProjectId = _reader.readString();
114
+ break;
115
+ case 4:
116
+ _instance.nluLanguageCode = _reader.readString();
117
+ break;
118
+ case 5:
119
+ _instance.t2sPipelineId = _reader.readString();
120
+ break;
121
+ default:
122
+ _reader.skipField();
123
+ }
124
+ }
125
+ S2sPipeline.refineValues(_instance);
126
+ }
127
+ /**
128
+ * Serializes a message to binary format using provided binary reader
129
+ * @param _instance message instance
130
+ * @param _writer binary writer instance
131
+ */
132
+ static serializeBinaryToWriter(_instance, _writer) {
133
+ if (_instance.id) {
134
+ _writer.writeString(1, _instance.id);
135
+ }
136
+ if (_instance.s2tPipelineId) {
137
+ _writer.writeString(2, _instance.s2tPipelineId);
138
+ }
139
+ if (_instance.nluProjectId) {
140
+ _writer.writeString(3, _instance.nluProjectId);
141
+ }
142
+ if (_instance.nluLanguageCode) {
143
+ _writer.writeString(4, _instance.nluLanguageCode);
144
+ }
145
+ if (_instance.t2sPipelineId) {
146
+ _writer.writeString(5, _instance.t2sPipelineId);
147
+ }
148
+ }
149
+ get id() {
150
+ return this._id;
151
+ }
152
+ set id(value) {
153
+ this._id = value;
154
+ }
155
+ get s2tPipelineId() {
156
+ return this._s2tPipelineId;
157
+ }
158
+ set s2tPipelineId(value) {
159
+ this._s2tPipelineId = value;
160
+ }
161
+ get nluProjectId() {
162
+ return this._nluProjectId;
163
+ }
164
+ set nluProjectId(value) {
165
+ this._nluProjectId = value;
166
+ }
167
+ get nluLanguageCode() {
168
+ return this._nluLanguageCode;
169
+ }
170
+ set nluLanguageCode(value) {
171
+ this._nluLanguageCode = value;
172
+ }
173
+ get t2sPipelineId() {
174
+ return this._t2sPipelineId;
175
+ }
176
+ set t2sPipelineId(value) {
177
+ this._t2sPipelineId = value;
178
+ }
179
+ /**
180
+ * Serialize message to binary data
181
+ * @param instance message instance
182
+ */
183
+ serializeBinary() {
184
+ const writer = new BinaryWriter();
185
+ S2sPipeline.serializeBinaryToWriter(this, writer);
186
+ return writer.getResultBuffer();
187
+ }
188
+ /**
189
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
190
+ */
191
+ toObject() {
192
+ return {
193
+ id: this.id,
194
+ s2tPipelineId: this.s2tPipelineId,
195
+ nluProjectId: this.nluProjectId,
196
+ nluLanguageCode: this.nluLanguageCode,
197
+ t2sPipelineId: this.t2sPipelineId
198
+ };
199
+ }
200
+ /**
201
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
202
+ */
203
+ toJSON() {
204
+ return this.toObject();
205
+ }
206
+ /**
207
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
208
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
209
+ * 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
210
+ */
211
+ toProtobufJSON(
212
+ // @ts-ignore
213
+ options) {
214
+ return {
215
+ id: this.id,
216
+ s2tPipelineId: this.s2tPipelineId,
217
+ nluProjectId: this.nluProjectId,
218
+ nluLanguageCode: this.nluLanguageCode,
219
+ t2sPipelineId: this.t2sPipelineId
220
+ };
221
+ }
222
+ }
223
+ S2sPipeline.id = 'ondewo.csi.S2sPipeline';
224
+ /**
225
+ * Message implementation for ondewo.csi.S2sPipelineId
226
+ */
227
+ export class S2sPipelineId {
228
+ /**
229
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
230
+ * @param _value initial values object or instance of S2sPipelineId to deeply clone from
231
+ */
232
+ constructor(_value) {
233
+ _value = _value || {};
234
+ this.id = _value.id;
235
+ S2sPipelineId.refineValues(this);
236
+ }
237
+ /**
238
+ * Deserialize binary data to message
239
+ * @param instance message instance
240
+ */
241
+ static deserializeBinary(bytes) {
242
+ const instance = new S2sPipelineId();
243
+ S2sPipelineId.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
244
+ return instance;
245
+ }
246
+ /**
247
+ * Check all the properties and set default protobuf values if necessary
248
+ * @param _instance message instance
249
+ */
250
+ static refineValues(_instance) {
251
+ _instance.id = _instance.id || '';
252
+ }
253
+ /**
254
+ * Deserializes / reads binary message into message instance using provided binary reader
255
+ * @param _instance message instance
256
+ * @param _reader binary reader instance
257
+ */
258
+ static deserializeBinaryFromReader(_instance, _reader) {
259
+ while (_reader.nextField()) {
260
+ if (_reader.isEndGroup())
261
+ break;
262
+ switch (_reader.getFieldNumber()) {
263
+ case 1:
264
+ _instance.id = _reader.readString();
265
+ break;
266
+ default:
267
+ _reader.skipField();
268
+ }
269
+ }
270
+ S2sPipelineId.refineValues(_instance);
271
+ }
272
+ /**
273
+ * Serializes a message to binary format using provided binary reader
274
+ * @param _instance message instance
275
+ * @param _writer binary writer instance
276
+ */
277
+ static serializeBinaryToWriter(_instance, _writer) {
278
+ if (_instance.id) {
279
+ _writer.writeString(1, _instance.id);
280
+ }
281
+ }
282
+ get id() {
283
+ return this._id;
284
+ }
285
+ set id(value) {
286
+ this._id = value;
287
+ }
288
+ /**
289
+ * Serialize message to binary data
290
+ * @param instance message instance
291
+ */
292
+ serializeBinary() {
293
+ const writer = new BinaryWriter();
294
+ S2sPipelineId.serializeBinaryToWriter(this, writer);
295
+ return writer.getResultBuffer();
296
+ }
297
+ /**
298
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
299
+ */
300
+ toObject() {
301
+ return {
302
+ id: this.id
303
+ };
304
+ }
305
+ /**
306
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
307
+ */
308
+ toJSON() {
309
+ return this.toObject();
310
+ }
311
+ /**
312
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
313
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
314
+ * 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
315
+ */
316
+ toProtobufJSON(
317
+ // @ts-ignore
318
+ options) {
319
+ return {
320
+ id: this.id
321
+ };
322
+ }
323
+ }
324
+ S2sPipelineId.id = 'ondewo.csi.S2sPipelineId';
325
+ /**
326
+ * Message implementation for ondewo.csi.ListS2sPipelinesRequest
327
+ */
328
+ export class ListS2sPipelinesRequest {
329
+ /**
330
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
331
+ * @param _value initial values object or instance of ListS2sPipelinesRequest to deeply clone from
332
+ */
333
+ constructor(_value) {
334
+ _value = _value || {};
335
+ ListS2sPipelinesRequest.refineValues(this);
336
+ }
337
+ /**
338
+ * Deserialize binary data to message
339
+ * @param instance message instance
340
+ */
341
+ static deserializeBinary(bytes) {
342
+ const instance = new ListS2sPipelinesRequest();
343
+ ListS2sPipelinesRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
344
+ return instance;
345
+ }
346
+ /**
347
+ * Check all the properties and set default protobuf values if necessary
348
+ * @param _instance message instance
349
+ */
350
+ static refineValues(_instance) { }
351
+ /**
352
+ * Deserializes / reads binary message into message instance using provided binary reader
353
+ * @param _instance message instance
354
+ * @param _reader binary reader instance
355
+ */
356
+ static deserializeBinaryFromReader(_instance, _reader) {
357
+ while (_reader.nextField()) {
358
+ if (_reader.isEndGroup())
359
+ break;
360
+ switch (_reader.getFieldNumber()) {
361
+ default:
362
+ _reader.skipField();
363
+ }
364
+ }
365
+ ListS2sPipelinesRequest.refineValues(_instance);
366
+ }
367
+ /**
368
+ * Serializes a message to binary format using provided binary reader
369
+ * @param _instance message instance
370
+ * @param _writer binary writer instance
371
+ */
372
+ static serializeBinaryToWriter(_instance, _writer) { }
373
+ /**
374
+ * Serialize message to binary data
375
+ * @param instance message instance
376
+ */
377
+ serializeBinary() {
378
+ const writer = new BinaryWriter();
379
+ ListS2sPipelinesRequest.serializeBinaryToWriter(this, writer);
380
+ return writer.getResultBuffer();
381
+ }
382
+ /**
383
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
384
+ */
385
+ toObject() {
386
+ return {};
387
+ }
388
+ /**
389
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
390
+ */
391
+ toJSON() {
392
+ return this.toObject();
393
+ }
394
+ /**
395
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
396
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
397
+ * 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
398
+ */
399
+ toProtobufJSON(
400
+ // @ts-ignore
401
+ options) {
402
+ return {};
403
+ }
404
+ }
405
+ ListS2sPipelinesRequest.id = 'ondewo.csi.ListS2sPipelinesRequest';
406
+ /**
407
+ * Message implementation for ondewo.csi.ListS2sPipelinesResponse
408
+ */
409
+ export class ListS2sPipelinesResponse {
410
+ /**
411
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
412
+ * @param _value initial values object or instance of ListS2sPipelinesResponse to deeply clone from
413
+ */
414
+ constructor(_value) {
415
+ _value = _value || {};
416
+ this.pipelines = (_value.pipelines || []).map(m => new S2sPipeline(m));
417
+ ListS2sPipelinesResponse.refineValues(this);
418
+ }
419
+ /**
420
+ * Deserialize binary data to message
421
+ * @param instance message instance
422
+ */
423
+ static deserializeBinary(bytes) {
424
+ const instance = new ListS2sPipelinesResponse();
425
+ ListS2sPipelinesResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
426
+ return instance;
427
+ }
428
+ /**
429
+ * Check all the properties and set default protobuf values if necessary
430
+ * @param _instance message instance
431
+ */
432
+ static refineValues(_instance) {
433
+ _instance.pipelines = _instance.pipelines || [];
434
+ }
435
+ /**
436
+ * Deserializes / reads binary message into message instance using provided binary reader
437
+ * @param _instance message instance
438
+ * @param _reader binary reader instance
439
+ */
440
+ static deserializeBinaryFromReader(_instance, _reader) {
441
+ while (_reader.nextField()) {
442
+ if (_reader.isEndGroup())
443
+ break;
444
+ switch (_reader.getFieldNumber()) {
445
+ case 1:
446
+ const messageInitializer1 = new S2sPipeline();
447
+ _reader.readMessage(messageInitializer1, S2sPipeline.deserializeBinaryFromReader);
448
+ (_instance.pipelines = _instance.pipelines || []).push(messageInitializer1);
449
+ break;
450
+ default:
451
+ _reader.skipField();
452
+ }
453
+ }
454
+ ListS2sPipelinesResponse.refineValues(_instance);
455
+ }
456
+ /**
457
+ * Serializes a message to binary format using provided binary reader
458
+ * @param _instance message instance
459
+ * @param _writer binary writer instance
460
+ */
461
+ static serializeBinaryToWriter(_instance, _writer) {
462
+ if (_instance.pipelines && _instance.pipelines.length) {
463
+ _writer.writeRepeatedMessage(1, _instance.pipelines, S2sPipeline.serializeBinaryToWriter);
464
+ }
465
+ }
466
+ get pipelines() {
467
+ return this._pipelines;
468
+ }
469
+ set pipelines(value) {
470
+ this._pipelines = value;
471
+ }
472
+ /**
473
+ * Serialize message to binary data
474
+ * @param instance message instance
475
+ */
476
+ serializeBinary() {
477
+ const writer = new BinaryWriter();
478
+ ListS2sPipelinesResponse.serializeBinaryToWriter(this, writer);
479
+ return writer.getResultBuffer();
480
+ }
481
+ /**
482
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
483
+ */
484
+ toObject() {
485
+ return {
486
+ pipelines: (this.pipelines || []).map(m => m.toObject())
487
+ };
488
+ }
489
+ /**
490
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
491
+ */
492
+ toJSON() {
493
+ return this.toObject();
494
+ }
495
+ /**
496
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
497
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
498
+ * 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
499
+ */
500
+ toProtobufJSON(
501
+ // @ts-ignore
502
+ options) {
503
+ return {
504
+ pipelines: (this.pipelines || []).map(m => m.toProtobufJSON(options))
505
+ };
506
+ }
507
+ }
508
+ ListS2sPipelinesResponse.id = 'ondewo.csi.ListS2sPipelinesResponse';
509
+ /**
510
+ * Message implementation for ondewo.csi.S2sStreamRequest
511
+ */
512
+ export class S2sStreamRequest {
513
+ /**
514
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
515
+ * @param _value initial values object or instance of S2sStreamRequest to deeply clone from
516
+ */
517
+ constructor(_value) {
518
+ _value = _value || {};
519
+ this.pipelineId = _value.pipelineId;
520
+ this.sessionId = _value.sessionId;
521
+ this.audio = _value.audio;
522
+ this.endOfStream = _value.endOfStream;
523
+ this.initialIntentDisplayName = _value.initialIntentDisplayName;
524
+ S2sStreamRequest.refineValues(this);
525
+ }
526
+ /**
527
+ * Deserialize binary data to message
528
+ * @param instance message instance
529
+ */
530
+ static deserializeBinary(bytes) {
531
+ const instance = new S2sStreamRequest();
532
+ S2sStreamRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
533
+ return instance;
534
+ }
535
+ /**
536
+ * Check all the properties and set default protobuf values if necessary
537
+ * @param _instance message instance
538
+ */
539
+ static refineValues(_instance) {
540
+ _instance.pipelineId = _instance.pipelineId || '';
541
+ _instance.sessionId = _instance.sessionId || '';
542
+ _instance.audio = _instance.audio || new Uint8Array();
543
+ _instance.endOfStream = _instance.endOfStream || false;
544
+ _instance.initialIntentDisplayName =
545
+ _instance.initialIntentDisplayName || '';
546
+ }
547
+ /**
548
+ * Deserializes / reads binary message into message instance using provided binary reader
549
+ * @param _instance message instance
550
+ * @param _reader binary reader instance
551
+ */
552
+ static deserializeBinaryFromReader(_instance, _reader) {
553
+ while (_reader.nextField()) {
554
+ if (_reader.isEndGroup())
555
+ break;
556
+ switch (_reader.getFieldNumber()) {
557
+ case 1:
558
+ _instance.pipelineId = _reader.readString();
559
+ break;
560
+ case 2:
561
+ _instance.sessionId = _reader.readString();
562
+ break;
563
+ case 3:
564
+ _instance.audio = _reader.readBytes();
565
+ break;
566
+ case 4:
567
+ _instance.endOfStream = _reader.readBool();
568
+ break;
569
+ case 5:
570
+ _instance.initialIntentDisplayName = _reader.readString();
571
+ break;
572
+ default:
573
+ _reader.skipField();
574
+ }
575
+ }
576
+ S2sStreamRequest.refineValues(_instance);
577
+ }
578
+ /**
579
+ * Serializes a message to binary format using provided binary reader
580
+ * @param _instance message instance
581
+ * @param _writer binary writer instance
582
+ */
583
+ static serializeBinaryToWriter(_instance, _writer) {
584
+ if (_instance.pipelineId) {
585
+ _writer.writeString(1, _instance.pipelineId);
586
+ }
587
+ if (_instance.sessionId) {
588
+ _writer.writeString(2, _instance.sessionId);
589
+ }
590
+ if (_instance.audio && _instance.audio.length) {
591
+ _writer.writeBytes(3, _instance.audio);
592
+ }
593
+ if (_instance.endOfStream) {
594
+ _writer.writeBool(4, _instance.endOfStream);
595
+ }
596
+ if (_instance.initialIntentDisplayName) {
597
+ _writer.writeString(5, _instance.initialIntentDisplayName);
598
+ }
599
+ }
600
+ get pipelineId() {
601
+ return this._pipelineId;
602
+ }
603
+ set pipelineId(value) {
604
+ this._pipelineId = value;
605
+ }
606
+ get sessionId() {
607
+ return this._sessionId;
608
+ }
609
+ set sessionId(value) {
610
+ this._sessionId = value;
611
+ }
612
+ get audio() {
613
+ return this._audio;
614
+ }
615
+ set audio(value) {
616
+ this._audio = value;
617
+ }
618
+ get endOfStream() {
619
+ return this._endOfStream;
620
+ }
621
+ set endOfStream(value) {
622
+ this._endOfStream = value;
623
+ }
624
+ get initialIntentDisplayName() {
625
+ return this._initialIntentDisplayName;
626
+ }
627
+ set initialIntentDisplayName(value) {
628
+ this._initialIntentDisplayName = value;
629
+ }
630
+ /**
631
+ * Serialize message to binary data
632
+ * @param instance message instance
633
+ */
634
+ serializeBinary() {
635
+ const writer = new BinaryWriter();
636
+ S2sStreamRequest.serializeBinaryToWriter(this, writer);
637
+ return writer.getResultBuffer();
638
+ }
639
+ /**
640
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
641
+ */
642
+ toObject() {
643
+ return {
644
+ pipelineId: this.pipelineId,
645
+ sessionId: this.sessionId,
646
+ audio: this.audio ? this.audio.subarray(0) : new Uint8Array(),
647
+ endOfStream: this.endOfStream,
648
+ initialIntentDisplayName: this.initialIntentDisplayName
649
+ };
650
+ }
651
+ /**
652
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
653
+ */
654
+ toJSON() {
655
+ return this.toObject();
656
+ }
657
+ /**
658
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
659
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
660
+ * 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
661
+ */
662
+ toProtobufJSON(
663
+ // @ts-ignore
664
+ options) {
665
+ return {
666
+ pipelineId: this.pipelineId,
667
+ sessionId: this.sessionId,
668
+ audio: this.audio ? uint8ArrayToBase64(this.audio) : '',
669
+ endOfStream: this.endOfStream,
670
+ initialIntentDisplayName: this.initialIntentDisplayName
671
+ };
672
+ }
673
+ }
674
+ S2sStreamRequest.id = 'ondewo.csi.S2sStreamRequest';
675
+ /**
676
+ * Message implementation for ondewo.csi.S2sStreamResponse
677
+ */
678
+ export class S2sStreamResponse {
679
+ /**
680
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
681
+ * @param _value initial values object or instance of S2sStreamResponse to deeply clone from
682
+ */
683
+ constructor(_value) {
684
+ this._response = S2sStreamResponse.ResponseCase.none;
685
+ _value = _value || {};
686
+ this.detectIntentResponse = _value.detectIntentResponse
687
+ ? new ondewoNlu011.DetectIntentResponse(_value.detectIntentResponse)
688
+ : undefined;
689
+ this.synthetizeResponse = _value.synthetizeResponse
690
+ ? new ondewoT2s012.SynthesizeResponse(_value.synthetizeResponse)
691
+ : undefined;
692
+ this.sipTrigger = _value.sipTrigger
693
+ ? new SipTrigger(_value.sipTrigger)
694
+ : undefined;
695
+ S2sStreamResponse.refineValues(this);
696
+ }
697
+ /**
698
+ * Deserialize binary data to message
699
+ * @param instance message instance
700
+ */
701
+ static deserializeBinary(bytes) {
702
+ const instance = new S2sStreamResponse();
703
+ S2sStreamResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
704
+ return instance;
705
+ }
706
+ /**
707
+ * Check all the properties and set default protobuf values if necessary
708
+ * @param _instance message instance
709
+ */
710
+ static refineValues(_instance) { }
711
+ /**
712
+ * Deserializes / reads binary message into message instance using provided binary reader
713
+ * @param _instance message instance
714
+ * @param _reader binary reader instance
715
+ */
716
+ static deserializeBinaryFromReader(_instance, _reader) {
717
+ while (_reader.nextField()) {
718
+ if (_reader.isEndGroup())
719
+ break;
720
+ switch (_reader.getFieldNumber()) {
721
+ case 1:
722
+ _instance.detectIntentResponse = new ondewoNlu011.DetectIntentResponse();
723
+ _reader.readMessage(_instance.detectIntentResponse, ondewoNlu011.DetectIntentResponse.deserializeBinaryFromReader);
724
+ break;
725
+ case 2:
726
+ _instance.synthetizeResponse = new ondewoT2s012.SynthesizeResponse();
727
+ _reader.readMessage(_instance.synthetizeResponse, ondewoT2s012.SynthesizeResponse.deserializeBinaryFromReader);
728
+ break;
729
+ case 3:
730
+ _instance.sipTrigger = new SipTrigger();
731
+ _reader.readMessage(_instance.sipTrigger, SipTrigger.deserializeBinaryFromReader);
732
+ break;
733
+ default:
734
+ _reader.skipField();
735
+ }
736
+ }
737
+ S2sStreamResponse.refineValues(_instance);
738
+ }
739
+ /**
740
+ * Serializes a message to binary format using provided binary reader
741
+ * @param _instance message instance
742
+ * @param _writer binary writer instance
743
+ */
744
+ static serializeBinaryToWriter(_instance, _writer) {
745
+ if (_instance.detectIntentResponse) {
746
+ _writer.writeMessage(1, _instance.detectIntentResponse, ondewoNlu011.DetectIntentResponse.serializeBinaryToWriter);
747
+ }
748
+ if (_instance.synthetizeResponse) {
749
+ _writer.writeMessage(2, _instance.synthetizeResponse, ondewoT2s012.SynthesizeResponse.serializeBinaryToWriter);
750
+ }
751
+ if (_instance.sipTrigger) {
752
+ _writer.writeMessage(3, _instance.sipTrigger, SipTrigger.serializeBinaryToWriter);
753
+ }
754
+ }
755
+ get detectIntentResponse() {
756
+ return this._detectIntentResponse;
757
+ }
758
+ set detectIntentResponse(value) {
759
+ if (value !== undefined && value !== null) {
760
+ this._synthetizeResponse = this._sipTrigger = undefined;
761
+ this._response = S2sStreamResponse.ResponseCase.detectIntentResponse;
762
+ }
763
+ this._detectIntentResponse = value;
764
+ }
765
+ get synthetizeResponse() {
766
+ return this._synthetizeResponse;
767
+ }
768
+ set synthetizeResponse(value) {
769
+ if (value !== undefined && value !== null) {
770
+ this._detectIntentResponse = this._sipTrigger = undefined;
771
+ this._response = S2sStreamResponse.ResponseCase.synthetizeResponse;
772
+ }
773
+ this._synthetizeResponse = value;
774
+ }
775
+ get sipTrigger() {
776
+ return this._sipTrigger;
777
+ }
778
+ set sipTrigger(value) {
779
+ if (value !== undefined && value !== null) {
780
+ this._detectIntentResponse = this._synthetizeResponse = undefined;
781
+ this._response = S2sStreamResponse.ResponseCase.sipTrigger;
782
+ }
783
+ this._sipTrigger = value;
784
+ }
785
+ get response() {
786
+ return this._response;
787
+ }
788
+ /**
789
+ * Serialize message to binary data
790
+ * @param instance message instance
791
+ */
792
+ serializeBinary() {
793
+ const writer = new BinaryWriter();
794
+ S2sStreamResponse.serializeBinaryToWriter(this, writer);
795
+ return writer.getResultBuffer();
796
+ }
797
+ /**
798
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
799
+ */
800
+ toObject() {
801
+ return {
802
+ detectIntentResponse: this.detectIntentResponse
803
+ ? this.detectIntentResponse.toObject()
804
+ : undefined,
805
+ synthetizeResponse: this.synthetizeResponse
806
+ ? this.synthetizeResponse.toObject()
807
+ : undefined,
808
+ sipTrigger: this.sipTrigger ? this.sipTrigger.toObject() : undefined
809
+ };
810
+ }
811
+ /**
812
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
813
+ */
814
+ toJSON() {
815
+ return this.toObject();
816
+ }
817
+ /**
818
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
819
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
820
+ * 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
821
+ */
822
+ toProtobufJSON(
823
+ // @ts-ignore
824
+ options) {
825
+ return {
826
+ detectIntentResponse: this.detectIntentResponse
827
+ ? this.detectIntentResponse.toProtobufJSON(options)
828
+ : null,
829
+ synthetizeResponse: this.synthetizeResponse
830
+ ? this.synthetizeResponse.toProtobufJSON(options)
831
+ : null,
832
+ sipTrigger: this.sipTrigger
833
+ ? this.sipTrigger.toProtobufJSON(options)
834
+ : null
835
+ };
836
+ }
837
+ }
838
+ S2sStreamResponse.id = 'ondewo.csi.S2sStreamResponse';
839
+ (function (S2sStreamResponse) {
840
+ let ResponseCase;
841
+ (function (ResponseCase) {
842
+ ResponseCase[ResponseCase["none"] = 0] = "none";
843
+ ResponseCase[ResponseCase["detectIntentResponse"] = 1] = "detectIntentResponse";
844
+ ResponseCase[ResponseCase["synthetizeResponse"] = 2] = "synthetizeResponse";
845
+ ResponseCase[ResponseCase["sipTrigger"] = 3] = "sipTrigger";
846
+ })(ResponseCase = S2sStreamResponse.ResponseCase || (S2sStreamResponse.ResponseCase = {}));
847
+ })(S2sStreamResponse || (S2sStreamResponse = {}));
848
+ /**
849
+ * Message implementation for ondewo.csi.SipTrigger
850
+ */
851
+ export class SipTrigger {
852
+ /**
853
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
854
+ * @param _value initial values object or instance of SipTrigger to deeply clone from
855
+ */
856
+ constructor(_value) {
857
+ _value = _value || {};
858
+ this.type = _value.type;
859
+ this.content = _value.content
860
+ ? new googleProtobuf003.Struct(_value.content)
861
+ : undefined;
862
+ SipTrigger.refineValues(this);
863
+ }
864
+ /**
865
+ * Deserialize binary data to message
866
+ * @param instance message instance
867
+ */
868
+ static deserializeBinary(bytes) {
869
+ const instance = new SipTrigger();
870
+ SipTrigger.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
871
+ return instance;
872
+ }
873
+ /**
874
+ * Check all the properties and set default protobuf values if necessary
875
+ * @param _instance message instance
876
+ */
877
+ static refineValues(_instance) {
878
+ _instance.type = _instance.type || 0;
879
+ _instance.content = _instance.content || undefined;
880
+ }
881
+ /**
882
+ * Deserializes / reads binary message into message instance using provided binary reader
883
+ * @param _instance message instance
884
+ * @param _reader binary reader instance
885
+ */
886
+ static deserializeBinaryFromReader(_instance, _reader) {
887
+ while (_reader.nextField()) {
888
+ if (_reader.isEndGroup())
889
+ break;
890
+ switch (_reader.getFieldNumber()) {
891
+ case 1:
892
+ _instance.type = _reader.readEnum();
893
+ break;
894
+ case 2:
895
+ _instance.content = new googleProtobuf003.Struct();
896
+ _reader.readMessage(_instance.content, googleProtobuf003.Struct.deserializeBinaryFromReader);
897
+ break;
898
+ default:
899
+ _reader.skipField();
900
+ }
901
+ }
902
+ SipTrigger.refineValues(_instance);
903
+ }
904
+ /**
905
+ * Serializes a message to binary format using provided binary reader
906
+ * @param _instance message instance
907
+ * @param _writer binary writer instance
908
+ */
909
+ static serializeBinaryToWriter(_instance, _writer) {
910
+ if (_instance.type) {
911
+ _writer.writeEnum(1, _instance.type);
912
+ }
913
+ if (_instance.content) {
914
+ _writer.writeMessage(2, _instance.content, googleProtobuf003.Struct.serializeBinaryToWriter);
915
+ }
916
+ }
917
+ get type() {
918
+ return this._type;
919
+ }
920
+ set type(value) {
921
+ this._type = value;
922
+ }
923
+ get content() {
924
+ return this._content;
925
+ }
926
+ set content(value) {
927
+ this._content = value;
928
+ }
929
+ /**
930
+ * Serialize message to binary data
931
+ * @param instance message instance
932
+ */
933
+ serializeBinary() {
934
+ const writer = new BinaryWriter();
935
+ SipTrigger.serializeBinaryToWriter(this, writer);
936
+ return writer.getResultBuffer();
937
+ }
938
+ /**
939
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
940
+ */
941
+ toObject() {
942
+ return {
943
+ type: this.type,
944
+ content: this.content ? this.content.toObject() : undefined
945
+ };
946
+ }
947
+ /**
948
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
949
+ */
950
+ toJSON() {
951
+ return this.toObject();
952
+ }
953
+ /**
954
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
955
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
956
+ * 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
957
+ */
958
+ toProtobufJSON(
959
+ // @ts-ignore
960
+ options) {
961
+ return {
962
+ type: SipTrigger.SipTriggerType[this.type === null || this.type === undefined ? 0 : this.type],
963
+ content: this.content ? this.content.toProtobufJSON(options) : null
964
+ };
965
+ }
966
+ }
967
+ SipTrigger.id = 'ondewo.csi.SipTrigger';
968
+ (function (SipTrigger) {
969
+ let SipTriggerType;
970
+ (function (SipTriggerType) {
971
+ SipTriggerType[SipTriggerType["UNSPECIFIED"] = 0] = "UNSPECIFIED";
972
+ SipTriggerType[SipTriggerType["HANGUP"] = 1] = "HANGUP";
973
+ SipTriggerType[SipTriggerType["HUMAN_HANDOVER"] = 2] = "HUMAN_HANDOVER";
974
+ SipTriggerType[SipTriggerType["SEND_NOW"] = 3] = "SEND_NOW";
975
+ SipTriggerType[SipTriggerType["PAUSE"] = 4] = "PAUSE";
976
+ })(SipTriggerType = SipTrigger.SipTriggerType || (SipTrigger.SipTriggerType = {}));
977
+ })(SipTrigger || (SipTrigger = {}));
978
+ /**
979
+ * Message implementation for ondewo.csi.CheckUpstreamHealthResponse
980
+ */
981
+ export class CheckUpstreamHealthResponse {
982
+ /**
983
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
984
+ * @param _value initial values object or instance of CheckUpstreamHealthResponse to deeply clone from
985
+ */
986
+ constructor(_value) {
987
+ _value = _value || {};
988
+ this.s2tStatus = _value.s2tStatus
989
+ ? new googleRpc004.Status(_value.s2tStatus)
990
+ : undefined;
991
+ this.nluStatus = _value.nluStatus
992
+ ? new googleRpc004.Status(_value.nluStatus)
993
+ : undefined;
994
+ this.t2sStatus = _value.t2sStatus
995
+ ? new googleRpc004.Status(_value.t2sStatus)
996
+ : undefined;
997
+ CheckUpstreamHealthResponse.refineValues(this);
998
+ }
999
+ /**
1000
+ * Deserialize binary data to message
1001
+ * @param instance message instance
1002
+ */
1003
+ static deserializeBinary(bytes) {
1004
+ const instance = new CheckUpstreamHealthResponse();
1005
+ CheckUpstreamHealthResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1006
+ return instance;
1007
+ }
1008
+ /**
1009
+ * Check all the properties and set default protobuf values if necessary
1010
+ * @param _instance message instance
1011
+ */
1012
+ static refineValues(_instance) {
1013
+ _instance.s2tStatus = _instance.s2tStatus || undefined;
1014
+ _instance.nluStatus = _instance.nluStatus || undefined;
1015
+ _instance.t2sStatus = _instance.t2sStatus || undefined;
1016
+ }
1017
+ /**
1018
+ * Deserializes / reads binary message into message instance using provided binary reader
1019
+ * @param _instance message instance
1020
+ * @param _reader binary reader instance
1021
+ */
1022
+ static deserializeBinaryFromReader(_instance, _reader) {
1023
+ while (_reader.nextField()) {
1024
+ if (_reader.isEndGroup())
1025
+ break;
1026
+ switch (_reader.getFieldNumber()) {
1027
+ case 1:
1028
+ _instance.s2tStatus = new googleRpc004.Status();
1029
+ _reader.readMessage(_instance.s2tStatus, googleRpc004.Status.deserializeBinaryFromReader);
1030
+ break;
1031
+ case 2:
1032
+ _instance.nluStatus = new googleRpc004.Status();
1033
+ _reader.readMessage(_instance.nluStatus, googleRpc004.Status.deserializeBinaryFromReader);
1034
+ break;
1035
+ case 3:
1036
+ _instance.t2sStatus = new googleRpc004.Status();
1037
+ _reader.readMessage(_instance.t2sStatus, googleRpc004.Status.deserializeBinaryFromReader);
1038
+ break;
1039
+ default:
1040
+ _reader.skipField();
1041
+ }
1042
+ }
1043
+ CheckUpstreamHealthResponse.refineValues(_instance);
1044
+ }
1045
+ /**
1046
+ * Serializes a message to binary format using provided binary reader
1047
+ * @param _instance message instance
1048
+ * @param _writer binary writer instance
1049
+ */
1050
+ static serializeBinaryToWriter(_instance, _writer) {
1051
+ if (_instance.s2tStatus) {
1052
+ _writer.writeMessage(1, _instance.s2tStatus, googleRpc004.Status.serializeBinaryToWriter);
1053
+ }
1054
+ if (_instance.nluStatus) {
1055
+ _writer.writeMessage(2, _instance.nluStatus, googleRpc004.Status.serializeBinaryToWriter);
1056
+ }
1057
+ if (_instance.t2sStatus) {
1058
+ _writer.writeMessage(3, _instance.t2sStatus, googleRpc004.Status.serializeBinaryToWriter);
1059
+ }
1060
+ }
1061
+ get s2tStatus() {
1062
+ return this._s2tStatus;
1063
+ }
1064
+ set s2tStatus(value) {
1065
+ this._s2tStatus = value;
1066
+ }
1067
+ get nluStatus() {
1068
+ return this._nluStatus;
1069
+ }
1070
+ set nluStatus(value) {
1071
+ this._nluStatus = value;
1072
+ }
1073
+ get t2sStatus() {
1074
+ return this._t2sStatus;
1075
+ }
1076
+ set t2sStatus(value) {
1077
+ this._t2sStatus = value;
1078
+ }
1079
+ /**
1080
+ * Serialize message to binary data
1081
+ * @param instance message instance
1082
+ */
1083
+ serializeBinary() {
1084
+ const writer = new BinaryWriter();
1085
+ CheckUpstreamHealthResponse.serializeBinaryToWriter(this, writer);
1086
+ return writer.getResultBuffer();
1087
+ }
1088
+ /**
1089
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1090
+ */
1091
+ toObject() {
1092
+ return {
1093
+ s2tStatus: this.s2tStatus ? this.s2tStatus.toObject() : undefined,
1094
+ nluStatus: this.nluStatus ? this.nluStatus.toObject() : undefined,
1095
+ t2sStatus: this.t2sStatus ? this.t2sStatus.toObject() : undefined
1096
+ };
1097
+ }
1098
+ /**
1099
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1100
+ */
1101
+ toJSON() {
1102
+ return this.toObject();
1103
+ }
1104
+ /**
1105
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1106
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1107
+ * 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
1108
+ */
1109
+ toProtobufJSON(
1110
+ // @ts-ignore
1111
+ options) {
1112
+ return {
1113
+ s2tStatus: this.s2tStatus ? this.s2tStatus.toProtobufJSON(options) : null,
1114
+ nluStatus: this.nluStatus ? this.nluStatus.toProtobufJSON(options) : null,
1115
+ t2sStatus: this.t2sStatus ? this.t2sStatus.toProtobufJSON(options) : null
1116
+ };
1117
+ }
1118
+ }
1119
+ CheckUpstreamHealthResponse.id = 'ondewo.csi.CheckUpstreamHealthResponse';
1120
+ /**
1121
+ * Message implementation for ondewo.csi.ControlStreamRequest
1122
+ */
1123
+ export class ControlStreamRequest {
1124
+ /**
1125
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1126
+ * @param _value initial values object or instance of ControlStreamRequest to deeply clone from
1127
+ */
1128
+ constructor(_value) {
1129
+ _value = _value || {};
1130
+ ControlStreamRequest.refineValues(this);
1131
+ }
1132
+ /**
1133
+ * Deserialize binary data to message
1134
+ * @param instance message instance
1135
+ */
1136
+ static deserializeBinary(bytes) {
1137
+ const instance = new ControlStreamRequest();
1138
+ ControlStreamRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1139
+ return instance;
1140
+ }
1141
+ /**
1142
+ * Check all the properties and set default protobuf values if necessary
1143
+ * @param _instance message instance
1144
+ */
1145
+ static refineValues(_instance) { }
1146
+ /**
1147
+ * Deserializes / reads binary message into message instance using provided binary reader
1148
+ * @param _instance message instance
1149
+ * @param _reader binary reader instance
1150
+ */
1151
+ static deserializeBinaryFromReader(_instance, _reader) {
1152
+ while (_reader.nextField()) {
1153
+ if (_reader.isEndGroup())
1154
+ break;
1155
+ switch (_reader.getFieldNumber()) {
1156
+ default:
1157
+ _reader.skipField();
1158
+ }
1159
+ }
1160
+ ControlStreamRequest.refineValues(_instance);
1161
+ }
1162
+ /**
1163
+ * Serializes a message to binary format using provided binary reader
1164
+ * @param _instance message instance
1165
+ * @param _writer binary writer instance
1166
+ */
1167
+ static serializeBinaryToWriter(_instance, _writer) { }
1168
+ /**
1169
+ * Serialize message to binary data
1170
+ * @param instance message instance
1171
+ */
1172
+ serializeBinary() {
1173
+ const writer = new BinaryWriter();
1174
+ ControlStreamRequest.serializeBinaryToWriter(this, writer);
1175
+ return writer.getResultBuffer();
1176
+ }
1177
+ /**
1178
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1179
+ */
1180
+ toObject() {
1181
+ return {};
1182
+ }
1183
+ /**
1184
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1185
+ */
1186
+ toJSON() {
1187
+ return this.toObject();
1188
+ }
1189
+ /**
1190
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1191
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1192
+ * 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
1193
+ */
1194
+ toProtobufJSON(
1195
+ // @ts-ignore
1196
+ options) {
1197
+ return {};
1198
+ }
1199
+ }
1200
+ ControlStreamRequest.id = 'ondewo.csi.ControlStreamRequest';
1201
+ /**
1202
+ * Message implementation for ondewo.csi.ControlStreamResponse
1203
+ */
1204
+ export class ControlStreamResponse {
1205
+ /**
1206
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1207
+ * @param _value initial values object or instance of ControlStreamResponse to deeply clone from
1208
+ */
1209
+ constructor(_value) {
1210
+ _value = _value || {};
1211
+ this.controlStatus = _value.controlStatus;
1212
+ ControlStreamResponse.refineValues(this);
1213
+ }
1214
+ /**
1215
+ * Deserialize binary data to message
1216
+ * @param instance message instance
1217
+ */
1218
+ static deserializeBinary(bytes) {
1219
+ const instance = new ControlStreamResponse();
1220
+ ControlStreamResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1221
+ return instance;
1222
+ }
1223
+ /**
1224
+ * Check all the properties and set default protobuf values if necessary
1225
+ * @param _instance message instance
1226
+ */
1227
+ static refineValues(_instance) {
1228
+ _instance.controlStatus = _instance.controlStatus || 0;
1229
+ }
1230
+ /**
1231
+ * Deserializes / reads binary message into message instance using provided binary reader
1232
+ * @param _instance message instance
1233
+ * @param _reader binary reader instance
1234
+ */
1235
+ static deserializeBinaryFromReader(_instance, _reader) {
1236
+ while (_reader.nextField()) {
1237
+ if (_reader.isEndGroup())
1238
+ break;
1239
+ switch (_reader.getFieldNumber()) {
1240
+ case 1:
1241
+ _instance.controlStatus = _reader.readEnum();
1242
+ break;
1243
+ default:
1244
+ _reader.skipField();
1245
+ }
1246
+ }
1247
+ ControlStreamResponse.refineValues(_instance);
1248
+ }
1249
+ /**
1250
+ * Serializes a message to binary format using provided binary reader
1251
+ * @param _instance message instance
1252
+ * @param _writer binary writer instance
1253
+ */
1254
+ static serializeBinaryToWriter(_instance, _writer) {
1255
+ if (_instance.controlStatus) {
1256
+ _writer.writeEnum(1, _instance.controlStatus);
1257
+ }
1258
+ }
1259
+ get controlStatus() {
1260
+ return this._controlStatus;
1261
+ }
1262
+ set controlStatus(value) {
1263
+ this._controlStatus = value;
1264
+ }
1265
+ /**
1266
+ * Serialize message to binary data
1267
+ * @param instance message instance
1268
+ */
1269
+ serializeBinary() {
1270
+ const writer = new BinaryWriter();
1271
+ ControlStreamResponse.serializeBinaryToWriter(this, writer);
1272
+ return writer.getResultBuffer();
1273
+ }
1274
+ /**
1275
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1276
+ */
1277
+ toObject() {
1278
+ return {
1279
+ controlStatus: this.controlStatus
1280
+ };
1281
+ }
1282
+ /**
1283
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1284
+ */
1285
+ toJSON() {
1286
+ return this.toObject();
1287
+ }
1288
+ /**
1289
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1290
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1291
+ * 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
1292
+ */
1293
+ toProtobufJSON(
1294
+ // @ts-ignore
1295
+ options) {
1296
+ return {
1297
+ controlStatus: ControlStatus[this.controlStatus === null || this.controlStatus === undefined
1298
+ ? 0
1299
+ : this.controlStatus]
1300
+ };
1301
+ }
1302
+ }
1303
+ ControlStreamResponse.id = 'ondewo.csi.ControlStreamResponse';
1304
+ /**
1305
+ * Message implementation for ondewo.csi.SetControlStatusRequest
1306
+ */
1307
+ export class SetControlStatusRequest {
1308
+ /**
1309
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1310
+ * @param _value initial values object or instance of SetControlStatusRequest to deeply clone from
1311
+ */
1312
+ constructor(_value) {
1313
+ _value = _value || {};
1314
+ this.controlStatus = _value.controlStatus;
1315
+ SetControlStatusRequest.refineValues(this);
1316
+ }
1317
+ /**
1318
+ * Deserialize binary data to message
1319
+ * @param instance message instance
1320
+ */
1321
+ static deserializeBinary(bytes) {
1322
+ const instance = new SetControlStatusRequest();
1323
+ SetControlStatusRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1324
+ return instance;
1325
+ }
1326
+ /**
1327
+ * Check all the properties and set default protobuf values if necessary
1328
+ * @param _instance message instance
1329
+ */
1330
+ static refineValues(_instance) {
1331
+ _instance.controlStatus = _instance.controlStatus || 0;
1332
+ }
1333
+ /**
1334
+ * Deserializes / reads binary message into message instance using provided binary reader
1335
+ * @param _instance message instance
1336
+ * @param _reader binary reader instance
1337
+ */
1338
+ static deserializeBinaryFromReader(_instance, _reader) {
1339
+ while (_reader.nextField()) {
1340
+ if (_reader.isEndGroup())
1341
+ break;
1342
+ switch (_reader.getFieldNumber()) {
1343
+ case 1:
1344
+ _instance.controlStatus = _reader.readEnum();
1345
+ break;
1346
+ default:
1347
+ _reader.skipField();
1348
+ }
1349
+ }
1350
+ SetControlStatusRequest.refineValues(_instance);
1351
+ }
1352
+ /**
1353
+ * Serializes a message to binary format using provided binary reader
1354
+ * @param _instance message instance
1355
+ * @param _writer binary writer instance
1356
+ */
1357
+ static serializeBinaryToWriter(_instance, _writer) {
1358
+ if (_instance.controlStatus) {
1359
+ _writer.writeEnum(1, _instance.controlStatus);
1360
+ }
1361
+ }
1362
+ get controlStatus() {
1363
+ return this._controlStatus;
1364
+ }
1365
+ set controlStatus(value) {
1366
+ this._controlStatus = value;
1367
+ }
1368
+ /**
1369
+ * Serialize message to binary data
1370
+ * @param instance message instance
1371
+ */
1372
+ serializeBinary() {
1373
+ const writer = new BinaryWriter();
1374
+ SetControlStatusRequest.serializeBinaryToWriter(this, writer);
1375
+ return writer.getResultBuffer();
1376
+ }
1377
+ /**
1378
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1379
+ */
1380
+ toObject() {
1381
+ return {
1382
+ controlStatus: this.controlStatus
1383
+ };
1384
+ }
1385
+ /**
1386
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1387
+ */
1388
+ toJSON() {
1389
+ return this.toObject();
1390
+ }
1391
+ /**
1392
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1393
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1394
+ * 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
1395
+ */
1396
+ toProtobufJSON(
1397
+ // @ts-ignore
1398
+ options) {
1399
+ return {
1400
+ controlStatus: ControlStatus[this.controlStatus === null || this.controlStatus === undefined
1401
+ ? 0
1402
+ : this.controlStatus]
1403
+ };
1404
+ }
1405
+ }
1406
+ SetControlStatusRequest.id = 'ondewo.csi.SetControlStatusRequest';
1407
+ /**
1408
+ * Message implementation for ondewo.csi.SetControlStatusResponse
1409
+ */
1410
+ export class SetControlStatusResponse {
1411
+ /**
1412
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1413
+ * @param _value initial values object or instance of SetControlStatusResponse to deeply clone from
1414
+ */
1415
+ constructor(_value) {
1416
+ _value = _value || {};
1417
+ this.oldControlStatus = _value.oldControlStatus;
1418
+ this.newControlStatus = _value.newControlStatus;
1419
+ SetControlStatusResponse.refineValues(this);
1420
+ }
1421
+ /**
1422
+ * Deserialize binary data to message
1423
+ * @param instance message instance
1424
+ */
1425
+ static deserializeBinary(bytes) {
1426
+ const instance = new SetControlStatusResponse();
1427
+ SetControlStatusResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1428
+ return instance;
1429
+ }
1430
+ /**
1431
+ * Check all the properties and set default protobuf values if necessary
1432
+ * @param _instance message instance
1433
+ */
1434
+ static refineValues(_instance) {
1435
+ _instance.oldControlStatus = _instance.oldControlStatus || 0;
1436
+ _instance.newControlStatus = _instance.newControlStatus || 0;
1437
+ }
1438
+ /**
1439
+ * Deserializes / reads binary message into message instance using provided binary reader
1440
+ * @param _instance message instance
1441
+ * @param _reader binary reader instance
1442
+ */
1443
+ static deserializeBinaryFromReader(_instance, _reader) {
1444
+ while (_reader.nextField()) {
1445
+ if (_reader.isEndGroup())
1446
+ break;
1447
+ switch (_reader.getFieldNumber()) {
1448
+ case 1:
1449
+ _instance.oldControlStatus = _reader.readEnum();
1450
+ break;
1451
+ case 2:
1452
+ _instance.newControlStatus = _reader.readEnum();
1453
+ break;
1454
+ default:
1455
+ _reader.skipField();
1456
+ }
1457
+ }
1458
+ SetControlStatusResponse.refineValues(_instance);
1459
+ }
1460
+ /**
1461
+ * Serializes a message to binary format using provided binary reader
1462
+ * @param _instance message instance
1463
+ * @param _writer binary writer instance
1464
+ */
1465
+ static serializeBinaryToWriter(_instance, _writer) {
1466
+ if (_instance.oldControlStatus) {
1467
+ _writer.writeEnum(1, _instance.oldControlStatus);
1468
+ }
1469
+ if (_instance.newControlStatus) {
1470
+ _writer.writeEnum(2, _instance.newControlStatus);
1471
+ }
1472
+ }
1473
+ get oldControlStatus() {
1474
+ return this._oldControlStatus;
1475
+ }
1476
+ set oldControlStatus(value) {
1477
+ this._oldControlStatus = value;
1478
+ }
1479
+ get newControlStatus() {
1480
+ return this._newControlStatus;
1481
+ }
1482
+ set newControlStatus(value) {
1483
+ this._newControlStatus = value;
1484
+ }
1485
+ /**
1486
+ * Serialize message to binary data
1487
+ * @param instance message instance
1488
+ */
1489
+ serializeBinary() {
1490
+ const writer = new BinaryWriter();
1491
+ SetControlStatusResponse.serializeBinaryToWriter(this, writer);
1492
+ return writer.getResultBuffer();
1493
+ }
1494
+ /**
1495
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1496
+ */
1497
+ toObject() {
1498
+ return {
1499
+ oldControlStatus: this.oldControlStatus,
1500
+ newControlStatus: this.newControlStatus
1501
+ };
1502
+ }
1503
+ /**
1504
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1505
+ */
1506
+ toJSON() {
1507
+ return this.toObject();
1508
+ }
1509
+ /**
1510
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1511
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1512
+ * 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
1513
+ */
1514
+ toProtobufJSON(
1515
+ // @ts-ignore
1516
+ options) {
1517
+ return {
1518
+ oldControlStatus: ControlStatus[this.oldControlStatus === null || this.oldControlStatus === undefined
1519
+ ? 0
1520
+ : this.oldControlStatus],
1521
+ newControlStatus: ControlStatus[this.newControlStatus === null || this.newControlStatus === undefined
1522
+ ? 0
1523
+ : this.newControlStatus]
1524
+ };
1525
+ }
1526
+ }
1527
+ SetControlStatusResponse.id = 'ondewo.csi.SetControlStatusResponse';
1528
+ /**
1529
+ * Message implementation for ondewo.csi.CondtionValueUnion
1530
+ */
1531
+ export class CondtionValueUnion {
1532
+ /**
1533
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1534
+ * @param _value initial values object or instance of CondtionValueUnion to deeply clone from
1535
+ */
1536
+ constructor(_value) {
1537
+ this._unionOneof = CondtionValueUnion.UnionOneofCase.none;
1538
+ _value = _value || {};
1539
+ this.intValue = _value.intValue;
1540
+ this.floatValue = _value.floatValue;
1541
+ this.datetimeValue = _value.datetimeValue
1542
+ ? new googleProtobuf010.Timestamp(_value.datetimeValue)
1543
+ : undefined;
1544
+ CondtionValueUnion.refineValues(this);
1545
+ }
1546
+ /**
1547
+ * Deserialize binary data to message
1548
+ * @param instance message instance
1549
+ */
1550
+ static deserializeBinary(bytes) {
1551
+ const instance = new CondtionValueUnion();
1552
+ CondtionValueUnion.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1553
+ return instance;
1554
+ }
1555
+ /**
1556
+ * Check all the properties and set default protobuf values if necessary
1557
+ * @param _instance message instance
1558
+ */
1559
+ static refineValues(_instance) { }
1560
+ /**
1561
+ * Deserializes / reads binary message into message instance using provided binary reader
1562
+ * @param _instance message instance
1563
+ * @param _reader binary reader instance
1564
+ */
1565
+ static deserializeBinaryFromReader(_instance, _reader) {
1566
+ while (_reader.nextField()) {
1567
+ if (_reader.isEndGroup())
1568
+ break;
1569
+ switch (_reader.getFieldNumber()) {
1570
+ case 1:
1571
+ _instance.intValue = _reader.readInt64String();
1572
+ break;
1573
+ case 2:
1574
+ _instance.floatValue = _reader.readFloat();
1575
+ break;
1576
+ case 3:
1577
+ _instance.datetimeValue = new googleProtobuf010.Timestamp();
1578
+ _reader.readMessage(_instance.datetimeValue, googleProtobuf010.Timestamp.deserializeBinaryFromReader);
1579
+ break;
1580
+ default:
1581
+ _reader.skipField();
1582
+ }
1583
+ }
1584
+ CondtionValueUnion.refineValues(_instance);
1585
+ }
1586
+ /**
1587
+ * Serializes a message to binary format using provided binary reader
1588
+ * @param _instance message instance
1589
+ * @param _writer binary writer instance
1590
+ */
1591
+ static serializeBinaryToWriter(_instance, _writer) {
1592
+ if (_instance.intValue || _instance.intValue === '0') {
1593
+ _writer.writeInt64String(1, _instance.intValue);
1594
+ }
1595
+ if (_instance.floatValue || _instance.floatValue === 0) {
1596
+ _writer.writeFloat(2, _instance.floatValue);
1597
+ }
1598
+ if (_instance.datetimeValue) {
1599
+ _writer.writeMessage(3, _instance.datetimeValue, googleProtobuf010.Timestamp.serializeBinaryToWriter);
1600
+ }
1601
+ }
1602
+ get intValue() {
1603
+ return this._intValue;
1604
+ }
1605
+ set intValue(value) {
1606
+ if (value !== undefined && value !== null) {
1607
+ this._floatValue = this._datetimeValue = undefined;
1608
+ this._unionOneof = CondtionValueUnion.UnionOneofCase.intValue;
1609
+ }
1610
+ this._intValue = value;
1611
+ }
1612
+ get floatValue() {
1613
+ return this._floatValue;
1614
+ }
1615
+ set floatValue(value) {
1616
+ if (value !== undefined && value !== null) {
1617
+ this._intValue = this._datetimeValue = undefined;
1618
+ this._unionOneof = CondtionValueUnion.UnionOneofCase.floatValue;
1619
+ }
1620
+ this._floatValue = value;
1621
+ }
1622
+ get datetimeValue() {
1623
+ return this._datetimeValue;
1624
+ }
1625
+ set datetimeValue(value) {
1626
+ if (value !== undefined && value !== null) {
1627
+ this._intValue = this._floatValue = undefined;
1628
+ this._unionOneof = CondtionValueUnion.UnionOneofCase.datetimeValue;
1629
+ }
1630
+ this._datetimeValue = value;
1631
+ }
1632
+ get unionOneof() {
1633
+ return this._unionOneof;
1634
+ }
1635
+ /**
1636
+ * Serialize message to binary data
1637
+ * @param instance message instance
1638
+ */
1639
+ serializeBinary() {
1640
+ const writer = new BinaryWriter();
1641
+ CondtionValueUnion.serializeBinaryToWriter(this, writer);
1642
+ return writer.getResultBuffer();
1643
+ }
1644
+ /**
1645
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1646
+ */
1647
+ toObject() {
1648
+ return {
1649
+ intValue: this.intValue,
1650
+ floatValue: this.floatValue,
1651
+ datetimeValue: this.datetimeValue
1652
+ ? this.datetimeValue.toObject()
1653
+ : undefined
1654
+ };
1655
+ }
1656
+ /**
1657
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1658
+ */
1659
+ toJSON() {
1660
+ return this.toObject();
1661
+ }
1662
+ /**
1663
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1664
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1665
+ * 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
1666
+ */
1667
+ toProtobufJSON(
1668
+ // @ts-ignore
1669
+ options) {
1670
+ return {
1671
+ intValue: this.intValue === null || this.intValue === undefined
1672
+ ? null
1673
+ : this.intValue,
1674
+ floatValue: this.floatValue === null || this.floatValue === undefined
1675
+ ? null
1676
+ : this.floatValue,
1677
+ datetimeValue: this.datetimeValue
1678
+ ? this.datetimeValue.toProtobufJSON(options)
1679
+ : null
1680
+ };
1681
+ }
1682
+ }
1683
+ CondtionValueUnion.id = 'ondewo.csi.CondtionValueUnion';
1684
+ (function (CondtionValueUnion) {
1685
+ let UnionOneofCase;
1686
+ (function (UnionOneofCase) {
1687
+ UnionOneofCase[UnionOneofCase["none"] = 0] = "none";
1688
+ UnionOneofCase[UnionOneofCase["intValue"] = 1] = "intValue";
1689
+ UnionOneofCase[UnionOneofCase["floatValue"] = 2] = "floatValue";
1690
+ UnionOneofCase[UnionOneofCase["datetimeValue"] = 3] = "datetimeValue";
1691
+ })(UnionOneofCase = CondtionValueUnion.UnionOneofCase || (CondtionValueUnion.UnionOneofCase = {}));
1692
+ })(CondtionValueUnion || (CondtionValueUnion = {}));
1693
+ /**
1694
+ * Message implementation for ondewo.csi.Condition
1695
+ */
1696
+ export class Condition {
1697
+ /**
1698
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1699
+ * @param _value initial values object or instance of Condition to deeply clone from
1700
+ */
1701
+ constructor(_value) {
1702
+ _value = _value || {};
1703
+ this.type = _value.type;
1704
+ this.value = _value.value;
1705
+ Condition.refineValues(this);
1706
+ }
1707
+ /**
1708
+ * Deserialize binary data to message
1709
+ * @param instance message instance
1710
+ */
1711
+ static deserializeBinary(bytes) {
1712
+ const instance = new Condition();
1713
+ Condition.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1714
+ return instance;
1715
+ }
1716
+ /**
1717
+ * Check all the properties and set default protobuf values if necessary
1718
+ * @param _instance message instance
1719
+ */
1720
+ static refineValues(_instance) {
1721
+ _instance.type = _instance.type || 0;
1722
+ _instance.value = _instance.value || '';
1723
+ }
1724
+ /**
1725
+ * Deserializes / reads binary message into message instance using provided binary reader
1726
+ * @param _instance message instance
1727
+ * @param _reader binary reader instance
1728
+ */
1729
+ static deserializeBinaryFromReader(_instance, _reader) {
1730
+ while (_reader.nextField()) {
1731
+ if (_reader.isEndGroup())
1732
+ break;
1733
+ switch (_reader.getFieldNumber()) {
1734
+ case 1:
1735
+ _instance.type = _reader.readEnum();
1736
+ break;
1737
+ case 2:
1738
+ _instance.value = _reader.readString();
1739
+ break;
1740
+ default:
1741
+ _reader.skipField();
1742
+ }
1743
+ }
1744
+ Condition.refineValues(_instance);
1745
+ }
1746
+ /**
1747
+ * Serializes a message to binary format using provided binary reader
1748
+ * @param _instance message instance
1749
+ * @param _writer binary writer instance
1750
+ */
1751
+ static serializeBinaryToWriter(_instance, _writer) {
1752
+ if (_instance.type) {
1753
+ _writer.writeEnum(1, _instance.type);
1754
+ }
1755
+ if (_instance.value) {
1756
+ _writer.writeString(2, _instance.value);
1757
+ }
1758
+ }
1759
+ get type() {
1760
+ return this._type;
1761
+ }
1762
+ set type(value) {
1763
+ this._type = value;
1764
+ }
1765
+ get value() {
1766
+ return this._value;
1767
+ }
1768
+ set value(value) {
1769
+ this._value = value;
1770
+ }
1771
+ /**
1772
+ * Serialize message to binary data
1773
+ * @param instance message instance
1774
+ */
1775
+ serializeBinary() {
1776
+ const writer = new BinaryWriter();
1777
+ Condition.serializeBinaryToWriter(this, writer);
1778
+ return writer.getResultBuffer();
1779
+ }
1780
+ /**
1781
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1782
+ */
1783
+ toObject() {
1784
+ return {
1785
+ type: this.type,
1786
+ value: this.value
1787
+ };
1788
+ }
1789
+ /**
1790
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1791
+ */
1792
+ toJSON() {
1793
+ return this.toObject();
1794
+ }
1795
+ /**
1796
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1797
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1798
+ * 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
1799
+ */
1800
+ toProtobufJSON(
1801
+ // @ts-ignore
1802
+ options) {
1803
+ return {
1804
+ type: ConditionType[this.type === null || this.type === undefined ? 0 : this.type],
1805
+ value: this.value
1806
+ };
1807
+ }
1808
+ }
1809
+ Condition.id = 'ondewo.csi.Condition';
1810
+ /**
1811
+ * Message implementation for ondewo.csi.ControlMessageServiceParameters
1812
+ */
1813
+ export class ControlMessageServiceParameters {
1814
+ /**
1815
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1816
+ * @param _value initial values object or instance of ControlMessageServiceParameters to deeply clone from
1817
+ */
1818
+ constructor(_value) {
1819
+ this._config = ControlMessageServiceParameters.ConfigCase.none;
1820
+ _value = _value || {};
1821
+ this.t2sConfig = _value.t2sConfig
1822
+ ? new ondewoT2s012.RequestConfig(_value.t2sConfig)
1823
+ : undefined;
1824
+ this.s2tConfig = _value.s2tConfig
1825
+ ? new ondewoS2t013.TranscribeRequestConfig(_value.s2tConfig)
1826
+ : undefined;
1827
+ this.transferId = _value.transferId;
1828
+ this.wavFiles = (_value.wavFiles || []).map(b => b ? b.subarray(0) : new Uint8Array());
1829
+ this.text = _value.text;
1830
+ this.context = _value.context
1831
+ ? new ondewoNlu006.Context(_value.context)
1832
+ : undefined;
1833
+ this.sessionId = _value.sessionId;
1834
+ this.contextName = _value.contextName;
1835
+ this.conditionStart = _value.conditionStart
1836
+ ? new Condition(_value.conditionStart)
1837
+ : undefined;
1838
+ this.conditionEnd = _value.conditionEnd
1839
+ ? new Condition(_value.conditionEnd)
1840
+ : undefined;
1841
+ ControlMessageServiceParameters.refineValues(this);
1842
+ }
1843
+ /**
1844
+ * Deserialize binary data to message
1845
+ * @param instance message instance
1846
+ */
1847
+ static deserializeBinary(bytes) {
1848
+ const instance = new ControlMessageServiceParameters();
1849
+ ControlMessageServiceParameters.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1850
+ return instance;
1851
+ }
1852
+ /**
1853
+ * Check all the properties and set default protobuf values if necessary
1854
+ * @param _instance message instance
1855
+ */
1856
+ static refineValues(_instance) {
1857
+ _instance.transferId = _instance.transferId || '';
1858
+ _instance.wavFiles = _instance.wavFiles || [];
1859
+ _instance.text = _instance.text || '';
1860
+ _instance.context = _instance.context || undefined;
1861
+ _instance.sessionId = _instance.sessionId || '';
1862
+ _instance.contextName = _instance.contextName || '';
1863
+ _instance.conditionStart = _instance.conditionStart || undefined;
1864
+ _instance.conditionEnd = _instance.conditionEnd || undefined;
1865
+ }
1866
+ /**
1867
+ * Deserializes / reads binary message into message instance using provided binary reader
1868
+ * @param _instance message instance
1869
+ * @param _reader binary reader instance
1870
+ */
1871
+ static deserializeBinaryFromReader(_instance, _reader) {
1872
+ while (_reader.nextField()) {
1873
+ if (_reader.isEndGroup())
1874
+ break;
1875
+ switch (_reader.getFieldNumber()) {
1876
+ case 1:
1877
+ _instance.t2sConfig = new ondewoT2s012.RequestConfig();
1878
+ _reader.readMessage(_instance.t2sConfig, ondewoT2s012.RequestConfig.deserializeBinaryFromReader);
1879
+ break;
1880
+ case 2:
1881
+ _instance.s2tConfig = new ondewoS2t013.TranscribeRequestConfig();
1882
+ _reader.readMessage(_instance.s2tConfig, ondewoS2t013.TranscribeRequestConfig.deserializeBinaryFromReader);
1883
+ break;
1884
+ case 3:
1885
+ _instance.transferId = _reader.readString();
1886
+ break;
1887
+ case 4:
1888
+ (_instance.wavFiles = _instance.wavFiles || []).push(_reader.readBytes());
1889
+ break;
1890
+ case 5:
1891
+ _instance.text = _reader.readString();
1892
+ break;
1893
+ case 6:
1894
+ _instance.context = new ondewoNlu006.Context();
1895
+ _reader.readMessage(_instance.context, ondewoNlu006.Context.deserializeBinaryFromReader);
1896
+ break;
1897
+ case 7:
1898
+ _instance.sessionId = _reader.readString();
1899
+ break;
1900
+ case 8:
1901
+ _instance.contextName = _reader.readString();
1902
+ break;
1903
+ case 9:
1904
+ _instance.conditionStart = new Condition();
1905
+ _reader.readMessage(_instance.conditionStart, Condition.deserializeBinaryFromReader);
1906
+ break;
1907
+ case 10:
1908
+ _instance.conditionEnd = new Condition();
1909
+ _reader.readMessage(_instance.conditionEnd, Condition.deserializeBinaryFromReader);
1910
+ break;
1911
+ default:
1912
+ _reader.skipField();
1913
+ }
1914
+ }
1915
+ ControlMessageServiceParameters.refineValues(_instance);
1916
+ }
1917
+ /**
1918
+ * Serializes a message to binary format using provided binary reader
1919
+ * @param _instance message instance
1920
+ * @param _writer binary writer instance
1921
+ */
1922
+ static serializeBinaryToWriter(_instance, _writer) {
1923
+ if (_instance.t2sConfig) {
1924
+ _writer.writeMessage(1, _instance.t2sConfig, ondewoT2s012.RequestConfig.serializeBinaryToWriter);
1925
+ }
1926
+ if (_instance.s2tConfig) {
1927
+ _writer.writeMessage(2, _instance.s2tConfig, ondewoS2t013.TranscribeRequestConfig.serializeBinaryToWriter);
1928
+ }
1929
+ if (_instance.transferId) {
1930
+ _writer.writeString(3, _instance.transferId);
1931
+ }
1932
+ if (_instance.wavFiles && _instance.wavFiles.length) {
1933
+ _writer.writeRepeatedBytes(4, _instance.wavFiles);
1934
+ }
1935
+ if (_instance.text) {
1936
+ _writer.writeString(5, _instance.text);
1937
+ }
1938
+ if (_instance.context) {
1939
+ _writer.writeMessage(6, _instance.context, ondewoNlu006.Context.serializeBinaryToWriter);
1940
+ }
1941
+ if (_instance.sessionId) {
1942
+ _writer.writeString(7, _instance.sessionId);
1943
+ }
1944
+ if (_instance.contextName) {
1945
+ _writer.writeString(8, _instance.contextName);
1946
+ }
1947
+ if (_instance.conditionStart) {
1948
+ _writer.writeMessage(9, _instance.conditionStart, Condition.serializeBinaryToWriter);
1949
+ }
1950
+ if (_instance.conditionEnd) {
1951
+ _writer.writeMessage(10, _instance.conditionEnd, Condition.serializeBinaryToWriter);
1952
+ }
1953
+ }
1954
+ get t2sConfig() {
1955
+ return this._t2sConfig;
1956
+ }
1957
+ set t2sConfig(value) {
1958
+ if (value !== undefined && value !== null) {
1959
+ this._s2tConfig = undefined;
1960
+ this._config = ControlMessageServiceParameters.ConfigCase.t2sConfig;
1961
+ }
1962
+ this._t2sConfig = value;
1963
+ }
1964
+ get s2tConfig() {
1965
+ return this._s2tConfig;
1966
+ }
1967
+ set s2tConfig(value) {
1968
+ if (value !== undefined && value !== null) {
1969
+ this._t2sConfig = undefined;
1970
+ this._config = ControlMessageServiceParameters.ConfigCase.s2tConfig;
1971
+ }
1972
+ this._s2tConfig = value;
1973
+ }
1974
+ get transferId() {
1975
+ return this._transferId;
1976
+ }
1977
+ set transferId(value) {
1978
+ this._transferId = value;
1979
+ }
1980
+ get wavFiles() {
1981
+ return this._wavFiles;
1982
+ }
1983
+ set wavFiles(value) {
1984
+ this._wavFiles = value;
1985
+ }
1986
+ get text() {
1987
+ return this._text;
1988
+ }
1989
+ set text(value) {
1990
+ this._text = value;
1991
+ }
1992
+ get context() {
1993
+ return this._context;
1994
+ }
1995
+ set context(value) {
1996
+ this._context = value;
1997
+ }
1998
+ get sessionId() {
1999
+ return this._sessionId;
2000
+ }
2001
+ set sessionId(value) {
2002
+ this._sessionId = value;
2003
+ }
2004
+ get contextName() {
2005
+ return this._contextName;
2006
+ }
2007
+ set contextName(value) {
2008
+ this._contextName = value;
2009
+ }
2010
+ get conditionStart() {
2011
+ return this._conditionStart;
2012
+ }
2013
+ set conditionStart(value) {
2014
+ this._conditionStart = value;
2015
+ }
2016
+ get conditionEnd() {
2017
+ return this._conditionEnd;
2018
+ }
2019
+ set conditionEnd(value) {
2020
+ this._conditionEnd = value;
2021
+ }
2022
+ get config() {
2023
+ return this._config;
2024
+ }
2025
+ /**
2026
+ * Serialize message to binary data
2027
+ * @param instance message instance
2028
+ */
2029
+ serializeBinary() {
2030
+ const writer = new BinaryWriter();
2031
+ ControlMessageServiceParameters.serializeBinaryToWriter(this, writer);
2032
+ return writer.getResultBuffer();
2033
+ }
2034
+ /**
2035
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2036
+ */
2037
+ toObject() {
2038
+ return {
2039
+ t2sConfig: this.t2sConfig ? this.t2sConfig.toObject() : undefined,
2040
+ s2tConfig: this.s2tConfig ? this.s2tConfig.toObject() : undefined,
2041
+ transferId: this.transferId,
2042
+ wavFiles: (this.wavFiles || []).map(b => b ? b.subarray(0) : new Uint8Array()),
2043
+ text: this.text,
2044
+ context: this.context ? this.context.toObject() : undefined,
2045
+ sessionId: this.sessionId,
2046
+ contextName: this.contextName,
2047
+ conditionStart: this.conditionStart
2048
+ ? this.conditionStart.toObject()
2049
+ : undefined,
2050
+ conditionEnd: this.conditionEnd ? this.conditionEnd.toObject() : undefined
2051
+ };
2052
+ }
2053
+ /**
2054
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2055
+ */
2056
+ toJSON() {
2057
+ return this.toObject();
2058
+ }
2059
+ /**
2060
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2061
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2062
+ * 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
2063
+ */
2064
+ toProtobufJSON(
2065
+ // @ts-ignore
2066
+ options) {
2067
+ return {
2068
+ t2sConfig: this.t2sConfig ? this.t2sConfig.toProtobufJSON(options) : null,
2069
+ s2tConfig: this.s2tConfig ? this.s2tConfig.toProtobufJSON(options) : null,
2070
+ transferId: this.transferId,
2071
+ wavFiles: (this.wavFiles || []).map(b => b ? uint8ArrayToBase64(b) : ''),
2072
+ text: this.text,
2073
+ context: this.context ? this.context.toProtobufJSON(options) : null,
2074
+ sessionId: this.sessionId,
2075
+ contextName: this.contextName,
2076
+ conditionStart: this.conditionStart
2077
+ ? this.conditionStart.toProtobufJSON(options)
2078
+ : null,
2079
+ conditionEnd: this.conditionEnd
2080
+ ? this.conditionEnd.toProtobufJSON(options)
2081
+ : null
2082
+ };
2083
+ }
2084
+ }
2085
+ ControlMessageServiceParameters.id = 'ondewo.csi.ControlMessageServiceParameters';
2086
+ (function (ControlMessageServiceParameters) {
2087
+ let ConfigCase;
2088
+ (function (ConfigCase) {
2089
+ ConfigCase[ConfigCase["none"] = 0] = "none";
2090
+ ConfigCase[ConfigCase["t2sConfig"] = 1] = "t2sConfig";
2091
+ ConfigCase[ConfigCase["s2tConfig"] = 2] = "s2tConfig";
2092
+ })(ConfigCase = ControlMessageServiceParameters.ConfigCase || (ControlMessageServiceParameters.ConfigCase = {}));
2093
+ })(ControlMessageServiceParameters || (ControlMessageServiceParameters = {}));
2094
+ /**
2095
+ * Message implementation for ondewo.csi.ControlMessage
2096
+ */
2097
+ export class ControlMessage {
2098
+ /**
2099
+ * Message constructor. Initializes the properties and applies default Protobuf values if necessary
2100
+ * @param _value initial values object or instance of ControlMessage to deeply clone from
2101
+ */
2102
+ constructor(_value) {
2103
+ _value = _value || {};
2104
+ this.service = _value.service;
2105
+ this.method = _value.method;
2106
+ this.parameters = _value.parameters
2107
+ ? new ControlMessageServiceParameters(_value.parameters)
2108
+ : undefined;
2109
+ ControlMessage.refineValues(this);
2110
+ }
2111
+ /**
2112
+ * Deserialize binary data to message
2113
+ * @param instance message instance
2114
+ */
2115
+ static deserializeBinary(bytes) {
2116
+ const instance = new ControlMessage();
2117
+ ControlMessage.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
2118
+ return instance;
2119
+ }
2120
+ /**
2121
+ * Check all the properties and set default protobuf values if necessary
2122
+ * @param _instance message instance
2123
+ */
2124
+ static refineValues(_instance) {
2125
+ _instance.service = _instance.service || 0;
2126
+ _instance.method = _instance.method || 0;
2127
+ _instance.parameters = _instance.parameters || undefined;
2128
+ }
2129
+ /**
2130
+ * Deserializes / reads binary message into message instance using provided binary reader
2131
+ * @param _instance message instance
2132
+ * @param _reader binary reader instance
2133
+ */
2134
+ static deserializeBinaryFromReader(_instance, _reader) {
2135
+ while (_reader.nextField()) {
2136
+ if (_reader.isEndGroup())
2137
+ break;
2138
+ switch (_reader.getFieldNumber()) {
2139
+ case 1:
2140
+ _instance.service = _reader.readEnum();
2141
+ break;
2142
+ case 2:
2143
+ _instance.method = _reader.readEnum();
2144
+ break;
2145
+ case 3:
2146
+ _instance.parameters = new ControlMessageServiceParameters();
2147
+ _reader.readMessage(_instance.parameters, ControlMessageServiceParameters.deserializeBinaryFromReader);
2148
+ break;
2149
+ default:
2150
+ _reader.skipField();
2151
+ }
2152
+ }
2153
+ ControlMessage.refineValues(_instance);
2154
+ }
2155
+ /**
2156
+ * Serializes a message to binary format using provided binary reader
2157
+ * @param _instance message instance
2158
+ * @param _writer binary writer instance
2159
+ */
2160
+ static serializeBinaryToWriter(_instance, _writer) {
2161
+ if (_instance.service) {
2162
+ _writer.writeEnum(1, _instance.service);
2163
+ }
2164
+ if (_instance.method) {
2165
+ _writer.writeEnum(2, _instance.method);
2166
+ }
2167
+ if (_instance.parameters) {
2168
+ _writer.writeMessage(3, _instance.parameters, ControlMessageServiceParameters.serializeBinaryToWriter);
2169
+ }
2170
+ }
2171
+ get service() {
2172
+ return this._service;
2173
+ }
2174
+ set service(value) {
2175
+ this._service = value;
2176
+ }
2177
+ get method() {
2178
+ return this._method;
2179
+ }
2180
+ set method(value) {
2181
+ this._method = value;
2182
+ }
2183
+ get parameters() {
2184
+ return this._parameters;
2185
+ }
2186
+ set parameters(value) {
2187
+ this._parameters = value;
2188
+ }
2189
+ /**
2190
+ * Serialize message to binary data
2191
+ * @param instance message instance
2192
+ */
2193
+ serializeBinary() {
2194
+ const writer = new BinaryWriter();
2195
+ ControlMessage.serializeBinaryToWriter(this, writer);
2196
+ return writer.getResultBuffer();
2197
+ }
2198
+ /**
2199
+ * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
2200
+ */
2201
+ toObject() {
2202
+ return {
2203
+ service: this.service,
2204
+ method: this.method,
2205
+ parameters: this.parameters ? this.parameters.toObject() : undefined
2206
+ };
2207
+ }
2208
+ /**
2209
+ * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
2210
+ */
2211
+ toJSON() {
2212
+ return this.toObject();
2213
+ }
2214
+ /**
2215
+ * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
2216
+ * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
2217
+ * 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
2218
+ */
2219
+ toProtobufJSON(
2220
+ // @ts-ignore
2221
+ options) {
2222
+ return {
2223
+ service: ControlMessageServiceName[this.service === null || this.service === undefined ? 0 : this.service],
2224
+ method: ControlMessageServiceMethod[this.method === null || this.method === undefined ? 0 : this.method],
2225
+ parameters: this.parameters
2226
+ ? this.parameters.toProtobufJSON(options)
2227
+ : null
2228
+ };
2229
+ }
2230
+ }
2231
+ ControlMessage.id = 'ondewo.csi.ControlMessage';
2232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2F0aW9uLnBiLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vYXBpL29uZGV3by9jc2kvY29udmVyc2F0aW9uLnBiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsY0FBYztBQUNkLEVBQUU7QUFDRiwyQkFBMkI7QUFDM0IsOENBQThDO0FBQzlDLE9BQU8sRUFJTCxrQkFBa0IsRUFDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBSXpFLE9BQU8sS0FBSyxpQkFBaUIsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEtBQUssWUFBWSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELE9BQU8sS0FBSyxZQUFZLE1BQU0sNkJBQTZCLENBQUM7QUFJNUQsT0FBTyxLQUFLLGlCQUFpQixNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxZQUFZLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxLQUFLLFlBQVksTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEtBQUssWUFBWSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE1BQU0sQ0FBTixJQUFZLGFBR1g7QUFIRCxXQUFZLGFBQWE7SUFDdkIsNkNBQU0sQ0FBQTtJQUNOLHFFQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFIVyxhQUFhLEtBQWIsYUFBYSxRQUd4QjtBQUNELE1BQU0sQ0FBTixJQUFZLHlCQU1YO0FBTkQsV0FBWSx5QkFBeUI7SUFDbkMsdUZBQWUsQ0FBQTtJQUNmLHFGQUFjLENBQUE7SUFDZCxxRkFBYyxDQUFBO0lBQ2QscUZBQWMsQ0FBQTtJQUNkLHFGQUFjLENBQUE7QUFDaEIsQ0FBQyxFQU5XLHlCQUF5QixLQUF6Qix5QkFBeUIsUUFNcEM7QUFDRCxNQUFNLENBQU4sSUFBWSwyQkFvQlg7QUFwQkQsV0FBWSwy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QUM7UUFDckQsT0FBTyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsUUFBUTtRQUNOLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ3JFLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjO0lBQ1osYUFBYTtJQUNiLE9BQStCO1FBRS9CLE9BQU87WUFDTCxPQUFPLEVBQ0wseUJBQXlCLENBQ3ZCLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQ3ZFO1lBQ0gsTUFBTSxFQUNKLDJCQUEyQixDQUN6QixJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNwRTtZQUNILFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDekIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztnQkFDekMsQ0FBQyxDQUFDLElBQUk7U0FDVCxDQUFDO0lBQ0osQ0FBQzs7QUF6S00saUJBQUUsR0FBRywyQkFBMkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gQHRzLW5vY2hlY2tcbi8vXG4vLyBUSElTIElTIEEgR0VORVJBVEVEIEZJTEVcbi8vIERPIE5PVCBNT0RJRlkgSVQhIFlPVVIgQ0hBTkdFUyBXSUxMIEJFIExPU1RcbmltcG9ydCB7XG4gIEdycGNNZXNzYWdlLFxuICBSZWN1cnNpdmVQYXJ0aWFsLFxuICBUb1Byb3RvYnVmSlNPTk9wdGlvbnMsXG4gIHVpbnQ4QXJyYXlUb0Jhc2U2NFxufSBmcm9tICdAbmd4LWdycGMvY29tbW9uJztcbmltcG9ydCB7IEJpbmFyeVJlYWRlciwgQmluYXJ5V3JpdGVyLCBCeXRlU291cmNlIH0gZnJvbSAnZ29vZ2xlLXByb3RvYnVmJztcbmltcG9ydCAqIGFzIGdvb2dsZVByb3RvYnVmMDAwIGZyb20gJ0BuZ3gtZ3JwYy93ZWxsLWtub3duLXR5cGVzJztcbmltcG9ydCAqIGFzIGdvb2dsZUFwaTAwMSBmcm9tICcuLi8uLi9nb29nbGUvYXBpL2Fubm90YXRpb25zLnBiJztcbmltcG9ydCAqIGFzIGdvb2dsZVByb3RvYnVmMDAyIGZyb20gJ0BuZ3gtZ3JwYy93ZWxsLWtub3duLXR5cGVzJztcbmltcG9ydCAqIGFzIGdvb2dsZVByb3RvYnVmMDAzIGZyb20gJ0BuZ3gtZ3JwYy93ZWxsLWtub3duLXR5cGVzJztcbmltcG9ydCAqIGFzIGdvb2dsZVJwYzAwNCBmcm9tICcuLi8uLi9nb29nbGUvcnBjL3N0YXR1cy5wYic7XG5pbXBvcnQgKiBhcyBnb29nbGVUeXBlMDA1IGZyb20gJy4uLy4uL2dvb2dsZS90eXBlL2xhdGxuZy5wYic7XG5pbXBvcnQgKiBhcyBvbmRld29ObHUwMDYgZnJvbSAnLi4vLi4vb25kZXdvL25sdS9jb250ZXh0LnBiJztcbmltcG9ydCAqIGFzIG9uZGV3b05sdTAwNyBmcm9tICcuLi8uLi9vbmRld28vbmx1L2ludGVudC5wYic7XG5pbXBvcnQgKiBhcyBvbmRld29ObHUwMDggZnJvbSAnLi4vLi4vb25kZXdvL25sdS9lbnRpdHktdHlwZS5wYic7XG5pbXBvcnQgKiBhcyBnb29nbGVQcm90b2J1ZjAwOSBmcm9tICdAbmd4LWdycGMvd2VsbC1rbm93bi10eXBlcyc7XG5pbXBvcnQgKiBhcyBnb29nbGVQcm90b2J1ZjAxMCBmcm9tICdAbmd4LWdycGMvd2VsbC1rbm93bi10eXBlcyc7XG5pbXBvcnQgKiBhcyBvbmRld29ObHUwMTEgZnJvbSAnLi4vLi4vb25kZXdvL25sdS9zZXNzaW9uLnBiJztcbmltcG9ydCAqIGFzIG9uZGV3b1QyczAxMiBmcm9tICcuLi8uLi9vbmRld28vdDJzL3RleHQtdG8tc3BlZWNoLnBiJztcbmltcG9ydCAqIGFzIG9uZGV3b1MydDAxMyBmcm9tICcuLi8uLi9vbmRld28vczJ0L3NwZWVjaC10by10ZXh0LnBiJztcbmV4cG9ydCBlbnVtIENvbnRyb2xTdGF0dXMge1xuICBPSyA9IDAsXG4gIEVNRVJHRU5DWV9TVE9QID0gMVxufVxuZXhwb3J0IGVudW0gQ29udHJvbE1lc3NhZ2VTZXJ2aWNlTmFtZSB7XG4gIFVOS05PV05OQU1FID0gMCxcbiAgb25kZXdvX3MydCA9IDEsXG4gIG9uZGV3b190MnMgPSAyLFxuICBvbmRld29fbmx1ID0gMyxcbiAgb25kZXdvX3NpcCA9IDRcbn1cbmV4cG9ydCBlbnVtIENvbnRyb2xNZXNzYWdlU2VydmljZU1ldGhvZCB7XG4gIFVOS05PV05NRVRIT0QgPSAwLFxuICB1cGRhdGVfY29uZmlnID0gMSxcbiAgdW5kb19jb25maWcgPSAyLFxuICByZXNldF9jb25maWcgPSAzLFxuICBlbmRfY2FsbCA9IDQsXG4gIHRyYW5zZmVyX2NhbGwgPSA1LFxuICBwbGF5X3dhdl9maWxlcyA9IDYsXG4gIHBsYXlfdGV4dCA9IDcsXG4gIG11dGUgPSA4LFxuICB1bl9tdXRlID0gOSxcbiAgc3RvcF9hbGxfY29udHJvbF9tZXNzYWdlcyA9IDEwLFxuICB0cmFpbl9hZ2VudCA9IDExLFxuICBjYW5jZWxfdHJhaW5fYWdlbnQgPSAxMixcbiAgZGVsZXRlX3Nlc3Npb24gPSAxMyxcbiAgZGVsZXRlX2FsbF9jb250ZXh0cyA9IDE0LFxuICBjcmVhdGVfY29udGV4dCA9IDE1LFxuICB1cGRhdGVfY29udGV4dCA9IDE2LFxuICBkZWxldGVfY29udGV4dCA9IDE3LFxuICBkZXRlY3RfaW50ZW50ID0gMThcbn1cbmV4cG9ydCBlbnVtIENvbmRpdGlvblR5cGUge1xuICBVTktOT1dUWVBFID0gMCxcbiAgaW1tZWRpYXRlID0gMSxcbiAgZHVyYXRpb24gPSAyLFxuICBkYXRldGltZSA9IDMsXG4gIGludGVyYWN0aW9ucyA9IDRcbn1cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLmNzaS5TMnNQaXBlbGluZVxuICovXG5leHBvcnQgY2xhc3MgUzJzUGlwZWxpbmUgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28uY3NpLlMyc1BpcGVsaW5lJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgUzJzUGlwZWxpbmUoKTtcbiAgICBTMnNQaXBlbGluZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoaW5zdGFuY2UsIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFMyc1BpcGVsaW5lKSB7XG4gICAgX2luc3RhbmNlLmlkID0gX2luc3RhbmNlLmlkIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5zMnRQaXBlbGluZUlkID0gX2luc3RhbmNlLnMydFBpcGVsaW5lSWQgfHwgJyc7XG4gICAgX2luc3RhbmNlLm5sdVByb2plY3RJZCA9IF9pbnN0YW5jZS5ubHVQcm9qZWN0SWQgfHwgJyc7XG4gICAgX2luc3RhbmNlLm5sdUxhbmd1YWdlQ29kZSA9IF9pbnN0YW5jZS5ubHVMYW5ndWFnZUNvZGUgfHwgJyc7XG4gICAgX2luc3RhbmNlLnQyc1BpcGVsaW5lSWQgPSBfaW5zdGFuY2UudDJzUGlwZWxpbmVJZCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFMyc1BpcGVsaW5lLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5pZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLnMydFBpcGVsaW5lSWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIF9pbnN0YW5jZS5ubHVQcm9qZWN0SWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIF9pbnN0YW5jZS5ubHVMYW5ndWFnZUNvZGUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIF9pbnN0YW5jZS50MnNQaXBlbGluZUlkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBTMnNQaXBlbGluZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFMyc1BpcGVsaW5lLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmlkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5pZCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuczJ0UGlwZWxpbmVJZCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyLCBfaW5zdGFuY2UuczJ0UGlwZWxpbmVJZCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uubmx1UHJvamVjdElkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMsIF9pbnN0YW5jZS5ubHVQcm9qZWN0SWQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLm5sdUxhbmd1YWdlQ29kZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg0LCBfaW5zdGFuY2Uubmx1TGFuZ3VhZ2VDb2RlKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS50MnNQaXBlbGluZUlkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDUsIF9pbnN0YW5jZS50MnNQaXBlbGluZUlkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pZD86IHN0cmluZztcbiAgcHJpdmF0ZSBfczJ0UGlwZWxpbmVJZD86IHN0cmluZztcbiAgcHJpdmF0ZSBfbmx1UHJvamVjdElkPzogc3RyaW5nO1xuICBwcml2YXRlIF9ubHVMYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX3Qyc1BpcGVsaW5lSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBTMnNQaXBlbGluZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxTMnNQaXBlbGluZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5pZCA9IF92YWx1ZS5pZDtcbiAgICB0aGlzLnMydFBpcGVsaW5lSWQgPSBfdmFsdWUuczJ0UGlwZWxpbmVJZDtcbiAgICB0aGlzLm5sdVByb2plY3RJZCA9IF92YWx1ZS5ubHVQcm9qZWN0SWQ7XG4gICAgdGhpcy5ubHVMYW5ndWFnZUNvZGUgPSBfdmFsdWUubmx1TGFuZ3VhZ2VDb2RlO1xuICAgIHRoaXMudDJzUGlwZWxpbmVJZCA9IF92YWx1ZS50MnNQaXBlbGluZUlkO1xuICAgIFMyc1BpcGVsaW5lLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgaWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cbiAgc2V0IGlkKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIGdldCBzMnRQaXBlbGluZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3MydFBpcGVsaW5lSWQ7XG4gIH1cbiAgc2V0IHMydFBpcGVsaW5lSWQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3MydFBpcGVsaW5lSWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbmx1UHJvamVjdElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX25sdVByb2plY3RJZDtcbiAgfVxuICBzZXQgbmx1UHJvamVjdElkKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ubHVQcm9qZWN0SWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgbmx1TGFuZ3VhZ2VDb2RlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX25sdUxhbmd1YWdlQ29kZTtcbiAgfVxuICBzZXQgbmx1TGFuZ3VhZ2VDb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ubHVMYW5ndWFnZUNvZGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgdDJzUGlwZWxpbmVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90MnNQaXBlbGluZUlkO1xuICB9XG4gIHNldCB0MnNQaXBlbGluZUlkKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90MnNQaXBlbGluZUlkID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgUzJzUGlwZWxpbmUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogUzJzUGlwZWxpbmUuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHMydFBpcGVsaW5lSWQ6IHRoaXMuczJ0UGlwZWxpbmVJZCxcbiAgICAgIG5sdVByb2plY3RJZDogdGhpcy5ubHVQcm9qZWN0SWQsXG4gICAgICBubHVMYW5ndWFnZUNvZGU6IHRoaXMubmx1TGFuZ3VhZ2VDb2RlLFxuICAgICAgdDJzUGlwZWxpbmVJZDogdGhpcy50MnNQaXBlbGluZUlkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogUzJzUGlwZWxpbmUuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHMydFBpcGVsaW5lSWQ6IHRoaXMuczJ0UGlwZWxpbmVJZCxcbiAgICAgIG5sdVByb2plY3RJZDogdGhpcy5ubHVQcm9qZWN0SWQsXG4gICAgICBubHVMYW5ndWFnZUNvZGU6IHRoaXMubmx1TGFuZ3VhZ2VDb2RlLFxuICAgICAgdDJzUGlwZWxpbmVJZDogdGhpcy50MnNQaXBlbGluZUlkXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBTMnNQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgUzJzUGlwZWxpbmVcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIHMydFBpcGVsaW5lSWQ/OiBzdHJpbmc7XG4gICAgbmx1UHJvamVjdElkPzogc3RyaW5nO1xuICAgIG5sdUxhbmd1YWdlQ29kZT86IHN0cmluZztcbiAgICB0MnNQaXBlbGluZUlkPzogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFMyc1BpcGVsaW5lXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBpZD86IHN0cmluZztcbiAgICBzMnRQaXBlbGluZUlkPzogc3RyaW5nO1xuICAgIG5sdVByb2plY3RJZD86IHN0cmluZztcbiAgICBubHVMYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gICAgdDJzUGlwZWxpbmVJZD86IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5jc2kuUzJzUGlwZWxpbmVJZFxuICovXG5leHBvcnQgY2xhc3MgUzJzUGlwZWxpbmVJZCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5jc2kuUzJzUGlwZWxpbmVJZCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFMyc1BpcGVsaW5lSWQoKTtcbiAgICBTMnNQaXBlbGluZUlkLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogUzJzUGlwZWxpbmVJZCkge1xuICAgIF9pbnN0YW5jZS5pZCA9IF9pbnN0YW5jZS5pZCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFMyc1BpcGVsaW5lSWQsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLmlkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBTMnNQaXBlbGluZUlkLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogUzJzUGlwZWxpbmVJZCxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5pZCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UuaWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgUzJzUGlwZWxpbmVJZCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxTMnNQaXBlbGluZUlkLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLmlkID0gX3ZhbHVlLmlkO1xuICAgIFMyc1BpcGVsaW5lSWQucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBpZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuICBzZXQgaWQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2lkID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgUzJzUGlwZWxpbmVJZC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBTMnNQaXBlbGluZUlkLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBTMnNQaXBlbGluZUlkLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWRcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFMyc1BpcGVsaW5lSWQge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFMyc1BpcGVsaW5lSWRcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGlkPzogc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFMyc1BpcGVsaW5lSWRcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGlkPzogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLmNzaS5MaXN0UzJzUGlwZWxpbmVzUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgTGlzdFMyc1BpcGVsaW5lc1JlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28uY3NpLkxpc3RTMnNQaXBlbGluZXNSZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTGlzdFMyc1BpcGVsaW5lc1JlcXVlc3QoKTtcbiAgICBMaXN0UzJzUGlwZWxpbmVzUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IExpc3RTMnNQaXBlbGluZXNSZXF1ZXN0KSB7fVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IExpc3RTMnNQaXBlbGluZXNSZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIExpc3RTMnNQaXBlbGluZXNSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogTGlzdFMyc1BpcGVsaW5lc1JlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge31cblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIExpc3RTMnNQaXBlbGluZXNSZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPExpc3RTMnNQaXBlbGluZXNSZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICBMaXN0UzJzUGlwZWxpbmVzUmVxdWVzdC5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgTGlzdFMyc1BpcGVsaW5lc1JlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogTGlzdFMyc1BpcGVsaW5lc1JlcXVlc3QuQXNPYmplY3Qge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogTGlzdFMyc1BpcGVsaW5lc1JlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBMaXN0UzJzUGlwZWxpbmVzUmVxdWVzdCB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgTGlzdFMyc1BpcGVsaW5lc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge31cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgTGlzdFMyc1BpcGVsaW5lc1JlcXVlc3RcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge31cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28uY3NpLkxpc3RTMnNQaXBlbGluZXNSZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgTGlzdFMyc1BpcGVsaW5lc1Jlc3BvbnNlIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLmNzaS5MaXN0UzJzUGlwZWxpbmVzUmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBMaXN0UzJzUGlwZWxpbmVzUmVzcG9uc2UoKTtcbiAgICBMaXN0UzJzUGlwZWxpbmVzUmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBMaXN0UzJzUGlwZWxpbmVzUmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2UucGlwZWxpbmVzID0gX2luc3RhbmNlLnBpcGVsaW5lcyB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IExpc3RTMnNQaXBlbGluZXNSZXNwb25zZSxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSW5pdGlhbGl6ZXIxID0gbmV3IFMyc1BpcGVsaW5lKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjEsXG4gICAgICAgICAgICBTMnNQaXBlbGluZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIChfaW5zdGFuY2UucGlwZWxpbmVzID0gX2luc3RhbmNlLnBpcGVsaW5lcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIG1lc3NhZ2VJbml0aWFsaXplcjFcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgTGlzdFMyc1BpcGVsaW5lc1Jlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogTGlzdFMyc1BpcGVsaW5lc1Jlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnBpcGVsaW5lcyAmJiBfaW5zdGFuY2UucGlwZWxpbmVzLmxlbmd0aCkge1xuICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLnBpcGVsaW5lcyBhcyBhbnksXG4gICAgICAgIFMyc1BpcGVsaW5lLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3BpcGVsaW5lcz86IFMyc1BpcGVsaW5lW107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBMaXN0UzJzUGlwZWxpbmVzUmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8TGlzdFMyc1BpcGVsaW5lc1Jlc3BvbnNlLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnBpcGVsaW5lcyA9IChfdmFsdWUucGlwZWxpbmVzIHx8IFtdKS5tYXAobSA9PiBuZXcgUzJzUGlwZWxpbmUobSkpO1xuICAgIExpc3RTMnNQaXBlbGluZXNSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHBpcGVsaW5lcygpOiBTMnNQaXBlbGluZVtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGlwZWxpbmVzO1xuICB9XG4gIHNldCBwaXBlbGluZXModmFsdWU6IFMyc1BpcGVsaW5lW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9waXBlbGluZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBMaXN0UzJzUGlwZWxpbmVzUmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogTGlzdFMyc1BpcGVsaW5lc1Jlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGlwZWxpbmVzOiAodGhpcy5waXBlbGluZXMgfHwgW10pLm1hcChtID0+IG0udG9PYmplY3QoKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBMaXN0UzJzUGlwZWxpbmVzUmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBwaXBlbGluZXM6ICh0aGlzLnBpcGVsaW5lcyB8fCBbXSkubWFwKG0gPT4gbS50b1Byb3RvYnVmSlNPTihvcHRpb25zKSlcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIExpc3RTMnNQaXBlbGluZXNSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgTGlzdFMyc1BpcGVsaW5lc1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBwaXBlbGluZXM/OiBTMnNQaXBlbGluZS5Bc09iamVjdFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIExpc3RTMnNQaXBlbGluZXNSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgcGlwZWxpbmVzPzogUzJzUGlwZWxpbmUuQXNQcm90b2J1ZkpTT05bXSB8IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28uY3NpLlMyc1N0cmVhbVJlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIFMyc1N0cmVhbVJlcXVlc3QgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28uY3NpLlMyc1N0cmVhbVJlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBTMnNTdHJlYW1SZXF1ZXN0KCk7XG4gICAgUzJzU3RyZWFtUmVxdWVzdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFMyc1N0cmVhbVJlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UucGlwZWxpbmVJZCA9IF9pbnN0YW5jZS5waXBlbGluZUlkIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5zZXNzaW9uSWQgPSBfaW5zdGFuY2Uuc2Vzc2lvbklkIHx8ICcnO1xuICAgIF9pbnN0YW5jZS5hdWRpbyA9IF9pbnN0YW5jZS5hdWRpbyB8fCBuZXcgVWludDhBcnJheSgpO1xuICAgIF9pbnN0YW5jZS5lbmRPZlN0cmVhbSA9IF9pbnN0YW5jZS5lbmRPZlN0cmVhbSB8fCBmYWxzZTtcbiAgICBfaW5zdGFuY2UuaW5pdGlhbEludGVudERpc3BsYXlOYW1lID1cbiAgICAgIF9pbnN0YW5jZS5pbml0aWFsSW50ZW50RGlzcGxheU5hbWUgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBTMnNTdHJlYW1SZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5waXBlbGluZUlkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UuYXVkaW8gPSBfcmVhZGVyLnJlYWRCeXRlcygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgX2luc3RhbmNlLmVuZE9mU3RyZWFtID0gX3JlYWRlci5yZWFkQm9vbCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgX2luc3RhbmNlLmluaXRpYWxJbnRlbnREaXNwbGF5TmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgUzJzU3RyZWFtUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFMyc1N0cmVhbVJlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UucGlwZWxpbmVJZCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2UucGlwZWxpbmVJZCk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2Uuc2Vzc2lvbklkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDIsIF9pbnN0YW5jZS5zZXNzaW9uSWQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmF1ZGlvICYmIF9pbnN0YW5jZS5hdWRpby5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVCeXRlcygzLCBfaW5zdGFuY2UuYXVkaW8pO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmVuZE9mU3RyZWFtKSB7XG4gICAgICBfd3JpdGVyLndyaXRlQm9vbCg0LCBfaW5zdGFuY2UuZW5kT2ZTdHJlYW0pO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmluaXRpYWxJbnRlbnREaXNwbGF5TmFtZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg1LCBfaW5zdGFuY2UuaW5pdGlhbEludGVudERpc3BsYXlOYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9waXBlbGluZUlkPzogc3RyaW5nO1xuICBwcml2YXRlIF9zZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2F1ZGlvPzogVWludDhBcnJheTtcbiAgcHJpdmF0ZSBfZW5kT2ZTdHJlYW0/OiBib29sZWFuO1xuICBwcml2YXRlIF9pbml0aWFsSW50ZW50RGlzcGxheU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBTMnNTdHJlYW1SZXF1ZXN0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFMyc1N0cmVhbVJlcXVlc3QuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMucGlwZWxpbmVJZCA9IF92YWx1ZS5waXBlbGluZUlkO1xuICAgIHRoaXMuc2Vzc2lvbklkID0gX3ZhbHVlLnNlc3Npb25JZDtcbiAgICB0aGlzLmF1ZGlvID0gX3ZhbHVlLmF1ZGlvO1xuICAgIHRoaXMuZW5kT2ZTdHJlYW0gPSBfdmFsdWUuZW5kT2ZTdHJlYW07XG4gICAgdGhpcy5pbml0aWFsSW50ZW50RGlzcGxheU5hbWUgPSBfdmFsdWUuaW5pdGlhbEludGVudERpc3BsYXlOYW1lO1xuICAgIFMyc1N0cmVhbVJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBwaXBlbGluZUlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BpcGVsaW5lSWQ7XG4gIH1cbiAgc2V0IHBpcGVsaW5lSWQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3BpcGVsaW5lSWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc2Vzc2lvbklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25JZDtcbiAgfVxuICBzZXQgc2Vzc2lvbklkKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9zZXNzaW9uSWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgYXVkaW8oKTogVWludDhBcnJheSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F1ZGlvO1xuICB9XG4gIHNldCBhdWRpbyh2YWx1ZTogVWludDhBcnJheSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2F1ZGlvID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGVuZE9mU3RyZWFtKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9lbmRPZlN0cmVhbTtcbiAgfVxuICBzZXQgZW5kT2ZTdHJlYW0odmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9lbmRPZlN0cmVhbSA9IHZhbHVlO1xuICB9XG4gIGdldCBpbml0aWFsSW50ZW50RGlzcGxheU5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbEludGVudERpc3BsYXlOYW1lO1xuICB9XG4gIHNldCBpbml0aWFsSW50ZW50RGlzcGxheU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2luaXRpYWxJbnRlbnREaXNwbGF5TmFtZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIFMyc1N0cmVhbVJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogUzJzU3RyZWFtUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMucGlwZWxpbmVJZCxcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICBhdWRpbzogdGhpcy5hdWRpbyA/IHRoaXMuYXVkaW8uc3ViYXJyYXkoMCkgOiBuZXcgVWludDhBcnJheSgpLFxuICAgICAgZW5kT2ZTdHJlYW06IHRoaXMuZW5kT2ZTdHJlYW0sXG4gICAgICBpbml0aWFsSW50ZW50RGlzcGxheU5hbWU6IHRoaXMuaW5pdGlhbEludGVudERpc3BsYXlOYW1lXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogUzJzU3RyZWFtUmVxdWVzdC5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMucGlwZWxpbmVJZCxcbiAgICAgIHNlc3Npb25JZDogdGhpcy5zZXNzaW9uSWQsXG4gICAgICBhdWRpbzogdGhpcy5hdWRpbyA/IHVpbnQ4QXJyYXlUb0Jhc2U2NCh0aGlzLmF1ZGlvKSA6ICcnLFxuICAgICAgZW5kT2ZTdHJlYW06IHRoaXMuZW5kT2ZTdHJlYW0sXG4gICAgICBpbml0aWFsSW50ZW50RGlzcGxheU5hbWU6IHRoaXMuaW5pdGlhbEludGVudERpc3BsYXlOYW1lXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBTMnNTdHJlYW1SZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBTMnNTdHJlYW1SZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBwaXBlbGluZUlkPzogc3RyaW5nO1xuICAgIHNlc3Npb25JZD86IHN0cmluZztcbiAgICBhdWRpbz86IFVpbnQ4QXJyYXk7XG4gICAgZW5kT2ZTdHJlYW0/OiBib29sZWFuO1xuICAgIGluaXRpYWxJbnRlbnREaXNwbGF5TmFtZT86IHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBTMnNTdHJlYW1SZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBwaXBlbGluZUlkPzogc3RyaW5nO1xuICAgIHNlc3Npb25JZD86IHN0cmluZztcbiAgICBhdWRpbz86IHN0cmluZztcbiAgICBlbmRPZlN0cmVhbT86IGJvb2xlYW47XG4gICAgaW5pdGlhbEludGVudERpc3BsYXlOYW1lPzogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLmNzaS5TMnNTdHJlYW1SZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgUzJzU3RyZWFtUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28uY3NpLlMyc1N0cmVhbVJlc3BvbnNlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgUzJzU3RyZWFtUmVzcG9uc2UoKTtcbiAgICBTMnNTdHJlYW1SZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFMyc1N0cmVhbVJlc3BvbnNlKSB7fVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IFMyc1N0cmVhbVJlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5kZXRlY3RJbnRlbnRSZXNwb25zZSA9IG5ldyBvbmRld29ObHUwMTEuRGV0ZWN0SW50ZW50UmVzcG9uc2UoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLmRldGVjdEludGVudFJlc3BvbnNlLFxuICAgICAgICAgICAgb25kZXdvTmx1MDExLkRldGVjdEludGVudFJlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2Uuc3ludGhldGl6ZVJlc3BvbnNlID0gbmV3IG9uZGV3b1QyczAxMi5TeW50aGVzaXplUmVzcG9uc2UoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnN5bnRoZXRpemVSZXNwb25zZSxcbiAgICAgICAgICAgIG9uZGV3b1QyczAxMi5TeW50aGVzaXplUmVzcG9uc2UuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIF9pbnN0YW5jZS5zaXBUcmlnZ2VyID0gbmV3IFNpcFRyaWdnZXIoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnNpcFRyaWdnZXIsXG4gICAgICAgICAgICBTaXBUcmlnZ2VyLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBTMnNTdHJlYW1SZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFMyc1N0cmVhbVJlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmRldGVjdEludGVudFJlc3BvbnNlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMSxcbiAgICAgICAgX2luc3RhbmNlLmRldGVjdEludGVudFJlc3BvbnNlIGFzIGFueSxcbiAgICAgICAgb25kZXdvTmx1MDExLkRldGVjdEludGVudFJlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnN5bnRoZXRpemVSZXNwb25zZSkge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDIsXG4gICAgICAgIF9pbnN0YW5jZS5zeW50aGV0aXplUmVzcG9uc2UgYXMgYW55LFxuICAgICAgICBvbmRld29UMnMwMTIuU3ludGhlc2l6ZVJlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNpcFRyaWdnZXIpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAzLFxuICAgICAgICBfaW5zdGFuY2Uuc2lwVHJpZ2dlciBhcyBhbnksXG4gICAgICAgIFNpcFRyaWdnZXIuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGV0ZWN0SW50ZW50UmVzcG9uc2U/OiBvbmRld29ObHUwMTEuRGV0ZWN0SW50ZW50UmVzcG9uc2U7XG4gIHByaXZhdGUgX3N5bnRoZXRpemVSZXNwb25zZT86IG9uZGV3b1QyczAxMi5TeW50aGVzaXplUmVzcG9uc2U7XG4gIHByaXZhdGUgX3NpcFRyaWdnZXI/OiBTaXBUcmlnZ2VyO1xuXG4gIHByaXZhdGUgX3Jlc3BvbnNlOiBTMnNTdHJlYW1SZXNwb25zZS5SZXNwb25zZUNhc2UgPVxuICAgIFMyc1N0cmVhbVJlc3BvbnNlLlJlc3BvbnNlQ2FzZS5ub25lO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgUzJzU3RyZWFtUmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8UzJzU3RyZWFtUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuZGV0ZWN0SW50ZW50UmVzcG9uc2UgPSBfdmFsdWUuZGV0ZWN0SW50ZW50UmVzcG9uc2VcbiAgICAgID8gbmV3IG9uZGV3b05sdTAxMS5EZXRlY3RJbnRlbnRSZXNwb25zZShfdmFsdWUuZGV0ZWN0SW50ZW50UmVzcG9uc2UpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN5bnRoZXRpemVSZXNwb25zZSA9IF92YWx1ZS5zeW50aGV0aXplUmVzcG9uc2VcbiAgICAgID8gbmV3IG9uZGV3b1QyczAxMi5TeW50aGVzaXplUmVzcG9uc2UoX3ZhbHVlLnN5bnRoZXRpemVSZXNwb25zZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuc2lwVHJpZ2dlciA9IF92YWx1ZS5zaXBUcmlnZ2VyXG4gICAgICA/IG5ldyBTaXBUcmlnZ2VyKF92YWx1ZS5zaXBUcmlnZ2VyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgUzJzU3RyZWFtUmVzcG9uc2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBkZXRlY3RJbnRlbnRSZXNwb25zZSgpOiBvbmRld29ObHUwMTEuRGV0ZWN0SW50ZW50UmVzcG9uc2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kZXRlY3RJbnRlbnRSZXNwb25zZTtcbiAgfVxuICBzZXQgZGV0ZWN0SW50ZW50UmVzcG9uc2UoXG4gICAgdmFsdWU6IG9uZGV3b05sdTAxMS5EZXRlY3RJbnRlbnRSZXNwb25zZSB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fc3ludGhldGl6ZVJlc3BvbnNlID0gdGhpcy5fc2lwVHJpZ2dlciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3Jlc3BvbnNlID0gUzJzU3RyZWFtUmVzcG9uc2UuUmVzcG9uc2VDYXNlLmRldGVjdEludGVudFJlc3BvbnNlO1xuICAgIH1cbiAgICB0aGlzLl9kZXRlY3RJbnRlbnRSZXNwb25zZSA9IHZhbHVlO1xuICB9XG4gIGdldCBzeW50aGV0aXplUmVzcG9uc2UoKTogb25kZXdvVDJzMDEyLlN5bnRoZXNpemVSZXNwb25zZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3N5bnRoZXRpemVSZXNwb25zZTtcbiAgfVxuICBzZXQgc3ludGhldGl6ZVJlc3BvbnNlKHZhbHVlOiBvbmRld29UMnMwMTIuU3ludGhlc2l6ZVJlc3BvbnNlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2RldGVjdEludGVudFJlc3BvbnNlID0gdGhpcy5fc2lwVHJpZ2dlciA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3Jlc3BvbnNlID0gUzJzU3RyZWFtUmVzcG9uc2UuUmVzcG9uc2VDYXNlLnN5bnRoZXRpemVSZXNwb25zZTtcbiAgICB9XG4gICAgdGhpcy5fc3ludGhldGl6ZVJlc3BvbnNlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHNpcFRyaWdnZXIoKTogU2lwVHJpZ2dlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NpcFRyaWdnZXI7XG4gIH1cbiAgc2V0IHNpcFRyaWdnZXIodmFsdWU6IFNpcFRyaWdnZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fZGV0ZWN0SW50ZW50UmVzcG9uc2UgPSB0aGlzLl9zeW50aGV0aXplUmVzcG9uc2UgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9yZXNwb25zZSA9IFMyc1N0cmVhbVJlc3BvbnNlLlJlc3BvbnNlQ2FzZS5zaXBUcmlnZ2VyO1xuICAgIH1cbiAgICB0aGlzLl9zaXBUcmlnZ2VyID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHJlc3BvbnNlKCkge1xuICAgIHJldHVybiB0aGlzLl9yZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBTMnNTdHJlYW1SZXNwb25zZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBTMnNTdHJlYW1SZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRldGVjdEludGVudFJlc3BvbnNlOiB0aGlzLmRldGVjdEludGVudFJlc3BvbnNlXG4gICAgICAgID8gdGhpcy5kZXRlY3RJbnRlbnRSZXNwb25zZS50b09iamVjdCgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc3ludGhldGl6ZVJlc3BvbnNlOiB0aGlzLnN5bnRoZXRpemVSZXNwb25zZVxuICAgICAgICA/IHRoaXMuc3ludGhldGl6ZVJlc3BvbnNlLnRvT2JqZWN0KClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBzaXBUcmlnZ2VyOiB0aGlzLnNpcFRyaWdnZXIgPyB0aGlzLnNpcFRyaWdnZXIudG9PYmplY3QoKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFMyc1N0cmVhbVJlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV0ZWN0SW50ZW50UmVzcG9uc2U6IHRoaXMuZGV0ZWN0SW50ZW50UmVzcG9uc2VcbiAgICAgICAgPyB0aGlzLmRldGVjdEludGVudFJlc3BvbnNlLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIHN5bnRoZXRpemVSZXNwb25zZTogdGhpcy5zeW50aGV0aXplUmVzcG9uc2VcbiAgICAgICAgPyB0aGlzLnN5bnRoZXRpemVSZXNwb25zZS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGwsXG4gICAgICBzaXBUcmlnZ2VyOiB0aGlzLnNpcFRyaWdnZXJcbiAgICAgICAgPyB0aGlzLnNpcFRyaWdnZXIudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgOiBudWxsXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBTMnNTdHJlYW1SZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgUzJzU3RyZWFtUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIGRldGVjdEludGVudFJlc3BvbnNlPzogb25kZXdvTmx1MDExLkRldGVjdEludGVudFJlc3BvbnNlLkFzT2JqZWN0O1xuICAgIHN5bnRoZXRpemVSZXNwb25zZT86IG9uZGV3b1QyczAxMi5TeW50aGVzaXplUmVzcG9uc2UuQXNPYmplY3Q7XG4gICAgc2lwVHJpZ2dlcj86IFNpcFRyaWdnZXIuQXNPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgUzJzU3RyZWFtUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGRldGVjdEludGVudFJlc3BvbnNlPzogb25kZXdvTmx1MDExLkRldGVjdEludGVudFJlc3BvbnNlLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICBzeW50aGV0aXplUmVzcG9uc2U/OiBvbmRld29UMnMwMTIuU3ludGhlc2l6ZVJlc3BvbnNlLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICBzaXBUcmlnZ2VyPzogU2lwVHJpZ2dlci5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gIH1cbiAgZXhwb3J0IGVudW0gUmVzcG9uc2VDYXNlIHtcbiAgICBub25lID0gMCxcbiAgICBkZXRlY3RJbnRlbnRSZXNwb25zZSA9IDEsXG4gICAgc3ludGhldGl6ZVJlc3BvbnNlID0gMixcbiAgICBzaXBUcmlnZ2VyID0gM1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLmNzaS5TaXBUcmlnZ2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXBUcmlnZ2VyIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLmNzaS5TaXBUcmlnZ2VyJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgU2lwVHJpZ2dlcigpO1xuICAgIFNpcFRyaWdnZXIuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKGluc3RhbmNlLCBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBTaXBUcmlnZ2VyKSB7XG4gICAgX2luc3RhbmNlLnR5cGUgPSBfaW5zdGFuY2UudHlwZSB8fCAwO1xuICAgIF9pbnN0YW5jZS5jb250ZW50ID0gX2luc3RhbmNlLmNvbnRlbnQgfHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogU2lwVHJpZ2dlcixcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UudHlwZSA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS5jb250ZW50ID0gbmV3IGdvb2dsZVByb3RvYnVmMDAzLlN0cnVjdCgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuY29udGVudCxcbiAgICAgICAgICAgIGdvb2dsZVByb3RvYnVmMDAzLlN0cnVjdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgU2lwVHJpZ2dlci5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihfaW5zdGFuY2U6IFNpcFRyaWdnZXIsIF93cml0ZXI6IEJpbmFyeVdyaXRlcikge1xuICAgIGlmIChfaW5zdGFuY2UudHlwZSkge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oMSwgX2luc3RhbmNlLnR5cGUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmNvbnRlbnQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAyLFxuICAgICAgICBfaW5zdGFuY2UuY29udGVudCBhcyBhbnksXG4gICAgICAgIGdvb2dsZVByb3RvYnVmMDAzLlN0cnVjdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90eXBlPzogU2lwVHJpZ2dlci5TaXBUcmlnZ2VyVHlwZTtcbiAgcHJpdmF0ZSBfY29udGVudD86IGdvb2dsZVByb3RvYnVmMDAzLlN0cnVjdDtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFNpcFRyaWdnZXIgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8U2lwVHJpZ2dlci5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy50eXBlID0gX3ZhbHVlLnR5cGU7XG4gICAgdGhpcy5jb250ZW50ID0gX3ZhbHVlLmNvbnRlbnRcbiAgICAgID8gbmV3IGdvb2dsZVByb3RvYnVmMDAzLlN0cnVjdChfdmFsdWUuY29udGVudClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIFNpcFRyaWdnZXIucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCB0eXBlKCk6IFNpcFRyaWdnZXIuU2lwVHJpZ2dlclR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG4gIHNldCB0eXBlKHZhbHVlOiBTaXBUcmlnZ2VyLlNpcFRyaWdnZXJUeXBlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdHlwZSA9IHZhbHVlO1xuICB9XG4gIGdldCBjb250ZW50KCk6IGdvb2dsZVByb3RvYnVmMDAzLlN0cnVjdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG4gIH1cbiAgc2V0IGNvbnRlbnQodmFsdWU6IGdvb2dsZVByb3RvYnVmMDAzLlN0cnVjdCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NvbnRlbnQgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBTaXBUcmlnZ2VyLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFNpcFRyaWdnZXIuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBjb250ZW50OiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQudG9PYmplY3QoKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFNpcFRyaWdnZXIuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOlxuICAgICAgICBTaXBUcmlnZ2VyLlNpcFRyaWdnZXJUeXBlW1xuICAgICAgICAgIHRoaXMudHlwZSA9PT0gbnVsbCB8fCB0aGlzLnR5cGUgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLnR5cGVcbiAgICAgICAgXSxcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC50b1Byb3RvYnVmSlNPTihvcHRpb25zKSA6IG51bGxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIFNpcFRyaWdnZXIge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFNpcFRyaWdnZXJcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHR5cGU/OiBTaXBUcmlnZ2VyLlNpcFRyaWdnZXJUeXBlO1xuICAgIGNvbnRlbnQ/OiBnb29nbGVQcm90b2J1ZjAwMy5TdHJ1Y3QuQXNPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgU2lwVHJpZ2dlclxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgdHlwZT86IHN0cmluZztcbiAgICBjb250ZW50PzogZ29vZ2xlUHJvdG9idWYwMDMuU3RydWN0LkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgfVxuICBleHBvcnQgZW51bSBTaXBUcmlnZ2VyVHlwZSB7XG4gICAgVU5TUEVDSUZJRUQgPSAwLFxuICAgIEhBTkdVUCA9IDEsXG4gICAgSFVNQU5fSEFORE9WRVIgPSAyLFxuICAgIFNFTkRfTk9XID0gMyxcbiAgICBQQVVTRSA9IDRcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5jc2kuQ2hlY2tVcHN0cmVhbUhlYWx0aFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBDaGVja1Vwc3RyZWFtSGVhbHRoUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28uY3NpLkNoZWNrVXBzdHJlYW1IZWFsdGhSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENoZWNrVXBzdHJlYW1IZWFsdGhSZXNwb25zZSgpO1xuICAgIENoZWNrVXBzdHJlYW1IZWFsdGhSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENoZWNrVXBzdHJlYW1IZWFsdGhSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5zMnRTdGF0dXMgPSBfaW5zdGFuY2UuczJ0U3RhdHVzIHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2Uubmx1U3RhdHVzID0gX2luc3RhbmNlLm5sdVN0YXR1cyB8fCB1bmRlZmluZWQ7XG4gICAgX2luc3RhbmNlLnQyc1N0YXR1cyA9IF9pbnN0YW5jZS50MnNTdGF0dXMgfHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ2hlY2tVcHN0cmVhbUhlYWx0aFJlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5zMnRTdGF0dXMgPSBuZXcgZ29vZ2xlUnBjMDA0LlN0YXR1cygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuczJ0U3RhdHVzLFxuICAgICAgICAgICAgZ29vZ2xlUnBjMDA0LlN0YXR1cy5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLm5sdVN0YXR1cyA9IG5ldyBnb29nbGVScGMwMDQuU3RhdHVzKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5ubHVTdGF0dXMsXG4gICAgICAgICAgICBnb29nbGVScGMwMDQuU3RhdHVzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UudDJzU3RhdHVzID0gbmV3IGdvb2dsZVJwYzAwNC5TdGF0dXMoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnQyc1N0YXR1cyxcbiAgICAgICAgICAgIGdvb2dsZVJwYzAwNC5TdGF0dXMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIENoZWNrVXBzdHJlYW1IZWFsdGhSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENoZWNrVXBzdHJlYW1IZWFsdGhSZXNwb25zZSxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5zMnRTdGF0dXMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAxLFxuICAgICAgICBfaW5zdGFuY2UuczJ0U3RhdHVzIGFzIGFueSxcbiAgICAgICAgZ29vZ2xlUnBjMDA0LlN0YXR1cy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5ubHVTdGF0dXMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAyLFxuICAgICAgICBfaW5zdGFuY2Uubmx1U3RhdHVzIGFzIGFueSxcbiAgICAgICAgZ29vZ2xlUnBjMDA0LlN0YXR1cy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS50MnNTdGF0dXMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAzLFxuICAgICAgICBfaW5zdGFuY2UudDJzU3RhdHVzIGFzIGFueSxcbiAgICAgICAgZ29vZ2xlUnBjMDA0LlN0YXR1cy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zMnRTdGF0dXM/OiBnb29nbGVScGMwMDQuU3RhdHVzO1xuICBwcml2YXRlIF9ubHVTdGF0dXM/OiBnb29nbGVScGMwMDQuU3RhdHVzO1xuICBwcml2YXRlIF90MnNTdGF0dXM/OiBnb29nbGVScGMwMDQuU3RhdHVzO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQ2hlY2tVcHN0cmVhbUhlYWx0aFJlc3BvbnNlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPENoZWNrVXBzdHJlYW1IZWFsdGhSZXNwb25zZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5zMnRTdGF0dXMgPSBfdmFsdWUuczJ0U3RhdHVzXG4gICAgICA/IG5ldyBnb29nbGVScGMwMDQuU3RhdHVzKF92YWx1ZS5zMnRTdGF0dXMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm5sdVN0YXR1cyA9IF92YWx1ZS5ubHVTdGF0dXNcbiAgICAgID8gbmV3IGdvb2dsZVJwYzAwNC5TdGF0dXMoX3ZhbHVlLm5sdVN0YXR1cylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMudDJzU3RhdHVzID0gX3ZhbHVlLnQyc1N0YXR1c1xuICAgICAgPyBuZXcgZ29vZ2xlUnBjMDA0LlN0YXR1cyhfdmFsdWUudDJzU3RhdHVzKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgQ2hlY2tVcHN0cmVhbUhlYWx0aFJlc3BvbnNlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgczJ0U3RhdHVzKCk6IGdvb2dsZVJwYzAwNC5TdGF0dXMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zMnRTdGF0dXM7XG4gIH1cbiAgc2V0IHMydFN0YXR1cyh2YWx1ZTogZ29vZ2xlUnBjMDA0LlN0YXR1cyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3MydFN0YXR1cyA9IHZhbHVlO1xuICB9XG4gIGdldCBubHVTdGF0dXMoKTogZ29vZ2xlUnBjMDA0LlN0YXR1cyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX25sdVN0YXR1cztcbiAgfVxuICBzZXQgbmx1U3RhdHVzKHZhbHVlOiBnb29nbGVScGMwMDQuU3RhdHVzIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbmx1U3RhdHVzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHQyc1N0YXR1cygpOiBnb29nbGVScGMwMDQuU3RhdHVzIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdDJzU3RhdHVzO1xuICB9XG4gIHNldCB0MnNTdGF0dXModmFsdWU6IGdvb2dsZVJwYzAwNC5TdGF0dXMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90MnNTdGF0dXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBDaGVja1Vwc3RyZWFtSGVhbHRoUmVzcG9uc2Uuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQ2hlY2tVcHN0cmVhbUhlYWx0aFJlc3BvbnNlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgczJ0U3RhdHVzOiB0aGlzLnMydFN0YXR1cyA/IHRoaXMuczJ0U3RhdHVzLnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICBubHVTdGF0dXM6IHRoaXMubmx1U3RhdHVzID8gdGhpcy5ubHVTdGF0dXMudG9PYmplY3QoKSA6IHVuZGVmaW5lZCxcbiAgICAgIHQyc1N0YXR1czogdGhpcy50MnNTdGF0dXMgPyB0aGlzLnQyc1N0YXR1cy50b09iamVjdCgpIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ2hlY2tVcHN0cmVhbUhlYWx0aFJlc3BvbnNlLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgczJ0U3RhdHVzOiB0aGlzLnMydFN0YXR1cyA/IHRoaXMuczJ0U3RhdHVzLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpIDogbnVsbCxcbiAgICAgIG5sdVN0YXR1czogdGhpcy5ubHVTdGF0dXMgPyB0aGlzLm5sdVN0YXR1cy50b1Byb3RvYnVmSlNPTihvcHRpb25zKSA6IG51bGwsXG4gICAgICB0MnNTdGF0dXM6IHRoaXMudDJzU3RhdHVzID8gdGhpcy50MnNTdGF0dXMudG9Qcm90b2J1ZkpTT04ob3B0aW9ucykgOiBudWxsXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBDaGVja1Vwc3RyZWFtSGVhbHRoUmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENoZWNrVXBzdHJlYW1IZWFsdGhSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgczJ0U3RhdHVzPzogZ29vZ2xlUnBjMDA0LlN0YXR1cy5Bc09iamVjdDtcbiAgICBubHVTdGF0dXM/OiBnb29nbGVScGMwMDQuU3RhdHVzLkFzT2JqZWN0O1xuICAgIHQyc1N0YXR1cz86IGdvb2dsZVJwYzAwNC5TdGF0dXMuQXNPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ2hlY2tVcHN0cmVhbUhlYWx0aFJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzMnRTdGF0dXM/OiBnb29nbGVScGMwMDQuU3RhdHVzLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICBubHVTdGF0dXM/OiBnb29nbGVScGMwMDQuU3RhdHVzLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICB0MnNTdGF0dXM/OiBnb29nbGVScGMwMDQuU3RhdHVzLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5jc2kuQ29udHJvbFN0cmVhbVJlcXVlc3RcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xTdHJlYW1SZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLmNzaS5Db250cm9sU3RyZWFtUmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENvbnRyb2xTdHJlYW1SZXF1ZXN0KCk7XG4gICAgQ29udHJvbFN0cmVhbVJlcXVlc3QuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBDb250cm9sU3RyZWFtUmVxdWVzdCkge31cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDb250cm9sU3RyZWFtUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb250cm9sU3RyZWFtUmVxdWVzdC5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENvbnRyb2xTdHJlYW1SZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHt9XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDb250cm9sU3RyZWFtUmVxdWVzdCB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDb250cm9sU3RyZWFtUmVxdWVzdC5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgQ29udHJvbFN0cmVhbVJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENvbnRyb2xTdHJlYW1SZXF1ZXN0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENvbnRyb2xTdHJlYW1SZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IENvbnRyb2xTdHJlYW1SZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgQ29udHJvbFN0cmVhbVJlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENvbnRyb2xTdHJlYW1SZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHt9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENvbnRyb2xTdHJlYW1SZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHt9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLmNzaS5Db250cm9sU3RyZWFtUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xTdHJlYW1SZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5jc2kuQ29udHJvbFN0cmVhbVJlc3BvbnNlJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ29udHJvbFN0cmVhbVJlc3BvbnNlKCk7XG4gICAgQ29udHJvbFN0cmVhbVJlc3BvbnNlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ29udHJvbFN0cmVhbVJlc3BvbnNlKSB7XG4gICAgX2luc3RhbmNlLmNvbnRyb2xTdGF0dXMgPSBfaW5zdGFuY2UuY29udHJvbFN0YXR1cyB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ29udHJvbFN0cmVhbVJlc3BvbnNlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5jb250cm9sU3RhdHVzID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQ29udHJvbFN0cmVhbVJlc3BvbnNlLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQ29udHJvbFN0cmVhbVJlc3BvbnNlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLmNvbnRyb2xTdGF0dXMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVFbnVtKDEsIF9pbnN0YW5jZS5jb250cm9sU3RhdHVzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jb250cm9sU3RhdHVzPzogQ29udHJvbFN0YXR1cztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENvbnRyb2xTdHJlYW1SZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDb250cm9sU3RyZWFtUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuY29udHJvbFN0YXR1cyA9IF92YWx1ZS5jb250cm9sU3RhdHVzO1xuICAgIENvbnRyb2xTdHJlYW1SZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGNvbnRyb2xTdGF0dXMoKTogQ29udHJvbFN0YXR1cyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2xTdGF0dXM7XG4gIH1cbiAgc2V0IGNvbnRyb2xTdGF0dXModmFsdWU6IENvbnRyb2xTdGF0dXMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb250cm9sU3RhdHVzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQ29udHJvbFN0cmVhbVJlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENvbnRyb2xTdHJlYW1SZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRyb2xTdGF0dXM6IHRoaXMuY29udHJvbFN0YXR1c1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IENvbnRyb2xTdHJlYW1SZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRyb2xTdGF0dXM6XG4gICAgICAgIENvbnRyb2xTdGF0dXNbXG4gICAgICAgICAgdGhpcy5jb250cm9sU3RhdHVzID09PSBudWxsIHx8IHRoaXMuY29udHJvbFN0YXR1cyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogdGhpcy5jb250cm9sU3RhdHVzXG4gICAgICAgIF1cbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENvbnRyb2xTdHJlYW1SZXNwb25zZSB7XG4gIC8qKlxuICAgKiBTdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgQ29udHJvbFN0cmVhbVJlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBjb250cm9sU3RhdHVzPzogQ29udHJvbFN0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBDb250cm9sU3RyZWFtUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgIGNvbnRyb2xTdGF0dXM/OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28uY3NpLlNldENvbnRyb2xTdGF0dXNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXRDb250cm9sU3RhdHVzUmVxdWVzdCBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5jc2kuU2V0Q29udHJvbFN0YXR1c1JlcXVlc3QnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBTZXRDb250cm9sU3RhdHVzUmVxdWVzdCgpO1xuICAgIFNldENvbnRyb2xTdGF0dXNSZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogU2V0Q29udHJvbFN0YXR1c1JlcXVlc3QpIHtcbiAgICBfaW5zdGFuY2UuY29udHJvbFN0YXR1cyA9IF9pbnN0YW5jZS5jb250cm9sU3RhdHVzIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBTZXRDb250cm9sU3RhdHVzUmVxdWVzdCxcbiAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgKSB7XG4gICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgIHN3aXRjaCAoX3JlYWRlci5nZXRGaWVsZE51bWJlcigpKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBfaW5zdGFuY2UuY29udHJvbFN0YXR1cyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFNldENvbnRyb2xTdGF0dXNSZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogU2V0Q29udHJvbFN0YXR1c1JlcXVlc3QsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2UuY29udHJvbFN0YXR1cykge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oMSwgX2luc3RhbmNlLmNvbnRyb2xTdGF0dXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NvbnRyb2xTdGF0dXM/OiBDb250cm9sU3RhdHVzO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgU2V0Q29udHJvbFN0YXR1c1JlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8U2V0Q29udHJvbFN0YXR1c1JlcXVlc3QuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuY29udHJvbFN0YXR1cyA9IF92YWx1ZS5jb250cm9sU3RhdHVzO1xuICAgIFNldENvbnRyb2xTdGF0dXNSZXF1ZXN0LnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgfVxuICBnZXQgY29udHJvbFN0YXR1cygpOiBDb250cm9sU3RhdHVzIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fY29udHJvbFN0YXR1cztcbiAgfVxuICBzZXQgY29udHJvbFN0YXR1cyh2YWx1ZTogQ29udHJvbFN0YXR1cyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NvbnRyb2xTdGF0dXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBTZXRDb250cm9sU3RhdHVzUmVxdWVzdC5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBTZXRDb250cm9sU3RhdHVzUmVxdWVzdC5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRyb2xTdGF0dXM6IHRoaXMuY29udHJvbFN0YXR1c1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFNldENvbnRyb2xTdGF0dXNSZXF1ZXN0LkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udHJvbFN0YXR1czpcbiAgICAgICAgQ29udHJvbFN0YXR1c1tcbiAgICAgICAgICB0aGlzLmNvbnRyb2xTdGF0dXMgPT09IG51bGwgfHwgdGhpcy5jb250cm9sU3RhdHVzID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiB0aGlzLmNvbnRyb2xTdGF0dXNcbiAgICAgICAgXVxuICAgIH07XG4gIH1cbn1cbmV4cG9ydCBtb2R1bGUgU2V0Q29udHJvbFN0YXR1c1JlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFNldENvbnRyb2xTdGF0dXNSZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICBjb250cm9sU3RhdHVzPzogQ29udHJvbFN0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBTZXRDb250cm9sU3RhdHVzUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgY29udHJvbFN0YXR1cz86IHN0cmluZztcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5jc2kuU2V0Q29udHJvbFN0YXR1c1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXRDb250cm9sU3RhdHVzUmVzcG9uc2UgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28uY3NpLlNldENvbnRyb2xTdGF0dXNSZXNwb25zZSc7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFNldENvbnRyb2xTdGF0dXNSZXNwb25zZSgpO1xuICAgIFNldENvbnRyb2xTdGF0dXNSZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFNldENvbnRyb2xTdGF0dXNSZXNwb25zZSkge1xuICAgIF9pbnN0YW5jZS5vbGRDb250cm9sU3RhdHVzID0gX2luc3RhbmNlLm9sZENvbnRyb2xTdGF0dXMgfHwgMDtcbiAgICBfaW5zdGFuY2UubmV3Q29udHJvbFN0YXR1cyA9IF9pbnN0YW5jZS5uZXdDb250cm9sU3RhdHVzIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBTZXRDb250cm9sU3RhdHVzUmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLm9sZENvbnRyb2xTdGF0dXMgPSBfcmVhZGVyLnJlYWRFbnVtKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UubmV3Q29udHJvbFN0YXR1cyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIFNldENvbnRyb2xTdGF0dXNSZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IFNldENvbnRyb2xTdGF0dXNSZXNwb25zZSxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5vbGRDb250cm9sU3RhdHVzKSB7XG4gICAgICBfd3JpdGVyLndyaXRlRW51bSgxLCBfaW5zdGFuY2Uub2xkQ29udHJvbFN0YXR1cyk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UubmV3Q29udHJvbFN0YXR1cykge1xuICAgICAgX3dyaXRlci53cml0ZUVudW0oMiwgX2luc3RhbmNlLm5ld0NvbnRyb2xTdGF0dXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX29sZENvbnRyb2xTdGF0dXM/OiBDb250cm9sU3RhdHVzO1xuICBwcml2YXRlIF9uZXdDb250cm9sU3RhdHVzPzogQ29udHJvbFN0YXR1cztcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFNldENvbnRyb2xTdGF0dXNSZXNwb25zZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxTZXRDb250cm9sU3RhdHVzUmVzcG9uc2UuQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMub2xkQ29udHJvbFN0YXR1cyA9IF92YWx1ZS5vbGRDb250cm9sU3RhdHVzO1xuICAgIHRoaXMubmV3Q29udHJvbFN0YXR1cyA9IF92YWx1ZS5uZXdDb250cm9sU3RhdHVzO1xuICAgIFNldENvbnRyb2xTdGF0dXNSZXNwb25zZS5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IG9sZENvbnRyb2xTdGF0dXMoKTogQ29udHJvbFN0YXR1cyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX29sZENvbnRyb2xTdGF0dXM7XG4gIH1cbiAgc2V0IG9sZENvbnRyb2xTdGF0dXModmFsdWU6IENvbnRyb2xTdGF0dXMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9vbGRDb250cm9sU3RhdHVzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IG5ld0NvbnRyb2xTdGF0dXMoKTogQ29udHJvbFN0YXR1cyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX25ld0NvbnRyb2xTdGF0dXM7XG4gIH1cbiAgc2V0IG5ld0NvbnRyb2xTdGF0dXModmFsdWU6IENvbnRyb2xTdGF0dXMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9uZXdDb250cm9sU3RhdHVzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgU2V0Q29udHJvbFN0YXR1c1Jlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IFNldENvbnRyb2xTdGF0dXNSZXNwb25zZS5Bc09iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9sZENvbnRyb2xTdGF0dXM6IHRoaXMub2xkQ29udHJvbFN0YXR1cyxcbiAgICAgIG5ld0NvbnRyb2xTdGF0dXM6IHRoaXMubmV3Q29udHJvbFN0YXR1c1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IFNldENvbnRyb2xTdGF0dXNSZXNwb25zZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9sZENvbnRyb2xTdGF0dXM6XG4gICAgICAgIENvbnRyb2xTdGF0dXNbXG4gICAgICAgICAgdGhpcy5vbGRDb250cm9sU3RhdHVzID09PSBudWxsIHx8IHRoaXMub2xkQ29udHJvbFN0YXR1cyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogdGhpcy5vbGRDb250cm9sU3RhdHVzXG4gICAgICAgIF0sXG4gICAgICBuZXdDb250cm9sU3RhdHVzOlxuICAgICAgICBDb250cm9sU3RhdHVzW1xuICAgICAgICAgIHRoaXMubmV3Q29udHJvbFN0YXR1cyA9PT0gbnVsbCB8fCB0aGlzLm5ld0NvbnRyb2xTdGF0dXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IHRoaXMubmV3Q29udHJvbFN0YXR1c1xuICAgICAgICBdXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBTZXRDb250cm9sU3RhdHVzUmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFNldENvbnRyb2xTdGF0dXNSZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgb2xkQ29udHJvbFN0YXR1cz86IENvbnRyb2xTdGF0dXM7XG4gICAgbmV3Q29udHJvbFN0YXR1cz86IENvbnRyb2xTdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgU2V0Q29udHJvbFN0YXR1c1Jlc3BvbnNlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBvbGRDb250cm9sU3RhdHVzPzogc3RyaW5nO1xuICAgIG5ld0NvbnRyb2xTdGF0dXM/OiBzdHJpbmc7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28uY3NpLkNvbmR0aW9uVmFsdWVVbmlvblxuICovXG5leHBvcnQgY2xhc3MgQ29uZHRpb25WYWx1ZVVuaW9uIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLmNzaS5Db25kdGlvblZhbHVlVW5pb24nO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDb25kdGlvblZhbHVlVW5pb24oKTtcbiAgICBDb25kdGlvblZhbHVlVW5pb24uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBDb25kdGlvblZhbHVlVW5pb24pIHt9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogQ29uZHRpb25WYWx1ZVVuaW9uLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5pbnRWYWx1ZSA9IF9yZWFkZXIucmVhZEludDY0U3RyaW5nKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UuZmxvYXRWYWx1ZSA9IF9yZWFkZXIucmVhZEZsb2F0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UuZGF0ZXRpbWVWYWx1ZSA9IG5ldyBnb29nbGVQcm90b2J1ZjAxMC5UaW1lc3RhbXAoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLmRhdGV0aW1lVmFsdWUsXG4gICAgICAgICAgICBnb29nbGVQcm90b2J1ZjAxMC5UaW1lc3RhbXAuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIENvbmR0aW9uVmFsdWVVbmlvbi5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENvbmR0aW9uVmFsdWVVbmlvbixcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS5pbnRWYWx1ZSB8fCBfaW5zdGFuY2UuaW50VmFsdWUgPT09ICcwJykge1xuICAgICAgX3dyaXRlci53cml0ZUludDY0U3RyaW5nKDEsIF9pbnN0YW5jZS5pbnRWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuZmxvYXRWYWx1ZSB8fCBfaW5zdGFuY2UuZmxvYXRWYWx1ZSA9PT0gMCkge1xuICAgICAgX3dyaXRlci53cml0ZUZsb2F0KDIsIF9pbnN0YW5jZS5mbG9hdFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5kYXRldGltZVZhbHVlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMyxcbiAgICAgICAgX2luc3RhbmNlLmRhdGV0aW1lVmFsdWUgYXMgYW55LFxuICAgICAgICBnb29nbGVQcm90b2J1ZjAxMC5UaW1lc3RhbXAuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaW50VmFsdWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2Zsb2F0VmFsdWU/OiBudW1iZXI7XG4gIHByaXZhdGUgX2RhdGV0aW1lVmFsdWU/OiBnb29nbGVQcm90b2J1ZjAxMC5UaW1lc3RhbXA7XG5cbiAgcHJpdmF0ZSBfdW5pb25PbmVvZjogQ29uZHRpb25WYWx1ZVVuaW9uLlVuaW9uT25lb2ZDYXNlID1cbiAgICBDb25kdGlvblZhbHVlVW5pb24uVW5pb25PbmVvZkNhc2Uubm9uZTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIENvbmR0aW9uVmFsdWVVbmlvbiB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDb25kdGlvblZhbHVlVW5pb24uQXNPYmplY3Q+KSB7XG4gICAgX3ZhbHVlID0gX3ZhbHVlIHx8IHt9O1xuICAgIHRoaXMuaW50VmFsdWUgPSBfdmFsdWUuaW50VmFsdWU7XG4gICAgdGhpcy5mbG9hdFZhbHVlID0gX3ZhbHVlLmZsb2F0VmFsdWU7XG4gICAgdGhpcy5kYXRldGltZVZhbHVlID0gX3ZhbHVlLmRhdGV0aW1lVmFsdWVcbiAgICAgID8gbmV3IGdvb2dsZVByb3RvYnVmMDEwLlRpbWVzdGFtcChfdmFsdWUuZGF0ZXRpbWVWYWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIENvbmR0aW9uVmFsdWVVbmlvbi5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IGludFZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ludFZhbHVlO1xuICB9XG4gIHNldCBpbnRWYWx1ZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2Zsb2F0VmFsdWUgPSB0aGlzLl9kYXRldGltZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdW5pb25PbmVvZiA9IENvbmR0aW9uVmFsdWVVbmlvbi5Vbmlvbk9uZW9mQ2FzZS5pbnRWYWx1ZTtcbiAgICB9XG4gICAgdGhpcy5faW50VmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgZmxvYXRWYWx1ZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mbG9hdFZhbHVlO1xuICB9XG4gIHNldCBmbG9hdFZhbHVlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5faW50VmFsdWUgPSB0aGlzLl9kYXRldGltZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdW5pb25PbmVvZiA9IENvbmR0aW9uVmFsdWVVbmlvbi5Vbmlvbk9uZW9mQ2FzZS5mbG9hdFZhbHVlO1xuICAgIH1cbiAgICB0aGlzLl9mbG9hdFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGRhdGV0aW1lVmFsdWUoKTogZ29vZ2xlUHJvdG9idWYwMTAuVGltZXN0YW1wIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0ZXRpbWVWYWx1ZTtcbiAgfVxuICBzZXQgZGF0ZXRpbWVWYWx1ZSh2YWx1ZTogZ29vZ2xlUHJvdG9idWYwMTAuVGltZXN0YW1wIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2ludFZhbHVlID0gdGhpcy5fZmxvYXRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3VuaW9uT25lb2YgPSBDb25kdGlvblZhbHVlVW5pb24uVW5pb25PbmVvZkNhc2UuZGF0ZXRpbWVWYWx1ZTtcbiAgICB9XG4gICAgdGhpcy5fZGF0ZXRpbWVWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIGdldCB1bmlvbk9uZW9mKCkge1xuICAgIHJldHVybiB0aGlzLl91bmlvbk9uZW9mO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENvbmR0aW9uVmFsdWVVbmlvbi5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBDb25kdGlvblZhbHVlVW5pb24uQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBpbnRWYWx1ZTogdGhpcy5pbnRWYWx1ZSxcbiAgICAgIGZsb2F0VmFsdWU6IHRoaXMuZmxvYXRWYWx1ZSxcbiAgICAgIGRhdGV0aW1lVmFsdWU6IHRoaXMuZGF0ZXRpbWVWYWx1ZVxuICAgICAgICA/IHRoaXMuZGF0ZXRpbWVWYWx1ZS50b09iamVjdCgpXG4gICAgICAgIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ29uZHRpb25WYWx1ZVVuaW9uLkFzUHJvdG9idWZKU09OIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW50VmFsdWU6XG4gICAgICAgIHRoaXMuaW50VmFsdWUgPT09IG51bGwgfHwgdGhpcy5pbnRWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiB0aGlzLmludFZhbHVlLFxuICAgICAgZmxvYXRWYWx1ZTpcbiAgICAgICAgdGhpcy5mbG9hdFZhbHVlID09PSBudWxsIHx8IHRoaXMuZmxvYXRWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiB0aGlzLmZsb2F0VmFsdWUsXG4gICAgICBkYXRldGltZVZhbHVlOiB0aGlzLmRhdGV0aW1lVmFsdWVcbiAgICAgICAgPyB0aGlzLmRhdGV0aW1lVmFsdWUudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgOiBudWxsXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBDb25kdGlvblZhbHVlVW5pb24ge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENvbmR0aW9uVmFsdWVVbmlvblxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgaW50VmFsdWU/OiBzdHJpbmc7XG4gICAgZmxvYXRWYWx1ZT86IG51bWJlcjtcbiAgICBkYXRldGltZVZhbHVlPzogZ29vZ2xlUHJvdG9idWYwMTAuVGltZXN0YW1wLkFzT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENvbmR0aW9uVmFsdWVVbmlvblxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgaW50VmFsdWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGZsb2F0VmFsdWU/OiBudW1iZXIgfCBudWxsO1xuICAgIGRhdGV0aW1lVmFsdWU/OiBnb29nbGVQcm90b2J1ZjAxMC5UaW1lc3RhbXAuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICB9XG4gIGV4cG9ydCBlbnVtIFVuaW9uT25lb2ZDYXNlIHtcbiAgICBub25lID0gMCxcbiAgICBpbnRWYWx1ZSA9IDEsXG4gICAgZmxvYXRWYWx1ZSA9IDIsXG4gICAgZGF0ZXRpbWVWYWx1ZSA9IDNcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIG9uZGV3by5jc2kuQ29uZGl0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25kaXRpb24gaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gIHN0YXRpYyBpZCA9ICdvbmRld28uY3NpLkNvbmRpdGlvbic7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IENvbmRpdGlvbigpO1xuICAgIENvbmRpdGlvbi5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoaW5zdGFuY2UsIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IENvbmRpdGlvbikge1xuICAgIF9pbnN0YW5jZS50eXBlID0gX2luc3RhbmNlLnR5cGUgfHwgMDtcbiAgICBfaW5zdGFuY2UudmFsdWUgPSBfaW5zdGFuY2UudmFsdWUgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDb25kaXRpb24sXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLnR5cGUgPSBfcmVhZGVyLnJlYWRFbnVtKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UudmFsdWUgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIENvbmRpdGlvbi5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihfaW5zdGFuY2U6IENvbmRpdGlvbiwgX3dyaXRlcjogQmluYXJ5V3JpdGVyKSB7XG4gICAgaWYgKF9pbnN0YW5jZS50eXBlKSB7XG4gICAgICBfd3JpdGVyLndyaXRlRW51bSgxLCBfaW5zdGFuY2UudHlwZSk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UudmFsdWUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMiwgX2luc3RhbmNlLnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90eXBlPzogQ29uZGl0aW9uVHlwZTtcbiAgcHJpdmF0ZSBfdmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDb25kaXRpb24gdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8Q29uZGl0aW9uLkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnR5cGUgPSBfdmFsdWUudHlwZTtcbiAgICB0aGlzLnZhbHVlID0gX3ZhbHVlLnZhbHVlO1xuICAgIENvbmRpdGlvbi5yZWZpbmVWYWx1ZXModGhpcyk7XG4gIH1cbiAgZ2V0IHR5cGUoKTogQ29uZGl0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cbiAgc2V0IHR5cGUodmFsdWU6IENvbmRpdGlvblR5cGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90eXBlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBDb25kaXRpb24uc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogQ29uZGl0aW9uLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBDb25kaXRpb24uQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOlxuICAgICAgICBDb25kaXRpb25UeXBlW1xuICAgICAgICAgIHRoaXMudHlwZSA9PT0gbnVsbCB8fCB0aGlzLnR5cGUgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLnR5cGVcbiAgICAgICAgXSxcbiAgICAgIHZhbHVlOiB0aGlzLnZhbHVlXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBDb25kaXRpb24ge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENvbmRpdGlvblxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgdHlwZT86IENvbmRpdGlvblR5cGU7XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ29uZGl0aW9uXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIHZhbHVlPzogc3RyaW5nO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3Igb25kZXdvLmNzaS5Db250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnb25kZXdvLmNzaS5Db250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzJztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgQ29udHJvbE1lc3NhZ2VTZXJ2aWNlUGFyYW1ldGVycygpO1xuICAgIENvbnRyb2xNZXNzYWdlU2VydmljZVBhcmFtZXRlcnMuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBuZXcgQmluYXJ5UmVhZGVyKGJ5dGVzKVxuICAgICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzKSB7XG4gICAgX2luc3RhbmNlLnRyYW5zZmVySWQgPSBfaW5zdGFuY2UudHJhbnNmZXJJZCB8fCAnJztcbiAgICBfaW5zdGFuY2Uud2F2RmlsZXMgPSBfaW5zdGFuY2Uud2F2RmlsZXMgfHwgW107XG4gICAgX2luc3RhbmNlLnRleHQgPSBfaW5zdGFuY2UudGV4dCB8fCAnJztcbiAgICBfaW5zdGFuY2UuY29udGV4dCA9IF9pbnN0YW5jZS5jb250ZXh0IHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX2luc3RhbmNlLnNlc3Npb25JZCB8fCAnJztcbiAgICBfaW5zdGFuY2UuY29udGV4dE5hbWUgPSBfaW5zdGFuY2UuY29udGV4dE5hbWUgfHwgJyc7XG4gICAgX2luc3RhbmNlLmNvbmRpdGlvblN0YXJ0ID0gX2luc3RhbmNlLmNvbmRpdGlvblN0YXJ0IHx8IHVuZGVmaW5lZDtcbiAgICBfaW5zdGFuY2UuY29uZGl0aW9uRW5kID0gX2luc3RhbmNlLmNvbmRpdGlvbkVuZCB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgX2luc3RhbmNlOiBDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS50MnNDb25maWcgPSBuZXcgb25kZXdvVDJzMDEyLlJlcXVlc3RDb25maWcoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnQyc0NvbmZpZyxcbiAgICAgICAgICAgIG9uZGV3b1QyczAxMi5SZXF1ZXN0Q29uZmlnLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBfaW5zdGFuY2UuczJ0Q29uZmlnID0gbmV3IG9uZGV3b1MydDAxMy5UcmFuc2NyaWJlUmVxdWVzdENvbmZpZygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuczJ0Q29uZmlnLFxuICAgICAgICAgICAgb25kZXdvUzJ0MDEzLlRyYW5zY3JpYmVSZXF1ZXN0Q29uZmlnLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UudHJhbnNmZXJJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgKF9pbnN0YW5jZS53YXZGaWxlcyA9IF9pbnN0YW5jZS53YXZGaWxlcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgIF9yZWFkZXIucmVhZEJ5dGVzKClcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgX2luc3RhbmNlLnRleHQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIF9pbnN0YW5jZS5jb250ZXh0ID0gbmV3IG9uZGV3b05sdTAwNi5Db250ZXh0KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5jb250ZXh0LFxuICAgICAgICAgICAgb25kZXdvTmx1MDA2LkNvbnRleHQuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIF9pbnN0YW5jZS5zZXNzaW9uSWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgIF9pbnN0YW5jZS5jb250ZXh0TmFtZSA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgX2luc3RhbmNlLmNvbmRpdGlvblN0YXJ0ID0gbmV3IENvbmRpdGlvbigpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuY29uZGl0aW9uU3RhcnQsXG4gICAgICAgICAgICBDb25kaXRpb24uZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBfaW5zdGFuY2UuY29uZGl0aW9uRW5kID0gbmV3IENvbmRpdGlvbigpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UuY29uZGl0aW9uRW5kLFxuICAgICAgICAgICAgQ29uZGl0aW9uLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogQ29udHJvbE1lc3NhZ2VTZXJ2aWNlUGFyYW1ldGVycyxcbiAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgKSB7XG4gICAgaWYgKF9pbnN0YW5jZS50MnNDb25maWcpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAxLFxuICAgICAgICBfaW5zdGFuY2UudDJzQ29uZmlnIGFzIGFueSxcbiAgICAgICAgb25kZXdvVDJzMDEyLlJlcXVlc3RDb25maWcuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UuczJ0Q29uZmlnKSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgMixcbiAgICAgICAgX2luc3RhbmNlLnMydENvbmZpZyBhcyBhbnksXG4gICAgICAgIG9uZGV3b1MydDAxMy5UcmFuc2NyaWJlUmVxdWVzdENvbmZpZy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS50cmFuc2ZlcklkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMsIF9pbnN0YW5jZS50cmFuc2ZlcklkKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS53YXZGaWxlcyAmJiBfaW5zdGFuY2Uud2F2RmlsZXMubGVuZ3RoKSB7XG4gICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRCeXRlcyg0LCBfaW5zdGFuY2Uud2F2RmlsZXMpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnRleHQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoNSwgX2luc3RhbmNlLnRleHQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmNvbnRleHQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICA2LFxuICAgICAgICBfaW5zdGFuY2UuY29udGV4dCBhcyBhbnksXG4gICAgICAgIG9uZGV3b05sdTAwNi5Db250ZXh0LnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnNlc3Npb25JZCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg3LCBfaW5zdGFuY2Uuc2Vzc2lvbklkKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5jb250ZXh0TmFtZSkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg4LCBfaW5zdGFuY2UuY29udGV4dE5hbWUpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmNvbmRpdGlvblN0YXJ0KSB7XG4gICAgICBfd3JpdGVyLndyaXRlTWVzc2FnZShcbiAgICAgICAgOSxcbiAgICAgICAgX2luc3RhbmNlLmNvbmRpdGlvblN0YXJ0IGFzIGFueSxcbiAgICAgICAgQ29uZGl0aW9uLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLmNvbmRpdGlvbkVuZCkge1xuICAgICAgX3dyaXRlci53cml0ZU1lc3NhZ2UoXG4gICAgICAgIDEwLFxuICAgICAgICBfaW5zdGFuY2UuY29uZGl0aW9uRW5kIGFzIGFueSxcbiAgICAgICAgQ29uZGl0aW9uLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Qyc0NvbmZpZz86IG9uZGV3b1QyczAxMi5SZXF1ZXN0Q29uZmlnO1xuICBwcml2YXRlIF9zMnRDb25maWc/OiBvbmRld29TMnQwMTMuVHJhbnNjcmliZVJlcXVlc3RDb25maWc7XG4gIHByaXZhdGUgX3RyYW5zZmVySWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX3dhdkZpbGVzPzogVWludDhBcnJheVtdO1xuICBwcml2YXRlIF90ZXh0Pzogc3RyaW5nO1xuICBwcml2YXRlIF9jb250ZXh0Pzogb25kZXdvTmx1MDA2LkNvbnRleHQ7XG4gIHByaXZhdGUgX3Nlc3Npb25JZD86IHN0cmluZztcbiAgcHJpdmF0ZSBfY29udGV4dE5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2NvbmRpdGlvblN0YXJ0PzogQ29uZGl0aW9uO1xuICBwcml2YXRlIF9jb25kaXRpb25FbmQ/OiBDb25kaXRpb247XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzLkNvbmZpZ0Nhc2UgPVxuICAgIENvbnRyb2xNZXNzYWdlU2VydmljZVBhcmFtZXRlcnMuQ29uZmlnQ2FzZS5ub25lO1xuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgcHJvcGVydGllcyBhbmQgYXBwbGllcyBkZWZhdWx0IFByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgQ29udHJvbE1lc3NhZ2VTZXJ2aWNlUGFyYW1ldGVycyB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzLkFzT2JqZWN0PlxuICApIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy50MnNDb25maWcgPSBfdmFsdWUudDJzQ29uZmlnXG4gICAgICA/IG5ldyBvbmRld29UMnMwMTIuUmVxdWVzdENvbmZpZyhfdmFsdWUudDJzQ29uZmlnKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5zMnRDb25maWcgPSBfdmFsdWUuczJ0Q29uZmlnXG4gICAgICA/IG5ldyBvbmRld29TMnQwMTMuVHJhbnNjcmliZVJlcXVlc3RDb25maWcoX3ZhbHVlLnMydENvbmZpZylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMudHJhbnNmZXJJZCA9IF92YWx1ZS50cmFuc2ZlcklkO1xuICAgIHRoaXMud2F2RmlsZXMgPSAoX3ZhbHVlLndhdkZpbGVzIHx8IFtdKS5tYXAoYiA9PlxuICAgICAgYiA/IGIuc3ViYXJyYXkoMCkgOiBuZXcgVWludDhBcnJheSgpXG4gICAgKTtcbiAgICB0aGlzLnRleHQgPSBfdmFsdWUudGV4dDtcbiAgICB0aGlzLmNvbnRleHQgPSBfdmFsdWUuY29udGV4dFxuICAgICAgPyBuZXcgb25kZXdvTmx1MDA2LkNvbnRleHQoX3ZhbHVlLmNvbnRleHQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlc3Npb25JZCA9IF92YWx1ZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy5jb250ZXh0TmFtZSA9IF92YWx1ZS5jb250ZXh0TmFtZTtcbiAgICB0aGlzLmNvbmRpdGlvblN0YXJ0ID0gX3ZhbHVlLmNvbmRpdGlvblN0YXJ0XG4gICAgICA/IG5ldyBDb25kaXRpb24oX3ZhbHVlLmNvbmRpdGlvblN0YXJ0KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5jb25kaXRpb25FbmQgPSBfdmFsdWUuY29uZGl0aW9uRW5kXG4gICAgICA/IG5ldyBDb25kaXRpb24oX3ZhbHVlLmNvbmRpdGlvbkVuZClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIENvbnRyb2xNZXNzYWdlU2VydmljZVBhcmFtZXRlcnMucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCB0MnNDb25maWcoKTogb25kZXdvVDJzMDEyLlJlcXVlc3RDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90MnNDb25maWc7XG4gIH1cbiAgc2V0IHQyc0NvbmZpZyh2YWx1ZTogb25kZXdvVDJzMDEyLlJlcXVlc3RDb25maWcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fczJ0Q29uZmlnID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY29uZmlnID0gQ29udHJvbE1lc3NhZ2VTZXJ2aWNlUGFyYW1ldGVycy5Db25maWdDYXNlLnQyc0NvbmZpZztcbiAgICB9XG4gICAgdGhpcy5fdDJzQ29uZmlnID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHMydENvbmZpZygpOiBvbmRld29TMnQwMTMuVHJhbnNjcmliZVJlcXVlc3RDb25maWcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zMnRDb25maWc7XG4gIH1cbiAgc2V0IHMydENvbmZpZyh2YWx1ZTogb25kZXdvUzJ0MDEzLlRyYW5zY3JpYmVSZXF1ZXN0Q29uZmlnIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3Qyc0NvbmZpZyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IENvbnRyb2xNZXNzYWdlU2VydmljZVBhcmFtZXRlcnMuQ29uZmlnQ2FzZS5zMnRDb25maWc7XG4gICAgfVxuICAgIHRoaXMuX3MydENvbmZpZyA9IHZhbHVlO1xuICB9XG4gIGdldCB0cmFuc2ZlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zZmVySWQ7XG4gIH1cbiAgc2V0IHRyYW5zZmVySWQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3RyYW5zZmVySWQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgd2F2RmlsZXMoKTogVWludDhBcnJheVtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd2F2RmlsZXM7XG4gIH1cbiAgc2V0IHdhdkZpbGVzKHZhbHVlOiBVaW50OEFycmF5W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl93YXZGaWxlcyA9IHZhbHVlO1xuICB9XG4gIGdldCB0ZXh0KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RleHQ7XG4gIH1cbiAgc2V0IHRleHQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3RleHQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgY29udGV4dCgpOiBvbmRld29ObHUwMDYuQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQ7XG4gIH1cbiAgc2V0IGNvbnRleHQodmFsdWU6IG9uZGV3b05sdTAwNi5Db250ZXh0IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY29udGV4dCA9IHZhbHVlO1xuICB9XG4gIGdldCBzZXNzaW9uSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbklkO1xuICB9XG4gIHNldCBzZXNzaW9uSWQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IHZhbHVlO1xuICB9XG4gIGdldCBjb250ZXh0TmFtZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb250ZXh0TmFtZTtcbiAgfVxuICBzZXQgY29udGV4dE5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2NvbnRleHROYW1lID0gdmFsdWU7XG4gIH1cbiAgZ2V0IGNvbmRpdGlvblN0YXJ0KCk6IENvbmRpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmRpdGlvblN0YXJ0O1xuICB9XG4gIHNldCBjb25kaXRpb25TdGFydCh2YWx1ZTogQ29uZGl0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY29uZGl0aW9uU3RhcnQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgY29uZGl0aW9uRW5kKCk6IENvbmRpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmRpdGlvbkVuZDtcbiAgfVxuICBzZXQgY29uZGl0aW9uRW5kKHZhbHVlOiBDb25kaXRpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9jb25kaXRpb25FbmQgPSB2YWx1ZTtcbiAgfVxuICBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICovXG4gIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgQ29udHJvbE1lc3NhZ2VTZXJ2aWNlUGFyYW1ldGVycy5zZXJpYWxpemVCaW5hcnlUb1dyaXRlcih0aGlzLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAqL1xuICB0b09iamVjdCgpOiBDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdDJzQ29uZmlnOiB0aGlzLnQyc0NvbmZpZyA/IHRoaXMudDJzQ29uZmlnLnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICBzMnRDb25maWc6IHRoaXMuczJ0Q29uZmlnID8gdGhpcy5zMnRDb25maWcudG9PYmplY3QoKSA6IHVuZGVmaW5lZCxcbiAgICAgIHRyYW5zZmVySWQ6IHRoaXMudHJhbnNmZXJJZCxcbiAgICAgIHdhdkZpbGVzOiAodGhpcy53YXZGaWxlcyB8fCBbXSkubWFwKGIgPT5cbiAgICAgICAgYiA/IGIuc3ViYXJyYXkoMCkgOiBuZXcgVWludDhBcnJheSgpXG4gICAgICApLFxuICAgICAgdGV4dDogdGhpcy50ZXh0LFxuICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0ID8gdGhpcy5jb250ZXh0LnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgY29udGV4dE5hbWU6IHRoaXMuY29udGV4dE5hbWUsXG4gICAgICBjb25kaXRpb25TdGFydDogdGhpcy5jb25kaXRpb25TdGFydFxuICAgICAgICA/IHRoaXMuY29uZGl0aW9uU3RhcnQudG9PYmplY3QoKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbmRpdGlvbkVuZDogdGhpcy5jb25kaXRpb25FbmQgPyB0aGlzLmNvbmRpdGlvbkVuZC50b09iamVjdCgpIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ29udHJvbE1lc3NhZ2VTZXJ2aWNlUGFyYW1ldGVycy5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHQyc0NvbmZpZzogdGhpcy50MnNDb25maWcgPyB0aGlzLnQyc0NvbmZpZy50b1Byb3RvYnVmSlNPTihvcHRpb25zKSA6IG51bGwsXG4gICAgICBzMnRDb25maWc6IHRoaXMuczJ0Q29uZmlnID8gdGhpcy5zMnRDb25maWcudG9Qcm90b2J1ZkpTT04ob3B0aW9ucykgOiBudWxsLFxuICAgICAgdHJhbnNmZXJJZDogdGhpcy50cmFuc2ZlcklkLFxuICAgICAgd2F2RmlsZXM6ICh0aGlzLndhdkZpbGVzIHx8IFtdKS5tYXAoYiA9PlxuICAgICAgICBiID8gdWludDhBcnJheVRvQmFzZTY0KGIpIDogJydcbiAgICAgICksXG4gICAgICB0ZXh0OiB0aGlzLnRleHQsXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQgPyB0aGlzLmNvbnRleHQudG9Qcm90b2J1ZkpTT04ob3B0aW9ucykgOiBudWxsLFxuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIGNvbnRleHROYW1lOiB0aGlzLmNvbnRleHROYW1lLFxuICAgICAgY29uZGl0aW9uU3RhcnQ6IHRoaXMuY29uZGl0aW9uU3RhcnRcbiAgICAgICAgPyB0aGlzLmNvbmRpdGlvblN0YXJ0LnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIGNvbmRpdGlvbkVuZDogdGhpcy5jb25kaXRpb25FbmRcbiAgICAgICAgPyB0aGlzLmNvbmRpdGlvbkVuZC50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENvbnRyb2xNZXNzYWdlU2VydmljZVBhcmFtZXRlcnMge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIENvbnRyb2xNZXNzYWdlU2VydmljZVBhcmFtZXRlcnNcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHQyc0NvbmZpZz86IG9uZGV3b1QyczAxMi5SZXF1ZXN0Q29uZmlnLkFzT2JqZWN0O1xuICAgIHMydENvbmZpZz86IG9uZGV3b1MydDAxMy5UcmFuc2NyaWJlUmVxdWVzdENvbmZpZy5Bc09iamVjdDtcbiAgICB0cmFuc2ZlcklkPzogc3RyaW5nO1xuICAgIHdhdkZpbGVzPzogVWludDhBcnJheVtdO1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gICAgY29udGV4dD86IG9uZGV3b05sdTAwNi5Db250ZXh0LkFzT2JqZWN0O1xuICAgIHNlc3Npb25JZD86IHN0cmluZztcbiAgICBjb250ZXh0TmFtZT86IHN0cmluZztcbiAgICBjb25kaXRpb25TdGFydD86IENvbmRpdGlvbi5Bc09iamVjdDtcbiAgICBjb25kaXRpb25FbmQ/OiBDb25kaXRpb24uQXNPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgQ29udHJvbE1lc3NhZ2VTZXJ2aWNlUGFyYW1ldGVyc1xuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgdDJzQ29uZmlnPzogb25kZXdvVDJzMDEyLlJlcXVlc3RDb25maWcuQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgIHMydENvbmZpZz86IG9uZGV3b1MydDAxMy5UcmFuc2NyaWJlUmVxdWVzdENvbmZpZy5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgdHJhbnNmZXJJZD86IHN0cmluZztcbiAgICB3YXZGaWxlcz86IHN0cmluZ1tdO1xuICAgIHRleHQ/OiBzdHJpbmc7XG4gICAgY29udGV4dD86IG9uZGV3b05sdTAwNi5Db250ZXh0LkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gICAgY29udGV4dE5hbWU/OiBzdHJpbmc7XG4gICAgY29uZGl0aW9uU3RhcnQ/OiBDb25kaXRpb24uQXNQcm90b2J1ZkpTT04gfCBudWxsO1xuICAgIGNvbmRpdGlvbkVuZD86IENvbmRpdGlvbi5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gIH1cbiAgZXhwb3J0IGVudW0gQ29uZmlnQ2FzZSB7XG4gICAgbm9uZSA9IDAsXG4gICAgdDJzQ29uZmlnID0gMSxcbiAgICBzMnRDb25maWcgPSAyXG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBvbmRld28uY3NpLkNvbnRyb2xNZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9sTWVzc2FnZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ29uZGV3by5jc2kuQ29udHJvbE1lc3NhZ2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBDb250cm9sTWVzc2FnZSgpO1xuICAgIENvbnRyb2xNZXNzYWdlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogQ29udHJvbE1lc3NhZ2UpIHtcbiAgICBfaW5zdGFuY2Uuc2VydmljZSA9IF9pbnN0YW5jZS5zZXJ2aWNlIHx8IDA7XG4gICAgX2luc3RhbmNlLm1ldGhvZCA9IF9pbnN0YW5jZS5tZXRob2QgfHwgMDtcbiAgICBfaW5zdGFuY2UucGFyYW1ldGVycyA9IF9pbnN0YW5jZS5wYXJhbWV0ZXJzIHx8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IENvbnRyb2xNZXNzYWdlLFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5zZXJ2aWNlID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLm1ldGhvZCA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIF9pbnN0YW5jZS5wYXJhbWV0ZXJzID0gbmV3IENvbnRyb2xNZXNzYWdlU2VydmljZVBhcmFtZXRlcnMoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICBDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb250cm9sTWVzc2FnZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IENvbnRyb2xNZXNzYWdlLFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnNlcnZpY2UpIHtcbiAgICAgIF93cml0ZXIud3JpdGVFbnVtKDEsIF9pbnN0YW5jZS5zZXJ2aWNlKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5tZXRob2QpIHtcbiAgICAgIF93cml0ZXIud3JpdGVFbnVtKDIsIF9pbnN0YW5jZS5tZXRob2QpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnBhcmFtZXRlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAzLFxuICAgICAgICBfaW5zdGFuY2UucGFyYW1ldGVycyBhcyBhbnksXG4gICAgICAgIENvbnRyb2xNZXNzYWdlU2VydmljZVBhcmFtZXRlcnMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2VydmljZT86IENvbnRyb2xNZXNzYWdlU2VydmljZU5hbWU7XG4gIHByaXZhdGUgX21ldGhvZD86IENvbnRyb2xNZXNzYWdlU2VydmljZU1ldGhvZDtcbiAgcHJpdmF0ZSBfcGFyYW1ldGVycz86IENvbnRyb2xNZXNzYWdlU2VydmljZVBhcmFtZXRlcnM7XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBDb250cm9sTWVzc2FnZSB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgKi9cbiAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxDb250cm9sTWVzc2FnZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5zZXJ2aWNlID0gX3ZhbHVlLnNlcnZpY2U7XG4gICAgdGhpcy5tZXRob2QgPSBfdmFsdWUubWV0aG9kO1xuICAgIHRoaXMucGFyYW1ldGVycyA9IF92YWx1ZS5wYXJhbWV0ZXJzXG4gICAgICA/IG5ldyBDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzKF92YWx1ZS5wYXJhbWV0ZXJzKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgQ29udHJvbE1lc3NhZ2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBzZXJ2aWNlKCk6IENvbnRyb2xNZXNzYWdlU2VydmljZU5hbWUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlO1xuICB9XG4gIHNldCBzZXJ2aWNlKHZhbHVlOiBDb250cm9sTWVzc2FnZVNlcnZpY2VOYW1lIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fc2VydmljZSA9IHZhbHVlO1xuICB9XG4gIGdldCBtZXRob2QoKTogQ29udHJvbE1lc3NhZ2VTZXJ2aWNlTWV0aG9kIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0aG9kO1xuICB9XG4gIHNldCBtZXRob2QodmFsdWU6IENvbnRyb2xNZXNzYWdlU2VydmljZU1ldGhvZCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX21ldGhvZCA9IHZhbHVlO1xuICB9XG4gIGdldCBwYXJhbWV0ZXJzKCk6IENvbnRyb2xNZXNzYWdlU2VydmljZVBhcmFtZXRlcnMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJzO1xuICB9XG4gIHNldCBwYXJhbWV0ZXJzKHZhbHVlOiBDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGFyYW1ldGVycyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgIENvbnRyb2xNZXNzYWdlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IENvbnRyb2xNZXNzYWdlLkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VydmljZTogdGhpcy5zZXJ2aWNlLFxuICAgICAgbWV0aG9kOiB0aGlzLm1ldGhvZCxcbiAgICAgIHBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVycyA/IHRoaXMucGFyYW1ldGVycy50b09iamVjdCgpIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc3VwcG9ydCBKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgcmVwbGljYXRlcyB0aGUgc3RydWN0dXJlIG9mIHRvT2JqZWN0KClcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b09iamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBKU09OIHVzaW5nIHByb3RvYnVmIEpTT04gbm90YXRpb246IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90bzMjanNvblxuICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgKi9cbiAgdG9Qcm90b2J1ZkpTT04oXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9wdGlvbnM/OiBUb1Byb3RvYnVmSlNPTk9wdGlvbnNcbiAgKTogQ29udHJvbE1lc3NhZ2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBzZXJ2aWNlOlxuICAgICAgICBDb250cm9sTWVzc2FnZVNlcnZpY2VOYW1lW1xuICAgICAgICAgIHRoaXMuc2VydmljZSA9PT0gbnVsbCB8fCB0aGlzLnNlcnZpY2UgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLnNlcnZpY2VcbiAgICAgICAgXSxcbiAgICAgIG1ldGhvZDpcbiAgICAgICAgQ29udHJvbE1lc3NhZ2VTZXJ2aWNlTWV0aG9kW1xuICAgICAgICAgIHRoaXMubWV0aG9kID09PSBudWxsIHx8IHRoaXMubWV0aG9kID09PSB1bmRlZmluZWQgPyAwIDogdGhpcy5tZXRob2RcbiAgICAgICAgXSxcbiAgICAgIHBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVyc1xuICAgICAgICA/IHRoaXMucGFyYW1ldGVycy50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIENvbnRyb2xNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBDb250cm9sTWVzc2FnZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgc2VydmljZT86IENvbnRyb2xNZXNzYWdlU2VydmljZU5hbWU7XG4gICAgbWV0aG9kPzogQ29udHJvbE1lc3NhZ2VTZXJ2aWNlTWV0aG9kO1xuICAgIHBhcmFtZXRlcnM/OiBDb250cm9sTWVzc2FnZVNlcnZpY2VQYXJhbWV0ZXJzLkFzT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIENvbnRyb2xNZXNzYWdlXG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzZXJ2aWNlPzogc3RyaW5nO1xuICAgIG1ldGhvZD86IHN0cmluZztcbiAgICBwYXJhbWV0ZXJzPzogQ29udHJvbE1lc3NhZ2VTZXJ2aWNlUGFyYW1ldGVycy5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gIH1cbn1cbiJdfQ==