@pipeline-builder/api-core 4.1.12 → 4.1.14

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 (187) hide show
  1. package/README.md +3 -2
  2. package/lib/constants/index.d.ts +0 -1
  3. package/lib/constants/index.js +1 -2
  4. package/lib/errors/app-errors.d.ts +8 -3
  5. package/lib/errors/app-errors.js +10 -5
  6. package/lib/helpers/access-helpers.d.ts +4 -6
  7. package/lib/helpers/access-helpers.js +6 -8
  8. package/lib/helpers/index.d.ts +3 -3
  9. package/lib/helpers/index.js +4 -4
  10. package/lib/helpers/org-hierarchy-http.d.ts +11 -10
  11. package/lib/helpers/org-hierarchy-http.js +24 -35
  12. package/lib/helpers/org-hierarchy.d.ts +37 -3
  13. package/lib/helpers/org-hierarchy.js +45 -4
  14. package/lib/helpers/restore-helpers.d.ts +44 -24
  15. package/lib/helpers/restore-helpers.js +41 -52
  16. package/lib/helpers/sse-helpers.d.ts +29 -7
  17. package/lib/helpers/sse-helpers.js +36 -9
  18. package/lib/index.d.ts +16 -14
  19. package/lib/index.js +17 -15
  20. package/lib/middleware/assurance.d.ts +116 -0
  21. package/lib/middleware/assurance.js +176 -0
  22. package/lib/middleware/auth.d.ts +5 -427
  23. package/lib/middleware/auth.js +36 -789
  24. package/lib/middleware/ecosystem-guard.d.ts +47 -0
  25. package/lib/middleware/ecosystem-guard.js +60 -0
  26. package/lib/middleware/index.d.ts +11 -4
  27. package/lib/middleware/index.js +12 -5
  28. package/lib/middleware/jwt-verify.d.ts +52 -0
  29. package/lib/middleware/jwt-verify.js +105 -0
  30. package/lib/middleware/permission-gates.d.ts +133 -0
  31. package/lib/middleware/permission-gates.js +260 -0
  32. package/lib/middleware/revocation.d.ts +96 -0
  33. package/lib/middleware/revocation.js +162 -0
  34. package/lib/middleware/route-table.d.ts +11 -0
  35. package/lib/middleware/route-table.js +4 -1
  36. package/lib/middleware/service-tokens.d.ts +83 -0
  37. package/lib/middleware/service-tokens.js +158 -0
  38. package/lib/middleware/step-up.d.ts +2 -2
  39. package/lib/middleware/step-up.js +8 -7
  40. package/lib/middleware/system-org.d.ts +20 -0
  41. package/lib/middleware/system-org.js +25 -0
  42. package/lib/openapi/routes/plugin-routes.js +133 -10
  43. package/lib/openapi/schema-registry.js +2 -5
  44. package/lib/routes/index.d.ts +1 -1
  45. package/lib/routes/index.js +2 -2
  46. package/lib/services/api-key-exchange.js +7 -5
  47. package/lib/services/audit-spool.d.ts +34 -10
  48. package/lib/services/audit-spool.js +75 -34
  49. package/lib/services/cache-service.d.ts +7 -0
  50. package/lib/services/cache-service.js +1 -1
  51. package/lib/services/circuit-breaker.d.ts +14 -1
  52. package/lib/services/circuit-breaker.js +36 -10
  53. package/lib/services/compliance-client.d.ts +10 -2
  54. package/lib/services/compliance-client.js +17 -10
  55. package/lib/services/compliance-event-subscriber.js +6 -6
  56. package/lib/services/durable-event-bus.js +8 -11
  57. package/lib/services/ecosystem-notify-client.d.ts +32 -0
  58. package/lib/services/ecosystem-notify-client.js +71 -0
  59. package/lib/services/env-redis.d.ts +4 -1
  60. package/lib/services/env-redis.js +32 -3
  61. package/lib/services/http-client.d.ts +19 -0
  62. package/lib/services/http-client.js +98 -19
  63. package/lib/services/index.d.ts +25 -24
  64. package/lib/services/index.js +25 -22
  65. package/lib/services/jwks-cache.js +5 -4
  66. package/lib/services/leader-lock.d.ts +22 -5
  67. package/lib/services/leader-lock.js +61 -6
  68. package/lib/services/quota.d.ts +9 -4
  69. package/lib/services/quota.js +34 -40
  70. package/lib/services/remote-audit-client.d.ts +28 -32
  71. package/lib/services/remote-audit-client.js +166 -49
  72. package/lib/services/retry-forever.js +5 -11
  73. package/lib/services/retry-strategy.d.ts +1 -1
  74. package/lib/services/retry-strategy.js +5 -4
  75. package/lib/services/scheduler.d.ts +8 -3
  76. package/lib/services/scheduler.js +17 -5
  77. package/lib/services/service-boot.d.ts +14 -13
  78. package/lib/services/service-boot.js +18 -15
  79. package/lib/services/service-keys.d.ts +1 -1
  80. package/lib/services/service-keys.js +12 -18
  81. package/lib/services/sse-ticket-store.d.ts +9 -1
  82. package/lib/services/sse-ticket-store.js +24 -9
  83. package/lib/services/system-notification.d.ts +27 -0
  84. package/lib/services/system-notification.js +50 -0
  85. package/lib/services/token-revocation.d.ts +50 -1
  86. package/lib/services/token-revocation.js +103 -3
  87. package/lib/types/audit-events.d.ts +6 -6
  88. package/lib/types/audit-events.js +1 -1
  89. package/lib/types/common.d.ts +32 -13
  90. package/lib/types/common.js +2 -1
  91. package/lib/types/ecosystem-notifications.d.ts +142 -0
  92. package/lib/types/ecosystem-notifications.js +210 -0
  93. package/lib/types/ecosystem.d.ts +77 -0
  94. package/lib/types/ecosystem.js +119 -0
  95. package/lib/types/error-codes.d.ts +81 -0
  96. package/lib/types/error-codes.js +108 -1
  97. package/lib/types/feature-flags.d.ts +21 -1
  98. package/lib/types/feature-flags.js +36 -2
  99. package/lib/types/index.d.ts +14 -9
  100. package/lib/types/index.js +15 -10
  101. package/lib/types/permissions.d.ts +46 -8
  102. package/lib/types/permissions.js +75 -12
  103. package/lib/types/plugin-catalog.d.ts +35 -0
  104. package/lib/types/plugin-catalog.js +39 -0
  105. package/lib/types/plugin-health.d.ts +102 -0
  106. package/lib/types/plugin-health.js +184 -0
  107. package/lib/types/quota-tiers.d.ts +15 -0
  108. package/lib/types/quota-tiers.js +23 -3
  109. package/lib/types/wire-vocabulary.d.ts +102 -0
  110. package/lib/types/wire-vocabulary.js +94 -0
  111. package/lib/utils/alias-resolver.js +2 -2
  112. package/lib/utils/audit.d.ts +5 -2
  113. package/lib/utils/audit.js +6 -3
  114. package/lib/utils/compliance-attributes.js +3 -4
  115. package/lib/utils/concurrency.d.ts +7 -0
  116. package/lib/utils/concurrency.js +13 -1
  117. package/lib/utils/env.d.ts +3 -4
  118. package/lib/utils/env.js +4 -5
  119. package/lib/utils/identity.d.ts +13 -4
  120. package/lib/utils/identity.js +18 -10
  121. package/lib/utils/index.d.ts +13 -10
  122. package/lib/utils/index.js +13 -10
  123. package/lib/utils/jwk.d.ts +4 -0
  124. package/lib/utils/jwk.js +13 -1
  125. package/lib/utils/logger.d.ts +1 -1
  126. package/lib/utils/logger.js +1 -1
  127. package/lib/utils/object.d.ts +11 -0
  128. package/lib/utils/object.js +24 -1
  129. package/lib/utils/params.d.ts +8 -22
  130. package/lib/utils/params.js +15 -43
  131. package/lib/utils/plugin-compliance.d.ts +98 -0
  132. package/lib/utils/plugin-compliance.js +78 -0
  133. package/lib/utils/proof-of-work.d.ts +69 -0
  134. package/lib/utils/proof-of-work.js +139 -0
  135. package/lib/utils/response.d.ts +16 -6
  136. package/lib/utils/response.js +18 -15
  137. package/lib/utils/retention.d.ts +17 -0
  138. package/lib/utils/retention.js +30 -0
  139. package/lib/utils/secret-encryption.d.ts +7 -7
  140. package/lib/utils/secret-encryption.js +9 -10
  141. package/lib/utils/secret-rotation.js +2 -2
  142. package/lib/utils/sensitive-patterns.js +4 -5
  143. package/lib/utils/service-registry.d.ts +15 -0
  144. package/lib/utils/service-registry.js +24 -0
  145. package/lib/utils/ssrf.d.ts +11 -2
  146. package/lib/utils/ssrf.js +112 -33
  147. package/lib/validation/ai-schemas.js +3 -2
  148. package/lib/validation/common-schemas.d.ts +0 -9
  149. package/lib/validation/common-schemas.js +1 -7
  150. package/lib/validation/dockerfile-static.d.ts +26 -0
  151. package/lib/validation/dockerfile-static.js +210 -0
  152. package/lib/validation/index.d.ts +13 -4
  153. package/lib/validation/index.js +14 -5
  154. package/lib/validation/message-schemas.js +6 -4
  155. package/lib/validation/pipeline-schemas.d.ts +8 -2
  156. package/lib/validation/pipeline-schemas.js +30 -4
  157. package/lib/validation/plugin-base-images.d.ts +20 -0
  158. package/lib/validation/plugin-base-images.js +17 -0
  159. package/lib/validation/plugin-catalog-detect.d.ts +86 -0
  160. package/lib/validation/plugin-catalog-detect.js +237 -0
  161. package/lib/validation/plugin-catalog-metadata.d.ts +141 -0
  162. package/lib/validation/plugin-catalog-metadata.js +162 -0
  163. package/lib/validation/plugin-heuristics.d.ts +41 -0
  164. package/lib/validation/plugin-heuristics.js +211 -0
  165. package/lib/validation/plugin-lint.d.ts +18 -0
  166. package/lib/validation/plugin-lint.js +136 -0
  167. package/lib/validation/plugin-name-confusable.d.ts +15 -0
  168. package/lib/validation/plugin-name-confusable.js +81 -0
  169. package/lib/validation/plugin-schemas.d.ts +40 -26
  170. package/lib/validation/plugin-schemas.js +26 -23
  171. package/lib/validation/plugin-spec-schema.d.ts +112 -0
  172. package/lib/validation/plugin-spec-schema.js +163 -0
  173. package/lib/validation/plugin-template-contract.d.ts +64 -0
  174. package/lib/validation/plugin-template-contract.js +113 -0
  175. package/package.json +69 -4
  176. package/lib/testing/mock-api-core.d.ts +0 -150
  177. package/lib/testing/mock-api-core.js +0 -246
  178. package/lib/testing/mock-drizzle.d.ts +0 -6
  179. package/lib/testing/mock-drizzle.js +0 -57
  180. package/lib/testing/route-coverage.d.ts +0 -64
  181. package/lib/testing/route-coverage.js +0 -183
  182. package/lib/testing/service-tokens.d.ts +0 -66
  183. package/lib/testing/service-tokens.js +0 -137
  184. package/lib/testing/tier-mock.d.ts +0 -44
  185. package/lib/testing/tier-mock.js +0 -65
  186. package/lib/testing/user-tokens.d.ts +0 -75
  187. package/lib/testing/user-tokens.js +0 -115
@@ -1,4 +1,4 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  export {};
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2F1ZGl0LWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogQ3Jvc3Mtc2VydmljZSBhdWRpdCBldmVudHMgZW1pdHRlZCB2aWEgc3RydWN0dXJlZCBsb2dzLlxuICpcbiAqIFBsYXRmb3JtJ3Mgb3duIGF1ZGl0IGV2ZW50cyAodXNlci5sb2dpbiwgb3JnLmNyZWF0ZSwg4oCmKSBsaXZlIGluIE1vbmdvREJcbiAqIHZpYSB0aGUgQXVkaXRFdmVudCBtb2RlbCDigJQgdGhhdCdzIGEgc2VwYXJhdGUgcGVyc2lzdGVuY2UgcGF0aCBzY29wZWQgdG9cbiAqIHRoZSBwbGF0Zm9ybSBzZXJ2aWNlLiBUaGUgZXZlbnRzIGJlbG93IGFyZSBlbWl0dGVkIGJ5IG90aGVyIHNlcnZpY2VzXG4gKiAoaW1hZ2UtcmVnaXN0cnksIGV0Yy4pIHZpYSB0aGUgYGVtaXRBdWRpdGAgaGVscGVyIGFzIHN0cnVjdHVyZWQgbG9nXG4gKiBsaW5lcyB3aXRoIGBldmVudENhdGVnb3J5OiAnYXVkaXQnYCwgc2NyYXBlZCBieSBMb2tpIGZvciBxdWVyeWFibGVcbiAqIGF1ZGl0IGhpc3RvcnkuXG4gKlxuICogQWRkIGEgbmV3IGV2ZW50OlxuICogICAxLiBFeHRlbmQgdGhlIHVuaW9uIHR5cGUgYmVsb3cuXG4gKiAgIDIuIERvY3VtZW50IGl0IGluIGBkb2NzL2F1ZGl0LWV2ZW50cy5tZGAgKG9yIHdoZXJldmVyIHRoZSBhdWRpdC1ldmVudHNcbiAqICAgICAgZG9jIGxpdmVzKSBpbmNsdWRpbmcgYW55IHBheWxvYWQtc3BlY2lmaWMgZmllbGRzLlxuICogICAzLiBFbWl0IHZpYSBgZW1pdEF1ZGl0KGxvZ2dlciwgJ2V2ZW50Lm5hbWUnLCB7IOKApiB9KWAgZnJvbSB0aGUgcm91dGUuXG4gKi9cblxuLyoqXG4gKiBDb3JyZWxhdGlvbiBjb250ZXh0IHNoYXJlZCBieSBldmVyeSBjcm9zcy1zZXJ2aWNlIGF1ZGl0IGV2ZW50LiBPcHRpb25hbCBzb1xuICogZXhpc3RpbmcgZW1pdCBzaXRlcyBjb21waWxlIHVuY2hhbmdlZDsgd2hlbiBwb3B1bGF0ZWQsIHRoZXNlIGxldCBhbiBvcGVyYXRvclxuICogcGl2b3QgYSBMb2tpIGF1ZGl0IGxpbmUgdG8gdGhlIG9yaWdpbmF0aW5nIEhUVFAgcmVxdWVzdCAoYHJlcXVlc3RJZGApIG9yIHRoZVxuICogZW5kLXRvLWVuZCBkaXN0cmlidXRlZCB0cmFjZSAoYHRyYWNlSWRgKSDigJQgYW5kIGxpbmUgdGhlbSB1cCB3aXRoIHBsYXRmb3JtJ3NcbiAqIE1vbmdvREIgYXVkaXQgZXZlbnRzLCB3aGljaCBjYXJyeSB0aGUgc2FtZSB0d28gZmllbGRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0Q29ycmVsYXRpb24ge1xuICAvKiogT3JpZ2luYXRpbmcgcmVxdWVzdCBpZCAocHJvcGFnYXRlZCBgeC1yZXF1ZXN0LWlkYCkuICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqIE9wZW5UZWxlbWV0cnkgdHJhY2UgaWQgb2YgdGhlIGFjdGl2ZSBzcGFuLCB3aGVuIHRyYWNpbmcgaXMgZW5hYmxlZC4gKi9cbiAgdHJhY2VJZD86IHN0cmluZztcbn1cblxuLyoqIFRhZy1jb3B5IGVtaXR0ZWQgZnJvbSBpbWFnZS1yZWdpc3RyeSdzIFBPU1QgL2FwaS9pbWFnZXMvY29weS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnlUYWdDb3B5QXVkaXQgZXh0ZW5kcyBBdWRpdENvcnJlbGF0aW9uIHtcbiAgZXZlbnQ6ICdyZWdpc3RyeS50YWcuY29weSc7XG4gIGFjdG9yOiBzdHJpbmc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICB0YXJnZXQ6IHN0cmluZztcbiAgc291cmNlRGlnZXN0OiBzdHJpbmc7XG4gIHRhcmdldERpZ2VzdDogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIHRhcmdldCdzIHJlcG8gc3RhcnRzIHdpdGggYHN5c3RlbS9gIOKAlCB0aGUgaGlnaGVzdC1wcml2aWxlZ2UgY2FzZS4gKi9cbiAgaXNQcm9tb3Rpb25Ub1N5c3RlbTogYm9vbGVhbjtcbiAgbW91bnRlZDogeyBtYW5pZmVzdHM6IG51bWJlcjsgYmxvYnM6IG51bWJlciB9O1xufVxuXG4vKiogVGFnLWRlbGV0ZSBlbWl0dGVkIGZyb20gaW1hZ2UtcmVnaXN0cnkncyBERUxFVEUgL2FwaS9pbWFnZXMvOm5hbWUvbWFuaWZlc3RzLzpyZWZlcmVuY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5VGFnRGVsZXRlQXVkaXQgZXh0ZW5kcyBBdWRpdENvcnJlbGF0aW9uIHtcbiAgZXZlbnQ6ICdyZWdpc3RyeS50YWcuZGVsZXRlJztcbiAgYWN0b3I6IHN0cmluZztcbiAgcmVwbzogc3RyaW5nO1xuICByZWY6IHN0cmluZztcbiAgZGlnZXN0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwb3NpdG9yeSBwcnVuZSBlbWl0dGVkIGZyb20gaW1hZ2UtcmVnaXN0cnkncyBERUxFVEUgL2FwaS9pbWFnZXMvOm5hbWUg4oCUXG4gKiBkZWxldGVzIGV2ZXJ5IG1hbmlmZXN0IGluIGEgcmVwbyAodXNlZCB0byByZW1vdmUgZW1wdHkvZGVhZCByZXBvcyBmcm9tIHRoZVxuICogY2F0YWxvZykuIFVubGlrZSB0aGUgdGFnLWRlbGV0ZSBhYm92ZSwgdGhlcmUncyBubyBzaW5nbGUgYHJlZmAvYGRpZ2VzdGA6XG4gKiB0aGUgY291bnRzIHN1bW1hcml6ZSB0aGUgd2hvbGUgcmVwby5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeVJlcG9EZWxldGVBdWRpdCBleHRlbmRzIEF1ZGl0Q29ycmVsYXRpb24ge1xuICBldmVudDogJ3JlZ2lzdHJ5LnJlcG8uZGVsZXRlJztcbiAgYWN0b3I6IHN0cmluZztcbiAgcmVwbzogc3RyaW5nO1xuICAvKiogQ291bnQgb2YgdW5pcXVlIG1hbmlmZXN0IGRpZ2VzdHMgYWN0dWFsbHkgZGVsZXRlZC4gKi9cbiAgZGVsZXRlZE1hbmlmZXN0czogbnVtYmVyO1xuICAvKiogQ291bnQgb2YgdGFncyB0aGUgcmVwbyBoZWxkIGJlZm9yZSB0aGUgcHJ1bmUuICovXG4gIGRlbGV0ZWRUYWdzOiBudW1iZXI7XG59XG5cbi8qKiBVbmlvbiBvZiBldmVyeSBjcm9zcy1zZXJ2aWNlIGF1ZGl0IGV2ZW50IGN1cnJlbnRseSBlbWl0dGVkLiAqL1xuZXhwb3J0IHR5cGUgQXVkaXRFdmVudCA9IFJlZ2lzdHJ5VGFnQ29weUF1ZGl0IHwgUmVnaXN0cnlUYWdEZWxldGVBdWRpdCB8IFJlZ2lzdHJ5UmVwb0RlbGV0ZUF1ZGl0O1xuIl19
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2F1ZGl0LWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogQ3Jvc3Mtc2VydmljZSBhdWRpdCBldmVudHMgZW1pdHRlZCB2aWEgc3RydWN0dXJlZCBsb2dzLlxuICpcbiAqIFBsYXRmb3JtJ3Mgb3duIGF1ZGl0IGV2ZW50cyAodXNlci5sb2dpbiwgb3JnLmNyZWF0ZSwg4oCmKSBsaXZlIGluIE1vbmdvREJcbiAqIHZpYSB0aGUgQXVkaXRFdmVudCBtb2RlbCDigJQgdGhhdCdzIGEgc2VwYXJhdGUgcGVyc2lzdGVuY2UgcGF0aCBzY29wZWQgdG9cbiAqIHRoZSBwbGF0Zm9ybSBzZXJ2aWNlLiBUaGUgZXZlbnRzIGJlbG93IGFyZSBlbWl0dGVkIGJ5IG90aGVyIHNlcnZpY2VzXG4gKiAoaW1hZ2UtcmVnaXN0cnksIGV0Yy4pIHZpYSB0aGUgYGxvZ0F1ZGl0RXZlbnRgIGhlbHBlciBhcyBzdHJ1Y3R1cmVkIGxvZ1xuICogbGluZXMgd2l0aCBgZXZlbnRDYXRlZ29yeTogJ2F1ZGl0J2AsIHNjcmFwZWQgYnkgTG9raSBmb3IgcXVlcnlhYmxlXG4gKiBhdWRpdCBoaXN0b3J5LlxuICpcbiAqIEFkZCBhIG5ldyBldmVudDpcbiAqICAgMS4gRXh0ZW5kIHRoZSB1bmlvbiB0eXBlIGJlbG93LlxuICogICAyLiBEb2N1bWVudCBpdCBpbiBgZG9jcy9hdWRpdC1ldmVudHMubWRgLCBpbmNsdWRpbmcgYW55IHBheWxvYWQtc3BlY2lmaWNcbiAqICAgICAgZmllbGRzLlxuICogICAzLiBFbWl0IHZpYSBgbG9nQXVkaXRFdmVudChsb2dnZXIsIHsgZXZlbnQ6ICdldmVudC5uYW1lJywg4oCmIH0pYCBmcm9tIHRoZSByb3V0ZS5cbiAqL1xuXG4vKipcbiAqIENvcnJlbGF0aW9uIGNvbnRleHQgc2hhcmVkIGJ5IGV2ZXJ5IGNyb3NzLXNlcnZpY2UgYXVkaXQgZXZlbnQuIE9wdGlvbmFsO1xuICogd2hlbiBwb3B1bGF0ZWQsIHRoZXNlIGxldCBhbiBvcGVyYXRvclxuICogcGl2b3QgYSBMb2tpIGF1ZGl0IGxpbmUgdG8gdGhlIG9yaWdpbmF0aW5nIEhUVFAgcmVxdWVzdCAoYHJlcXVlc3RJZGApIG9yIHRoZVxuICogZW5kLXRvLWVuZCBkaXN0cmlidXRlZCB0cmFjZSAoYHRyYWNlSWRgKSDigJQgYW5kIGxpbmUgdGhlbSB1cCB3aXRoIHBsYXRmb3JtJ3NcbiAqIE1vbmdvREIgYXVkaXQgZXZlbnRzLCB3aGljaCBjYXJyeSB0aGUgc2FtZSB0d28gZmllbGRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0Q29ycmVsYXRpb24ge1xuICAvKiogT3JpZ2luYXRpbmcgcmVxdWVzdCBpZCAocHJvcGFnYXRlZCBgeC1yZXF1ZXN0LWlkYCkuICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqIE9wZW5UZWxlbWV0cnkgdHJhY2UgaWQgb2YgdGhlIGFjdGl2ZSBzcGFuLCB3aGVuIHRyYWNpbmcgaXMgZW5hYmxlZC4gKi9cbiAgdHJhY2VJZD86IHN0cmluZztcbn1cblxuLyoqIFRhZy1jb3B5IGVtaXR0ZWQgZnJvbSBpbWFnZS1yZWdpc3RyeSdzIFBPU1QgL2FwaS9pbWFnZXMvY29weS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cnlUYWdDb3B5QXVkaXQgZXh0ZW5kcyBBdWRpdENvcnJlbGF0aW9uIHtcbiAgZXZlbnQ6ICdyZWdpc3RyeS50YWcuY29weSc7XG4gIGFjdG9yOiBzdHJpbmc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICB0YXJnZXQ6IHN0cmluZztcbiAgc291cmNlRGlnZXN0OiBzdHJpbmc7XG4gIHRhcmdldERpZ2VzdDogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIHRhcmdldCdzIHJlcG8gc3RhcnRzIHdpdGggYHN5c3RlbS9gIOKAlCB0aGUgaGlnaGVzdC1wcml2aWxlZ2UgY2FzZS4gKi9cbiAgaXNQcm9tb3Rpb25Ub1N5c3RlbTogYm9vbGVhbjtcbiAgbW91bnRlZDogeyBtYW5pZmVzdHM6IG51bWJlcjsgYmxvYnM6IG51bWJlciB9O1xufVxuXG4vKiogVGFnLWRlbGV0ZSBlbWl0dGVkIGZyb20gaW1hZ2UtcmVnaXN0cnkncyBERUxFVEUgL2FwaS9pbWFnZXMvOm5hbWUvbWFuaWZlc3RzLzpyZWZlcmVuY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJ5VGFnRGVsZXRlQXVkaXQgZXh0ZW5kcyBBdWRpdENvcnJlbGF0aW9uIHtcbiAgZXZlbnQ6ICdyZWdpc3RyeS50YWcuZGVsZXRlJztcbiAgYWN0b3I6IHN0cmluZztcbiAgcmVwbzogc3RyaW5nO1xuICByZWY6IHN0cmluZztcbiAgZGlnZXN0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwb3NpdG9yeSBwcnVuZSBlbWl0dGVkIGZyb20gaW1hZ2UtcmVnaXN0cnkncyBERUxFVEUgL2FwaS9pbWFnZXMvOm5hbWUg4oCUXG4gKiBkZWxldGVzIGV2ZXJ5IG1hbmlmZXN0IGluIGEgcmVwbyAodXNlZCB0byByZW1vdmUgZW1wdHkvZGVhZCByZXBvcyBmcm9tIHRoZVxuICogY2F0YWxvZykuIFVubGlrZSB0aGUgdGFnLWRlbGV0ZSBhYm92ZSwgdGhlcmUncyBubyBzaW5nbGUgYHJlZmAvYGRpZ2VzdGA6XG4gKiB0aGUgY291bnRzIHN1bW1hcml6ZSB0aGUgd2hvbGUgcmVwby5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyeVJlcG9EZWxldGVBdWRpdCBleHRlbmRzIEF1ZGl0Q29ycmVsYXRpb24ge1xuICBldmVudDogJ3JlZ2lzdHJ5LnJlcG8uZGVsZXRlJztcbiAgYWN0b3I6IHN0cmluZztcbiAgcmVwbzogc3RyaW5nO1xuICAvKiogQ291bnQgb2YgdW5pcXVlIG1hbmlmZXN0IGRpZ2VzdHMgYWN0dWFsbHkgZGVsZXRlZC4gKi9cbiAgZGVsZXRlZE1hbmlmZXN0czogbnVtYmVyO1xuICAvKiogQ291bnQgb2YgdGFncyB0aGUgcmVwbyBoZWxkIGJlZm9yZSB0aGUgcHJ1bmUuICovXG4gIGRlbGV0ZWRUYWdzOiBudW1iZXI7XG59XG5cbi8qKiBVbmlvbiBvZiBldmVyeSBjcm9zcy1zZXJ2aWNlIGF1ZGl0IGV2ZW50IGN1cnJlbnRseSBlbWl0dGVkLiAqL1xuZXhwb3J0IHR5cGUgQXVkaXRFdmVudCA9IFJlZ2lzdHJ5VGFnQ29weUF1ZGl0IHwgUmVnaXN0cnlUYWdEZWxldGVBdWRpdCB8IFJlZ2lzdHJ5UmVwb0RlbGV0ZUF1ZGl0O1xuIl19
@@ -56,7 +56,7 @@ export type TokenUse = 'access' | 'api_key';
56
56
  */
57
57
  export type AuthMethod = 'pwd' | 'oauth' | 'sso' | 'webauthn' | 'stepup' | 'mfa';
58
58
  /**
59
- * Authenticator assurance level of the session a token speaks for (#8).
59
+ * Authenticator assurance level of the session a token speaks for.
60
60
  *
61
61
  * - `1` — one factor: a password, a social sign-in, or SSO through an IdP the
62
62
  * org has NOT marked as enforcing MFA.
@@ -94,12 +94,16 @@ export declare const AUTH_METHODS: readonly AuthMethod[];
94
94
  * user-editable feature tables. Without these caps a single org could
95
95
  * spam thousands of dashboards / rules and bloat the shared Postgres /
96
96
  * Mongo working sets. Counted at create time; decremented on delete.
97
+ * - `listings` — active, non-suspended plugin-ecosystem listings a (root) org
98
+ * publishes (docs/plugin-publishing.md). A COUNT quota like
99
+ * `plugins`: checked at publish-request submit and re-checked at approval;
100
+ * installs never count.
97
101
  */
98
- export type QuotaType = 'plugins' | 'pipelines' | 'apiCalls' | 'aiCalls' | 'storageBytes' | 'dashboards' | 'alertRules' | 'alertDestinations' | 'idpConfigs';
102
+ export type QuotaType = 'plugins' | 'pipelines' | 'apiCalls' | 'aiCalls' | 'storageBytes' | 'dashboards' | 'alertRules' | 'alertDestinations' | 'idpConfigs' | 'listings';
99
103
  /**
100
104
  * Valid quota type values.
101
105
  */
102
- export declare const VALID_QUOTA_TYPES: readonly ['plugins', 'pipelines', 'apiCalls', 'aiCalls', 'storageBytes', 'dashboards', 'alertRules', 'alertDestinations', 'idpConfigs'];
106
+ export declare const VALID_QUOTA_TYPES: readonly ['plugins', 'pipelines', 'apiCalls', 'aiCalls', 'storageBytes', 'dashboards', 'alertRules', 'alertDestinations', 'idpConfigs', 'listings'];
103
107
  /**
104
108
  * Type guard to check if a value is a valid QuotaType.
105
109
  *
@@ -214,7 +218,7 @@ export interface JwtPayload {
214
218
  * Never reset by refresh / renew / switch-org. */
215
219
  auth_time?: number;
216
220
  /**
217
- * The active org REQUIRES MFA and its grace period has passed (#8).
221
+ * The active org REQUIRES MFA and its grace period has passed.
218
222
  *
219
223
  * Carried as a claim so no service has to look the policy up: the org policy
220
224
  * is enforced where the token is ISSUED (a session scoped to such an org gets
@@ -233,7 +237,7 @@ export interface JwtPayload {
233
237
  */
234
238
  org_admin_aal?: 2;
235
239
  /**
236
- * BOOTSTRAP-ADMIN EXCEPTION (#8, revision 4). Set only on a session opened by
240
+ * BOOTSTRAP-ADMIN EXCEPTION. Set only on a session opened by
237
241
  * the install's bootstrap admin (`BOOTSTRAP_SUPERADMIN_EMAILS`, system org)
238
242
  * while they still have no enrolled factor. Such a session is `aal: 1` and may
239
243
  * reach ONLY enrolment, sign-out and the routes `init-platform.sh` calls;
@@ -256,10 +260,9 @@ export interface JwtPayload {
256
260
  /**
257
261
  * Global super-admin flag (cross-org). When `true`, the user is treated
258
262
  * as a system administrator regardless of which org they're currently
259
- * acting under. This is the SOLE signal for sysadmin authority — the old path
260
- * (membership in the well-known "system" org with role admin/owner) has been
261
- * removed because it conflated "Pipeline Builder operator" with "real customer
262
- * tenant" in the data model. Grant sysadmin only via `isSuperAdmin`.
263
+ * acting under. This is the SOLE signal for sysadmin authority — membership in
264
+ * the well-known "system" org grants nothing, because that would conflate
265
+ * "Pipeline Builder operator" with "customer tenant" in the data model.
263
266
  */
264
267
  isSuperAdmin?: boolean;
265
268
  /** Organization's quota tier. */
@@ -319,10 +322,26 @@ export interface JwtPayload {
319
322
  */
320
323
  impersonationReadOnly?: boolean;
321
324
  /**
322
- * The user's `tokenVersion` at the moment this token was issued. Every
323
- * privilege change (deactivate / role or tier downgrade / membership or
324
- * ownership change / password change / logout-all) increments the user's
325
- * server-side `tokenVersion`, so a token whose embedded version is behind the
325
+ * The refresh-session slot (interactive or machine) this access token was
326
+ * minted with. Revoking that ONE slot publishes `revoke:sid:<sid>` (see
327
+ * `credentialRevocationKey`), which every service checks in `requireAuth`, so
328
+ * a single signed-out device / machine credential stops working everywhere
329
+ * immediately instead of at natural expiry. Absent on PATs and impersonation.
330
+ */
331
+ sid?: string;
332
+ /**
333
+ * The access key (PAT / service-account key id) this token was DERIVED from,
334
+ * when it is not itself the exchanged key token (whose key id is its `jti`) —
335
+ * e.g. a switch-org or generate-token mint made while holding an exchanged
336
+ * key token. Revoking the key publishes `revoke:key:<keyId>`, which rejects
337
+ * every token that names it here or as its `jti`.
338
+ */
339
+ parentKeyId?: string;
340
+ /**
341
+ * The user's ACCESS version at the moment this token was issued: the hard
342
+ * `tokenVersion` (deactivate / password change / logout-all — clears slots)
343
+ * plus `claimsVersion` (role, tier, membership or ownership changes — re-minted
344
+ * on refresh). Both only grow, so a token whose embedded version is behind the
326
345
  * current one has been REVOKED. Platform validates this against Mongo; the
327
346
  * stateless services validate it against a Redis-published current-version
328
347
  * store (see `setTokenRevocationStore`). Absent on machine/service tokens.
@@ -16,6 +16,7 @@ export const AUTH_METHODS = ['pwd', 'oauth', 'sso', 'webauthn', 'stepup', 'mfa']
16
16
  export const VALID_QUOTA_TYPES = [
17
17
  'plugins', 'pipelines', 'apiCalls', 'aiCalls', 'storageBytes',
18
18
  'dashboards', 'alertRules', 'alertDestinations', 'idpConfigs',
19
+ 'listings',
19
20
  ];
20
21
  /**
21
22
  * Type guard to check if a value is a valid QuotaType.
@@ -48,4 +49,4 @@ export function isValidQuotaType(value) {
48
49
  export function effectiveRootOrgId(payload) {
49
50
  return payload.rootOrganizationId ?? payload.organizationId;
50
51
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBMkJ0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUEwQixDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQWlEakcsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBNkIsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDaEcsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUF3QixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQTBCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztBQThCeEc7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYztJQUM3RCxZQUFZLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFlBQVk7Q0FDckQsQ0FBQztBQUVYOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFjO0lBQzdDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFrQixDQUFDLENBQUM7QUFDckYsQ0FBQztBQXNPRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsT0FBa0U7SUFFbEUsT0FBTyxPQUFPLENBQUMsa0JBQWtCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbiB9IGZyb20gJy4vcGVybWlzc2lvbnMuanMnO1xuaW1wb3J0IHR5cGUgeyBRdW90YVRpZXIgfSBmcm9tICcuL3F1b3RhLXRpZXJzLmpzJztcblxuLyoqXG4gKiBDYXBhYmlsaXR5IHNjb3BlIGNhdGFsb2cgZm9yIG1hY2hpbmUvYXV0b21hdGlvbiB0b2tlbnMuIEEgc2NvcGVkIHRva2VuIGNhcnJpZXNcbiAqIGV4YWN0bHkgb25lIG9mIHRoZXNlIGluc3RlYWQgb2Ygcm9sZS1iYXNlZCBwZXJtaXNzaW9uczsgZW5kcG9pbnRzIHRoYXQgYWNjZXB0IGFcbiAqIHNjb3BlZCBpZGVudGl0eSBjaGVjayBpdCB2aWEgYGhhc1Njb3BlYC4gS2VwdCBhIGNsb3NlZCB1bmlvbiAobWlycm9yaW5nXG4gKiB7QGxpbmsgUGVybWlzc2lvbn0pIHNvIGEgdHlwbyBvbiBlaXRoZXIgdGhlIG1pbnQgb3IgdGhlIGNoZWNrIHNpZGUgaXMgYSBjb21waWxlXG4gKiBlcnJvci4gQWRkIGEgdmFsdWUgaGVyZSB3aGVuIGludHJvZHVjaW5nIGEgbmV3IHNjb3BlZC10b2tlbiBzdXJmYWNlLlxuICpcbiAqIC0gYHJlcG9ydGluZzppbmdlc3RgIOKAlCB0aGUgQVdTIGV2ZW50LWluZ2VzdGlvbiBMYW1iZGEncyB3cml0ZXMgKGAvcmVwb3J0cy9ldmVudHNgLFxuICogICBgL3JlcG9ydHMvaW5nZXN0LWhlYWx0aGApIGFuZCB0aGUgaW5jaWRlbnQgd2ViaG9vay5cbiAqIC0gYHJlZ2lzdHJ5OnB1c2hgICAgIOKAlCBgZG9ja2VyIHB1c2hgIGludG8gdGhlIG93bmluZyBvcmcncyBvd24gbmFtZXNwYWNlIHZpYVxuICogICBpbWFnZS1yZWdpc3RyeSdzIGAvdG9rZW5gIGVuZHBvaW50LiBHcmFudHMgdGhlIHJhdy1pbWFnZSB3cml0ZSB0aGF0XG4gKiAgIGBwbHVnaW5zOndyaXRlYCBncmFudHMgYSBwZXJzb24sIGFuZCBub3RoaW5nIGVsc2U6IGEgc2NvcGVkIHRva2VuIGNhcnJpZXMgbm9cbiAqICAgcGVybWlzc2lvbnMsIHNvIGl0IGNhbiBuZWl0aGVyIHJlYWQgdGhlIEFQSSBub3IgcHVzaCBvdXRzaWRlIGl0cyBvcmcuXG4gKiAtIGBzY2ltYCAgICAgICAgICAgICDigJQgYW4gaWRlbnRpdHkgcHJvdmlkZXIncyBTQ0lNIDIuMCBjbGllbnQgKDNiKSBkcml2aW5nXG4gKiAgIGAvc2NpbS92Mi9Vc2Vyc2AgYW5kIGAvc2NpbS92Mi9Hcm91cHNgIGZvciB0aGUga2V5J3MgT1dOIG9yZy4gSXQgcHJvdmlzaW9uc1xuICogICBhbmQgZGVhY3RpdmF0ZXMgbWVtYmVyc2hpcHMgYW5kIG1vdmVzIHBlb3BsZSBiZXR3ZWVuIGRpcmVjdG9yeSBncm91cHM7IGl0XG4gKiAgIGNhbiBuZXZlciByZWFkIG9yIHdyaXRlIGFueXRoaW5nIGVsc2UsIGFuZCDigJQgYmVjYXVzZSBhIHNjb3BlZCB0b2tlbiBjYXJyaWVzXG4gKiAgIG5vIHBlcm1pc3Npb25zIOKAlCBpdCBjYW5ub3QgYXV0aG9yIHRoZSBncm91cCDihpIgUm9sZSBydWxlcyBpdHMgc3luY3MgcmVzb2x2ZVxuICogICB0aHJvdWdoLiBPbmx5IGEgc2VydmljZS1hY2NvdW50IGtleSBtYXkgY2FycnkgaXQ7IGEgcGVyc29uJ3MgdG9rZW4gbmV2ZXIgZG9lcy5cbiAqL1xuZXhwb3J0IHR5cGUgVG9rZW5TY29wZSA9ICdyZXBvcnRpbmc6aW5nZXN0JyB8ICdyZWdpc3RyeTpwdXNoJyB8ICdzY2ltJztcblxuLyoqXG4gKiBSdW50aW1lIGNhdGFsb2cgb2Yge0BsaW5rIFRva2VuU2NvcGV9IChhIHVuaW9uIGlzIGVyYXNlZCBhdCBydW50aW1lKS4gVGhpcyBpc1xuICogdGhlIE9ORSBhbGxvd2xpc3QgZXZlcnkgbWludCBwYXRoIHZhbGlkYXRlcyBhZ2FpbnN0IOKAlCBwbGF0Zm9ybSdzIGtleS90b2tlblxuICogaXNzdWUgcm91dGVzIGluY2x1ZGVkIOKAlCBzbyBhIG5ldyBzY29wZSBpcyBhZGRlZCBpbiBleGFjdGx5IG9uZSBwbGFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRPS0VOX1NDT1BFUzogcmVhZG9ubHkgVG9rZW5TY29wZVtdID0gWydyZXBvcnRpbmc6aW5nZXN0JywgJ3JlZ2lzdHJ5OnB1c2gnLCAnc2NpbSddO1xuXG4vKipcbiAqIFdoYXQga2luZCBvZiBwcmluY2lwYWwgYSB0b2tlbiBzcGVha3MgZm9yLiBBdXRoIGRlY2lzaW9ucyBicmFuY2ggb24gdGhpcyBjbGFpbVxuICog4oCUIG5ldmVyIG9uIHRoZSBzaGFwZSBvZiBgc3ViYCBvciBvbiB3aGljaCBvcHRpb25hbCBjbGFpbXMgaGFwcGVuIHRvIGJlIHByZXNlbnQuXG4gKlxuICogLSBgdXNlcmAgICAgICAgICAgICDigJQgYSBwZXJzb24gKHNlc3Npb24sIG1hY2hpbmUgc2Vzc2lvbiwgUEFUIG9yIGltcGVyc29uYXRpb24pLlxuICogLSBgc2VydmljZV9hY2NvdW50YCDigJQgYSBub24taHVtYW4gYWNjb3VudCBvd25lZCBieSBPTkUgb3JnLCBob2xkaW5nIG9yZyBSb2xlc1xuICogICAgICAgICAgICAgICAgICAgICAgIGFuZCBhdXRoZW50aWNhdGluZyB3aXRoIGEgYHBiX3NhX+KApmAga2V5IGV4Y2hhbmdlZCBhdFxuICogICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLiBOZXZlciBzYXRpc2ZpZXMgYW4gYXNzdXJhbmNlL3N0ZXAtdXAgZ2F0ZS5cbiAqIC0gYHNlcnZpY2VgICAgICAgICAg4oCUIGFuIGludGVybmFsIFBpcGVsaW5lIEJ1aWxkZXIgc2VydmljZSAoe0BsaW5rIHNpZ25TZXJ2aWNlVG9rZW59KS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJpbmNpcGFsVHlwZSA9ICd1c2VyJyB8ICdzZXJ2aWNlX2FjY291bnQnIHwgJ3NlcnZpY2UnO1xuXG4vKipcbiAqIEhvdyBhIHRva2VuIGlzIHVzZWQuIGBhY2Nlc3NgIGlzIGEgc2Vzc2lvbi1zdHlsZSBhY2Nlc3MgdG9rZW4gKGludGVyYWN0aXZlLFxuICogbWFjaGluZS1zZXNzaW9uIG9yIHNlcnZpY2UpOyBgYXBpX2tleWAgaXMgYSBzdGFuZGFsb25lIGNyZWRlbnRpYWwgdHJhY2tlZCBieVxuICogaXRzIG93biByZWNvcmQg4oCUIGEgUGVyc29uYWwgQWNjZXNzIFRva2VuIG9yIGEgc2VydmljZS1hY2NvdW50IGtleSwgbmFtZWQgYnlcbiAqIGBqdGlgLlxuICovXG5leHBvcnQgdHlwZSBUb2tlblVzZSA9ICdhY2Nlc3MnIHwgJ2FwaV9rZXknO1xuXG4vKipcbiAqIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgKGBhbXJgLCBSRkMgODE3NiBzdHlsZSkgdGhhdCBlc3RhYmxpc2hlZCBhIHVzZXInc1xuICogc2Vzc2lvbi4gYHB3ZGAgcGFzc3dvcmQgc2lnbi1pbjsgYG9hdXRoYCBzb2NpYWwgc2lnbi1pbiAoR29vZ2xlLCBHaXRIdWIg4oCmKTtcbiAqIGBzc29gIHBlci1vcmcgT0lEQyBzaW5nbGUgc2lnbi1vbjsgYHdlYmF1dGhuYCBhIHBhc3NrZXkgKFdlYkF1dGhuIGFzc2VydGlvblxuICogd2l0aCB1c2VyIHZlcmlmaWNhdGlvbik7IGBzdGVwdXBgIGEgc3RlcC11cCByZS12ZXJpZmljYXRpb24gdG9rZW47IGBtZmFgIGFcbiAqIHNlY29uZCBmYWN0b3Igd2FzIHByZXNlbnRlZCBhcyB3ZWxsIOKAlCB0b2RheSBhbiBhdXRoZW50aWNhdG9yLWFwcCBjb2RlIChUT1RQKVxuICogb3Igb25lIG9mIGl0cyByZWNvdmVyeSBjb2Rlcywgc28gaXQgYXBwZWFycyBBTE9OR1NJREUgdGhlIG1ldGhvZCB0aGF0XG4gKiBpZGVudGlmaWVkIHRoZSB1c2VyIChgWydwd2QnLCAnbWZhJ11gKSwgbmV2ZXIgb24gaXRzIG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0aE1ldGhvZCA9ICdwd2QnIHwgJ29hdXRoJyB8ICdzc28nIHwgJ3dlYmF1dGhuJyB8ICdzdGVwdXAnIHwgJ21mYSc7XG5cbi8qKlxuICogQXV0aGVudGljYXRvciBhc3N1cmFuY2UgbGV2ZWwgb2YgdGhlIHNlc3Npb24gYSB0b2tlbiBzcGVha3MgZm9yICgjOCkuXG4gKlxuICogLSBgMWAg4oCUIG9uZSBmYWN0b3I6IGEgcGFzc3dvcmQsIGEgc29jaWFsIHNpZ24taW4sIG9yIFNTTyB0aHJvdWdoIGFuIElkUCB0aGVcbiAqICAgb3JnIGhhcyBOT1QgbWFya2VkIGFzIGVuZm9yY2luZyBNRkEuXG4gKiAtIGAyYCDigJQgTUZBLWdyYWRlOiBhIHBhc3NrZXkgYXNzZXJ0ZWQgd2l0aCB1c2VyIHZlcmlmaWNhdGlvbiwgYSBwYXNzd29yZCBwbHVzXG4gKiAgIGFuIGF1dGhlbnRpY2F0b3ItYXBwIGNvZGUsIG9yIFNTTyB0aHJvdWdoIGFuIElkUCB0aGUgb3JnIEhBUyBtYXJrZWQgYXNcbiAqICAgZW5mb3JjaW5nIE1GQSAocHJvdmlkZXJzIGRvbid0IHNlbmQgYGFtcmAgcmVsaWFibHksIHNvIHRoZSBvcmcncyBvd25cbiAqICAgc3RhdGVtZW50IGFib3V0IGl0cyBJZFAgaXMgdGhlIHNpZ25hbCkuXG4gKlxuICogRml4ZWQgd2hlbiB0aGUgc2Vzc2lvbiBpcyBvcGVuZWQgYW5kIHN0b3JlZCBvbiBpdHMgcmVmcmVzaC1zZXNzaW9uIHNsb3QsIHNvXG4gKiByZWZyZXNoIC8gcmVuZXdhbCAvIHN3aXRjaC1vcmcgY29weSBpdCB2ZXJiYXRpbSBhbmQgY2FuIG5ldmVyIFJBSVNFIGl0IOKAlFxuICogZWFybmluZyBhYWwgMiBhbHdheXMgbWVhbnMgYXV0aGVudGljYXRpbmcgYWdhaW4gd2l0aCBhIHNlY29uZCBmYWN0b3IuXG4gKi9cbmV4cG9ydCB0eXBlIEFzc3VyYW5jZUxldmVsID0gMSB8IDI7XG5cbi8qKiBSdW50aW1lIGNhdGFsb2dzIGZvciB0aGUgY2xhaW0gdW5pb25zIGFib3ZlIChhIHVuaW9uIGlzIGVyYXNlZCBhdCBydW50aW1lKS4gKi9cbmV4cG9ydCBjb25zdCBQUklOQ0lQQUxfVFlQRVM6IHJlYWRvbmx5IFByaW5jaXBhbFR5cGVbXSA9IFsndXNlcicsICdzZXJ2aWNlX2FjY291bnQnLCAnc2VydmljZSddO1xuZXhwb3J0IGNvbnN0IFRPS0VOX1VTRVM6IHJlYWRvbmx5IFRva2VuVXNlW10gPSBbJ2FjY2VzcycsICdhcGlfa2V5J107XG5leHBvcnQgY29uc3QgQVVUSF9NRVRIT0RTOiByZWFkb25seSBBdXRoTWV0aG9kW10gPSBbJ3B3ZCcsICdvYXV0aCcsICdzc28nLCAnd2ViYXV0aG4nLCAnc3RlcHVwJywgJ21mYSddO1xuXG4vKipcbiAqIFF1b3RhIHR5cGUgaWRlbnRpZmllcnMuXG4gKlxuICogLSBgcGx1Z2luc2AgLyBgcGlwZWxpbmVzYCDigJQgY291bnQgb2YgY3JlYXRlZCBlbnRpdGllc1xuICogLSBgYXBpQ2FsbHNgIOKAlCBnZW5lcmljIEFQSSBjYWxsIGNvdW50IChyZWFkLWhlYXZ5IHBhdGhzKVxuICogLSBgYWlDYWxsc2Ag4oCUIEFJIHByb3ZpZGVyIGludm9jYXRpb25zIChjb3VudGVkIHNlcGFyYXRlbHkgYmVjYXVzZSBlYWNoIGNhbGxcbiAqICAgaGFzIGV4dGVybmFsIGRvbGxhciBjb3N0OyBzaXplZCBzbWFsbGVyIHRoYW4gYXBpQ2FsbHMgcGVyIHRpZXIpXG4gKiAtIGBzdG9yYWdlQnl0ZXNgIOKAlCByZWdpc3RyeSBzdG9yYWdlIGJ1ZGdldCBwZXIgb3JnLiBVbmxpa2UgdGhlIG90aGVyc1xuICogICAod2hpY2ggY291bnQgZGlzY3JldGUgZXZlbnRzKSwgdGhpcyBpcyBhIG1lYXN1cmVkIHRvdGFsIHJlY29tcHV0ZWRcbiAqICAgb24gZGVtYW5kLiBJbmNyZW1lbnRlZCBieSB0aGUgaW1hZ2UtcmVnaXN0cnkncyBwdXNoLWdhdGUgYmVmb3JlXG4gKiAgIGlzc3VpbmcgYSB0b2tlbiB3aG9zZSBzY29wZSBpbmNsdWRlcyBgcHVzaGA7IHRoZSBHQyBzY2hlZHVsZXJcbiAqICAgZXZlbnR1YWxseSBmcmVlcyB0aGUgYnl0ZXMsIHRoZW4gdGhlIG5leHQgcHVzaC1nYXRlIGNoZWNrIHJlYWRzXG4gKiAgIHRoZSBsb3dlciB2YWx1ZS4gTk9UIGEgY291bnRlci1zdHlsZSBxdW90YSBpbiB0aGUgc2Vuc2Ugb2ZcbiAqICAgYGluY3JlbWVudFVzYWdlYCDigJQgdGhlIHJlZ2lzdHJ5IHB1c2hlcyB0aGUgbWVhc3VyZWQgdG90YWwgdmlhXG4gKiAgIGB1cGRhdGVMaW1pdHNgL2ByZXNldFVzYWdlYCBmbG93cy4gVGllciBsaW1pdHMgYXJlIGJ5dGVzLlxuICogLSBgZGFzaGJvYXJkc2AgLyBgYWxlcnRSdWxlc2AgLyBgYWxlcnREZXN0aW5hdGlvbnNgIC8gYGlkcENvbmZpZ3NgIOKAlFxuICogICByZXNvdXJjZS1jb3VudCBxdW90YXMgYWRkZWQgdG8gY2xvc2UgcGVyLW9yZyBEb1Mgc3VyZmFjZXMgaW4gdGhlXG4gKiAgIHVzZXItZWRpdGFibGUgZmVhdHVyZSB0YWJsZXMuIFdpdGhvdXQgdGhlc2UgY2FwcyBhIHNpbmdsZSBvcmcgY291bGRcbiAqICAgc3BhbSB0aG91c2FuZHMgb2YgZGFzaGJvYXJkcyAvIHJ1bGVzIGFuZCBibG9hdCB0aGUgc2hhcmVkIFBvc3RncmVzIC9cbiAqICAgTW9uZ28gd29ya2luZyBzZXRzLiBDb3VudGVkIGF0IGNyZWF0ZSB0aW1lOyBkZWNyZW1lbnRlZCBvbiBkZWxldGUuXG4gKi9cbi8vIE5PVEU6IGBzZWF0c2AgaXMgaW50ZW50aW9uYWxseSBOT1QgaGVyZS4gSXQncyBhIHRpZXIgbGltaXQgKFF1b3RhVGllckxpbWl0cylcbi8vIGVuZm9yY2VkIGJ5IGNvbXBhcmluZyB0aGUgb3JnJ3MgTElWRSBtZW1iZXIgY291bnQgYXQgaW52aXRlIHRpbWUg4oCUIG5vdCBhblxuLy8gaW5jcmVtZW50aW5nIHBlci1wZXJpb2QgY291bnRlciBsaWtlIHRoZSBjb25zdW1hYmxlIHF1b3RhcyBiZWxvdy5cbmV4cG9ydCB0eXBlIFF1b3RhVHlwZSA9XG4gIHwgJ3BsdWdpbnMnIHwgJ3BpcGVsaW5lcycgfCAnYXBpQ2FsbHMnIHwgJ2FpQ2FsbHMnIHwgJ3N0b3JhZ2VCeXRlcydcbiAgfCAnZGFzaGJvYXJkcycgfCAnYWxlcnRSdWxlcycgfCAnYWxlcnREZXN0aW5hdGlvbnMnIHwgJ2lkcENvbmZpZ3MnO1xuXG4vKipcbiAqIFZhbGlkIHF1b3RhIHR5cGUgdmFsdWVzLlxuICovXG5leHBvcnQgY29uc3QgVkFMSURfUVVPVEFfVFlQRVMgPSBbXG4gICdwbHVnaW5zJywgJ3BpcGVsaW5lcycsICdhcGlDYWxscycsICdhaUNhbGxzJywgJ3N0b3JhZ2VCeXRlcycsXG4gICdkYXNoYm9hcmRzJywgJ2FsZXJ0UnVsZXMnLCAnYWxlcnREZXN0aW5hdGlvbnMnLCAnaWRwQ29uZmlncycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjaGVja1xuICogQHJldHVybnMgVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZhbGlkIFF1b3RhVHlwZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoaXNWYWxpZFF1b3RhVHlwZShyZXEuYm9keS5xdW90YVR5cGUpKSB7XG4gKiAgIC8vIHF1b3RhVHlwZSBpcyBndWFyYW50ZWVkIHRvIGJlIFF1b3RhVHlwZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUXVvdGFUeXBlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUXVvdGFUeXBlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgVkFMSURfUVVPVEFfVFlQRVMuaW5jbHVkZXModmFsdWUgYXMgUXVvdGFUeXBlKTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgZnJvbSBxdW90YSBjaGVjayBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFDaGVja1Jlc3VsdCB7XG4gIC8qKiBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIGFsbG93ZWQgKi9cbiAgYWxsb3dlZDogYm9vbGVhbjtcbiAgLyoqIE1heGltdW0gcXVvdGEgbGltaXQgKC0xIGZvciB1bmxpbWl0ZWQpICovXG4gIGxpbWl0OiBudW1iZXI7XG4gIC8qKiBDdXJyZW50IHVzYWdlIGNvdW50ICovXG4gIHVzZWQ6IG51bWJlcjtcbiAgLyoqIFJlbWFpbmluZyBxdW90YSAoLTEgZm9yIHVubGltaXRlZCkgKi9cbiAgcmVtYWluaW5nOiBudW1iZXI7XG4gIC8qKiBJU08gdGltZXN0YW1wIHdoZW4gcXVvdGEgcmVzZXRzICovXG4gIHJlc2V0QXQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgcXVvdGEgaXMgdW5saW1pdGVkICovXG4gIHVubGltaXRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgT05MWSB3aGVuIHRoaXMgcmVzdWx0IGlzIHRoZSBmYWlsLW9wZW4gc2VudGluZWwgcmV0dXJuZWQgYmVjYXVzZSB0aGVcbiAgICogcXVvdGEgc2VydmljZSB3YXMgdW5yZWFjaGFibGUgLyByZXR1cm5lZCBub24tb2sgKG5vdCBhIHJlYWwgcXVvdGEgcmVhZGluZykuXG4gICAqIExldHMgZmFpbC1jbG9zZWQgY2FsbGVycyAoZS5nLiB0aGUgcmVnaXN0cnkgc3RvcmFnZSBwdXNoLWdhdGUpIGRpc3Rpbmd1aXNoXG4gICAqIGFuIG91dGFnZSBmcm9tIGEgZ2VudWluZSBgbGltaXQ6IC0xYCAodW5saW1pdGVkKSBvcmcuIEFic2VudCBvbiByZWFsIHJlc3VsdHMuXG4gICAqL1xuICBmYWlsT3Blbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUXVvdGEgaW5mb3JtYXRpb24gZm9yIGVycm9yIHJlc3BvbnNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YUluZm8ge1xuICB0eXBlOiBRdW90YVR5cGU7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHVzZWQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIHN1Y2Nlc3MgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU3VjY2Vzc1Jlc3BvbnNlPFQgPSB1bmtub3duPiB7XG4gIHN1Y2Nlc3M6IHRydWU7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgZGF0YT86IFQ7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhbmRhcmQgQVBJIGVycm9yIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVycm9yUmVzcG9uc2Uge1xuICBzdWNjZXNzOiBmYWxzZTtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGNvZGU/OiBzdHJpbmc7XG4gIGRldGFpbHM/OiB1bmtub3duO1xuICBxdW90YT86IFF1b3RhSW5mbztcbn1cblxuLyoqXG4gKiBDb21iaW5lZCBBUEkgcmVzcG9uc2UgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpUmVzcG9uc2U8VCA9IHVua25vd24+ID0gQXBpU3VjY2Vzc1Jlc3BvbnNlPFQ+IHwgQXBpRXJyb3JSZXNwb25zZTtcblxuLyoqXG4gKiBKV1QgcGF5bG9hZCBmcm9tIGFjY2VzcyB0b2tlbnMuXG4gKlxuICogVXNlcnMgY2FuIGJlbG9uZyB0byBtdWx0aXBsZSBvcmdhbml6YXRpb25zLiBUaGUgdG9rZW4gaXMgc2NvcGVkIHRvIG9uZVxuICogYWN0aXZlIG9yZ2FuaXphdGlvbiBhdCBhIHRpbWUuIFRoZSBgcm9sZWAgZmllbGQgaXMgdGhlIHVzZXIncyBwZXItb3JnXG4gKiByb2xlIGluIHRoYXQgb3JnYW5pemF0aW9uIChmcm9tIHRoZSBVc2VyT3JnYW5pemF0aW9uIGp1bmN0aW9uIGNvbGxlY3Rpb24pLFxuICogYW5kIGBpc0FkbWluYCBpcyBkZXJpdmVkIGFzIGByb2xlID09PSAnYWRtaW4nIHx8IHJvbGUgPT09ICdvd25lcidgLlxuICpcbiAqIFVzZSBgUE9TVCAvYXV0aC9zd2l0Y2gtb3JnYCB0byBjaGFuZ2UgdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24sIHdoaWNoXG4gKiByZS1pc3N1ZXMgdG9rZW5zIHdpdGggdGhlIG5ldyBvcmcncyByb2xlIGFuZCBjb250ZXh0LlxuICovXG4vKipcbiAqIENvYXJzZSBwZXItb3JnIG1lbWJlcnNoaXAgbGFiZWwsIERFUklWRUQgZnJvbSB0aGUgUm9sZXMgYSB1c2VyIGlzIGFzc2lnbmVkXG4gKiAodGhlIGhpZ2hlc3QgYGdyYW50c1JvbGVgIGFtb25nIHRoZW07IGBvd25lcmAgaXMgc2V0IG9ubHkgYnkgb3duZXJzaGlwXG4gKiB0cmFuc2ZlcikuIEl0IGlzIGEgZGlzcGxheS9hdXRob3JpdHkgbGFiZWwg4oCUIGRyaXZpbmcgYGlzQWRtaW5gLCBvd25lcnNoaXAsXG4gKiBhbmQgc2VhdCBhY2NvdW50aW5nIOKAlCBOT1QgYSBwZXJtaXNzaW9uIHNvdXJjZS4gRWZmZWN0aXZlIHBlcm1pc3Npb25zIGNvbWVcbiAqIHNvbGVseSBmcm9tIHRoZSB1c2VyJ3MgYXNzaWduZWQgUm9sZXMgKHNlZSBgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc2ApLiBOb3QgYVxuICogZ2xvYmFsIHJvbGUuXG4gKi9cbmV4cG9ydCB0eXBlIE9yZ1JvbGUgPSAnb3duZXInIHwgJ2FkbWluJyB8ICdtZW1iZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIEp3dFBheWxvYWQge1xuICAvKiogVXNlciBJRCAoc3ViamVjdCkgKi9cbiAgc3ViOiBzdHJpbmc7XG4gIC8qKiBVc2VybmFtZSAqL1xuICB1c2VybmFtZTogc3RyaW5nO1xuICAvKiogVXNlciBlbWFpbCAqL1xuICBlbWFpbDogc3RyaW5nO1xuICAvKiogV2hpY2gga2luZCBvZiBwcmluY2lwYWwgdGhpcyB0b2tlbiBzcGVha3MgZm9yIChzZWUge0BsaW5rIFByaW5jaXBhbFR5cGV9KS4gKi9cbiAgcHJpbmNpcGFsVHlwZTogUHJpbmNpcGFsVHlwZTtcbiAgLyoqIEhvdyB0aGUgdG9rZW4gaXMgdXNlZCAoc2VlIHtAbGluayBUb2tlblVzZX0pOyBQQVRzIGFyZSBgYXBpX2tleWAuICovXG4gIHRva2VuX3VzZTogVG9rZW5Vc2U7XG4gIC8qKlxuICAgKiBNZXRob2RzIHRoYXQgYXV0aGVudGljYXRlZCB0aGUgc2Vzc2lvbiAodXNlciBwcmluY2lwYWxzKS4gS2VwdCBvbiB0aGVcbiAgICogcmVmcmVzaC1zZXNzaW9uIHNsb3QsIHNvIHJlZnJlc2ggLyByZW5ldyAvIHN3aXRjaC1vcmcgY2FycnkgaXQgdW5jaGFuZ2VkLlxuICAgKiBBYnNlbnQgb24gc2VydmljZSB0b2tlbnMuXG4gICAqL1xuICBhbXI/OiBBdXRoTWV0aG9kW107XG4gIC8qKiBBc3N1cmFuY2UgbGV2ZWwgKHVzZXIgcHJpbmNpcGFscykuIE5ldmVyIHJhaXNlZCBieSByZWZyZXNoIC8gcmVuZXcgLyBzd2l0Y2gtb3JnLiAqL1xuICBhYWw/OiBBc3N1cmFuY2VMZXZlbDtcbiAgLyoqIEVwb2NoIHNlY29uZHMgb2YgdGhlIHNpZ24taW4gdGhhdCBlc3RhYmxpc2hlZCB0aGUgc2Vzc2lvbiAodXNlciBwcmluY2lwYWxzKS5cbiAgICogIE5ldmVyIHJlc2V0IGJ5IHJlZnJlc2ggLyByZW5ldyAvIHN3aXRjaC1vcmcuICovXG4gIGF1dGhfdGltZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBhY3RpdmUgb3JnIFJFUVVJUkVTIE1GQSBhbmQgaXRzIGdyYWNlIHBlcmlvZCBoYXMgcGFzc2VkICgjOCkuXG4gICAqXG4gICAqIENhcnJpZWQgYXMgYSBjbGFpbSBzbyBubyBzZXJ2aWNlIGhhcyB0byBsb29rIHRoZSBwb2xpY3kgdXA6IHRoZSBvcmcgcG9saWN5XG4gICAqIGlzIGVuZm9yY2VkIHdoZXJlIHRoZSB0b2tlbiBpcyBJU1NVRUQgKGEgc2Vzc2lvbiBzY29wZWQgdG8gc3VjaCBhbiBvcmcgZ2V0c1xuICAgKiBgYWFsOiAyYCBvciBpcyByZWZ1c2VkKSwgYW5kIHRoaXMgY2xhaW0gaXMgdGhlIHJlY29yZCBvZiB0aGF0IGRlY2lzaW9uLCBmb3JcbiAgICogVUkgY29weSBhbmQgYXVkaXQgcmF0aGVyIHRoYW4gZm9yIGEgc2Vjb25kIGVuZm9yY2VtZW50IHBvaW50LlxuICAgKi9cbiAgbWZhUmVxdWlyZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGFjdGl2ZSBvcmcncyBcImFkbWluaXN0cmF0aXZlIGFjdGlvbnMgcmVxdWlyZSBNRkFcIiBwb2xpY3lcbiAgICogKGBhZG1pbkFjdGlvbnNSZXF1aXJlTWZhYCwgc3RyaWN0ZXN0IGFjcm9zcyB0aGUgb3JnIGFuZCBpdHMgYW5jZXN0b3JzKS5cbiAgICogUHJlc2VudCDigJQgYW5kIGFsd2F5cyBgMmAg4oCUIG9ubHkgd2hlbiB0aGUgcG9saWN5IGlzIG9uLiBJdCBpcyByZXNvbHZlZCB3aGVuXG4gICAqIHRoZSB0b2tlbiBpcyBJU1NVRUQsIHNvIHNlcnZpY2VzIHRoYXQgY2FuJ3QgcmVhZCB0aGUgb3JnIGRvY3VtZW50IHN0aWxsIGtub3dcbiAgICogdGhlIHBvbGljeTogYHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZWAgcmVmdXNlcyBhbiBgYWFsOiAxYCBzZXNzaW9uIG9uIGFuXG4gICAqIGFkbWluaXN0cmF0aXZlIHJvdXRlIHdoZW4gdGhpcyBjbGFpbSBpcyBwcmVzZW50LiBDaGFuZ2luZyB0aGUgcG9saWN5IGJ1bXBzXG4gICAqIGV2ZXJ5IGFmZmVjdGVkIG1lbWJlcidzIGB0b2tlblZlcnNpb25gLCBzbyB0aGUgY2xhaW0gY2FuJ3QgZ28gc3RhbGUuXG4gICAqL1xuICBvcmdfYWRtaW5fYWFsPzogMjtcbiAgLyoqXG4gICAqIEJPT1RTVFJBUC1BRE1JTiBFWENFUFRJT04gKCM4LCByZXZpc2lvbiA0KS4gU2V0IG9ubHkgb24gYSBzZXNzaW9uIG9wZW5lZCBieVxuICAgKiB0aGUgaW5zdGFsbCdzIGJvb3RzdHJhcCBhZG1pbiAoYEJPT1RTVFJBUF9TVVBFUkFETUlOX0VNQUlMU2AsIHN5c3RlbSBvcmcpXG4gICAqIHdoaWxlIHRoZXkgc3RpbGwgaGF2ZSBubyBlbnJvbGxlZCBmYWN0b3IuIFN1Y2ggYSBzZXNzaW9uIGlzIGBhYWw6IDFgIGFuZCBtYXlcbiAgICogcmVhY2ggT05MWSBlbnJvbG1lbnQsIHNpZ24tb3V0IGFuZCB0aGUgcm91dGVzIGBpbml0LXBsYXRmb3JtLnNoYCBjYWxscztcbiAgICogZXZlcnkgb3RoZXIgc2VydmljZSByZWZ1c2VzIGl0IG91dHJpZ2h0IChzZWUgYHJlcXVpcmVBdXRoYCkuIFRoZSBleGNlcHRpb25cbiAgICogY2xvc2VzIHBlcm1hbmVudGx5IGF0IHRoZSBmaXJzdCBlbnJvbG1lbnQgYW5kIG5ldmVyIHJlb3BlbnMuXG4gICAqL1xuICBtZmFFbnJvbGxtZW50UGVuZGluZz86IGJvb2xlYW47XG4gIC8qKiBQZXItb3JnIHJvbGUgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKCdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcicpLiBOb3QgYSBnbG9iYWwgcm9sZS4gKi9cbiAgcm9sZTogT3JnUm9sZTtcbiAgLyoqIERlcml2ZWQ6IHRydWUgd2hlbiByb2xlIGlzICdhZG1pbicgb3IgJ293bmVyJyBpbiB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAqL1xuICBpc0FkbWluPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlc29sdmVkIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9ucyBmb3IgdGhlIGFjdGl2ZSBvcmcvdGVhbSDigJQgdGhlIHVuaW9uIG9mXG4gICAqIHRoZSBwZXJtaXNzaW9ucyBjYXJyaWVkIGJ5IGV2ZXJ5IFJvbGUgdGhlIHVzZXIgaXMgYXNzaWduZWQgKHNlZVxuICAgKiBgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc2ApLiBBYnNlbnQgb24gbWFjaGluZS9zY29wZWQgdG9rZW5zLiBTdXBlcmFkbWlucyBhcmVcbiAgICogZ3JhbnRlZCBhbGwgcGVybWlzc2lvbnMgaW1wbGljaXRseSBhbmQgbWF5IG9taXQgdGhpcy4gRW5kcG9pbnRzIGVuZm9yY2UgdmlhXG4gICAqIGByZXF1aXJlUGVybWlzc2lvbiguLi4pYC5cbiAgICovXG4gIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdO1xuICAvKipcbiAgICogR2xvYmFsIHN1cGVyLWFkbWluIGZsYWcgKGNyb3NzLW9yZykuIFdoZW4gYHRydWVgLCB0aGUgdXNlciBpcyB0cmVhdGVkXG4gICAqIGFzIGEgc3lzdGVtIGFkbWluaXN0cmF0b3IgcmVnYXJkbGVzcyBvZiB3aGljaCBvcmcgdGhleSdyZSBjdXJyZW50bHlcbiAgICogYWN0aW5nIHVuZGVyLiBUaGlzIGlzIHRoZSBTT0xFIHNpZ25hbCBmb3Igc3lzYWRtaW4gYXV0aG9yaXR5IOKAlCB0aGUgb2xkIHBhdGhcbiAgICogKG1lbWJlcnNoaXAgaW4gdGhlIHdlbGwta25vd24gXCJzeXN0ZW1cIiBvcmcgd2l0aCByb2xlIGFkbWluL293bmVyKSBoYXMgYmVlblxuICAgKiByZW1vdmVkIGJlY2F1c2UgaXQgY29uZmxhdGVkIFwiUGlwZWxpbmUgQnVpbGRlciBvcGVyYXRvclwiIHdpdGggXCJyZWFsIGN1c3RvbWVyXG4gICAqIHRlbmFudFwiIGluIHRoZSBkYXRhIG1vZGVsLiBHcmFudCBzeXNhZG1pbiBvbmx5IHZpYSBgaXNTdXBlckFkbWluYC5cbiAgICovXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW47XG4gIC8qKiBPcmdhbml6YXRpb24ncyBxdW90YSB0aWVyLiAqL1xuICB0aWVyPzogUXVvdGFUaWVyO1xuICAvKiogUmVzb2x2ZWQgZmVhdHVyZSBmbGFncyBmb3IgdGhpcyB1c2VyL29yZyAqL1xuICBmZWF0dXJlcz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogTmFycm93IGNhcGFiaWxpdHkgc2NvcGUgZm9yIG1hY2hpbmUvYXV0b21hdGlvbiB0b2tlbnMgKGUuZy5cbiAgICogYCdyZXBvcnRpbmc6aW5nZXN0J2ApLiBBYnNlbnQgb24gbm9ybWFsIGludGVyYWN0aXZlIHVzZXIgdG9rZW5zLiBFbmRwb2ludHNcbiAgICogdGhhdCBhY2NlcHQgYSBzY29wZWQgaWRlbnRpdHkgY2hlY2sgdGhpcyAoc2VlIGBoYXNTY29wZWApIGluc3RlYWQgb2Ygcm9sZTtcbiAgICogYSBzY29wZWQgdG9rZW4gaXMgbWludGVkIHdpdGggbWluaW1hbCByb2xlIGZvciBsZWFzdC1wcml2aWxlZ2UuXG4gICAqL1xuICBzY29wZT86IFRva2VuU2NvcGU7XG4gIC8qKlxuICAgKiBUaGUgdG9rZW4ncyBgcGVybWlzc2lvbnNgIHdlcmUgTkFSUk9XRUQgdG8gYSBjYXRhbG9nIHN1YnNldCBjaG9zZW4gd2hlbiB0aGVcbiAgICogY3JlZGVudGlhbCB3YXMgY3JlYXRlZCAoYSBwZXJtaXNzaW9uLXNjb3BlZCBwZXJzb25hbCBhY2Nlc3Mga2V5IG9yIG1hY2hpbmVcbiAgICogdG9rZW4pLiBUaGUgY2xhaW0gaXMgdGhlIHJlY29yZCB0aGF0IGBwZXJtaXNzaW9uc2AgaXMgdGhlIElOVEVSU0VDVElPTiBvZlxuICAgKiB0aGF0IHN1YnNldCB3aXRoIHRoZSBob2xkZXIncyBjdXJyZW50IFJvbGVzIOKAlCBub3QgdGhlaXIgZnVsbCBhdXRob3JpdHkg4oCUIHNvXG4gICAqIGFueXRoaW5nIHRoZSB0b2tlbiBtaW50cyBjYW4gb25seSBiZSBuYXJyb3dlciBzdGlsbCwgYW5kIGl0IG5ldmVyIGNhcnJpZXNcbiAgICogYGlzU3VwZXJBZG1pbmAgb3IgYW4gYWRtaW4gYHJvbGVgIChib3RoIHdvdWxkIGJ5cGFzcyB0aGUgc3Vic2V0KS4gT25seSBldmVyXG4gICAqIGB0cnVlYDsgYWJzZW50IG9uIHVucmVzdHJpY3RlZCB0b2tlbnMuXG4gICAqL1xuICBwZXJtaXNzaW9uc1Jlc3RyaWN0ZWQ/OiBib29sZWFuO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBJRCAoZnJvbSBVc2VyT3JnYW5pemF0aW9uIG1lbWJlcnNoaXApICovXG4gIG9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKiogQWN0aXZlIG9yZ2FuaXphdGlvbiBuYW1lICovXG4gIG9yZ2FuaXphdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcmcg4oaSIHRlYW0gaGllcmFyY2h5IChvcmctdGVhbS1oaWVyYXJjaHkgcHJvcG9zYWwsIHBoYXNlIDEpLlxuICAgKiBgcGFyZW50T3JnYW5pemF0aW9uSWRgIGlzIHRoZSBhY3RpdmUgb3JnJ3MgZGlyZWN0IHBhcmVudDsgYHJvb3RPcmdhbml6YXRpb25JZGBcbiAgICogaXMgdGhlIHRvcCBvZiBpdHMgYW5jZXN0cnkgY2hhaW4uIEJvdGggYXJlICoqb21pdHRlZCBmb3IgZmxhdCAocm9vdCkgb3JncyoqIOKAlFxuICAgKiBjb25zdW1lcnMgc2hvdWxkIHRyZWF0IHRoZSBlZmZlY3RpdmUgcm9vdCBhcyBgcm9vdE9yZ2FuaXphdGlvbklkID8/IG9yZ2FuaXphdGlvbklkYFxuICAgKiAodXNlIHRoZSBzaGFyZWQge0BsaW5rIGVmZmVjdGl2ZVJvb3RPcmdJZH0gYWNjZXNzb3IgcmF0aGVyIHRoYW4gY29hbGVzY2luZyBpbmxpbmUpLlxuICAgKiBDdXJyZW50bHkgZXZlcnkgb3JnIGlzIGZsYXQsIHNvIHRoZXNlIGFyZSBhYnNlbnQgb24gYWxsIHRva2VucyB0b2RheS5cbiAgICovXG4gIHBhcmVudE9yZ2FuaXphdGlvbklkPzogc3RyaW5nO1xuICAvKiogUm9vdCBvcmdhbml6YXRpb24gSUQgb2YgdGhlIGFjdGl2ZSBvcmcncyBhbmNlc3RyeSBjaGFpbiAoc2VlIGBwYXJlbnRPcmdhbml6YXRpb25JZGApLiAqL1xuICByb290T3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXQgb24gdG9rZW5zIGlzc3VlZCBieSB0aGUgc3lzYWRtaW4gaW1wZXJzb25hdGlvbiBmbG93XG4gICAqIChgUE9TVCAvYWRtaW4vaW1wZXJzb25hdGUvOnVzZXJJZGApLiBDYXJyaWVzIHRoZSBvcmlnaW5hbCBzeXNhZG1pbidzXG4gICAqIHVzZXIgaWQgc28gYXVkaXQgZXZlbnRzIHN0aWxsIGF0dHJpYnV0ZSBhY3Rpb25zIGNvcnJlY3RseS5cbiAgICovXG4gIGltcGVyc29uYXRvcklkPzogc3RyaW5nO1xuICAvKipcbiAgICogVW5pcXVlIHRva2VuIGlkLiBPbiBhbiBpbXBlcnNvbmF0aW9uIHRva2VuIGl0IGlkZW50aWZpZXMgdGhlIFNFU1NJT04sIHNvIGl0XG4gICAqIGNhbiBiZSByZXZva2VkIG9uIGl0cyBvd24gYWNyb3NzIGV2ZXJ5IHNlcnZpY2UgKHNlZVxuICAgKiBgVG9rZW5SZXZvY2F0aW9uU3RvcmUuZ2V0U2Vzc2lvblJldm9jYXRpb25gKS4gUGVyc29uYWwgQWNjZXNzIFRva2Vuc1xuICAgKiAoYHRva2VuX3VzZTogJ2FwaV9rZXknYCkgY2Fycnkgb25lIHRvbywgdmFsaWRhdGVkIGFnYWluc3QgdGhlaXIgb3duIHJlY29yZC5cbiAgICogQSBganRpYCBhbG9uZSBuZXZlciBjbGFzc2lmaWVzIGEgdG9rZW4g4oCUIGB0b2tlbl91c2VgIGFuZCBgaW1wZXJzb25hdG9ySWRgIGRvLlxuICAgKi9cbiAganRpPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCB0aGUgdG9rZW4gaXMgcmVhZC1vbmx5IOKAlCBhbnkgbm9uLUdFVCByZXF1ZXN0IGlzIHJlamVjdGVkXG4gICAqIHVwc3RyZWFtIGJ5IHRoZSBwbGF0Zm9ybSdzIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uIGdhdGUuIExldHNcbiAgICogc3lzYWRtaW5zIFwidmlldyBhcyB1c2VyIFhcIiB3aXRob3V0IHJpc2tpbmcgYSBkZXN0cnVjdGl2ZSBhY3Rpb24uXG4gICAqL1xuICBpbXBlcnNvbmF0aW9uUmVhZE9ubHk/OiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIHVzZXIncyBgdG9rZW5WZXJzaW9uYCBhdCB0aGUgbW9tZW50IHRoaXMgdG9rZW4gd2FzIGlzc3VlZC4gRXZlcnlcbiAgICogcHJpdmlsZWdlIGNoYW5nZSAoZGVhY3RpdmF0ZSAvIHJvbGUgb3IgdGllciBkb3duZ3JhZGUgLyBtZW1iZXJzaGlwIG9yXG4gICAqIG93bmVyc2hpcCBjaGFuZ2UgLyBwYXNzd29yZCBjaGFuZ2UgLyBsb2dvdXQtYWxsKSBpbmNyZW1lbnRzIHRoZSB1c2VyJ3NcbiAgICogc2VydmVyLXNpZGUgYHRva2VuVmVyc2lvbmAsIHNvIGEgdG9rZW4gd2hvc2UgZW1iZWRkZWQgdmVyc2lvbiBpcyBiZWhpbmQgdGhlXG4gICAqIGN1cnJlbnQgb25lIGhhcyBiZWVuIFJFVk9LRUQuIFBsYXRmb3JtIHZhbGlkYXRlcyB0aGlzIGFnYWluc3QgTW9uZ287IHRoZVxuICAgKiBzdGF0ZWxlc3Mgc2VydmljZXMgdmFsaWRhdGUgaXQgYWdhaW5zdCBhIFJlZGlzLXB1Ymxpc2hlZCBjdXJyZW50LXZlcnNpb25cbiAgICogc3RvcmUgKHNlZSBgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmVgKS4gQWJzZW50IG9uIG1hY2hpbmUvc2VydmljZSB0b2tlbnMuXG4gICAqL1xuICB0b2tlblZlcnNpb24/OiBudW1iZXI7XG4gIC8qKiBUb2tlbiB0eXBlICovXG4gIHR5cGU6ICdhY2Nlc3MnIHwgJ3JlZnJlc2gnO1xuICAvKiogSXNzdWVkIGF0IHRpbWVzdGFtcCAqL1xuICBpYXQ/OiBudW1iZXI7XG4gIC8qKiBFeHBpcmF0aW9uIHRpbWVzdGFtcCAqL1xuICBleHA/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGFjY291bnQgYm91bmRhcnkgKHJvb3Qgb3JnKSBmb3IgYSB0b2tlbidzIGFjdGl2ZSBvcmcuXG4gKlxuICogVGhlIGFjY291bnQgcm9vdCBpcyBgcm9vdE9yZ2FuaXphdGlvbklkID8/IG9yZ2FuaXphdGlvbklkYDogYSBmbGF0IChyb290KSBvcmdcbiAqIG9taXRzIGByb290T3JnYW5pemF0aW9uSWRgLCBzbyBpdCBJUyBpdHMgb3duIHJvb3Q7IGEgdGVhbSAoY2hpbGQpIG9yZyBjYXJyaWVzXG4gKiB0aGUgdG9wIG9mIGl0cyBhbmNlc3RyeSBjaGFpbi4gRXZlcnkgYWNjb3VudC1zY29wZWQgcmVhZCAocXVvdGEvc2VhdC9iaWxsaW5nXG4gKiBwb29saW5nKSBtdXN0IHJlc29sdmUgdGhyb3VnaCB0aGlzIGNvYWxlc2NlIHJhdGhlciB0aGFuIHJlYWRpbmdcbiAqIGBvcmdhbml6YXRpb25JZGAgZGlyZWN0bHkg4oCUIHRoZSBsYXR0ZXIgc2lsZW50bHkgd29ya3MgdG9kYXkgKGFsbCBvcmdzIGZsYXQpXG4gKiBidXQgd291bGQgYmluZCB0byB0aGUgdGVhbSBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG9uY2UgdGVhbXMgZXhpc3QuXG4gKlxuICogQHJldHVybnMgdGhlIGVmZmVjdGl2ZSByb290IG9yZyBpZCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBuZWl0aGVyIGZpZWxkIGlzIHNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdGl2ZVJvb3RPcmdJZChcbiAgcGF5bG9hZDogUGljazxKd3RQYXlsb2FkLCAnb3JnYW5pemF0aW9uSWQnIHwgJ3Jvb3RPcmdhbml6YXRpb25JZCc+LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHBheWxvYWQucm9vdE9yZ2FuaXphdGlvbklkID8/IHBheWxvYWQub3JnYW5pemF0aW9uSWQ7XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgRXhwcmVzcyBSZXF1ZXN0IHdpdGggdXNlciBwcm9wZXJ0eS5cbiAqL1xuZGVjbGFyZSBnbG9iYWwge1xuICBuYW1lc3BhY2UgRXhwcmVzcyB7XG4gICAgaW50ZXJmYWNlIFJlcXVlc3Qge1xuICAgICAgdXNlcj86IEp3dFBheWxvYWQ7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2VydmljZSBjb25maWd1cmF0aW9uIGZvciBpbnRlcm5hbCBIVFRQIGNsaWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlQ29uZmlnIHtcbiAgLyoqIFNlcnZpY2UgaG9zdG5hbWUgKi9cbiAgaG9zdDogc3RyaW5nO1xuICAvKiogU2VydmljZSBwb3J0ICovXG4gIHBvcnQ6IG51bWJlcjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBIZWFsdGggY2hlY2sgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ2hlY2tSZXNwb25zZSB7XG4gIHN0YXR1czogJ2hlYWx0aHknIHwgJ3VuaGVhbHRoeSc7XG4gIHNlcnZpY2U6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIHVwdGltZTogbnVtYmVyO1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCAnY29ubmVjdGVkJyB8ICdkaXNjb25uZWN0ZWQnIHwgJ3Vua25vd24nPjtcbn1cbiJdfQ==
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBMkJ0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUEwQixDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztBQWlEakcsa0ZBQWtGO0FBQ2xGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBNkIsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDaEcsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUF3QixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQTBCLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztBQW1DeEc7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYztJQUM3RCxZQUFZLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLFlBQVk7SUFDN0QsVUFBVTtDQUNGLENBQUM7QUFFWDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBYztJQUM3QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsS0FBa0IsQ0FBQyxDQUFDO0FBQ3JGLENBQUM7QUFxUEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE9BQWtFO0lBRWxFLE9BQU8sT0FBTyxDQUFDLGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb24gfSBmcm9tICcuL3Blcm1pc3Npb25zLmpzJztcbmltcG9ydCB0eXBlIHsgUXVvdGFUaWVyIH0gZnJvbSAnLi9xdW90YS10aWVycy5qcyc7XG5cbi8qKlxuICogQ2FwYWJpbGl0eSBzY29wZSBjYXRhbG9nIGZvciBtYWNoaW5lL2F1dG9tYXRpb24gdG9rZW5zLiBBIHNjb3BlZCB0b2tlbiBjYXJyaWVzXG4gKiBleGFjdGx5IG9uZSBvZiB0aGVzZSBpbnN0ZWFkIG9mIHJvbGUtYmFzZWQgcGVybWlzc2lvbnM7IGVuZHBvaW50cyB0aGF0IGFjY2VwdCBhXG4gKiBzY29wZWQgaWRlbnRpdHkgY2hlY2sgaXQgdmlhIGBoYXNTY29wZWAuIEtlcHQgYSBjbG9zZWQgdW5pb24gKG1pcnJvcmluZ1xuICoge0BsaW5rIFBlcm1pc3Npb259KSBzbyBhIHR5cG8gb24gZWl0aGVyIHRoZSBtaW50IG9yIHRoZSBjaGVjayBzaWRlIGlzIGEgY29tcGlsZVxuICogZXJyb3IuIEFkZCBhIHZhbHVlIGhlcmUgd2hlbiBpbnRyb2R1Y2luZyBhIG5ldyBzY29wZWQtdG9rZW4gc3VyZmFjZS5cbiAqXG4gKiAtIGByZXBvcnRpbmc6aW5nZXN0YCDigJQgdGhlIEFXUyBldmVudC1pbmdlc3Rpb24gTGFtYmRhJ3Mgd3JpdGVzIChgL3JlcG9ydHMvZXZlbnRzYCxcbiAqICAgYC9yZXBvcnRzL2luZ2VzdC1oZWFsdGhgKSBhbmQgdGhlIGluY2lkZW50IHdlYmhvb2suXG4gKiAtIGByZWdpc3RyeTpwdXNoYCAgICDigJQgYGRvY2tlciBwdXNoYCBpbnRvIHRoZSBvd25pbmcgb3JnJ3Mgb3duIG5hbWVzcGFjZSB2aWFcbiAqICAgaW1hZ2UtcmVnaXN0cnkncyBgL3Rva2VuYCBlbmRwb2ludC4gR3JhbnRzIHRoZSByYXctaW1hZ2Ugd3JpdGUgdGhhdFxuICogICBgcGx1Z2luczp3cml0ZWAgZ3JhbnRzIGEgcGVyc29uLCBhbmQgbm90aGluZyBlbHNlOiBhIHNjb3BlZCB0b2tlbiBjYXJyaWVzIG5vXG4gKiAgIHBlcm1pc3Npb25zLCBzbyBpdCBjYW4gbmVpdGhlciByZWFkIHRoZSBBUEkgbm9yIHB1c2ggb3V0c2lkZSBpdHMgb3JnLlxuICogLSBgc2NpbWAgICAgICAgICAgICAg4oCUIGFuIGlkZW50aXR5IHByb3ZpZGVyJ3MgU0NJTSAyLjAgY2xpZW50ICgzYikgZHJpdmluZ1xuICogICBgL3NjaW0vdjIvVXNlcnNgIGFuZCBgL3NjaW0vdjIvR3JvdXBzYCBmb3IgdGhlIGtleSdzIE9XTiBvcmcuIEl0IHByb3Zpc2lvbnNcbiAqICAgYW5kIGRlYWN0aXZhdGVzIG1lbWJlcnNoaXBzIGFuZCBtb3ZlcyBwZW9wbGUgYmV0d2VlbiBkaXJlY3RvcnkgZ3JvdXBzOyBpdFxuICogICBjYW4gbmV2ZXIgcmVhZCBvciB3cml0ZSBhbnl0aGluZyBlbHNlLCBhbmQg4oCUIGJlY2F1c2UgYSBzY29wZWQgdG9rZW4gY2Fycmllc1xuICogICBubyBwZXJtaXNzaW9ucyDigJQgaXQgY2Fubm90IGF1dGhvciB0aGUgZ3JvdXAg4oaSIFJvbGUgcnVsZXMgaXRzIHN5bmNzIHJlc29sdmVcbiAqICAgdGhyb3VnaC4gT25seSBhIHNlcnZpY2UtYWNjb3VudCBrZXkgbWF5IGNhcnJ5IGl0OyBhIHBlcnNvbidzIHRva2VuIG5ldmVyIGRvZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFRva2VuU2NvcGUgPSAncmVwb3J0aW5nOmluZ2VzdCcgfCAncmVnaXN0cnk6cHVzaCcgfCAnc2NpbSc7XG5cbi8qKlxuICogUnVudGltZSBjYXRhbG9nIG9mIHtAbGluayBUb2tlblNjb3BlfSAoYSB1bmlvbiBpcyBlcmFzZWQgYXQgcnVudGltZSkuIFRoaXMgaXNcbiAqIHRoZSBPTkUgYWxsb3dsaXN0IGV2ZXJ5IG1pbnQgcGF0aCB2YWxpZGF0ZXMgYWdhaW5zdCDigJQgcGxhdGZvcm0ncyBrZXkvdG9rZW5cbiAqIGlzc3VlIHJvdXRlcyBpbmNsdWRlZCDigJQgc28gYSBuZXcgc2NvcGUgaXMgYWRkZWQgaW4gZXhhY3RseSBvbmUgcGxhY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBUT0tFTl9TQ09QRVM6IHJlYWRvbmx5IFRva2VuU2NvcGVbXSA9IFsncmVwb3J0aW5nOmluZ2VzdCcsICdyZWdpc3RyeTpwdXNoJywgJ3NjaW0nXTtcblxuLyoqXG4gKiBXaGF0IGtpbmQgb2YgcHJpbmNpcGFsIGEgdG9rZW4gc3BlYWtzIGZvci4gQXV0aCBkZWNpc2lvbnMgYnJhbmNoIG9uIHRoaXMgY2xhaW1cbiAqIOKAlCBuZXZlciBvbiB0aGUgc2hhcGUgb2YgYHN1YmAgb3Igb24gd2hpY2ggb3B0aW9uYWwgY2xhaW1zIGhhcHBlbiB0byBiZSBwcmVzZW50LlxuICpcbiAqIC0gYHVzZXJgICAgICAgICAgICAg4oCUIGEgcGVyc29uIChzZXNzaW9uLCBtYWNoaW5lIHNlc3Npb24sIFBBVCBvciBpbXBlcnNvbmF0aW9uKS5cbiAqIC0gYHNlcnZpY2VfYWNjb3VudGAg4oCUIGEgbm9uLWh1bWFuIGFjY291bnQgb3duZWQgYnkgT05FIG9yZywgaG9sZGluZyBvcmcgUm9sZXNcbiAqICAgICAgICAgICAgICAgICAgICAgICBhbmQgYXV0aGVudGljYXRpbmcgd2l0aCBhIGBwYl9zYV/igKZgIGtleSBleGNoYW5nZWQgYXRcbiAqICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybS4gTmV2ZXIgc2F0aXNmaWVzIGFuIGFzc3VyYW5jZS9zdGVwLXVwIGdhdGUuXG4gKiAtIGBzZXJ2aWNlYCAgICAgICAgIOKAlCBhbiBpbnRlcm5hbCBQaXBlbGluZSBCdWlsZGVyIHNlcnZpY2UgKHtAbGluayBzaWduU2VydmljZVRva2VufSkuXG4gKi9cbmV4cG9ydCB0eXBlIFByaW5jaXBhbFR5cGUgPSAndXNlcicgfCAnc2VydmljZV9hY2NvdW50JyB8ICdzZXJ2aWNlJztcblxuLyoqXG4gKiBIb3cgYSB0b2tlbiBpcyB1c2VkLiBgYWNjZXNzYCBpcyBhIHNlc3Npb24tc3R5bGUgYWNjZXNzIHRva2VuIChpbnRlcmFjdGl2ZSxcbiAqIG1hY2hpbmUtc2Vzc2lvbiBvciBzZXJ2aWNlKTsgYGFwaV9rZXlgIGlzIGEgc3RhbmRhbG9uZSBjcmVkZW50aWFsIHRyYWNrZWQgYnlcbiAqIGl0cyBvd24gcmVjb3JkIOKAlCBhIFBlcnNvbmFsIEFjY2VzcyBUb2tlbiBvciBhIHNlcnZpY2UtYWNjb3VudCBrZXksIG5hbWVkIGJ5XG4gKiBganRpYC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9rZW5Vc2UgPSAnYWNjZXNzJyB8ICdhcGlfa2V5JztcblxuLyoqXG4gKiBBdXRoZW50aWNhdGlvbiBtZXRob2RzIChgYW1yYCwgUkZDIDgxNzYgc3R5bGUpIHRoYXQgZXN0YWJsaXNoZWQgYSB1c2VyJ3NcbiAqIHNlc3Npb24uIGBwd2RgIHBhc3N3b3JkIHNpZ24taW47IGBvYXV0aGAgc29jaWFsIHNpZ24taW4gKEdvb2dsZSwgR2l0SHViIOKApik7XG4gKiBgc3NvYCBwZXItb3JnIE9JREMgc2luZ2xlIHNpZ24tb247IGB3ZWJhdXRobmAgYSBwYXNza2V5IChXZWJBdXRobiBhc3NlcnRpb25cbiAqIHdpdGggdXNlciB2ZXJpZmljYXRpb24pOyBgc3RlcHVwYCBhIHN0ZXAtdXAgcmUtdmVyaWZpY2F0aW9uIHRva2VuOyBgbWZhYCBhXG4gKiBzZWNvbmQgZmFjdG9yIHdhcyBwcmVzZW50ZWQgYXMgd2VsbCDigJQgdG9kYXkgYW4gYXV0aGVudGljYXRvci1hcHAgY29kZSAoVE9UUClcbiAqIG9yIG9uZSBvZiBpdHMgcmVjb3ZlcnkgY29kZXMsIHNvIGl0IGFwcGVhcnMgQUxPTkdTSURFIHRoZSBtZXRob2QgdGhhdFxuICogaWRlbnRpZmllZCB0aGUgdXNlciAoYFsncHdkJywgJ21mYSddYCksIG5ldmVyIG9uIGl0cyBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIEF1dGhNZXRob2QgPSAncHdkJyB8ICdvYXV0aCcgfCAnc3NvJyB8ICd3ZWJhdXRobicgfCAnc3RlcHVwJyB8ICdtZmEnO1xuXG4vKipcbiAqIEF1dGhlbnRpY2F0b3IgYXNzdXJhbmNlIGxldmVsIG9mIHRoZSBzZXNzaW9uIGEgdG9rZW4gc3BlYWtzIGZvci5cbiAqXG4gKiAtIGAxYCDigJQgb25lIGZhY3RvcjogYSBwYXNzd29yZCwgYSBzb2NpYWwgc2lnbi1pbiwgb3IgU1NPIHRocm91Z2ggYW4gSWRQIHRoZVxuICogICBvcmcgaGFzIE5PVCBtYXJrZWQgYXMgZW5mb3JjaW5nIE1GQS5cbiAqIC0gYDJgIOKAlCBNRkEtZ3JhZGU6IGEgcGFzc2tleSBhc3NlcnRlZCB3aXRoIHVzZXIgdmVyaWZpY2F0aW9uLCBhIHBhc3N3b3JkIHBsdXNcbiAqICAgYW4gYXV0aGVudGljYXRvci1hcHAgY29kZSwgb3IgU1NPIHRocm91Z2ggYW4gSWRQIHRoZSBvcmcgSEFTIG1hcmtlZCBhc1xuICogICBlbmZvcmNpbmcgTUZBIChwcm92aWRlcnMgZG9uJ3Qgc2VuZCBgYW1yYCByZWxpYWJseSwgc28gdGhlIG9yZydzIG93blxuICogICBzdGF0ZW1lbnQgYWJvdXQgaXRzIElkUCBpcyB0aGUgc2lnbmFsKS5cbiAqXG4gKiBGaXhlZCB3aGVuIHRoZSBzZXNzaW9uIGlzIG9wZW5lZCBhbmQgc3RvcmVkIG9uIGl0cyByZWZyZXNoLXNlc3Npb24gc2xvdCwgc29cbiAqIHJlZnJlc2ggLyByZW5ld2FsIC8gc3dpdGNoLW9yZyBjb3B5IGl0IHZlcmJhdGltIGFuZCBjYW4gbmV2ZXIgUkFJU0UgaXQg4oCUXG4gKiBlYXJuaW5nIGFhbCAyIGFsd2F5cyBtZWFucyBhdXRoZW50aWNhdGluZyBhZ2FpbiB3aXRoIGEgc2Vjb25kIGZhY3Rvci5cbiAqL1xuZXhwb3J0IHR5cGUgQXNzdXJhbmNlTGV2ZWwgPSAxIHwgMjtcblxuLyoqIFJ1bnRpbWUgY2F0YWxvZ3MgZm9yIHRoZSBjbGFpbSB1bmlvbnMgYWJvdmUgKGEgdW5pb24gaXMgZXJhc2VkIGF0IHJ1bnRpbWUpLiAqL1xuZXhwb3J0IGNvbnN0IFBSSU5DSVBBTF9UWVBFUzogcmVhZG9ubHkgUHJpbmNpcGFsVHlwZVtdID0gWyd1c2VyJywgJ3NlcnZpY2VfYWNjb3VudCcsICdzZXJ2aWNlJ107XG5leHBvcnQgY29uc3QgVE9LRU5fVVNFUzogcmVhZG9ubHkgVG9rZW5Vc2VbXSA9IFsnYWNjZXNzJywgJ2FwaV9rZXknXTtcbmV4cG9ydCBjb25zdCBBVVRIX01FVEhPRFM6IHJlYWRvbmx5IEF1dGhNZXRob2RbXSA9IFsncHdkJywgJ29hdXRoJywgJ3NzbycsICd3ZWJhdXRobicsICdzdGVwdXAnLCAnbWZhJ107XG5cbi8qKlxuICogUXVvdGEgdHlwZSBpZGVudGlmaWVycy5cbiAqXG4gKiAtIGBwbHVnaW5zYCAvIGBwaXBlbGluZXNgIOKAlCBjb3VudCBvZiBjcmVhdGVkIGVudGl0aWVzXG4gKiAtIGBhcGlDYWxsc2Ag4oCUIGdlbmVyaWMgQVBJIGNhbGwgY291bnQgKHJlYWQtaGVhdnkgcGF0aHMpXG4gKiAtIGBhaUNhbGxzYCDigJQgQUkgcHJvdmlkZXIgaW52b2NhdGlvbnMgKGNvdW50ZWQgc2VwYXJhdGVseSBiZWNhdXNlIGVhY2ggY2FsbFxuICogICBoYXMgZXh0ZXJuYWwgZG9sbGFyIGNvc3Q7IHNpemVkIHNtYWxsZXIgdGhhbiBhcGlDYWxscyBwZXIgdGllcilcbiAqIC0gYHN0b3JhZ2VCeXRlc2Ag4oCUIHJlZ2lzdHJ5IHN0b3JhZ2UgYnVkZ2V0IHBlciBvcmcuIFVubGlrZSB0aGUgb3RoZXJzXG4gKiAgICh3aGljaCBjb3VudCBkaXNjcmV0ZSBldmVudHMpLCB0aGlzIGlzIGEgbWVhc3VyZWQgdG90YWwgcmVjb21wdXRlZFxuICogICBvbiBkZW1hbmQuIEluY3JlbWVudGVkIGJ5IHRoZSBpbWFnZS1yZWdpc3RyeSdzIHB1c2gtZ2F0ZSBiZWZvcmVcbiAqICAgaXNzdWluZyBhIHRva2VuIHdob3NlIHNjb3BlIGluY2x1ZGVzIGBwdXNoYDsgdGhlIEdDIHNjaGVkdWxlclxuICogICBldmVudHVhbGx5IGZyZWVzIHRoZSBieXRlcywgdGhlbiB0aGUgbmV4dCBwdXNoLWdhdGUgY2hlY2sgcmVhZHNcbiAqICAgdGhlIGxvd2VyIHZhbHVlLiBOT1QgYSBjb3VudGVyLXN0eWxlIHF1b3RhIGluIHRoZSBzZW5zZSBvZlxuICogICBgaW5jcmVtZW50VXNhZ2VgIOKAlCB0aGUgcmVnaXN0cnkgcHVzaGVzIHRoZSBtZWFzdXJlZCB0b3RhbCB2aWFcbiAqICAgYHVwZGF0ZUxpbWl0c2AvYHJlc2V0VXNhZ2VgIGZsb3dzLiBUaWVyIGxpbWl0cyBhcmUgYnl0ZXMuXG4gKiAtIGBkYXNoYm9hcmRzYCAvIGBhbGVydFJ1bGVzYCAvIGBhbGVydERlc3RpbmF0aW9uc2AgLyBgaWRwQ29uZmlnc2Ag4oCUXG4gKiAgIHJlc291cmNlLWNvdW50IHF1b3RhcyBhZGRlZCB0byBjbG9zZSBwZXItb3JnIERvUyBzdXJmYWNlcyBpbiB0aGVcbiAqICAgdXNlci1lZGl0YWJsZSBmZWF0dXJlIHRhYmxlcy4gV2l0aG91dCB0aGVzZSBjYXBzIGEgc2luZ2xlIG9yZyBjb3VsZFxuICogICBzcGFtIHRob3VzYW5kcyBvZiBkYXNoYm9hcmRzIC8gcnVsZXMgYW5kIGJsb2F0IHRoZSBzaGFyZWQgUG9zdGdyZXMgL1xuICogICBNb25nbyB3b3JraW5nIHNldHMuIENvdW50ZWQgYXQgY3JlYXRlIHRpbWU7IGRlY3JlbWVudGVkIG9uIGRlbGV0ZS5cbiAqIC0gYGxpc3RpbmdzYCDigJQgYWN0aXZlLCBub24tc3VzcGVuZGVkIHBsdWdpbi1lY29zeXN0ZW0gbGlzdGluZ3MgYSAocm9vdCkgb3JnXG4gKiAgIHB1Ymxpc2hlcyAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuIEEgQ09VTlQgcXVvdGEgbGlrZVxuICogICBgcGx1Z2luc2A6IGNoZWNrZWQgYXQgcHVibGlzaC1yZXF1ZXN0IHN1Ym1pdCBhbmQgcmUtY2hlY2tlZCBhdCBhcHByb3ZhbDtcbiAqICAgaW5zdGFsbHMgbmV2ZXIgY291bnQuXG4gKi9cbi8vIE5PVEU6IGBzZWF0c2AgaXMgaW50ZW50aW9uYWxseSBOT1QgaGVyZS4gSXQncyBhIHRpZXIgbGltaXQgKFF1b3RhVGllckxpbWl0cylcbi8vIGVuZm9yY2VkIGJ5IGNvbXBhcmluZyB0aGUgb3JnJ3MgTElWRSBtZW1iZXIgY291bnQgYXQgaW52aXRlIHRpbWUg4oCUIG5vdCBhblxuLy8gaW5jcmVtZW50aW5nIHBlci1wZXJpb2QgY291bnRlciBsaWtlIHRoZSBjb25zdW1hYmxlIHF1b3RhcyBiZWxvdy5cbmV4cG9ydCB0eXBlIFF1b3RhVHlwZSA9XG4gIHwgJ3BsdWdpbnMnIHwgJ3BpcGVsaW5lcycgfCAnYXBpQ2FsbHMnIHwgJ2FpQ2FsbHMnIHwgJ3N0b3JhZ2VCeXRlcydcbiAgfCAnZGFzaGJvYXJkcycgfCAnYWxlcnRSdWxlcycgfCAnYWxlcnREZXN0aW5hdGlvbnMnIHwgJ2lkcENvbmZpZ3MnXG4gIHwgJ2xpc3RpbmdzJztcblxuLyoqXG4gKiBWYWxpZCBxdW90YSB0eXBlIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1FVT1RBX1RZUEVTID0gW1xuICAncGx1Z2lucycsICdwaXBlbGluZXMnLCAnYXBpQ2FsbHMnLCAnYWlDYWxscycsICdzdG9yYWdlQnl0ZXMnLFxuICAnZGFzaGJvYXJkcycsICdhbGVydFJ1bGVzJywgJ2FsZXJ0RGVzdGluYXRpb25zJywgJ2lkcENvbmZpZ3MnLFxuICAnbGlzdGluZ3MnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIFRydWUgaWYgdmFsdWUgaXMgYSB2YWxpZCBRdW90YVR5cGVcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaWYgKGlzVmFsaWRRdW90YVR5cGUocmVxLmJvZHkucXVvdGFUeXBlKSkge1xuICogICAvLyBxdW90YVR5cGUgaXMgZ3VhcmFudGVlZCB0byBiZSBRdW90YVR5cGVcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFF1b3RhVHlwZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFF1b3RhVHlwZSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFZBTElEX1FVT1RBX1RZUEVTLmluY2x1ZGVzKHZhbHVlIGFzIFF1b3RhVHlwZSk7XG59XG5cbi8qKlxuICogUmVzdWx0IGZyb20gcXVvdGEgY2hlY2sgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhQ2hlY2tSZXN1bHQge1xuICAvKiogV2hldGhlciB0aGUgcmVxdWVzdCBpcyBhbGxvd2VkICovXG4gIGFsbG93ZWQ6IGJvb2xlYW47XG4gIC8qKiBNYXhpbXVtIHF1b3RhIGxpbWl0ICgtMSBmb3IgdW5saW1pdGVkKSAqL1xuICBsaW1pdDogbnVtYmVyO1xuICAvKiogQ3VycmVudCB1c2FnZSBjb3VudCAqL1xuICB1c2VkOiBudW1iZXI7XG4gIC8qKiBSZW1haW5pbmcgcXVvdGEgKC0xIGZvciB1bmxpbWl0ZWQpICovXG4gIHJlbWFpbmluZzogbnVtYmVyO1xuICAvKiogSVNPIHRpbWVzdGFtcCB3aGVuIHF1b3RhIHJlc2V0cyAqL1xuICByZXNldEF0OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHF1b3RhIGlzIHVubGltaXRlZCAqL1xuICB1bmxpbWl0ZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUcnVlIE9OTFkgd2hlbiB0aGlzIHJlc3VsdCBpcyB0aGUgZmFpbC1vcGVuIHNlbnRpbmVsIHJldHVybmVkIGJlY2F1c2UgdGhlXG4gICAqIHF1b3RhIHNlcnZpY2Ugd2FzIHVucmVhY2hhYmxlIC8gcmV0dXJuZWQgbm9uLW9rIChub3QgYSByZWFsIHF1b3RhIHJlYWRpbmcpLlxuICAgKiBMZXRzIGZhaWwtY2xvc2VkIGNhbGxlcnMgKGUuZy4gdGhlIHJlZ2lzdHJ5IHN0b3JhZ2UgcHVzaC1nYXRlKSBkaXN0aW5ndWlzaFxuICAgKiBhbiBvdXRhZ2UgZnJvbSBhIGdlbnVpbmUgYGxpbWl0OiAtMWAgKHVubGltaXRlZCkgb3JnLiBBYnNlbnQgb24gcmVhbCByZXN1bHRzLlxuICAgKi9cbiAgZmFpbE9wZW4/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFF1b3RhIGluZm9ybWF0aW9uIGZvciBlcnJvciByZXNwb25zZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFJbmZvIHtcbiAgdHlwZTogUXVvdGFUeXBlO1xuICBsaW1pdDogbnVtYmVyO1xuICB1c2VkOiBudW1iZXI7XG4gIHJlbWFpbmluZzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkIEFQSSBzdWNjZXNzIHJlc3BvbnNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaVN1Y2Nlc3NSZXNwb25zZTxUID0gdW5rbm93bj4ge1xuICBzdWNjZXNzOiB0cnVlO1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIGRhdGE/OiBUO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFN0YW5kYXJkIEFQSSBlcnJvciByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlFcnJvclJlc3BvbnNlIHtcbiAgc3VjY2VzczogZmFsc2U7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBjb2RlPzogc3RyaW5nO1xuICBkZXRhaWxzPzogdW5rbm93bjtcbiAgcXVvdGE/OiBRdW90YUluZm87XG59XG5cbi8qKlxuICogQ29tYmluZWQgQVBJIHJlc3BvbnNlIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIEFwaVJlc3BvbnNlPFQgPSB1bmtub3duPiA9IEFwaVN1Y2Nlc3NSZXNwb25zZTxUPiB8IEFwaUVycm9yUmVzcG9uc2U7XG5cbi8qKlxuICogSldUIHBheWxvYWQgZnJvbSBhY2Nlc3MgdG9rZW5zLlxuICpcbiAqIFVzZXJzIGNhbiBiZWxvbmcgdG8gbXVsdGlwbGUgb3JnYW5pemF0aW9ucy4gVGhlIHRva2VuIGlzIHNjb3BlZCB0byBvbmVcbiAqIGFjdGl2ZSBvcmdhbml6YXRpb24gYXQgYSB0aW1lLiBUaGUgYHJvbGVgIGZpZWxkIGlzIHRoZSB1c2VyJ3MgcGVyLW9yZ1xuICogcm9sZSBpbiB0aGF0IG9yZ2FuaXphdGlvbiAoZnJvbSB0aGUgVXNlck9yZ2FuaXphdGlvbiBqdW5jdGlvbiBjb2xsZWN0aW9uKSxcbiAqIGFuZCBgaXNBZG1pbmAgaXMgZGVyaXZlZCBhcyBgcm9sZSA9PT0gJ2FkbWluJyB8fCByb2xlID09PSAnb3duZXInYC5cbiAqXG4gKiBVc2UgYFBPU1QgL2F1dGgvc3dpdGNoLW9yZ2AgdG8gY2hhbmdlIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uLCB3aGljaFxuICogcmUtaXNzdWVzIHRva2VucyB3aXRoIHRoZSBuZXcgb3JnJ3Mgcm9sZSBhbmQgY29udGV4dC5cbiAqL1xuLyoqXG4gKiBDb2Fyc2UgcGVyLW9yZyBtZW1iZXJzaGlwIGxhYmVsLCBERVJJVkVEIGZyb20gdGhlIFJvbGVzIGEgdXNlciBpcyBhc3NpZ25lZFxuICogKHRoZSBoaWdoZXN0IGBncmFudHNSb2xlYCBhbW9uZyB0aGVtOyBgb3duZXJgIGlzIHNldCBvbmx5IGJ5IG93bmVyc2hpcFxuICogdHJhbnNmZXIpLiBJdCBpcyBhIGRpc3BsYXkvYXV0aG9yaXR5IGxhYmVsIOKAlCBkcml2aW5nIGBpc0FkbWluYCwgb3duZXJzaGlwLFxuICogYW5kIHNlYXQgYWNjb3VudGluZyDigJQgTk9UIGEgcGVybWlzc2lvbiBzb3VyY2UuIEVmZmVjdGl2ZSBwZXJtaXNzaW9ucyBjb21lXG4gKiBzb2xlbHkgZnJvbSB0aGUgdXNlcidzIGFzc2lnbmVkIFJvbGVzIChzZWUgYHJlc29sdmVVc2VyUGVybWlzc2lvbnNgKS4gTm90IGFcbiAqIGdsb2JhbCByb2xlLlxuICovXG5leHBvcnQgdHlwZSBPcmdSb2xlID0gJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcblxuZXhwb3J0IGludGVyZmFjZSBKd3RQYXlsb2FkIHtcbiAgLyoqIFVzZXIgSUQgKHN1YmplY3QpICovXG4gIHN1Yjogc3RyaW5nO1xuICAvKiogVXNlcm5hbWUgKi9cbiAgdXNlcm5hbWU6IHN0cmluZztcbiAgLyoqIFVzZXIgZW1haWwgKi9cbiAgZW1haWw6IHN0cmluZztcbiAgLyoqIFdoaWNoIGtpbmQgb2YgcHJpbmNpcGFsIHRoaXMgdG9rZW4gc3BlYWtzIGZvciAoc2VlIHtAbGluayBQcmluY2lwYWxUeXBlfSkuICovXG4gIHByaW5jaXBhbFR5cGU6IFByaW5jaXBhbFR5cGU7XG4gIC8qKiBIb3cgdGhlIHRva2VuIGlzIHVzZWQgKHNlZSB7QGxpbmsgVG9rZW5Vc2V9KTsgUEFUcyBhcmUgYGFwaV9rZXlgLiAqL1xuICB0b2tlbl91c2U6IFRva2VuVXNlO1xuICAvKipcbiAgICogTWV0aG9kcyB0aGF0IGF1dGhlbnRpY2F0ZWQgdGhlIHNlc3Npb24gKHVzZXIgcHJpbmNpcGFscykuIEtlcHQgb24gdGhlXG4gICAqIHJlZnJlc2gtc2Vzc2lvbiBzbG90LCBzbyByZWZyZXNoIC8gcmVuZXcgLyBzd2l0Y2gtb3JnIGNhcnJ5IGl0IHVuY2hhbmdlZC5cbiAgICogQWJzZW50IG9uIHNlcnZpY2UgdG9rZW5zLlxuICAgKi9cbiAgYW1yPzogQXV0aE1ldGhvZFtdO1xuICAvKiogQXNzdXJhbmNlIGxldmVsICh1c2VyIHByaW5jaXBhbHMpLiBOZXZlciByYWlzZWQgYnkgcmVmcmVzaCAvIHJlbmV3IC8gc3dpdGNoLW9yZy4gKi9cbiAgYWFsPzogQXNzdXJhbmNlTGV2ZWw7XG4gIC8qKiBFcG9jaCBzZWNvbmRzIG9mIHRoZSBzaWduLWluIHRoYXQgZXN0YWJsaXNoZWQgdGhlIHNlc3Npb24gKHVzZXIgcHJpbmNpcGFscykuXG4gICAqICBOZXZlciByZXNldCBieSByZWZyZXNoIC8gcmVuZXcgLyBzd2l0Y2gtb3JnLiAqL1xuICBhdXRoX3RpbWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYWN0aXZlIG9yZyBSRVFVSVJFUyBNRkEgYW5kIGl0cyBncmFjZSBwZXJpb2QgaGFzIHBhc3NlZC5cbiAgICpcbiAgICogQ2FycmllZCBhcyBhIGNsYWltIHNvIG5vIHNlcnZpY2UgaGFzIHRvIGxvb2sgdGhlIHBvbGljeSB1cDogdGhlIG9yZyBwb2xpY3lcbiAgICogaXMgZW5mb3JjZWQgd2hlcmUgdGhlIHRva2VuIGlzIElTU1VFRCAoYSBzZXNzaW9uIHNjb3BlZCB0byBzdWNoIGFuIG9yZyBnZXRzXG4gICAqIGBhYWw6IDJgIG9yIGlzIHJlZnVzZWQpLCBhbmQgdGhpcyBjbGFpbSBpcyB0aGUgcmVjb3JkIG9mIHRoYXQgZGVjaXNpb24sIGZvclxuICAgKiBVSSBjb3B5IGFuZCBhdWRpdCByYXRoZXIgdGhhbiBmb3IgYSBzZWNvbmQgZW5mb3JjZW1lbnQgcG9pbnQuXG4gICAqL1xuICBtZmFSZXF1aXJlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgYWN0aXZlIG9yZydzIFwiYWRtaW5pc3RyYXRpdmUgYWN0aW9ucyByZXF1aXJlIE1GQVwiIHBvbGljeVxuICAgKiAoYGFkbWluQWN0aW9uc1JlcXVpcmVNZmFgLCBzdHJpY3Rlc3QgYWNyb3NzIHRoZSBvcmcgYW5kIGl0cyBhbmNlc3RvcnMpLlxuICAgKiBQcmVzZW50IOKAlCBhbmQgYWx3YXlzIGAyYCDigJQgb25seSB3aGVuIHRoZSBwb2xpY3kgaXMgb24uIEl0IGlzIHJlc29sdmVkIHdoZW5cbiAgICogdGhlIHRva2VuIGlzIElTU1VFRCwgc28gc2VydmljZXMgdGhhdCBjYW4ndCByZWFkIHRoZSBvcmcgZG9jdW1lbnQgc3RpbGwga25vd1xuICAgKiB0aGUgcG9saWN5OiBgcmVxdWlyZU9yZ0FkbWluQXNzdXJhbmNlYCByZWZ1c2VzIGFuIGBhYWw6IDFgIHNlc3Npb24gb24gYW5cbiAgICogYWRtaW5pc3RyYXRpdmUgcm91dGUgd2hlbiB0aGlzIGNsYWltIGlzIHByZXNlbnQuIENoYW5naW5nIHRoZSBwb2xpY3kgYnVtcHNcbiAgICogZXZlcnkgYWZmZWN0ZWQgbWVtYmVyJ3MgYHRva2VuVmVyc2lvbmAsIHNvIHRoZSBjbGFpbSBjYW4ndCBnbyBzdGFsZS5cbiAgICovXG4gIG9yZ19hZG1pbl9hYWw/OiAyO1xuICAvKipcbiAgICogQk9PVFNUUkFQLUFETUlOIEVYQ0VQVElPTi4gU2V0IG9ubHkgb24gYSBzZXNzaW9uIG9wZW5lZCBieVxuICAgKiB0aGUgaW5zdGFsbCdzIGJvb3RzdHJhcCBhZG1pbiAoYEJPT1RTVFJBUF9TVVBFUkFETUlOX0VNQUlMU2AsIHN5c3RlbSBvcmcpXG4gICAqIHdoaWxlIHRoZXkgc3RpbGwgaGF2ZSBubyBlbnJvbGxlZCBmYWN0b3IuIFN1Y2ggYSBzZXNzaW9uIGlzIGBhYWw6IDFgIGFuZCBtYXlcbiAgICogcmVhY2ggT05MWSBlbnJvbG1lbnQsIHNpZ24tb3V0IGFuZCB0aGUgcm91dGVzIGBpbml0LXBsYXRmb3JtLnNoYCBjYWxscztcbiAgICogZXZlcnkgb3RoZXIgc2VydmljZSByZWZ1c2VzIGl0IG91dHJpZ2h0IChzZWUgYHJlcXVpcmVBdXRoYCkuIFRoZSBleGNlcHRpb25cbiAgICogY2xvc2VzIHBlcm1hbmVudGx5IGF0IHRoZSBmaXJzdCBlbnJvbG1lbnQgYW5kIG5ldmVyIHJlb3BlbnMuXG4gICAqL1xuICBtZmFFbnJvbGxtZW50UGVuZGluZz86IGJvb2xlYW47XG4gIC8qKiBQZXItb3JnIHJvbGUgaW4gdGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gKCdvd25lcicgfCAnYWRtaW4nIHwgJ21lbWJlcicpLiBOb3QgYSBnbG9iYWwgcm9sZS4gKi9cbiAgcm9sZTogT3JnUm9sZTtcbiAgLyoqIERlcml2ZWQ6IHRydWUgd2hlbiByb2xlIGlzICdhZG1pbicgb3IgJ293bmVyJyBpbiB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAqL1xuICBpc0FkbWluPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFJlc29sdmVkIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9ucyBmb3IgdGhlIGFjdGl2ZSBvcmcvdGVhbSDigJQgdGhlIHVuaW9uIG9mXG4gICAqIHRoZSBwZXJtaXNzaW9ucyBjYXJyaWVkIGJ5IGV2ZXJ5IFJvbGUgdGhlIHVzZXIgaXMgYXNzaWduZWQgKHNlZVxuICAgKiBgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc2ApLiBBYnNlbnQgb24gbWFjaGluZS9zY29wZWQgdG9rZW5zLiBTdXBlcmFkbWlucyBhcmVcbiAgICogZ3JhbnRlZCBhbGwgcGVybWlzc2lvbnMgaW1wbGljaXRseSBhbmQgbWF5IG9taXQgdGhpcy4gRW5kcG9pbnRzIGVuZm9yY2UgdmlhXG4gICAqIGByZXF1aXJlUGVybWlzc2lvbiguLi4pYC5cbiAgICovXG4gIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdO1xuICAvKipcbiAgICogR2xvYmFsIHN1cGVyLWFkbWluIGZsYWcgKGNyb3NzLW9yZykuIFdoZW4gYHRydWVgLCB0aGUgdXNlciBpcyB0cmVhdGVkXG4gICAqIGFzIGEgc3lzdGVtIGFkbWluaXN0cmF0b3IgcmVnYXJkbGVzcyBvZiB3aGljaCBvcmcgdGhleSdyZSBjdXJyZW50bHlcbiAgICogYWN0aW5nIHVuZGVyLiBUaGlzIGlzIHRoZSBTT0xFIHNpZ25hbCBmb3Igc3lzYWRtaW4gYXV0aG9yaXR5IOKAlCBtZW1iZXJzaGlwIGluXG4gICAqIHRoZSB3ZWxsLWtub3duIFwic3lzdGVtXCIgb3JnIGdyYW50cyBub3RoaW5nLCBiZWNhdXNlIHRoYXQgd291bGQgY29uZmxhdGVcbiAgICogXCJQaXBlbGluZSBCdWlsZGVyIG9wZXJhdG9yXCIgd2l0aCBcImN1c3RvbWVyIHRlbmFudFwiIGluIHRoZSBkYXRhIG1vZGVsLlxuICAgKi9cbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbjtcbiAgLyoqIE9yZ2FuaXphdGlvbidzIHF1b3RhIHRpZXIuICovXG4gIHRpZXI/OiBRdW90YVRpZXI7XG4gIC8qKiBSZXNvbHZlZCBmZWF0dXJlIGZsYWdzIGZvciB0aGlzIHVzZXIvb3JnICovXG4gIGZlYXR1cmVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBOYXJyb3cgY2FwYWJpbGl0eSBzY29wZSBmb3IgbWFjaGluZS9hdXRvbWF0aW9uIHRva2VucyAoZS5nLlxuICAgKiBgJ3JlcG9ydGluZzppbmdlc3QnYCkuIEFic2VudCBvbiBub3JtYWwgaW50ZXJhY3RpdmUgdXNlciB0b2tlbnMuIEVuZHBvaW50c1xuICAgKiB0aGF0IGFjY2VwdCBhIHNjb3BlZCBpZGVudGl0eSBjaGVjayB0aGlzIChzZWUgYGhhc1Njb3BlYCkgaW5zdGVhZCBvZiByb2xlO1xuICAgKiBhIHNjb3BlZCB0b2tlbiBpcyBtaW50ZWQgd2l0aCBtaW5pbWFsIHJvbGUgZm9yIGxlYXN0LXByaXZpbGVnZS5cbiAgICovXG4gIHNjb3BlPzogVG9rZW5TY29wZTtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbidzIGBwZXJtaXNzaW9uc2Agd2VyZSBOQVJST1dFRCB0byBhIGNhdGFsb2cgc3Vic2V0IGNob3NlbiB3aGVuIHRoZVxuICAgKiBjcmVkZW50aWFsIHdhcyBjcmVhdGVkIChhIHBlcm1pc3Npb24tc2NvcGVkIHBlcnNvbmFsIGFjY2VzcyBrZXkgb3IgbWFjaGluZVxuICAgKiB0b2tlbikuIFRoZSBjbGFpbSBpcyB0aGUgcmVjb3JkIHRoYXQgYHBlcm1pc3Npb25zYCBpcyB0aGUgSU5URVJTRUNUSU9OIG9mXG4gICAqIHRoYXQgc3Vic2V0IHdpdGggdGhlIGhvbGRlcidzIGN1cnJlbnQgUm9sZXMg4oCUIG5vdCB0aGVpciBmdWxsIGF1dGhvcml0eSDigJQgc29cbiAgICogYW55dGhpbmcgdGhlIHRva2VuIG1pbnRzIGNhbiBvbmx5IGJlIG5hcnJvd2VyIHN0aWxsLCBhbmQgaXQgbmV2ZXIgY2Fycmllc1xuICAgKiBgaXNTdXBlckFkbWluYCBvciBhbiBhZG1pbiBgcm9sZWAgKGJvdGggd291bGQgYnlwYXNzIHRoZSBzdWJzZXQpLiBPbmx5IGV2ZXJcbiAgICogYHRydWVgOyBhYnNlbnQgb24gdW5yZXN0cmljdGVkIHRva2Vucy5cbiAgICovXG4gIHBlcm1pc3Npb25zUmVzdHJpY3RlZD86IGJvb2xlYW47XG4gIC8qKiBBY3RpdmUgb3JnYW5pemF0aW9uIElEIChmcm9tIFVzZXJPcmdhbml6YXRpb24gbWVtYmVyc2hpcCkgKi9cbiAgb3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnYW5pemF0aW9uIG5hbWUgKi9cbiAgb3JnYW5pemF0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE9yZyDihpIgdGVhbSBoaWVyYXJjaHkgKG9yZy10ZWFtLWhpZXJhcmNoeSBwcm9wb3NhbCwgcGhhc2UgMSkuXG4gICAqIGBwYXJlbnRPcmdhbml6YXRpb25JZGAgaXMgdGhlIGFjdGl2ZSBvcmcncyBkaXJlY3QgcGFyZW50OyBgcm9vdE9yZ2FuaXphdGlvbklkYFxuICAgKiBpcyB0aGUgdG9wIG9mIGl0cyBhbmNlc3RyeSBjaGFpbi4gQm90aCBhcmUgKipvbWl0dGVkIGZvciBmbGF0IChyb290KSBvcmdzKiog4oCUXG4gICAqIGNvbnN1bWVycyBzaG91bGQgdHJlYXQgdGhlIGVmZmVjdGl2ZSByb290IGFzIGByb290T3JnYW5pemF0aW9uSWQgPz8gb3JnYW5pemF0aW9uSWRgXG4gICAqICh1c2UgdGhlIHNoYXJlZCB7QGxpbmsgZWZmZWN0aXZlUm9vdE9yZ0lkfSBhY2Nlc3NvciByYXRoZXIgdGhhbiBjb2FsZXNjaW5nIGlubGluZSkuXG4gICAqIEN1cnJlbnRseSBldmVyeSBvcmcgaXMgZmxhdCwgc28gdGhlc2UgYXJlIGFic2VudCBvbiBhbGwgdG9rZW5zIHRvZGF5LlxuICAgKi9cbiAgcGFyZW50T3JnYW5pemF0aW9uSWQ/OiBzdHJpbmc7XG4gIC8qKiBSb290IG9yZ2FuaXphdGlvbiBJRCBvZiB0aGUgYWN0aXZlIG9yZydzIGFuY2VzdHJ5IGNoYWluIChzZWUgYHBhcmVudE9yZ2FuaXphdGlvbklkYCkuICovXG4gIHJvb3RPcmdhbml6YXRpb25JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFNldCBvbiB0b2tlbnMgaXNzdWVkIGJ5IHRoZSBzeXNhZG1pbiBpbXBlcnNvbmF0aW9uIGZsb3dcbiAgICogKGBQT1NUIC9hZG1pbi9pbXBlcnNvbmF0ZS86dXNlcklkYCkuIENhcnJpZXMgdGhlIG9yaWdpbmFsIHN5c2FkbWluJ3NcbiAgICogdXNlciBpZCBzbyBhdWRpdCBldmVudHMgc3RpbGwgYXR0cmlidXRlIGFjdGlvbnMgY29ycmVjdGx5LlxuICAgKi9cbiAgaW1wZXJzb25hdG9ySWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVbmlxdWUgdG9rZW4gaWQuIE9uIGFuIGltcGVyc29uYXRpb24gdG9rZW4gaXQgaWRlbnRpZmllcyB0aGUgU0VTU0lPTiwgc28gaXRcbiAgICogY2FuIGJlIHJldm9rZWQgb24gaXRzIG93biBhY3Jvc3MgZXZlcnkgc2VydmljZSAoc2VlXG4gICAqIGBUb2tlblJldm9jYXRpb25TdG9yZS5nZXRTZXNzaW9uUmV2b2NhdGlvbmApLiBQZXJzb25hbCBBY2Nlc3MgVG9rZW5zXG4gICAqIChgdG9rZW5fdXNlOiAnYXBpX2tleSdgKSBjYXJyeSBvbmUgdG9vLCB2YWxpZGF0ZWQgYWdhaW5zdCB0aGVpciBvd24gcmVjb3JkLlxuICAgKiBBIGBqdGlgIGFsb25lIG5ldmVyIGNsYXNzaWZpZXMgYSB0b2tlbiDigJQgYHRva2VuX3VzZWAgYW5kIGBpbXBlcnNvbmF0b3JJZGAgZG8uXG4gICAqL1xuICBqdGk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHRoZSB0b2tlbiBpcyByZWFkLW9ubHkg4oCUIGFueSBub24tR0VUIHJlcXVlc3QgaXMgcmVqZWN0ZWRcbiAgICogdXBzdHJlYW0gYnkgdGhlIHBsYXRmb3JtJ3MgcmVhZC1vbmx5IGltcGVyc29uYXRpb24gZ2F0ZS4gTGV0c1xuICAgKiBzeXNhZG1pbnMgXCJ2aWV3IGFzIHVzZXIgWFwiIHdpdGhvdXQgcmlza2luZyBhIGRlc3RydWN0aXZlIGFjdGlvbi5cbiAgICovXG4gIGltcGVyc29uYXRpb25SZWFkT25seT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgcmVmcmVzaC1zZXNzaW9uIHNsb3QgKGludGVyYWN0aXZlIG9yIG1hY2hpbmUpIHRoaXMgYWNjZXNzIHRva2VuIHdhc1xuICAgKiBtaW50ZWQgd2l0aC4gUmV2b2tpbmcgdGhhdCBPTkUgc2xvdCBwdWJsaXNoZXMgYHJldm9rZTpzaWQ6PHNpZD5gIChzZWVcbiAgICogYGNyZWRlbnRpYWxSZXZvY2F0aW9uS2V5YCksIHdoaWNoIGV2ZXJ5IHNlcnZpY2UgY2hlY2tzIGluIGByZXF1aXJlQXV0aGAsIHNvXG4gICAqIGEgc2luZ2xlIHNpZ25lZC1vdXQgZGV2aWNlIC8gbWFjaGluZSBjcmVkZW50aWFsIHN0b3BzIHdvcmtpbmcgZXZlcnl3aGVyZVxuICAgKiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIGF0IG5hdHVyYWwgZXhwaXJ5LiBBYnNlbnQgb24gUEFUcyBhbmQgaW1wZXJzb25hdGlvbi5cbiAgICovXG4gIHNpZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBhY2Nlc3Mga2V5IChQQVQgLyBzZXJ2aWNlLWFjY291bnQga2V5IGlkKSB0aGlzIHRva2VuIHdhcyBERVJJVkVEIGZyb20sXG4gICAqIHdoZW4gaXQgaXMgbm90IGl0c2VsZiB0aGUgZXhjaGFuZ2VkIGtleSB0b2tlbiAod2hvc2Uga2V5IGlkIGlzIGl0cyBganRpYCkg4oCUXG4gICAqIGUuZy4gYSBzd2l0Y2gtb3JnIG9yIGdlbmVyYXRlLXRva2VuIG1pbnQgbWFkZSB3aGlsZSBob2xkaW5nIGFuIGV4Y2hhbmdlZFxuICAgKiBrZXkgdG9rZW4uIFJldm9raW5nIHRoZSBrZXkgcHVibGlzaGVzIGByZXZva2U6a2V5OjxrZXlJZD5gLCB3aGljaCByZWplY3RzXG4gICAqIGV2ZXJ5IHRva2VuIHRoYXQgbmFtZXMgaXQgaGVyZSBvciBhcyBpdHMgYGp0aWAuXG4gICAqL1xuICBwYXJlbnRLZXlJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1c2VyJ3MgQUNDRVNTIHZlcnNpb24gYXQgdGhlIG1vbWVudCB0aGlzIHRva2VuIHdhcyBpc3N1ZWQ6IHRoZSBoYXJkXG4gICAqIGB0b2tlblZlcnNpb25gIChkZWFjdGl2YXRlIC8gcGFzc3dvcmQgY2hhbmdlIC8gbG9nb3V0LWFsbCDigJQgY2xlYXJzIHNsb3RzKVxuICAgKiBwbHVzIGBjbGFpbXNWZXJzaW9uYCAocm9sZSwgdGllciwgbWVtYmVyc2hpcCBvciBvd25lcnNoaXAgY2hhbmdlcyDigJQgcmUtbWludGVkXG4gICAqIG9uIHJlZnJlc2gpLiBCb3RoIG9ubHkgZ3Jvdywgc28gYSB0b2tlbiB3aG9zZSBlbWJlZGRlZCB2ZXJzaW9uIGlzIGJlaGluZCB0aGVcbiAgICogY3VycmVudCBvbmUgaGFzIGJlZW4gUkVWT0tFRC4gUGxhdGZvcm0gdmFsaWRhdGVzIHRoaXMgYWdhaW5zdCBNb25nbzsgdGhlXG4gICAqIHN0YXRlbGVzcyBzZXJ2aWNlcyB2YWxpZGF0ZSBpdCBhZ2FpbnN0IGEgUmVkaXMtcHVibGlzaGVkIGN1cnJlbnQtdmVyc2lvblxuICAgKiBzdG9yZSAoc2VlIGBzZXRUb2tlblJldm9jYXRpb25TdG9yZWApLiBBYnNlbnQgb24gbWFjaGluZS9zZXJ2aWNlIHRva2Vucy5cbiAgICovXG4gIHRva2VuVmVyc2lvbj86IG51bWJlcjtcbiAgLyoqIFRva2VuIHR5cGUgKi9cbiAgdHlwZTogJ2FjY2VzcycgfCAncmVmcmVzaCc7XG4gIC8qKiBJc3N1ZWQgYXQgdGltZXN0YW1wICovXG4gIGlhdD86IG51bWJlcjtcbiAgLyoqIEV4cGlyYXRpb24gdGltZXN0YW1wICovXG4gIGV4cD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgYWNjb3VudCBib3VuZGFyeSAocm9vdCBvcmcpIGZvciBhIHRva2VuJ3MgYWN0aXZlIG9yZy5cbiAqXG4gKiBUaGUgYWNjb3VudCByb290IGlzIGByb290T3JnYW5pemF0aW9uSWQgPz8gb3JnYW5pemF0aW9uSWRgOiBhIGZsYXQgKHJvb3QpIG9yZ1xuICogb21pdHMgYHJvb3RPcmdhbml6YXRpb25JZGAsIHNvIGl0IElTIGl0cyBvd24gcm9vdDsgYSB0ZWFtIChjaGlsZCkgb3JnIGNhcnJpZXNcbiAqIHRoZSB0b3Agb2YgaXRzIGFuY2VzdHJ5IGNoYWluLiBFdmVyeSBhY2NvdW50LXNjb3BlZCByZWFkIChxdW90YS9zZWF0L2JpbGxpbmdcbiAqIHBvb2xpbmcpIG11c3QgcmVzb2x2ZSB0aHJvdWdoIHRoaXMgY29hbGVzY2UgcmF0aGVyIHRoYW4gcmVhZGluZ1xuICogYG9yZ2FuaXphdGlvbklkYCBkaXJlY3RseSDigJQgdGhlIGxhdHRlciBzaWxlbnRseSB3b3JrcyB0b2RheSAoYWxsIG9yZ3MgZmxhdClcbiAqIGJ1dCB3b3VsZCBiaW5kIHRvIHRoZSB0ZWFtIGluc3RlYWQgb2YgdGhlIGFjY291bnQgb25jZSB0ZWFtcyBleGlzdC5cbiAqXG4gKiBAcmV0dXJucyB0aGUgZWZmZWN0aXZlIHJvb3Qgb3JnIGlkLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5laXRoZXIgZmllbGQgaXMgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWZmZWN0aXZlUm9vdE9yZ0lkKFxuICBwYXlsb2FkOiBQaWNrPEp3dFBheWxvYWQsICdvcmdhbml6YXRpb25JZCcgfCAncm9vdE9yZ2FuaXphdGlvbklkJz4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcGF5bG9hZC5yb290T3JnYW5pemF0aW9uSWQgPz8gcGF5bG9hZC5vcmdhbml6YXRpb25JZDtcbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBFeHByZXNzIFJlcXVlc3Qgd2l0aCB1c2VyIHByb3BlcnR5LlxuICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIG5hbWVzcGFjZSBFeHByZXNzIHtcbiAgICBpbnRlcmZhY2UgUmVxdWVzdCB7XG4gICAgICB1c2VyPzogSnd0UGF5bG9hZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24gZm9yIGludGVybmFsIEhUVFAgY2xpZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VDb25maWcge1xuICAvKiogU2VydmljZSBob3N0bmFtZSAqL1xuICBob3N0OiBzdHJpbmc7XG4gIC8qKiBTZXJ2aWNlIHBvcnQgKi9cbiAgcG9ydDogbnVtYmVyO1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhlYWx0aCBjaGVjayByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDaGVja1Jlc3BvbnNlIHtcbiAgc3RhdHVzOiAnaGVhbHRoeScgfCAndW5oZWFsdGh5JztcbiAgc2VydmljZTogc3RyaW5nO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgdXB0aW1lOiBudW1iZXI7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsICdjb25uZWN0ZWQnIHwgJ2Rpc2Nvbm5lY3RlZCcgfCAndW5rbm93bic+O1xufVxuIl19
@@ -0,0 +1,142 @@
1
+ /**
2
+ * The plugin-ecosystem notification contract (docs/plugin-publishing.md),
3
+ * shared by the sender (the plugin service's enqueue API and digest
4
+ * dispatcher) and the relay (platform `POST /internal/notify-email`).
5
+ *
6
+ * Recipients travel as RULES, never as lists: platform resolves each
7
+ * {@link EcosystemRecipientSpec} against its user/Role directory AT SEND TIME,
8
+ * so a digest that flushes tomorrow reaches tomorrow's moderators, the plugin
9
+ * service never handles an email address or a membership list, and a publisher
10
+ * can never learn who installed their plugin (the relay mails each recipient
11
+ * individually — no shared To: line).
12
+ */
13
+ /** A notification event number. */
14
+ export type EcosystemNotificationEventId = 'N1' | 'N2' | 'N3' | 'N4' | 'N5' | 'N6' | 'N7' | 'N8' | 'N9' | 'N10' | 'N11' | 'N12' | 'N13' | 'N14' | 'N15' | 'N16' | 'N17' | 'N18' | 'N19' | 'N20' | 'N21' | 'N22' | 'N23' | 'N24' | 'N25' | 'N26' | 'N27' | 'N28' | 'N29';
15
+ /** A delivery channel. In-app is the source of truth; email is the courtesy copy. */
16
+ export type EcosystemNotificationChannel = 'in_app' | 'email';
17
+ /** A per-user EMAIL opt-out key. In-app is never optional. */
18
+ export type EcosystemEmailPreference = 'ecosystem.reviews.email' | 'ecosystem.upgrades.email' | 'ecosystem.installs.email' | 'ecosystem.moderationDigest.email';
19
+ /** The field each preference key is stored under in the user's per-org
20
+ * `notifications.ecosystem` preferences (platform `UserPreferences`). */
21
+ export declare const ECOSYSTEM_EMAIL_PREFERENCE_FIELDS: Readonly<Record<EcosystemEmailPreference, EcosystemEmailPreferenceField>>;
22
+ /** Stored field names of the ecosystem email preferences (all default `true`). */
23
+ export type EcosystemEmailPreferenceField = 'reviewsEmail' | 'upgradesEmail' | 'installsEmail' | 'moderationDigestEmail';
24
+ /** Every stored ecosystem email-preference field. */
25
+ export declare const ECOSYSTEM_EMAIL_PREFERENCE_FIELD_NAMES: readonly EcosystemEmailPreferenceField[];
26
+ /** How often a batched email is flushed. */
27
+ export type EcosystemDigestCadence = 'hourly' | 'daily' | 'weekly';
28
+ /** One event's delivery rules. */
29
+ export interface EcosystemEventSpec {
30
+ /** One-line description (docs, logs). */
31
+ description: string;
32
+ /** Channels the event is delivered on. */
33
+ channels: readonly EcosystemNotificationChannel[];
34
+ /**
35
+ * Email opt-out key, or `null` when the email is TRANSACTIONAL / security
36
+ * (N1, N3–N5, N7–N10, N18–N23, N25, N28, N29 can't be turned off).
37
+ */
38
+ preference: EcosystemEmailPreference | null;
39
+ /** When the email is batched rather than immediate, its cadence. */
40
+ digest?: EcosystemDigestCadence;
41
+ /** Allowed to address a raw email (the anonymous SUBMITTER) — only the
42
+ * transactional submission notices. */
43
+ allowsAddress?: boolean;
44
+ }
45
+ /** The notification event table, as data. */
46
+ export declare const ECOSYSTEM_NOTIFICATION_EVENTS: Readonly<Record<EcosystemNotificationEventId, EcosystemEventSpec>>;
47
+ /** Whether `value` is a notification event number. */
48
+ export declare function isEcosystemNotificationEvent(value: unknown): value is EcosystemNotificationEventId;
49
+ /** Org-local permissions an {@link EcosystemRecipientSpec} `org_permission` rule may name. */
50
+ export type EcosystemOrgRecipientPermission = 'publishers:manage' | 'plugin_installs:manage';
51
+ /** System-org permissions a `moderators` rule may name. */
52
+ export type EcosystemModeratorPermission = 'plugins:moderate' | 'publishers:verify';
53
+ /**
54
+ * A recipient RULE, resolved by platform at send time:
55
+ *
56
+ * - `user` — one user (Requester, Review author, the affected user of N23).
57
+ * `orgId` picks the inbox; defaults to the user's last active org.
58
+ * - `org_permission` — active members of `orgId` holding `permission`
59
+ * (Publisher managers = `publishers:manage`, Org approvers =
60
+ * `plugin_installs:manage`). With `inheritFromRoot`, a team with no holders
61
+ * falls back to its root org's holders; with none anywhere, the org's owners.
62
+ * - `moderators` — the system org's holders of `permission` (the Ecosystem
63
+ * Manager role), minus anyone with a conflict of interest (members of
64
+ * `excludeMembersOfOrgId`, or the listed users); superadmins when empty.
65
+ * - `superadmins` — every platform superadmin.
66
+ * - `address` — a raw address; only the anonymous SUBMITTER notices (N1, N3,
67
+ * N4), whose recipient has no account.
68
+ */
69
+ export type EcosystemRecipientSpec = {
70
+ kind: 'user';
71
+ userId: string;
72
+ orgId?: string;
73
+ } | {
74
+ kind: 'org_permission';
75
+ orgId: string;
76
+ permission: EcosystemOrgRecipientPermission;
77
+ inheritFromRoot?: boolean;
78
+ } | {
79
+ kind: 'moderators';
80
+ permission: EcosystemModeratorPermission;
81
+ excludeMembersOfOrgId?: string;
82
+ excludeUserIds?: string[];
83
+ } | {
84
+ kind: 'superadmins';
85
+ } | {
86
+ kind: 'address';
87
+ email: string;
88
+ };
89
+ /** The body of an ecosystem send through platform's notify relay. */
90
+ export interface EcosystemNotifyRequest {
91
+ event: EcosystemNotificationEventId;
92
+ recipients: EcosystemRecipientSpec[];
93
+ subject: string;
94
+ /** Plain-text body (email body and in-app content). */
95
+ text: string;
96
+ /** Subset of the event's channels to deliver on (default: all of them). The
97
+ * digest dispatcher sends `['email']` because in-app went out at enqueue. */
98
+ channels?: EcosystemNotificationChannel[];
99
+ /** Deliver the email even to users who opted out — for an event whose
100
+ * normally-optional email is mandatory in this instance (N24 yank, advisory
101
+ * and security-fix requests). */
102
+ mandatory?: boolean;
103
+ }
104
+ /** Hard caps, matching the message service's own limits. */
105
+ export declare const ECOSYSTEM_NOTIFY_SUBJECT_MAX = 500;
106
+ export declare const ECOSYSTEM_NOTIFY_TEXT_MAX = 10000;
107
+ /**
108
+ * Validate an {@link EcosystemNotifyRequest}. Returns the normalized request,
109
+ * or an error string (the relay's 400). Pure, so both the sender (fail at
110
+ * enqueue, not at 09:00 tomorrow) and the relay use the same rules.
111
+ */
112
+ export declare function parseEcosystemNotifyRequest(body: unknown): EcosystemNotifyRequest | string;
113
+ /** The UTC hour digests flush at ("daily digest email (09:00 UTC)"). */
114
+ export declare const ECOSYSTEM_DIGEST_HOUR_UTC = 9;
115
+ /**
116
+ * The next flush time for a digest cadence, strictly after `now`:
117
+ * `hourly` → the next top of the hour; `daily` → the next 09:00 UTC;
118
+ * `weekly` → the next Monday 09:00 UTC.
119
+ */
120
+ export declare function nextEcosystemDigestTime(cadence: EcosystemDigestCadence, now?: Date): Date;
121
+ /** A rendered notice. */
122
+ export interface EcosystemNotificationContent {
123
+ subject: string;
124
+ text: string;
125
+ }
126
+ /**
127
+ * N23 — someone was added to or removed from the system org's Ecosystem
128
+ * Manager role. Sent to every superadmin and to the affected user;
129
+ * transactional (no opt-out).
130
+ */
131
+ export declare function renderEcosystemManagerChange(input: {
132
+ /** The affected user's display name or email. */
133
+ user: string;
134
+ added: boolean;
135
+ /** Who made the change (superadmins only can), when known. */
136
+ actor?: string;
137
+ }): EcosystemNotificationContent;
138
+ /**
139
+ * Coalesce several queued notices into one digest email: a count-bearing
140
+ * subject and one line per item (each item's subject), oldest first.
141
+ */
142
+ export declare function renderEcosystemDigest(event: EcosystemNotificationEventId, items: readonly EcosystemNotificationContent[]): EcosystemNotificationContent;