@o3r/components 10.0.0-next.8 → 11.0.0-next.0

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 (134) hide show
  1. package/README.md +1 -1
  2. package/builders/component-extractor/helpers/component/component-class.extractor.d.ts +2 -0
  3. package/builders/component-extractor/helpers/component/component-class.extractor.d.ts.map +1 -1
  4. package/builders/component-extractor/helpers/component/component-class.extractor.js +14 -8
  5. package/builders/component-extractor/helpers/component/component-class.extractor.js.map +1 -1
  6. package/builders/component-extractor/helpers/component/component-config.extractor.d.ts.map +1 -1
  7. package/builders/component-extractor/helpers/component/component-config.extractor.js +6 -2
  8. package/builders/component-extractor/helpers/component/component-config.extractor.js.map +1 -1
  9. package/builders/component-extractor/helpers/component/component.extractor.d.ts +5 -5
  10. package/builders/component-extractor/helpers/component/component.extractor.d.ts.map +1 -1
  11. package/builders/component-extractor/helpers/component/component.extractor.js +4 -2
  12. package/builders/component-extractor/helpers/component/component.extractor.js.map +1 -1
  13. package/builders/component-extractor/helpers/component/component.parser.d.ts +9 -6
  14. package/builders/component-extractor/helpers/component/component.parser.d.ts.map +1 -1
  15. package/builders/component-extractor/helpers/component/component.parser.js +36 -10
  16. package/builders/component-extractor/helpers/component/component.parser.js.map +1 -1
  17. package/builders/component-extractor/index.d.ts +0 -1
  18. package/builders/component-extractor/index.d.ts.map +1 -1
  19. package/builders/component-extractor/index.js +8 -9
  20. package/builders/component-extractor/index.js.map +1 -1
  21. package/builders/component-extractor/schema.d.ts +5 -0
  22. package/builders/component-extractor/schema.d.ts.map +1 -1
  23. package/builders/component-extractor/schema.json +22 -1
  24. package/core/component.output.d.ts +8 -11
  25. package/core/component.output.d.ts.map +1 -1
  26. package/core/index.d.ts +0 -1
  27. package/core/index.d.ts.map +1 -1
  28. package/core/rendering/helpers.d.ts +0 -1
  29. package/core/rendering/helpers.d.ts.map +1 -1
  30. package/devkit/components-devkit.interface.d.ts +0 -1
  31. package/devkit/components-devkit.interface.d.ts.map +1 -1
  32. package/devkit/components-devtools.message.service.d.ts +4 -6
  33. package/devkit/components-devtools.message.service.d.ts.map +1 -1
  34. package/devkit/components-devtools.module.d.ts +0 -1
  35. package/devkit/components-devtools.module.d.ts.map +1 -1
  36. package/devkit/inspector/ng/ng.d.ts +0 -3
  37. package/devkit/inspector/ng/ng.d.ts.map +1 -1
  38. package/devkit/inspector/otter-inspector.helpers.d.ts +0 -7
  39. package/devkit/inspector/otter-inspector.helpers.d.ts.map +1 -1
  40. package/devkit/inspector/otter-inspector.service.d.ts +5 -6
  41. package/devkit/inspector/otter-inspector.service.d.ts.map +1 -1
  42. package/esm2022/core/component.output.mjs +1 -1
  43. package/esm2022/core/index.mjs +1 -2
  44. package/esm2022/core/rendering/helpers.mjs +1 -2
  45. package/esm2022/devkit/components-devkit.interface.mjs +1 -2
  46. package/esm2022/devkit/components-devtools.message.service.mjs +6 -8
  47. package/esm2022/devkit/components-devtools.module.mjs +5 -6
  48. package/esm2022/devkit/inspector/ng/ng.mjs +1 -1
  49. package/esm2022/devkit/inspector/otter-inspector.helpers.mjs +1 -8
  50. package/esm2022/devkit/inspector/otter-inspector.service.mjs +1 -2
  51. package/esm2022/public_api.mjs +1 -1
  52. package/esm2022/rules-engine/o3r-components-rules-engine.mjs +5 -0
  53. package/esm2022/rules-engine/placeholder.action-handler.mjs +154 -0
  54. package/esm2022/rules-engine/placeholder.interfaces.mjs +3 -0
  55. package/esm2022/rules-engine/placeholder.rules-engine.effect.mjs +124 -0
  56. package/esm2022/rules-engine/placeholder.rules-engine.module.mjs +31 -0
  57. package/esm2022/rules-engine/public_api.mjs +4 -0
  58. package/esm2022/stores/placeholder-request/placeholder-request.module.mjs +4 -4
  59. package/esm2022/stores/placeholder-request/placeholder-request.selectors.mjs +1 -2
  60. package/esm2022/stores/placeholder-template/placeholder-template.module.mjs +4 -4
  61. package/esm2022/stores/placeholder-template/placeholder-template.selectors.mjs +24 -10
  62. package/esm2022/tools/component-replacement/c11n.directive.mjs +17 -23
  63. package/esm2022/tools/component-replacement/c11n.helpers.mjs +1 -2
  64. package/esm2022/tools/component-replacement/c11n.mock.module.mjs +10 -10
  65. package/esm2022/tools/component-replacement/c11n.module.mjs +5 -6
  66. package/esm2022/tools/component-replacement/c11n.service.mjs +6 -8
  67. package/esm2022/tools/pipes/capitalize/capitalize.module.mjs +4 -4
  68. package/esm2022/tools/pipes/capitalize/capitalize.pipe.mjs +3 -3
  69. package/esm2022/tools/pipes/duration/duration.module.mjs +4 -4
  70. package/esm2022/tools/pipes/duration/duration.pipe.mjs +4 -5
  71. package/esm2022/tools/pipes/keep-white-space/keep-white-space.module.mjs +4 -4
  72. package/esm2022/tools/pipes/keep-white-space/keep-white-space.pipe.mjs +3 -3
  73. package/esm2022/tools/pipes/replace-with-bold/replace-with-bold.module.mjs +4 -4
  74. package/esm2022/tools/pipes/replace-with-bold/replace-with-bold.pipe.mjs +3 -3
  75. package/esm2022/tools/placeholder/placeholder.component.mjs +44 -23
  76. package/esm2022/tools/placeholder/placeholder.interface.mjs +2 -0
  77. package/esm2022/tools/placeholder/placeholder.module.mjs +4 -4
  78. package/fesm2022/o3r-components-rules-engine.mjs +302 -0
  79. package/fesm2022/o3r-components-rules-engine.mjs.map +1 -0
  80. package/fesm2022/o3r-components.mjs +150 -141
  81. package/fesm2022/o3r-components.mjs.map +1 -1
  82. package/package.json +62 -33
  83. package/public_api.d.ts +1 -1
  84. package/public_api.d.ts.map +1 -1
  85. package/rules-engine/index.d.ts +6 -0
  86. package/rules-engine/o3r-components-rules-engine.d.ts.map +1 -0
  87. package/rules-engine/placeholder.action-handler.d.ts +42 -0
  88. package/rules-engine/placeholder.action-handler.d.ts.map +1 -0
  89. package/rules-engine/placeholder.interfaces.d.ts +13 -0
  90. package/rules-engine/placeholder.interfaces.d.ts.map +1 -0
  91. package/rules-engine/placeholder.rules-engine.effect.d.ts +37 -0
  92. package/rules-engine/placeholder.rules-engine.effect.d.ts.map +1 -0
  93. package/rules-engine/placeholder.rules-engine.module.d.ts +9 -0
  94. package/rules-engine/placeholder.rules-engine.module.d.ts.map +1 -0
  95. package/rules-engine/public_api.d.ts +4 -0
  96. package/rules-engine/public_api.d.ts.map +1 -0
  97. package/schemas/component.metadata.schema.json +8 -1
  98. package/schemas/placeholder-template.schema.json +1 -1
  99. package/schemas/rules-engine.placeholder-action.schema.json +26 -0
  100. package/schematics/cms-adapter/index.d.ts +0 -1
  101. package/schematics/cms-adapter/index.d.ts.map +1 -1
  102. package/schematics/cms-adapter/index.js +5 -9
  103. package/schematics/cms-adapter/index.js.map +1 -1
  104. package/schematics/ng-add/helpers/devtools-registration.d.ts +10 -0
  105. package/schematics/ng-add/helpers/devtools-registration.d.ts.map +1 -0
  106. package/schematics/ng-add/helpers/devtools-registration.js +25 -0
  107. package/schematics/ng-add/helpers/devtools-registration.js.map +1 -0
  108. package/schematics/ng-add/index.d.ts +0 -1
  109. package/schematics/ng-add/index.d.ts.map +1 -1
  110. package/schematics/ng-add/index.js +7 -5
  111. package/schematics/ng-add/index.js.map +1 -1
  112. package/schematics/ng-add/schema.json +1 -1
  113. package/stores/placeholder-request/placeholder-request.selectors.d.ts +0 -1
  114. package/stores/placeholder-request/placeholder-request.selectors.d.ts.map +1 -1
  115. package/stores/placeholder-template/placeholder-template.selectors.d.ts +41 -8
  116. package/stores/placeholder-template/placeholder-template.selectors.d.ts.map +1 -1
  117. package/tools/component-replacement/c11n.directive.d.ts +5 -10
  118. package/tools/component-replacement/c11n.directive.d.ts.map +1 -1
  119. package/tools/component-replacement/c11n.helpers.d.ts +1 -3
  120. package/tools/component-replacement/c11n.helpers.d.ts.map +1 -1
  121. package/tools/component-replacement/c11n.module.d.ts +0 -1
  122. package/tools/component-replacement/c11n.module.d.ts.map +1 -1
  123. package/tools/component-replacement/c11n.service.d.ts +2 -5
  124. package/tools/component-replacement/c11n.service.d.ts.map +1 -1
  125. package/tools/pipes/duration/duration.pipe.d.ts.map +1 -1
  126. package/tools/placeholder/placeholder.component.d.ts +7 -5
  127. package/tools/placeholder/placeholder.component.d.ts.map +1 -1
  128. package/tools/placeholder/placeholder.interface.d.ts +22 -0
  129. package/tools/placeholder/placeholder.interface.d.ts.map +1 -0
  130. package/builders/package.json +0 -3
  131. package/core/focus.d.ts +0 -17
  132. package/core/focus.d.ts.map +0 -1
  133. package/esm2022/core/focus.mjs +0 -2
  134. package/schematics/package.json +0 -3
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGV2a2l0L2luc3BlY3Rvci9uZy9uZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBOZyB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBET00gZWxlbWVudC5cbiAgICpcbiAgICogQHVzYWdlTm90ZXNcbiAgICogR2l2ZW4gdGhlIGZvbGxvd2luZyBET00gc3RydWN0dXJlOlxuICAgKiBgYGBodG1sXG4gICAqIDxteS1hcHA+XG4gICAqICAgPGRpdj5cbiAgICogICAgIDxjaGlsZC1jb21wPjwvY2hpbGQtY29tcD5cbiAgICogICA8L2Rpdj5cbiAgICogPC9teS1hcHA+XG4gICAqIGBgYFxuICAgKiBDYWxsaW5nIGBnZXRDb21wb25lbnRgIG9uIGA8Y2hpbGQtY29tcD5gIHdpbGwgcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiBgQ2hpbGRDb21wb25lbnRgXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIERPTSBlbGVtZW50LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoZSBmdW5jdGlvbiBvbiBgPG15LWFwcD5gIHdpbGwgcmV0dXJuIHRoZSBgTXlBcHBgIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gZWxlbWVudCBET00gZWxlbWVudCBmcm9tIHdoaWNoIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHJldHJpZXZlZC5cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCBvciBgbnVsbGAgaWYgdGhlcmVcbiAgICogICAgaXMgbm8gY29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICovXG4gIGdldENvbXBvbmVudDxUID0gYW55PihlbGVtZW50OiBFbGVtZW50KTogVCB8IG51bGw7XG5cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjb21wb25lbnQgaW5zdGFuY2Ugd2hvc2UgdmlldyBjb250YWlucyB0aGUgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiBgPGNoaWxkLWNvbXA+YCBpcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBvZiBgPGFwcC1jb21wPmBcbiAgICogKGkuZS4gYSBgVmlld0NoaWxkYCBvZiBgPGFwcC1jb21wPmApLCBjYWxsaW5nIGBnZXRPd25pbmdDb21wb25lbnRgIG9uIGA8Y2hpbGQtY29tcD5gXG4gICAqIHdvdWxkIHJldHVybiBgPGFwcC1jb21wPmAuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50T3JEaXIgRE9NIGVsZW1lbnQsIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2VcbiAgICogICAgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSByb290IGNvbXBvbmVudHMuXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBpbnN0YW5jZSB3aG9zZSB2aWV3IG93bnMgdGhlIERPTSBlbGVtZW50IG9yIG51bGwgaWYgdGhlIGVsZW1lbnQgaXMgbm90XG4gICAqICAgIHBhcnQgb2YgYSBjb21wb25lbnQgdmlldy5cbiAgICovXG4gIGdldE93bmluZ0NvbXBvbmVudDxUID0gYW55PihlbGVtZW50T3JEaXI6IEVsZW1lbnQgfCBvYmplY3QpOiBUIHwgbnVsbDtcblxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGhvc3QgZWxlbWVudCBvZiBhIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gICAqIFRoZSBob3N0IGVsZW1lbnQgaXMgdGhlIERPTSBlbGVtZW50IHRoYXQgbWF0Y2hlZCB0aGUgc2VsZWN0b3Igb2YgdGhlIGRpcmVjdGl2ZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbXBvbmVudE9yRGlyZWN0aXZlIENvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UgZm9yIHdoaWNoIHRoZSBob3N0XG4gICAqICAgICBlbGVtZW50IHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gICAqIEByZXR1cm5zIEhvc3QgZWxlbWVudCBvZiB0aGUgdGFyZ2V0LlxuICAgKi9cbiAgZ2V0SG9zdEVsZW1lbnQoY29tcG9uZW50T3JEaXJlY3RpdmU6IG9iamVjdCk6IEVsZW1lbnQ7XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZGV2a2l0L2luc3BlY3Rvci9uZy9uZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBOZyB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBET00gZWxlbWVudC5cbiAgICogQHVzYWdlTm90ZXNcbiAgICogR2l2ZW4gdGhlIGZvbGxvd2luZyBET00gc3RydWN0dXJlOlxuICAgKiBgYGBodG1sXG4gICAqIDxteS1hcHA+XG4gICAqICAgPGRpdj5cbiAgICogICAgIDxjaGlsZC1jb21wPjwvY2hpbGQtY29tcD5cbiAgICogICA8L2Rpdj5cbiAgICogPC9teS1hcHA+XG4gICAqIGBgYFxuICAgKiBDYWxsaW5nIGBnZXRDb21wb25lbnRgIG9uIGA8Y2hpbGQtY29tcD5gIHdpbGwgcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiBgQ2hpbGRDb21wb25lbnRgXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIERPTSBlbGVtZW50LlxuICAgKlxuICAgKiBDYWxsaW5nIHRoZSBmdW5jdGlvbiBvbiBgPG15LWFwcD5gIHdpbGwgcmV0dXJuIHRoZSBgTXlBcHBgIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gZWxlbWVudCBET00gZWxlbWVudCBmcm9tIHdoaWNoIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIHJldHJpZXZlZC5cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCBvciBgbnVsbGAgaWYgdGhlcmVcbiAgICogICAgaXMgbm8gY29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICovXG4gIGdldENvbXBvbmVudDxUID0gYW55PihlbGVtZW50OiBFbGVtZW50KTogVCB8IG51bGw7XG5cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjb21wb25lbnQgaW5zdGFuY2Ugd2hvc2UgdmlldyBjb250YWlucyB0aGUgRE9NIGVsZW1lbnQuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBpZiBgPGNoaWxkLWNvbXA+YCBpcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBvZiBgPGFwcC1jb21wPmBcbiAgICogKGkuZS4gYSBgVmlld0NoaWxkYCBvZiBgPGFwcC1jb21wPmApLCBjYWxsaW5nIGBnZXRPd25pbmdDb21wb25lbnRgIG9uIGA8Y2hpbGQtY29tcD5gXG4gICAqIHdvdWxkIHJldHVybiBgPGFwcC1jb21wPmAuXG4gICAqIEBwYXJhbSBlbGVtZW50T3JEaXIgRE9NIGVsZW1lbnQsIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2VcbiAgICogICAgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSByb290IGNvbXBvbmVudHMuXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBpbnN0YW5jZSB3aG9zZSB2aWV3IG93bnMgdGhlIERPTSBlbGVtZW50IG9yIG51bGwgaWYgdGhlIGVsZW1lbnQgaXMgbm90XG4gICAqICAgIHBhcnQgb2YgYSBjb21wb25lbnQgdmlldy5cbiAgICovXG4gIGdldE93bmluZ0NvbXBvbmVudDxUID0gYW55PihlbGVtZW50T3JEaXI6IEVsZW1lbnQgfCBvYmplY3QpOiBUIHwgbnVsbDtcblxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGhvc3QgZWxlbWVudCBvZiBhIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UuXG4gICAqIFRoZSBob3N0IGVsZW1lbnQgaXMgdGhlIERPTSBlbGVtZW50IHRoYXQgbWF0Y2hlZCB0aGUgc2VsZWN0b3Igb2YgdGhlIGRpcmVjdGl2ZS5cbiAgICogQHBhcmFtIGNvbXBvbmVudE9yRGlyZWN0aXZlIENvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UgZm9yIHdoaWNoIHRoZSBob3N0XG4gICAqICAgICBlbGVtZW50IHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gICAqIEByZXR1cm5zIEhvc3QgZWxlbWVudCBvZiB0aGUgdGFyZ2V0LlxuICAgKi9cbiAgZ2V0SG9zdEVsZW1lbnQoY29tcG9uZW50T3JEaXJlY3RpdmU6IG9iamVjdCk6IEVsZW1lbnQ7XG59XG4iXX0=
@@ -5,7 +5,6 @@ import { otterComponentInfoPropertyName } from '@o3r/core';
5
5
  export const INSPECTOR_CLASS = 'otter-devtools-inspector';
6
6
  /**
7
7
  * Determine if a node is an Otter container
8
- *
9
8
  * @param node Element to check
10
9
  * @returns true if the node is an Otter container
11
10
  */
@@ -14,7 +13,6 @@ export const isContainer = (node) => {
14
13
  };
15
14
  /**
16
15
  * Determine the config id of a component instance
17
- *
18
16
  * @param instance component instance
19
17
  * @returns the config id of the component instance
20
18
  */
@@ -23,7 +21,6 @@ export const getConfigId = (instance) => {
23
21
  };
24
22
  /**
25
23
  * Recursive method to determin the translations of a node
26
- *
27
24
  * @param node HTMLElement to check
28
25
  * @param rec recursive method
29
26
  * @returns the trasnslations associated to their component name
@@ -55,14 +52,12 @@ export function getTranslationsRec(node, rec) {
55
52
  }
56
53
  /**
57
54
  * Determine the translations of a node
58
- *
59
55
  * @param node HTMLElement to check
60
56
  * @returns the translations associated to their component name
61
57
  */
62
58
  export const getTranslations = (node) => getTranslationsRec(node, getTranslations);
63
59
  /**
64
60
  * Recursive method to determine the analytics of a node
65
- *
66
61
  * @param node Element to check
67
62
  * @param rec recursive method
68
63
  * @returns the analytics associated to their component name
@@ -94,14 +89,12 @@ export function getAnalyticEventsRec(node, rec) {
94
89
  }
95
90
  /**
96
91
  * Determine the analytics of a node
97
- *
98
92
  * @param node Element to check
99
93
  * @returns the analytics associated to their component name
100
94
  */
101
95
  export const getAnalyticEvents = (node) => getAnalyticEventsRec(node, getAnalyticEvents);
102
96
  /**
103
97
  * Determine all info from an Otter component
104
- *
105
98
  * @param componentClassInstance component instance
106
99
  * @param host HTML element hosting the component
107
100
  * @returns all info from an Otter component
@@ -117,4 +110,4 @@ export const getOtterLikeComponentInfo = (componentClassInstance, host) => {
117
110
  analytics
118
111
  };
119
112
  };
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3R0ZXItaW5zcGVjdG9yLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGV2a2l0L2luc3BlY3Rvci9vdHRlci1pbnNwZWN0b3IuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsOEJBQThCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFlekQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsMEJBQTBCLENBQUM7QUFFMUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFnQyxFQUFtQixFQUFFO0lBQy9FLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hELENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsUUFBYSxFQUFFLEVBQUU7SUFDM0MsT0FBTyxRQUFRLENBQUMsOEJBQThCLENBQUMsRUFBRSxRQUFRLENBQUM7QUFDNUQsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQW9CLEVBQUUsR0FBOEI7SUFDckYsTUFBTSxlQUFlLEdBQUksTUFBYyxDQUFDLEVBQUUsQ0FBQztJQUMzQyxNQUFNLGVBQWUsR0FBMEMsZ0JBQWdCLENBQUM7SUFDaEYsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtRQUM3QixPQUFPO0tBQ1I7SUFDRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JELE1BQU0sZUFBZSxHQUE2QyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdB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Q0FBQyxNQUFNLEVBQUU7WUFDMUIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLGVBQWUsQ0FBQztTQUN6QztLQUNGO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDekQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFvQixFQUF3QyxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFFL0k7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxzQkFBMkIsRUFBRSxJQUFhLEVBQTBCLEVBQUU7SUFDOUcsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDckQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLE9BQU87UUFDTCxhQUFhLEVBQUUsc0JBQXNCLENBQUMsV0FBVyxDQUFDLElBQUk7UUFDdEQsUUFBUTtRQUNSLFlBQVk7UUFDWixTQUFTO0tBQ1YsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7b3R0ZXJDb21wb25lbnRJbmZvUHJvcGVydHlOYW1lfSBmcm9tICdAbzNyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE90dGVyTGlrZUNvbXBvbmVudEluZm8ge1xuICAvKiogQ29udGFpbmVyIGluZm9ybWF0aW9uICovXG4gIGNvbnRhaW5lcj86IE90dGVyTGlrZUNvbXBvbmVudEluZm87XG4gIC8qKiBDb25maWd1cmF0aW9uIElEICovXG4gIGNvbmZpZ0lkPzogc3RyaW5nO1xuICAvKiogQ29tcG9uZW50IG5hbWUgKi9cbiAgY29tcG9uZW50TmFtZTogc3RyaW5nO1xuICAvKiogQ29tcG9uZW50IHRyYW5zbGF0aW9uICovXG4gIHRyYW5zbGF0aW9ucz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqIENvbXBvbmVudCBhbmFseXRpY3MgKi9cbiAgYW5hbHl0aWNzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xufVxuXG4vKipcbiAqIE90dGVyIGluc3BlY3RvciBjc3MgY2xhc3NcbiAqL1xuZXhwb3J0IGNvbnN0IElOU1BFQ1RPUl9DTEFTUyA9ICdvdHRlci1kZXZ0b29scy1pbnNwZWN0b3InO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIG5vZGUgaXMgYW4gT3R0ZXIgY29udGFpbmVyXG4gKlxuICogQHBhcmFtIG5vZGUgRWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhbiBPdHRlciBjb250YWluZXJcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ29udGFpbmVyID0gKG5vZGU6IEVsZW1lbnQgfCB1bmRlZmluZWQgfCBudWxsKTogbm9kZSBpcyBFbGVtZW50ID0+IHtcbiAgcmV0dXJuICEhbm9kZT8udGFnTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCdjb250Jyk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSB0aGUgY29uZmlnIGlkIG9mIGEgY29tcG9uZW50IGluc3RhbmNlXG4gKlxuICogQHBhcmFtIGluc3RhbmNlIGNvbXBvbmVudCBpbnN0YW5jZVxuICogQHJldHVybnMgdGhlIGNvbmZpZyBpZCBvZiB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb25maWdJZCA9IChpbnN0YW5jZTogYW55KSA9PiB7XG4gIHJldHVybiBpbnN0YW5jZVtvdHRlckNvbXBvbmVudEluZm9Qcm9wZXJ0eU5hbWVdPy5jb25maWdJZDtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlIG1ldGhvZCB0byBkZXRlcm1pbiB0aGUgdHJhbnNsYXRpb25zIG9mIGEgbm9kZVxuICpcbiAqIEBwYXJhbSBub2RlIEhUTUxFbGVtZW50IHRvIGNoZWNrXG4gKiBAcGFyYW0gcmVjIHJlY3Vyc2l2ZSBtZXRob2RcbiAqIEByZXR1cm5zIHRoZSB0cmFzbnNsYXRpb25zIGFzc29jaWF0ZWQgdG8gdGhlaXIgY29tcG9uZW50IG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uc1JlYyhub2RlOiBFbGVtZW50IHwgbnVsbCwgcmVjOiB0eXBlb2YgZ2V0VHJhbnNsYXRpb25zUmVjKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYW5ndWxhckRldlRvb2xzID0gKHdpbmRvdyBhcyBhbnkpLm5nO1xuICBjb25zdCBvM3JJbmZvUHJvcGVydHk6IHR5cGVvZiBvdHRlckNvbXBvbmVudEluZm9Qcm9wZXJ0eU5hbWUgPSAnX19vdHRlci1pbmZvX18nO1xuICBpZiAoIW5vZGUgfHwgIWFuZ3VsYXJEZXZUb29scykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjb21wb25lbnQgPSBhbmd1bGFyRGV2VG9vbHMuZ2V0Q29tcG9uZW50KG5vZGUpO1xuICBjb25zdCBzdWJUcmFuc2xhdGlvbnM6IChSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWQpW10gPSBBcnJheS5mcm9tKG5vZGUuY2hpbGRyZW4pLm1hcCgoY2hpbGQpID0+IHJlYyhjaGlsZCwgcmVjKSk7XG4gIGNvbnN0IHRyYW5zbGF0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gIHN1YlRyYW5zbGF0aW9ucy5mb3JFYWNoKChzKSA9PiB7XG4gICAgT2JqZWN0LmVudHJpZXMocyB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBpZiAodi5sZW5ndGgpIHtcbiAgICAgICAgdHJhbnNsYXRpb25zW2tdID0gdjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGlmIChjb21wb25lbnQpIHtcbiAgICBjb25zdCBjb21wb25lbnROYW1lOiBzdHJpbmcgPSBjb21wb25lbnQuY29uc3RydWN0b3IubmFtZTtcbiAgICBjb25zdCBjb21wb25lbnRUcmFuc2xhdGlvbnMgPSBPYmplY3QudmFsdWVzPHN0cmluZz4oY29tcG9uZW50W28zckluZm9Qcm9wZXJ0eV0/LnRyYW5zbGF0aW9ucyB8fCB7fSkuZmlsdGVyKCh0KSA9PiB0eXBlb2YgdCA9PT0gJ3N0cmluZycpO1xuICAgIGlmIChjb21wb25lbnRUcmFuc2xhdGlvbnMubGVuZ3RoKSB7XG4gICAgICB0cmFuc2xhdGlvbnNbY29tcG9uZW50TmFtZV0gPSBjb21wb25lbnRUcmFuc2xhdGlvbnM7XG4gICAgfVxuICB9XG4gIHJldHVybiBPYmplY3Qua2V5cyh0cmFuc2xhdGlvbnMpLmxlbmd0aCA/IHRyYW5zbGF0aW9ucyA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIHRyYW5zbGF0aW9ucyBvZiBhIG5vZGVcbiAqXG4gKiBAcGFyYW0gbm9kZSBIVE1MRWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgdGhlIHRyYW5zbGF0aW9ucyBhc3NvY2lhdGVkIHRvIHRoZWlyIGNvbXBvbmVudCBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRUcmFuc2xhdGlvbnMgPSAobm9kZTogRWxlbWVudCB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWQgPT4gZ2V0VHJhbnNsYXRpb25zUmVjKG5vZGUsIGdldFRyYW5zbGF0aW9ucyk7XG5cbi8qKlxuICogUmVjdXJzaXZlIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIGFuYWx5dGljcyBvZiBhIG5vZGVcbiAqXG4gKiBAcGFyYW0gbm9kZSBFbGVtZW50IHRvIGNoZWNrXG4gKiBAcGFyYW0gcmVjIHJlY3Vyc2l2ZSBtZXRob2RcbiAqIEByZXR1cm5zIHRoZSBhbmFseXRpY3MgYXNzb2NpYXRlZCB0byB0aGVpciBjb21wb25lbnQgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5hbHl0aWNFdmVudHNSZWMobm9kZTogRWxlbWVudCB8IG51bGwsIHJlYzogdHlwZW9mIGdldEFuYWx5dGljRXZlbnRzUmVjKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYW5ndWxhckRldlRvb2xzID0gKHdpbmRvdyBhcyBhbnkpLm5nO1xuICBjb25zdCBvM3JJbmZvUHJvcGVydHk6IHR5cGVvZiBvdHRlckNvbXBvbmVudEluZm9Qcm9wZXJ0eU5hbWUgPSAnX19vdHRlci1pbmZvX18nO1xuICBpZiAoIW5vZGUgfHwgIWFuZ3VsYXJEZXZUb29scykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjb21wb25lbnQgPSBhbmd1bGFyRGV2VG9vbHMuZ2V0Q29tcG9uZW50KG5vZGUpO1xuICBjb25zdCBzdWJFdmVudHMgPSBBcnJheS5mcm9tKG5vZGUuY2hpbGRyZW4pLm1hcCgoY2hpbGQpID0+IHJlYyhjaGlsZCwgcmVjKSk7XG4gIGNvbnN0IGV2ZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gIHN1YkV2ZW50cy5mb3JFYWNoKChzKSA9PiB7XG4gICAgT2JqZWN0LmVudHJpZXMocyB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBpZiAodi5sZW5ndGgpIHtcbiAgICAgICAgZXZlbnRzW2tdID0gdjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGlmIChjb21wb25lbnQgJiYgY29tcG9uZW50W28zckluZm9Qcm9wZXJ0eV0pIHtcbiAgICBjb25zdCBjb21wb25lbnROYW1lOiBzdHJpbmcgPSBjb21wb25lbnQuY29uc3RydWN0b3IubmFtZTtcbiAgICBjb25zdCBjb21wb25lbnRFdmVudHM6IHN0cmluZ1tdID0gT2JqZWN0LnZhbHVlczxhbnk+KGNvbXBvbmVudC5hbmFseXRpY3NFdmVudHMgfHwge30pLm1hcCgoZXZlbnRDb25zdHJ1Y3RvcikgPT4gZXZlbnRDb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoY29tcG9uZW50RXZlbnRzLmxlbmd0aCkge1xuICAgICAgZXZlbnRzW2NvbXBvbmVudE5hbWVdID0gY29tcG9uZW50RXZlbnRzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMoZXZlbnRzKS5sZW5ndGggPyBldmVudHMgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHRoZSBhbmFseXRpY3Mgb2YgYSBub2RlXG4gKlxuICogQHBhcmFtIG5vZGUgRWxlbWVudCB0byBjaGVja1xuICogQHJldHVybnMgdGhlIGFuYWx5dGljcyBhc3NvY2lhdGVkIHRvIHRoZWlyIGNvbXBvbmVudCBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBbmFseXRpY0V2ZW50cyA9IChub2RlOiBFbGVtZW50IHwgbnVsbCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZCA9PiBnZXRBbmFseXRpY0V2ZW50c1JlYyhub2RlLCBnZXRBbmFseXRpY0V2ZW50cyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGFsbCBpbmZvIGZyb20gYW4gT3R0ZXIgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNvbXBvbmVudENsYXNzSW5zdGFuY2UgY29tcG9uZW50IGluc3RhbmNlXG4gKiBAcGFyYW0gaG9zdCBIVE1MIGVsZW1lbnQgaG9zdGluZyB0aGUgY29tcG9uZW50XG4gKiBAcmV0dXJucyBhbGwgaW5mbyBmcm9tIGFuIE90dGVyIGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3QgZ2V0T3R0ZXJMaWtlQ29tcG9uZW50SW5mbyA9IChjb21wb25lbnRDbGFzc0luc3RhbmNlOiBhbnksIGhvc3Q6IEVsZW1lbnQpOiBPdHRlckxpa2VDb21wb25lbnRJbmZvID0+IHtcbiAgY29uc3QgY29uZmlnSWQgPSBnZXRDb25maWdJZChjb21wb25lbnRDbGFzc0luc3RhbmNlKTtcbiAgY29uc3QgdHJhbnNsYXRpb25zID0gZ2V0VHJhbnNsYXRpb25zKGhvc3QpO1xuICBjb25zdCBhbmFseXRpY3MgPSBnZXRBbmFseXRpY0V2ZW50cyhob3N0KTtcbiAgcmV0dXJuIHtcbiAgICBjb21wb25lbnROYW1lOiBjb21wb25lbnRDbGFzc0luc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgY29uZmlnSWQsXG4gICAgdHJhbnNsYXRpb25zLFxuICAgIGFuYWx5dGljc1xuICB9O1xufTtcbiJdfQ==
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3R0ZXItaW5zcGVjdG9yLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGV2a2l0L2luc3BlY3Rvci9vdHRlci1pbnNwZWN0b3IuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsOEJBQThCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFlekQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsMEJBQTBCLENBQUM7QUFFMUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQWdDLEVBQW1CLEVBQUU7SUFDL0UsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLFFBQWEsRUFBRSxFQUFFO0lBQzNDLE9BQU8sUUFBUSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsUUFBUSxDQUFDO0FBQzVELENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQW9CLEVBQUUsR0FBOEI7SUFDckYsTUFBTSxlQUFlLEdBQUksTUFBYyxDQUFDLEVBQUUsQ0FBQztJQUMzQyxNQUFNLGVBQWUsR0FBMEMsZ0JBQWdCLENBQUM7SUFDaEYsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtRQUM3QixPQUFPO0tBQ1I7SUFDRCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JELE1BQU0sZUFBZSxHQUE2QyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcs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TUFBTSxFQUFFO1lBQzFCLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxlQUFlLENBQUM7U0FDekM7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3pELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFvQixFQUF3QyxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFFL0k7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLHNCQUEyQixFQUFFLElBQWEsRUFBMEIsRUFBRTtJQUM5RyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsT0FBTztRQUNMLGFBQWEsRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsSUFBSTtRQUN0RCxRQUFRO1FBQ1IsWUFBWTtRQUNaLFNBQVM7S0FDVixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtvdHRlckNvbXBvbmVudEluZm9Qcm9wZXJ0eU5hbWV9IGZyb20gJ0BvM3IvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3R0ZXJMaWtlQ29tcG9uZW50SW5mbyB7XG4gIC8qKiBDb250YWluZXIgaW5mb3JtYXRpb24gKi9cbiAgY29udGFpbmVyPzogT3R0ZXJMaWtlQ29tcG9uZW50SW5mbztcbiAgLyoqIENvbmZpZ3VyYXRpb24gSUQgKi9cbiAgY29uZmlnSWQ/OiBzdHJpbmc7XG4gIC8qKiBDb21wb25lbnQgbmFtZSAqL1xuICBjb21wb25lbnROYW1lOiBzdHJpbmc7XG4gIC8qKiBDb21wb25lbnQgdHJhbnNsYXRpb24gKi9cbiAgdHJhbnNsYXRpb25zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICAvKiogQ29tcG9uZW50IGFuYWx5dGljcyAqL1xuICBhbmFseXRpY3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG59XG5cbi8qKlxuICogT3R0ZXIgaW5zcGVjdG9yIGNzcyBjbGFzc1xuICovXG5leHBvcnQgY29uc3QgSU5TUEVDVE9SX0NMQVNTID0gJ290dGVyLWRldnRvb2xzLWluc3BlY3Rvcic7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgbm9kZSBpcyBhbiBPdHRlciBjb250YWluZXJcbiAqIEBwYXJhbSBub2RlIEVsZW1lbnQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgYW4gT3R0ZXIgY29udGFpbmVyXG4gKi9cbmV4cG9ydCBjb25zdCBpc0NvbnRhaW5lciA9IChub2RlOiBFbGVtZW50IHwgdW5kZWZpbmVkIHwgbnVsbCk6IG5vZGUgaXMgRWxlbWVudCA9PiB7XG4gIHJldHVybiAhIW5vZGU/LnRhZ05hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnY29udCcpO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIGNvbmZpZyBpZCBvZiBhIGNvbXBvbmVudCBpbnN0YW5jZVxuICogQHBhcmFtIGluc3RhbmNlIGNvbXBvbmVudCBpbnN0YW5jZVxuICogQHJldHVybnMgdGhlIGNvbmZpZyBpZCBvZiB0aGUgY29tcG9uZW50IGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb25maWdJZCA9IChpbnN0YW5jZTogYW55KSA9PiB7XG4gIHJldHVybiBpbnN0YW5jZVtvdHRlckNvbXBvbmVudEluZm9Qcm9wZXJ0eU5hbWVdPy5jb25maWdJZDtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlIG1ldGhvZCB0byBkZXRlcm1pbiB0aGUgdHJhbnNsYXRpb25zIG9mIGEgbm9kZVxuICogQHBhcmFtIG5vZGUgSFRNTEVsZW1lbnQgdG8gY2hlY2tcbiAqIEBwYXJhbSByZWMgcmVjdXJzaXZlIG1ldGhvZFxuICogQHJldHVybnMgdGhlIHRyYXNuc2xhdGlvbnMgYXNzb2NpYXRlZCB0byB0aGVpciBjb21wb25lbnQgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNsYXRpb25zUmVjKG5vZGU6IEVsZW1lbnQgfCBudWxsLCByZWM6IHR5cGVvZiBnZXRUcmFuc2xhdGlvbnNSZWMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWQge1xuICBjb25zdCBhbmd1bGFyRGV2VG9vbHMgPSAod2luZG93IGFzIGFueSkubmc7XG4gIGNvbnN0IG8zckluZm9Qcm9wZXJ0eTogdHlwZW9mIG90dGVyQ29tcG9uZW50SW5mb1Byb3BlcnR5TmFtZSA9ICdfX290dGVyLWluZm9fXyc7XG4gIGlmICghbm9kZSB8fCAhYW5ndWxhckRldlRvb2xzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGNvbXBvbmVudCA9IGFuZ3VsYXJEZXZUb29scy5nZXRDb21wb25lbnQobm9kZSk7XG4gIGNvbnN0IHN1YlRyYW5zbGF0aW9uczogKFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZClbXSA9IEFycmF5LmZyb20obm9kZS5jaGlsZHJlbikubWFwKChjaGlsZCkgPT4gcmVjKGNoaWxkLCByZWMpKTtcbiAgY29uc3QgdHJhbnNsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgc3ViVHJhbnNsYXRpb25zLmZvckVhY2goKHMpID0+IHtcbiAgICBPYmplY3QuZW50cmllcyhzIHx8IHt9KS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIGlmICh2Lmxlbmd0aCkge1xuICAgICAgICB0cmFuc2xhdGlvbnNba10gPSB2O1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgaWYgKGNvbXBvbmVudCkge1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWU6IHN0cmluZyA9IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGNvbnN0IGNvbXBvbmVudFRyYW5zbGF0aW9ucyA9IE9iamVjdC52YWx1ZXM8c3RyaW5nPihjb21wb25lbnRbbzNySW5mb1Byb3BlcnR5XT8udHJhbnNsYXRpb25zIHx8IHt9KS5maWx0ZXIoKHQpID0+IHR5cGVvZiB0ID09PSAnc3RyaW5nJyk7XG4gICAgaWYgKGNvbXBvbmVudFRyYW5zbGF0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRyYW5zbGF0aW9uc1tjb21wb25lbnROYW1lXSA9IGNvbXBvbmVudFRyYW5zbGF0aW9ucztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHRyYW5zbGF0aW9ucykubGVuZ3RoID8gdHJhbnNsYXRpb25zIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERldGVybWluZSB0aGUgdHJhbnNsYXRpb25zIG9mIGEgbm9kZVxuICogQHBhcmFtIG5vZGUgSFRNTEVsZW1lbnQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRoZSB0cmFuc2xhdGlvbnMgYXNzb2NpYXRlZCB0byB0aGVpciBjb21wb25lbnQgbmFtZVxuICovXG5leHBvcnQgY29uc3QgZ2V0VHJhbnNsYXRpb25zID0gKG5vZGU6IEVsZW1lbnQgfCBudWxsKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkID0+IGdldFRyYW5zbGF0aW9uc1JlYyhub2RlLCBnZXRUcmFuc2xhdGlvbnMpO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZSBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSBhbmFseXRpY3Mgb2YgYSBub2RlXG4gKiBAcGFyYW0gbm9kZSBFbGVtZW50IHRvIGNoZWNrXG4gKiBAcGFyYW0gcmVjIHJlY3Vyc2l2ZSBtZXRob2RcbiAqIEByZXR1cm5zIHRoZSBhbmFseXRpY3MgYXNzb2NpYXRlZCB0byB0aGVpciBjb21wb25lbnQgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5hbHl0aWNFdmVudHNSZWMobm9kZTogRWxlbWVudCB8IG51bGwsIHJlYzogdHlwZW9mIGdldEFuYWx5dGljRXZlbnRzUmVjKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYW5ndWxhckRldlRvb2xzID0gKHdpbmRvdyBhcyBhbnkpLm5nO1xuICBjb25zdCBvM3JJbmZvUHJvcGVydHk6IHR5cGVvZiBvdHRlckNvbXBvbmVudEluZm9Qcm9wZXJ0eU5hbWUgPSAnX19vdHRlci1pbmZvX18nO1xuICBpZiAoIW5vZGUgfHwgIWFuZ3VsYXJEZXZUb29scykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjb21wb25lbnQgPSBhbmd1bGFyRGV2VG9vbHMuZ2V0Q29tcG9uZW50KG5vZGUpO1xuICBjb25zdCBzdWJFdmVudHMgPSBBcnJheS5mcm9tKG5vZGUuY2hpbGRyZW4pLm1hcCgoY2hpbGQpID0+IHJlYyhjaGlsZCwgcmVjKSk7XG4gIGNvbnN0IGV2ZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gIHN1YkV2ZW50cy5mb3JFYWNoKChzKSA9PiB7XG4gICAgT2JqZWN0LmVudHJpZXMocyB8fCB7fSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBpZiAodi5sZW5ndGgpIHtcbiAgICAgICAgZXZlbnRzW2tdID0gdjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIGlmIChjb21wb25lbnQgJiYgY29tcG9uZW50W28zckluZm9Qcm9wZXJ0eV0pIHtcbiAgICBjb25zdCBjb21wb25lbnROYW1lOiBzdHJpbmcgPSBjb21wb25lbnQuY29uc3RydWN0b3IubmFtZTtcbiAgICBjb25zdCBjb21wb25lbnRFdmVudHM6IHN0cmluZ1tdID0gT2JqZWN0LnZhbHVlczxhbnk+KGNvbXBvbmVudC5hbmFseXRpY3NFdmVudHMgfHwge30pLm1hcCgoZXZlbnRDb25zdHJ1Y3RvcikgPT4gZXZlbnRDb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoY29tcG9uZW50RXZlbnRzLmxlbmd0aCkge1xuICAgICAgZXZlbnRzW2NvbXBvbmVudE5hbWVdID0gY29tcG9uZW50RXZlbnRzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMoZXZlbnRzKS5sZW5ndGggPyBldmVudHMgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHRoZSBhbmFseXRpY3Mgb2YgYSBub2RlXG4gKiBAcGFyYW0gbm9kZSBFbGVtZW50IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB0aGUgYW5hbHl0aWNzIGFzc29jaWF0ZWQgdG8gdGhlaXIgY29tcG9uZW50IG5hbWVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFuYWx5dGljRXZlbnRzID0gKG5vZGU6IEVsZW1lbnQgfCBudWxsKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkID0+IGdldEFuYWx5dGljRXZlbnRzUmVjKG5vZGUsIGdldEFuYWx5dGljRXZlbnRzKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgYWxsIGluZm8gZnJvbSBhbiBPdHRlciBjb21wb25lbnRcbiAqIEBwYXJhbSBjb21wb25lbnRDbGFzc0luc3RhbmNlIGNvbXBvbmVudCBpbnN0YW5jZVxuICogQHBhcmFtIGhvc3QgSFRNTCBlbGVtZW50IGhvc3RpbmcgdGhlIGNvbXBvbmVudFxuICogQHJldHVybnMgYWxsIGluZm8gZnJvbSBhbiBPdHRlciBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE90dGVyTGlrZUNvbXBvbmVudEluZm8gPSAoY29tcG9uZW50Q2xhc3NJbnN0YW5jZTogYW55LCBob3N0OiBFbGVtZW50KTogT3R0ZXJMaWtlQ29tcG9uZW50SW5mbyA9PiB7XG4gIGNvbnN0IGNvbmZpZ0lkID0gZ2V0Q29uZmlnSWQoY29tcG9uZW50Q2xhc3NJbnN0YW5jZSk7XG4gIGNvbnN0IHRyYW5zbGF0aW9ucyA9IGdldFRyYW5zbGF0aW9ucyhob3N0KTtcbiAgY29uc3QgYW5hbHl0aWNzID0gZ2V0QW5hbHl0aWNFdmVudHMoaG9zdCk7XG4gIHJldHVybiB7XG4gICAgY29tcG9uZW50TmFtZTogY29tcG9uZW50Q2xhc3NJbnN0YW5jZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIGNvbmZpZ0lkLFxuICAgIHRyYW5zbGF0aW9ucyxcbiAgICBhbmFseXRpY3NcbiAgfTtcbn07XG4iXX0=
@@ -147,7 +147,6 @@ export class OtterInspectorService {
147
147
  }
148
148
  /**
149
149
  * Toggle the inspector.
150
- *
151
150
  * @param isRunning true if the inspector is running
152
151
  */
153
152
  toggleInspector(isRunning) {
@@ -165,4 +164,4 @@ export class OtterInspectorService {
165
164
  window.removeEventListener('mouseout', this.cancelEventCallback, true);
166
165
  }
167
166
  }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3R0ZXItaW5zcGVjdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGV2a2l0L2luc3BlY3Rvci9vdHRlci1pbnNwZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUEwQixNQUFNLDJCQUEyQixDQUFDO0FBUTVIOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQWNoQztRQVpRLDZCQUF3QixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQseUJBQW9CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsd0JBQW1CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEQsaUJBQVksR0FBMEIsSUFBSSxDQUFDO1FBQzNDLG1DQUE4QixHQUFHLElBQUksZUFBZSxDQUFxQyxTQUFTLENBQUMsQ0FBQztRQUU1Rzs7V0FFRztRQUNJLG9DQUErQixHQUFtRCxJQUFJLENBQUMsOEJBQThCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFHMUksSUFBSSxDQUFDLGVBQWUsR0FBSSxNQUFjLENBQUMsRUFBb0IsQ0FBQztJQUM5RCxDQUFDO0lBRU8sZUFBZTtRQUNyQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU8sWUFBWSxDQUFDLENBQWE7UUFDaEMsQ0FBQyxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNwRCxPQUFPO1NBQ1I7UUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDN0ksTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7WUFDdkMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUM7WUFDL0MsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVkLDZEQUE2RDtRQUM3RCxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLFlBQVksRUFBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUVuRSxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDO1lBQ3ZDLEdBQUcsWUFBWTtZQUNmLFNBQVM7U0FDVixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsSUFBNEI7UUFDdkQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDcEMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDO1FBQ3BELE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2hFLE9BQU8sV0FBVyxJQUFJLGVBQWUsSUFBSSxZQUFZLENBQUM7SUFDeEQsQ0FBQztJQUVPLGlCQUFpQixDQUFDLElBQWE7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsT0FBTztTQUNSO1FBQ0QsSUFBSSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RILElBQUksb0JBQTRDLENBQUM7UUFDakQsSUFBSSxTQUFrQixDQUFDO1FBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMzQixPQUFPO1NBQ1I7UUFDRCxHQUFHO1lBQ0Qsb0JBQW9CLEdBQUcseUJBQXlCLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1lBQ3RJLFNBQVMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUNkLHNCQUFzQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsQ0FBQzthQUMxRjtTQUNGLFFBQVEsQ0FBQyxTQUFTLElBQUksc0JBQXNCLEVBQUU7UUFDL0MsSUFBSSxTQUFTLEVBQUU7WUFDYixPQUFPO2dCQUNMLFNBQVMsRUFBRSxzQkFBc0I7Z0JBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQztnQkFDakUsR0FBRyxvQkFBb0I7YUFDeEIsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQixDQUFDLENBQWE7UUFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBNkIsQ0FBQztRQUUzQyxJQUFJLEVBQUUsRUFBRTtZQUNOLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELElBQUksaUJBQWlCLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ25DO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sU0FBUyxDQUFDLGlCQUE0QztRQUM1RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQztZQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUM7WUFDcEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztZQUNoRCw0RUFBNEU7WUFDNUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFXLENBQUMsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUM7U0FDdEc7SUFDSCxDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRU8sV0FBVyxDQUFDLENBQWE7UUFDL0IsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0I7UUFDckIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLE9BQU87U0FDUjtRQUNELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsWUFBWSxDQUFDLFdBQVcsR0FBRztTQUN0QixlQUFlOzs7Ozs7Ozs7OztTQVdmLGVBQWU7Ozs7Ozs7O1FBUWhCLENBQUM7UUFFTCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4QyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU1QyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksZUFBZSxDQUFDLFNBQWtCO1FBQ3ZDLElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0UsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZyB9IGZyb20gJy4vbmcnO1xuaW1wb3J0IHsgZ2V0T3R0ZXJMaWtlQ29tcG9uZW50SW5mbywgSU5TUEVDVE9SX0NMQVNTLCBpc0NvbnRhaW5lciwgT3R0ZXJMaWtlQ29tcG9uZW50SW5mbyB9IGZyb20gJy4vb3R0ZXItaW5zcGVjdG9yLmhlbHBlcnMnO1xuXG5cbmludGVyZmFjZSBDb21wb25lbnRJbmZvIGV4dGVuZHMgT3R0ZXJMaWtlQ29tcG9uZW50SW5mbyB7XG4gIGNvbXBvbmVudDogYW55O1xuICBob3N0OiBFbGVtZW50O1xufVxuXG4vKipcbiAqIFNlcnZpY2UgdG8gaGFuZGxlIHRoZSBjdXN0b20gaW5zcGVjdG9yIGZvciB0aGUgT3R0ZXIgRGV2dG9vbHMgQ2hyb21lIGV4dGVuc2lvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE90dGVySW5zcGVjdG9yU2VydmljZSB7XG4gIHByaXZhdGUgYW5ndWxhckRldlRvb2xzOiBOZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBlbGVtZW50TW91c2VPdmVyQ2FsbGJhY2sgPSB0aGlzLmVsZW1lbnRNb3VzZU92ZXIuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBlbGVtZW50Q2xpY2tDYWxsYmFjayA9IHRoaXMuZWxlbWVudENsaWNrLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgY2FuY2VsRXZlbnRDYWxsYmFjayA9IHRoaXMuY2FuY2VsRXZlbnQuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZENvbXBvbmVudDogQ29tcG9uZW50SW5mbyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpbnNwZWN0b3JEaXY6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb3R0ZXJMaWtlQ29tcG9uZW50SW5mb1RvQmVTZW50ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPdHRlckxpa2VDb21wb25lbnRJbmZvIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8qKlxuICAgKiBTdHJlYW0gb2YgY29tcG9uZW50IGluZm8gdG8gYmUgc2VudCB0byB0aGUgZXh0ZW5zaW9uIGFwcC5cbiAgICovXG4gIHB1YmxpYyBvdHRlckxpa2VDb21wb25lbnRJbmZvVG9CZVNlbnQkOiBPYnNlcnZhYmxlPE90dGVyTGlrZUNvbXBvbmVudEluZm8gfCB1bmRlZmluZWQ+ID0gdGhpcy5vdHRlckxpa2VDb21wb25lbnRJbmZvVG9CZVNlbnQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hbmd1bGFyRGV2VG9vbHMgPSAod2luZG93IGFzIGFueSkubmcgYXMgTmcgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0SW5zcGVjdGluZygpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5lbGVtZW50TW91c2VPdmVyQ2FsbGJhY2ssIHRydWUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZWxlbWVudENsaWNrQ2FsbGJhY2ssIHRydWUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMuY2FuY2VsRXZlbnRDYWxsYmFjaywgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGVsZW1lbnRDbGljayhlOiBNb3VzZUV2ZW50KSB7XG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb21wb25lbnQgfHwgIXRoaXMuYW5ndWxhckRldlRvb2xzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50Lmhvc3QucGFyZW50RWxlbWVudDtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRFbGVtZW50ICYmICh0aGlzLmFuZ3VsYXJEZXZUb29scy5nZXRDb21wb25lbnQocGFyZW50RWxlbWVudCkgfHwgdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0T3duaW5nQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpKTtcbiAgICBjb25zdCBwYXJlbnRIb3N0ID0gcGFyZW50ICYmIHRoaXMuYW5ndWxhckRldlRvb2xzLmdldEhvc3RFbGVtZW50KHBhcmVudCk7XG4gICAgY29uc3QgY29udGFpbmVyID0gaXNDb250YWluZXIocGFyZW50SG9zdClcbiAgICAgID8gZ2V0T3R0ZXJMaWtlQ29tcG9uZW50SW5mbyhwYXJlbnQsIHBhcmVudEhvc3QpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCB7IGNvbXBvbmVudCwgaG9zdCwgLi4uaW5mb1RvQmVTZW50fSA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQ7XG5cbiAgICB0aGlzLm90dGVyTGlrZUNvbXBvbmVudEluZm9Ub0JlU2VudC5uZXh0KHtcbiAgICAgIC4uLmluZm9Ub0JlU2VudCxcbiAgICAgIGNvbnRhaW5lclxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc090dGVyTGlrZUNvbXBvbmVudChpbmZvOiBPdHRlckxpa2VDb21wb25lbnRJbmZvKSB7XG4gICAgY29uc3QgaGFzQ29uZmlnSWQgPSAhIWluZm8uY29uZmlnSWQ7XG4gICAgY29uc3QgaGFzVHJhbnNsYXRpb25zID0gISFpbmZvLnRyYW5zbGF0aW9ucz8ubGVuZ3RoO1xuICAgIGNvbnN0IGhhc0FuYWx5dGljcyA9ICEhT2JqZWN0LmtleXMoaW5mby5hbmFseXRpY3MgfHwge30pLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzQ29uZmlnSWQgfHwgaGFzVHJhbnNsYXRpb25zIHx8IGhhc0FuYWx5dGljcztcbiAgfVxuXG4gIHByaXZhdGUgZmluZENvbXBvbmVudEluZm8obm9kZTogRWxlbWVudCk6IENvbXBvbmVudEluZm8gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5hbmd1bGFyRGV2VG9vbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGNvbXBvbmVudENsYXNzSW5zdGFuY2UgPSB0aGlzLmFuZ3VsYXJEZXZUb29scy5nZXRDb21wb25lbnQobm9kZSkgfHwgdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0T3duaW5nQ29tcG9uZW50KG5vZGUpO1xuICAgIGxldCBvM3JMaWtlQ29tcG9uZW50SW5mbzogT3R0ZXJMaWtlQ29tcG9uZW50SW5mbztcbiAgICBsZXQgaXNPM3JMaWtlOiBib29sZWFuO1xuICAgIGlmICghY29tcG9uZW50Q2xhc3NJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkbyB7XG4gICAgICBvM3JMaWtlQ29tcG9uZW50SW5mbyA9IGdldE90dGVyTGlrZUNvbXBvbmVudEluZm8oY29tcG9uZW50Q2xhc3NJbnN0YW5jZSwgdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0SG9zdEVsZW1lbnQoY29tcG9uZW50Q2xhc3NJbnN0YW5jZSkpO1xuICAgICAgaXNPM3JMaWtlID0gdGhpcy5pc090dGVyTGlrZUNvbXBvbmVudChvM3JMaWtlQ29tcG9uZW50SW5mbyk7XG4gICAgICBpZiAoIWlzTzNyTGlrZSkge1xuICAgICAgICBjb21wb25lbnRDbGFzc0luc3RhbmNlID0gdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0T3duaW5nQ29tcG9uZW50KGNvbXBvbmVudENsYXNzSW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKCFpc08zckxpa2UgJiYgY29tcG9uZW50Q2xhc3NJbnN0YW5jZSk7XG4gICAgaWYgKGlzTzNyTGlrZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnRDbGFzc0luc3RhbmNlLFxuICAgICAgICBob3N0OiB0aGlzLmFuZ3VsYXJEZXZUb29scy5nZXRIb3N0RWxlbWVudChjb21wb25lbnRDbGFzc0luc3RhbmNlKSxcbiAgICAgICAgLi4ubzNyTGlrZUNvbXBvbmVudEluZm9cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbGVtZW50TW91c2VPdmVyKGU6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmNhbmNlbEV2ZW50KGUpO1xuXG4gICAgY29uc3QgZWwgPSBlLnRhcmdldCBhcyBFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVsKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudCA9IHRoaXMuZmluZENvbXBvbmVudEluZm8oZWwpO1xuICAgICAgaWYgKHNlbGVjdGVkQ29tcG9uZW50Py5ob3N0ICE9PSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50Py5ob3N0KSB7XG4gICAgICAgIHRoaXMudW5IaWdobGlnaHQoKTtcbiAgICAgICAgdGhpcy5oaWdobGlnaHQoc2VsZWN0ZWRDb21wb25lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGlnaGxpZ2h0KHNlbGVjdGVkQ29tcG9uZW50OiBDb21wb25lbnRJbmZvIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IHNlbGVjdGVkQ29tcG9uZW50O1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29tcG9uZW50Py5ob3N0ICYmIHRoaXMuaW5zcGVjdG9yRGl2KSB7XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudC5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5pbnNwZWN0b3JEaXYuc3R5bGUud2lkdGggPSBgJHtyZWN0LndpZHRofXB4YDtcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLmhlaWdodCA9IGAke3JlY3QuaGVpZ2h0fXB4YDtcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLmxlZnQgPSBgJHtyZWN0LmxlZnR9cHhgO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgdGhpcy5pbnNwZWN0b3JEaXYuZmlyc3RDaGlsZCEudGV4dENvbnRlbnQgPSBgPCR7dGhpcy5zZWxlY3RlZENvbXBvbmVudC5jb21wb25lbnQuY29uc3RydWN0b3IubmFtZX0+YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuSGlnaGxpZ2h0KCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29tcG9uZW50Py5ob3N0ICYmIHRoaXMuaW5zcGVjdG9yRGl2KSB7XG4gICAgICB0aGlzLmluc3BlY3RvckRpdi5zdHlsZS53aWR0aCA9ICcwJztcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLnRvcCA9ICcwJztcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbEV2ZW50KGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgdGhlIGluc3BlY3RvciBkaXYgYW5kIGFkZCBpdCB0byB0aGUgRE9NLlxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJbnNwZWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuaW5zcGVjdG9yRGl2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluc3BlY3RvckNzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgaW5zcGVjdG9yQ3NzLnRleHRDb250ZW50ID0gYFxuICAgICAgLiR7SU5TUEVDVE9SX0NMQVNTfSB7XG4gICAgICAgIHotaW5kZXg6IDk5OTk5OTk7XG4gICAgICAgIHdpZHRoOiAwO1xuICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTA0LCAxODIsIDI1NSwgMC4zNSk7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLiR7SU5TUEVDVE9SX0NMQVNTfSA+IHNwYW4ge1xuICAgICAgICBib3R0b206IC0yNXB4O1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiAxMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwNCwgMTgyLCAyNTUsIDAuOSk7O1xuICAgICAgICBwYWRkaW5nOiA1cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgfWA7XG5cbiAgICBjb25zdCBpbnNwZWN0b3JEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBpbnNwZWN0b3JTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGluc3BlY3RvckRpdi5hcHBlbmRDaGlsZChpbnNwZWN0b3JTcGFuKTtcbiAgICBpbnNwZWN0b3JEaXYuY2xhc3NMaXN0LmFkZChJTlNQRUNUT1JfQ0xBU1MpO1xuXG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChpbnNwZWN0b3JDc3MpO1xuICAgIHRoaXMuaW5zcGVjdG9yRGl2ID0gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbnNwZWN0b3JEaXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgaW5zcGVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gaXNSdW5uaW5nIHRydWUgaWYgdGhlIGluc3BlY3RvciBpcyBydW5uaW5nXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlSW5zcGVjdG9yKGlzUnVubmluZzogYm9vbGVhbikge1xuICAgIGlmIChpc1J1bm5pbmcpIHtcbiAgICAgIHRoaXMuc3RhcnRJbnNwZWN0aW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcEluc3BlY3RpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcEluc3BlY3RpbmcoKSB7XG4gICAgdGhpcy51bkhpZ2hsaWdodCgpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLmVsZW1lbnRNb3VzZU92ZXJDYWxsYmFjaywgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5lbGVtZW50Q2xpY2tDYWxsYmFjaywgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5jYW5jZWxFdmVudENhbGxiYWNrLCB0cnVlKTtcbiAgfVxufVxuIl19
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3R0ZXItaW5zcGVjdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGV2a2l0L2luc3BlY3Rvci9vdHRlci1pbnNwZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUEwQixNQUFNLDJCQUEyQixDQUFDO0FBUTVIOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHFCQUFxQjtJQWNoQztRQVppQiw2QkFBd0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELHlCQUFvQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELHdCQUFtQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNELGlCQUFZLEdBQTBCLElBQUksQ0FBQztRQUNsQyxtQ0FBOEIsR0FBRyxJQUFJLGVBQWUsQ0FBcUMsU0FBUyxDQUFDLENBQUM7UUFFckg7O1dBRUc7UUFDSSxvQ0FBK0IsR0FBbUQsSUFBSSxDQUFDLDhCQUE4QixDQUFDLFlBQVksRUFBRSxDQUFDO1FBRzFJLElBQUksQ0FBQyxlQUFlLEdBQUksTUFBYyxDQUFDLEVBQW9CLENBQUM7SUFDOUQsQ0FBQztJQUVPLGVBQWU7UUFDckIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxJ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Q0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFNUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZUFBZSxDQUFDLFNBQWtCO1FBQ3ZDLElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3hCO2FBQU07WUFDTCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDdkI7SUFDSCxDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0UsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZyB9IGZyb20gJy4vbmcnO1xuaW1wb3J0IHsgZ2V0T3R0ZXJMaWtlQ29tcG9uZW50SW5mbywgSU5TUEVDVE9SX0NMQVNTLCBpc0NvbnRhaW5lciwgT3R0ZXJMaWtlQ29tcG9uZW50SW5mbyB9IGZyb20gJy4vb3R0ZXItaW5zcGVjdG9yLmhlbHBlcnMnO1xuXG5cbmludGVyZmFjZSBDb21wb25lbnRJbmZvIGV4dGVuZHMgT3R0ZXJMaWtlQ29tcG9uZW50SW5mbyB7XG4gIGNvbXBvbmVudDogYW55O1xuICBob3N0OiBFbGVtZW50O1xufVxuXG4vKipcbiAqIFNlcnZpY2UgdG8gaGFuZGxlIHRoZSBjdXN0b20gaW5zcGVjdG9yIGZvciB0aGUgT3R0ZXIgRGV2dG9vbHMgQ2hyb21lIGV4dGVuc2lvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE90dGVySW5zcGVjdG9yU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYW5ndWxhckRldlRvb2xzOiBOZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50TW91c2VPdmVyQ2FsbGJhY2sgPSB0aGlzLmVsZW1lbnRNb3VzZU92ZXIuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50Q2xpY2tDYWxsYmFjayA9IHRoaXMuZWxlbWVudENsaWNrLmJpbmQodGhpcyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuY2VsRXZlbnRDYWxsYmFjayA9IHRoaXMuY2FuY2VsRXZlbnQuYmluZCh0aGlzKTtcbiAgcHJpdmF0ZSBzZWxlY3RlZENvbXBvbmVudDogQ29tcG9uZW50SW5mbyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBpbnNwZWN0b3JEaXY6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3R0ZXJMaWtlQ29tcG9uZW50SW5mb1RvQmVTZW50ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPdHRlckxpa2VDb21wb25lbnRJbmZvIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8qKlxuICAgKiBTdHJlYW0gb2YgY29tcG9uZW50IGluZm8gdG8gYmUgc2VudCB0byB0aGUgZXh0ZW5zaW9uIGFwcC5cbiAgICovXG4gIHB1YmxpYyBvdHRlckxpa2VDb21wb25lbnRJbmZvVG9CZVNlbnQkOiBPYnNlcnZhYmxlPE90dGVyTGlrZUNvbXBvbmVudEluZm8gfCB1bmRlZmluZWQ+ID0gdGhpcy5vdHRlckxpa2VDb21wb25lbnRJbmZvVG9CZVNlbnQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hbmd1bGFyRGV2VG9vbHMgPSAod2luZG93IGFzIGFueSkubmcgYXMgTmcgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0SW5zcGVjdGluZygpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdmVyJywgdGhpcy5lbGVtZW50TW91c2VPdmVyQ2FsbGJhY2ssIHRydWUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZWxlbWVudENsaWNrQ2FsbGJhY2ssIHRydWUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIHRoaXMuY2FuY2VsRXZlbnRDYWxsYmFjaywgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGVsZW1lbnRDbGljayhlOiBNb3VzZUV2ZW50KSB7XG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb21wb25lbnQgfHwgIXRoaXMuYW5ndWxhckRldlRvb2xzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50Lmhvc3QucGFyZW50RWxlbWVudDtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRFbGVtZW50ICYmICh0aGlzLmFuZ3VsYXJEZXZUb29scy5nZXRDb21wb25lbnQocGFyZW50RWxlbWVudCkgfHwgdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0T3duaW5nQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpKTtcbiAgICBjb25zdCBwYXJlbnRIb3N0ID0gcGFyZW50ICYmIHRoaXMuYW5ndWxhckRldlRvb2xzLmdldEhvc3RFbGVtZW50KHBhcmVudCk7XG4gICAgY29uc3QgY29udGFpbmVyID0gaXNDb250YWluZXIocGFyZW50SG9zdClcbiAgICAgID8gZ2V0T3R0ZXJMaWtlQ29tcG9uZW50SW5mbyhwYXJlbnQsIHBhcmVudEhvc3QpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCB7IGNvbXBvbmVudCwgaG9zdCwgLi4uaW5mb1RvQmVTZW50fSA9IHRoaXMuc2VsZWN0ZWRDb21wb25lbnQ7XG5cbiAgICB0aGlzLm90dGVyTGlrZUNvbXBvbmVudEluZm9Ub0JlU2VudC5uZXh0KHtcbiAgICAgIC4uLmluZm9Ub0JlU2VudCxcbiAgICAgIGNvbnRhaW5lclxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc090dGVyTGlrZUNvbXBvbmVudChpbmZvOiBPdHRlckxpa2VDb21wb25lbnRJbmZvKSB7XG4gICAgY29uc3QgaGFzQ29uZmlnSWQgPSAhIWluZm8uY29uZmlnSWQ7XG4gICAgY29uc3QgaGFzVHJhbnNsYXRpb25zID0gISFpbmZvLnRyYW5zbGF0aW9ucz8ubGVuZ3RoO1xuICAgIGNvbnN0IGhhc0FuYWx5dGljcyA9ICEhT2JqZWN0LmtleXMoaW5mby5hbmFseXRpY3MgfHwge30pLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzQ29uZmlnSWQgfHwgaGFzVHJhbnNsYXRpb25zIHx8IGhhc0FuYWx5dGljcztcbiAgfVxuXG4gIHByaXZhdGUgZmluZENvbXBvbmVudEluZm8obm9kZTogRWxlbWVudCk6IENvbXBvbmVudEluZm8gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5hbmd1bGFyRGV2VG9vbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGNvbXBvbmVudENsYXNzSW5zdGFuY2UgPSB0aGlzLmFuZ3VsYXJEZXZUb29scy5nZXRDb21wb25lbnQobm9kZSkgfHwgdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0T3duaW5nQ29tcG9uZW50KG5vZGUpO1xuICAgIGxldCBvM3JMaWtlQ29tcG9uZW50SW5mbzogT3R0ZXJMaWtlQ29tcG9uZW50SW5mbztcbiAgICBsZXQgaXNPM3JMaWtlOiBib29sZWFuO1xuICAgIGlmICghY29tcG9uZW50Q2xhc3NJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkbyB7XG4gICAgICBvM3JMaWtlQ29tcG9uZW50SW5mbyA9IGdldE90dGVyTGlrZUNvbXBvbmVudEluZm8oY29tcG9uZW50Q2xhc3NJbnN0YW5jZSwgdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0SG9zdEVsZW1lbnQoY29tcG9uZW50Q2xhc3NJbnN0YW5jZSkpO1xuICAgICAgaXNPM3JMaWtlID0gdGhpcy5pc090dGVyTGlrZUNvbXBvbmVudChvM3JMaWtlQ29tcG9uZW50SW5mbyk7XG4gICAgICBpZiAoIWlzTzNyTGlrZSkge1xuICAgICAgICBjb21wb25lbnRDbGFzc0luc3RhbmNlID0gdGhpcy5hbmd1bGFyRGV2VG9vbHMuZ2V0T3duaW5nQ29tcG9uZW50KGNvbXBvbmVudENsYXNzSW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKCFpc08zckxpa2UgJiYgY29tcG9uZW50Q2xhc3NJbnN0YW5jZSk7XG4gICAgaWYgKGlzTzNyTGlrZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnRDbGFzc0luc3RhbmNlLFxuICAgICAgICBob3N0OiB0aGlzLmFuZ3VsYXJEZXZUb29scy5nZXRIb3N0RWxlbWVudChjb21wb25lbnRDbGFzc0luc3RhbmNlKSxcbiAgICAgICAgLi4ubzNyTGlrZUNvbXBvbmVudEluZm9cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbGVtZW50TW91c2VPdmVyKGU6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmNhbmNlbEV2ZW50KGUpO1xuXG4gICAgY29uc3QgZWwgPSBlLnRhcmdldCBhcyBFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVsKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudCA9IHRoaXMuZmluZENvbXBvbmVudEluZm8oZWwpO1xuICAgICAgaWYgKHNlbGVjdGVkQ29tcG9uZW50Py5ob3N0ICE9PSB0aGlzLnNlbGVjdGVkQ29tcG9uZW50Py5ob3N0KSB7XG4gICAgICAgIHRoaXMudW5IaWdobGlnaHQoKTtcbiAgICAgICAgdGhpcy5oaWdobGlnaHQoc2VsZWN0ZWRDb21wb25lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGlnaGxpZ2h0KHNlbGVjdGVkQ29tcG9uZW50OiBDb21wb25lbnRJbmZvIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvbmVudCA9IHNlbGVjdGVkQ29tcG9uZW50O1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29tcG9uZW50Py5ob3N0ICYmIHRoaXMuaW5zcGVjdG9yRGl2KSB7XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5zZWxlY3RlZENvbXBvbmVudC5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5pbnNwZWN0b3JEaXYuc3R5bGUud2lkdGggPSBgJHtyZWN0LndpZHRofXB4YDtcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLmhlaWdodCA9IGAke3JlY3QuaGVpZ2h0fXB4YDtcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLmxlZnQgPSBgJHtyZWN0LmxlZnR9cHhgO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgdGhpcy5pbnNwZWN0b3JEaXYuZmlyc3RDaGlsZCEudGV4dENvbnRlbnQgPSBgPCR7dGhpcy5zZWxlY3RlZENvbXBvbmVudC5jb21wb25lbnQuY29uc3RydWN0b3IubmFtZX0+YDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuSGlnaGxpZ2h0KCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29tcG9uZW50Py5ob3N0ICYmIHRoaXMuaW5zcGVjdG9yRGl2KSB7XG4gICAgICB0aGlzLmluc3BlY3RvckRpdi5zdHlsZS53aWR0aCA9ICcwJztcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLnRvcCA9ICcwJztcbiAgICAgIHRoaXMuaW5zcGVjdG9yRGl2LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRDb21wb25lbnQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbEV2ZW50KGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgdGhlIGluc3BlY3RvciBkaXYgYW5kIGFkZCBpdCB0byB0aGUgRE9NLlxuICAgKi9cbiAgcHVibGljIHByZXBhcmVJbnNwZWN0b3IoKSB7XG4gICAgaWYgKHRoaXMuaW5zcGVjdG9yRGl2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluc3BlY3RvckNzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgaW5zcGVjdG9yQ3NzLnRleHRDb250ZW50ID0gYFxuICAgICAgLiR7SU5TUEVDVE9SX0NMQVNTfSB7XG4gICAgICAgIHotaW5kZXg6IDk5OTk5OTk7XG4gICAgICAgIHdpZHRoOiAwO1xuICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTA0LCAxODIsIDI1NSwgMC4zNSk7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLiR7SU5TUEVDVE9SX0NMQVNTfSA+IHNwYW4ge1xuICAgICAgICBib3R0b206IC0yNXB4O1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiAxMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwNCwgMTgyLCAyNTUsIDAuOSk7O1xuICAgICAgICBwYWRkaW5nOiA1cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgfWA7XG5cbiAgICBjb25zdCBpbnNwZWN0b3JEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBpbnNwZWN0b3JTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIGluc3BlY3RvckRpdi5hcHBlbmRDaGlsZChpbnNwZWN0b3JTcGFuKTtcbiAgICBpbnNwZWN0b3JEaXYuY2xhc3NMaXN0LmFkZChJTlNQRUNUT1JfQ0xBU1MpO1xuXG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChpbnNwZWN0b3JDc3MpO1xuICAgIHRoaXMuaW5zcGVjdG9yRGl2ID0gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbnNwZWN0b3JEaXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgaW5zcGVjdG9yLlxuICAgKiBAcGFyYW0gaXNSdW5uaW5nIHRydWUgaWYgdGhlIGluc3BlY3RvciBpcyBydW5uaW5nXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlSW5zcGVjdG9yKGlzUnVubmluZzogYm9vbGVhbikge1xuICAgIGlmIChpc1J1bm5pbmcpIHtcbiAgICAgIHRoaXMuc3RhcnRJbnNwZWN0aW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RvcEluc3BlY3RpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RvcEluc3BlY3RpbmcoKSB7XG4gICAgdGhpcy51bkhpZ2hsaWdodCgpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLmVsZW1lbnRNb3VzZU92ZXJDYWxsYmFjaywgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5lbGVtZW50Q2xpY2tDYWxsYmFjaywgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5jYW5jZWxFdmVudENhbGxiYWNrLCB0cnVlKTtcbiAgfVxufVxuIl19
@@ -2,4 +2,4 @@ export * from './core/index';
2
2
  export * from './devkit/index';
3
3
  export * from './stores/index';
4
4
  export * from './tools/index';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgQmxvY2ssIEV4cG9zZWRDb21wb25lbnQsIFBhZ2UsIENvbnRleHQsIENvbnRleHRJbnB1dCwgQmFzZUNvbnRleHRPdXRwdXQsIFRlbXBsYXRlQ29udGV4dCB9IGZyb20gJ0BvM3IvY29yZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmUvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9kZXZraXQvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi9zdG9yZXMvaW5kZXgnO1xuZXhwb3J0ICogZnJvbSAnLi90b29scy9pbmRleCc7XG4iXX0=
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWNfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHsgQ29udGV4dCwgQ29udGV4dElucHV0LCBCYXNlQ29udGV4dE91dHB1dCwgVGVtcGxhdGVDb250ZXh0IH0gZnJvbSAnQG8zci9jb3JlJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZS9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL2RldmtpdC9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3Jlcy9pbmRleCc7XG5leHBvcnQgKiBmcm9tICcuL3Rvb2xzL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public_api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibzNyLWNvbXBvbmVudHMtcnVsZXMtZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3J1bGVzLWVuZ2luZS9vM3ItY29tcG9uZW50cy1ydWxlcy1lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWNfYXBpJztcbiJdfQ==
@@ -0,0 +1,154 @@
1
+ import { inject, Injectable, Optional } from '@angular/core';
2
+ import { LoggerService } from '@o3r/logger';
3
+ import { combineLatest, distinctUntilChanged, firstValueFrom, map, of, Subject, Subscription, withLatestFrom } from 'rxjs';
4
+ import { deletePlaceholderTemplateEntity, selectPlaceholderRequestEntities, selectPlaceholderTemplateEntities, setPlaceholderRequestEntityFromUrl, setPlaceholderTemplateEntity, updatePlaceholderRequestEntity } from '@o3r/components';
5
+ import { select, Store } from '@ngrx/store';
6
+ import { LocalizationService } from '@o3r/localization';
7
+ import { RULES_ENGINE_PLACEHOLDER_UPDATE_ACTION_TYPE } from './placeholder.interfaces';
8
+ import { DynamicContentService } from '@o3r/dynamic-content';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@ngrx/store";
11
+ import * as i2 from "@o3r/logger";
12
+ import * as i3 from "@o3r/localization";
13
+ /**
14
+ * Service to handle async PlaceholderTemplate actions
15
+ */
16
+ export class PlaceholderRulesEngineActionHandler {
17
+ constructor(store, logger, translateService) {
18
+ this.logger = logger;
19
+ this.subscription = new Subscription();
20
+ this.placeholdersActions$ = new Subject();
21
+ /** @inheritdoc */
22
+ this.supportingActions = [RULES_ENGINE_PLACEHOLDER_UPDATE_ACTION_TYPE];
23
+ const lang$ = translateService ? translateService.getTranslateService().onLangChange.pipe(map(({ lang }) => lang), distinctUntilChanged()) : of(null);
24
+ const filteredActions$ = combineLatest([lang$, this.placeholdersActions$.pipe(distinctUntilChanged((prev, next) => JSON.stringify(prev) === JSON.stringify(next)))]).pipe(withLatestFrom(combineLatest([store.pipe(select(selectPlaceholderTemplateEntities)), store.pipe(select(selectPlaceholderRequestEntities))])), map(([langAndTemplatesUrls, storedPlaceholdersAndRequests]) => {
25
+ const [lang, placeholderActions] = langAndTemplatesUrls;
26
+ const storedPlaceholders = storedPlaceholdersAndRequests[0] || {};
27
+ const storedPlaceholderRequests = storedPlaceholdersAndRequests[1] || {};
28
+ const placeholderNewRequests = [];
29
+ // Stores all raw Urls used from the current engine execution
30
+ const usedUrls = {};
31
+ // Get all Urls that needs to be resolved from current rules engine output
32
+ const placeholdersTemplates = placeholderActions.reduce((acc, placeholderAction) => {
33
+ const placeholdersTemplateUrl = {
34
+ rawUrl: placeholderAction.templateUrl,
35
+ priority: placeholderAction.priority
36
+ };
37
+ if (acc[placeholderAction.placeholderId]) {
38
+ acc[placeholderAction.placeholderId].push(placeholdersTemplateUrl);
39
+ }
40
+ else {
41
+ acc[placeholderAction.placeholderId] = [placeholdersTemplateUrl];
42
+ }
43
+ const resolvedUrl = this.resolveUrlWithLang(placeholderAction.templateUrl, lang);
44
+ // Filters duplicates and resolved urls that are already in the store
45
+ if (!usedUrls[placeholderAction.templateUrl] && (!storedPlaceholderRequests[placeholderAction.templateUrl]
46
+ || storedPlaceholderRequests[placeholderAction.templateUrl].resolvedUrl !== resolvedUrl)) {
47
+ placeholderNewRequests.push({
48
+ rawUrl: placeholderAction.templateUrl,
49
+ resolvedUrl: this.resolveUrlWithLang(placeholderAction.templateUrl, lang)
50
+ });
51
+ }
52
+ usedUrls[placeholderAction.templateUrl] = true;
53
+ return acc;
54
+ }, {});
55
+ // Urls not used anymore and not already disabled
56
+ const placeholderRequestsToDisable = [];
57
+ // Urls used that were disabled
58
+ const placeholderRequestsToEnable = [];
59
+ Object.keys(storedPlaceholderRequests).forEach((storedPlaceholderRequestRawUrl) => {
60
+ const usedFromEngineIteration = usedUrls[storedPlaceholderRequestRawUrl];
61
+ const usedFromStore = (storedPlaceholderRequests && storedPlaceholderRequests[storedPlaceholderRequestRawUrl]) ? storedPlaceholderRequests[storedPlaceholderRequestRawUrl].used : false;
62
+ if (!usedFromEngineIteration && usedFromStore) {
63
+ placeholderRequestsToDisable.push(storedPlaceholderRequestRawUrl);
64
+ }
65
+ else if (usedFromEngineIteration && !usedFromStore) {
66
+ placeholderRequestsToEnable.push(storedPlaceholderRequestRawUrl);
67
+ }
68
+ });
69
+ // Placeholder that are no longer filled by the current engine execution output will be cleared
70
+ const placeholdersTemplatesToBeCleanedUp = Object.keys(storedPlaceholders)
71
+ .filter(placeholderId => !placeholdersTemplates[placeholderId]);
72
+ const placeholdersTemplatesToBeSet = Object.keys(placeholdersTemplates).reduce((changedPlaceholderTemplates, placeholderTemplateId) => {
73
+ // Caching if the placeholder template already exists with the same urls
74
+ if (!storedPlaceholders[placeholderTemplateId] ||
75
+ !(JSON.stringify(storedPlaceholders[placeholderTemplateId].urlsWithPriority) === JSON.stringify(placeholdersTemplates[placeholderTemplateId]))) {
76
+ changedPlaceholderTemplates.push({
77
+ id: placeholderTemplateId,
78
+ urlsWithPriority: placeholdersTemplates[placeholderTemplateId]
79
+ });
80
+ }
81
+ return changedPlaceholderTemplates;
82
+ }, []);
83
+ return {
84
+ placeholdersTemplatesToBeCleanedUp,
85
+ placeholderRequestsToDisable,
86
+ placeholderRequestsToEnable,
87
+ placeholdersTemplatesToBeSet,
88
+ placeholderNewRequests
89
+ };
90
+ }));
91
+ this.subscription.add(filteredActions$.subscribe((placeholdersUpdates) => {
92
+ placeholdersUpdates.placeholdersTemplatesToBeCleanedUp.forEach(placeholderId => store.dispatch(deletePlaceholderTemplateEntity({
93
+ id: placeholderId
94
+ })));
95
+ placeholdersUpdates.placeholdersTemplatesToBeSet.forEach(placeholdersTemplateToBeSet => {
96
+ store.dispatch(setPlaceholderTemplateEntity({ entity: placeholdersTemplateToBeSet }));
97
+ });
98
+ placeholdersUpdates.placeholderRequestsToDisable.forEach(placeholderRequestToDisable => {
99
+ store.dispatch(updatePlaceholderRequestEntity({ entity: { id: placeholderRequestToDisable, used: false } }));
100
+ });
101
+ placeholdersUpdates.placeholderRequestsToEnable.forEach(placeholderRequestToEnable => {
102
+ store.dispatch(updatePlaceholderRequestEntity({ entity: { id: placeholderRequestToEnable, used: true } }));
103
+ });
104
+ placeholdersUpdates.placeholderNewRequests.forEach(placeholderNewRequest => {
105
+ store.dispatch(setPlaceholderRequestEntityFromUrl({
106
+ resolvedUrl: placeholderNewRequest.resolvedUrl,
107
+ id: placeholderNewRequest.rawUrl,
108
+ call: this.retrieveTemplate(placeholderNewRequest.resolvedUrl)
109
+ }));
110
+ });
111
+ }));
112
+ }
113
+ /**
114
+ * Localize the url, replacing the language marker
115
+ * @param url
116
+ * @param language
117
+ */
118
+ resolveUrlWithLang(url, language) {
119
+ if (!language && url.includes('[LANGUAGE]')) {
120
+ this.logger.warn(`Missing language when trying to resolve ${url}`);
121
+ }
122
+ return language ? url.replace(/\[LANGUAGE]/g, language) : url;
123
+ }
124
+ /**
125
+ * Retrieve template as json from a given url
126
+ * @param url
127
+ */
128
+ async retrieveTemplate(url) {
129
+ const resolvedUrl$ = inject(DynamicContentService, { optional: true })?.getContentPathStream(url) || of(url);
130
+ const fullUrl = await firstValueFrom(resolvedUrl$);
131
+ return fetch(fullUrl).then((response) => response.json());
132
+ }
133
+ /** @inheritdoc */
134
+ executeActions(actions) {
135
+ const templates = actions.map((action) => ({
136
+ placeholderId: action.placeholderId,
137
+ templateUrl: action.value,
138
+ priority: action.priority || 0
139
+ }));
140
+ this.placeholdersActions$.next(templates);
141
+ }
142
+ /** @inheritdoc */
143
+ ngOnDestroy() {
144
+ this.subscription.unsubscribe();
145
+ }
146
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PlaceholderRulesEngineActionHandler, deps: [{ token: i1.Store }, { token: i2.LoggerService }, { token: i3.LocalizationService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
147
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PlaceholderRulesEngineActionHandler }); }
148
+ }
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PlaceholderRulesEngineActionHandler, decorators: [{
150
+ type: Injectable
151
+ }], ctorParameters: () => [{ type: i1.Store }, { type: i2.LoggerService }, { type: i3.LocalizationService, decorators: [{
152
+ type: Optional
153
+ }] }] });
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIuYWN0aW9uLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcnVsZXMtZW5naW5lL3BsYWNlaG9sZGVyLmFjdGlvbi1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0gsT0FBTyxFQUNMLCtCQUErQixFQUcvQixnQ0FBZ0MsRUFDaEMsaUNBQWlDLEVBQ2pDLGtDQUFrQyxFQUNsQyw0QkFBNEIsRUFDNUIsOEJBQThCLEVBQy9CLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEQsT0FBTyxFQUFnQywyQ0FBMkMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7OztBQUU3RDs7R0FFRztBQUVILE1BQU0sT0FBTyxtQ0FBbUM7SUFTOUMsWUFBWSxLQUFzQyxFQUFtQixNQUFxQixFQUFjLGdCQUFzQztRQUF6RSxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBUGhGLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVsQyx5QkFBb0IsR0FBZ0YsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUU1SCxrQkFBa0I7UUFDRixzQkFBaUIsR0FBRyxDQUFDLDJDQUEyQyxDQUFV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QyxnQkFBZ0IsQ0FBQyxHQUFXO1FBQzFDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RyxNQUFNLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxrQkFBa0I7SUFDWCxjQUFjLENBQUMsT0FBdUM7UUFDM0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6QyxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7WUFDbkMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1lBQ3pCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUM7U0FDL0IsQ0FBQyxDQUFDLENBQUM7UUFFSixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxrQkFBa0I7SUFDWCxXQUFXO1FBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbEMsQ0FBQztpSUFySlUsbUNBQW1DO3FJQUFuQyxtQ0FBbUM7OzJGQUFuQyxtQ0FBbUM7a0JBRC9DLFVBQVU7OzBCQVVvRixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJ1bGVzRW5naW5lQWN0aW9uSGFuZGxlciB9IGZyb20gJ0BvM3IvY29yZSc7XG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnQG8zci9sb2dnZXInO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpcnN0VmFsdWVGcm9tLCBtYXAsIG9mLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHdpdGhMYXRlc3RGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkZWxldGVQbGFjZWhvbGRlclRlbXBsYXRlRW50aXR5LFxuICBQbGFjZWhvbGRlclJlcXVlc3RSZXBseSxcbiAgUGxhY2Vob2xkZXJUZW1wbGF0ZVN0b3JlLFxuICBzZWxlY3RQbGFjZWhvbGRlclJlcXVlc3RFbnRpdGllcyxcbiAgc2VsZWN0UGxhY2Vob2xkZXJUZW1wbGF0ZUVudGl0aWVzLFxuICBzZXRQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHlGcm9tVXJsLFxuICBzZXRQbGFjZWhvbGRlclRlbXBsYXRlRW50aXR5LFxuICB1cGRhdGVQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHlcbn0gZnJvbSAnQG8zci9jb21wb25lbnRzJztcbmltcG9ydCB7IHNlbGVjdCwgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnQG8zci9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHsgQWN0aW9uVXBkYXRlUGxhY2Vob2xkZXJCbG9jaywgUlVMRVNfRU5HSU5FX1BMQUNFSE9MREVSX1VQREFURV9BQ1RJT05fVFlQRSB9IGZyb20gJy4vcGxhY2Vob2xkZXIuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEeW5hbWljQ29udGVudFNlcnZpY2UgfSBmcm9tICdAbzNyL2R5bmFtaWMtY29udGVudCc7XG5cbi8qKlxuICogU2VydmljZSB0byBoYW5kbGUgYXN5bmMgUGxhY2Vob2xkZXJUZW1wbGF0ZSBhY3Rpb25zXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBQbGFjZWhvbGRlclJ1bGVzRW5naW5lQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIE9uRGVzdHJveSwgUnVsZXNFbmdpbmVBY3Rpb25IYW5kbGVyPEFjdGlvblVwZGF0ZVBsYWNlaG9sZGVyQmxvY2s+IHtcblxuICBwcm90ZWN0ZWQgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHByb3RlY3RlZCBwbGFjZWhvbGRlcnNBY3Rpb25zJDogU3ViamVjdDx7IHBsYWNlaG9sZGVySWQ6IHN0cmluZzsgdGVtcGxhdGVVcmw6IHN0cmluZzsgcHJpb3JpdHk6IG51bWJlciB9W10+ID0gbmV3IFN1YmplY3QoKTtcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1cHBvcnRpbmdBY3Rpb25zID0gW1JVTEVTX0VOR0lORV9QTEFDRUhPTERFUl9VUERBVEVfQUNUSU9OX1RZUEVdIGFzIGNvbnN0O1xuXG4gIGNvbnN0cnVjdG9yKHN0b3JlOiBTdG9yZTxQbGFjZWhvbGRlclRlbXBsYXRlU3RvcmU+LCBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyU2VydmljZSwgQE9wdGlvbmFsKCkgdHJhbnNsYXRlU2VydmljZT86IExvY2FsaXphdGlvblNlcnZpY2UpIHtcblxuICAgIGNvbnN0IGxhbmckID0gdHJhbnNsYXRlU2VydmljZSA/IHRyYW5zbGF0ZVNlcnZpY2UuZ2V0VHJhbnNsYXRlU2VydmljZSgpLm9uTGFuZ0NoYW5nZS5waXBlKFxuICAgICAgbWFwKCh7IGxhbmcgfSkgPT4gbGFuZyksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKSA6IG9mKG51bGwpO1xuXG4gICAgY29uc3QgZmlsdGVyZWRBY3Rpb25zJCA9IGNvbWJpbmVMYXRlc3QoW2xhbmckLCB0aGlzLnBsYWNlaG9sZGVyc0FjdGlvbnMkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgbmV4dCkgPT4gSlNPTi5zdHJpbmdpZnkocHJldikgPT09IEpTT04uc3RyaW5naWZ5KG5leHQpKSldKS5waXBlKFxuICAgICAgd2l0aExhdGVzdEZyb20oXG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW3N0b3JlLnBpcGUoc2VsZWN0KHNlbGVjdFBsYWNlaG9sZGVyVGVtcGxhdGVFbnRpdGllcykpLCBzdG9yZS5waXBlKHNlbGVjdChzZWxlY3RQbGFjZWhvbGRlclJlcXVlc3RFbnRpdGllcykpXSlcbiAgICAgICksXG4gICAgICBtYXAoKFtsYW5nQW5kVGVtcGxhdGVzVXJscywgc3RvcmVkUGxhY2Vob2xkZXJzQW5kUmVxdWVzdHNdKSA9PiB7XG4gICAgICAgIGNvbnN0IFtsYW5nLCBwbGFjZWhvbGRlckFjdGlvbnNdID0gbGFuZ0FuZFRlbXBsYXRlc1VybHM7XG4gICAgICAgIGNvbnN0IHN0b3JlZFBsYWNlaG9sZGVycyA9IHN0b3JlZFBsYWNlaG9sZGVyc0FuZFJlcXVlc3RzWzBdIHx8IHt9O1xuICAgICAgICBjb25zdCBzdG9yZWRQbGFjZWhvbGRlclJlcXVlc3RzID0gc3RvcmVkUGxhY2Vob2xkZXJzQW5kUmVxdWVzdHNbMV0gfHwge307XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyTmV3UmVxdWVzdHM6IHsgcmF3VXJsOiBzdHJpbmc7IHJlc29sdmVkVXJsOiBzdHJpbmcgfVtdID0gW107XG4gICAgICAgIC8vIFN0b3JlcyBhbGwgcmF3IFVybHMgdXNlZCBmcm9tIHRoZSBjdXJyZW50IGVuZ2luZSBleGVjdXRpb25cbiAgICAgICAgY29uc3QgdXNlZFVybHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gICAgICAgIC8vIEdldCBhbGwgVXJscyB0aGF0IG5lZWRzIHRvIGJlIHJlc29sdmVkIGZyb20gY3VycmVudCBydWxlcyBlbmdpbmUgb3V0cHV0XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyc1RlbXBsYXRlcyA9IHBsYWNlaG9sZGVyQWN0aW9ucy5yZWR1Y2UoKGFjYywgcGxhY2Vob2xkZXJBY3Rpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNUZW1wbGF0ZVVybCA9IHtcbiAgICAgICAgICAgIHJhd1VybDogcGxhY2Vob2xkZXJBY3Rpb24udGVtcGxhdGVVcmwsXG4gICAgICAgICAgICBwcmlvcml0eTogcGxhY2Vob2xkZXJBY3Rpb24ucHJpb3JpdHlcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChhY2NbcGxhY2Vob2xkZXJBY3Rpb24ucGxhY2Vob2xkZXJJZF0pIHtcbiAgICAgICAgICAgIGFjY1twbGFjZWhvbGRlckFjdGlvbi5wbGFjZWhvbGRlcklkXS5wdXNoKHBsYWNlaG9sZGVyc1RlbXBsYXRlVXJsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjW3BsYWNlaG9sZGVyQWN0aW9uLnBsYWNlaG9sZGVySWRdID0gW3BsYWNlaG9sZGVyc1RlbXBsYXRlVXJsXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRVcmwgPSB0aGlzLnJlc29sdmVVcmxXaXRoTGFuZyhwbGFjZWhvbGRlckFjdGlvbi50ZW1wbGF0ZVVybCwgbGFuZyk7XG4gICAgICAgICAgLy8gRmlsdGVycyBkdXBsaWNhdGVzIGFuZCByZXNvbHZlZCB1cmxzIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIHN0b3JlXG4gICAgICAgICAgaWYgKCF1c2VkVXJsc1twbGFjZWhvbGRlckFjdGlvbi50ZW1wbGF0ZVVybF0gJiYgKCFzdG9yZWRQbGFjZWhvbGRlclJlcXVlc3RzW3BsYWNlaG9sZGVyQWN0aW9uLnRlbXBsYXRlVXJsXVxuICAgICAgICAgICAgfHwgc3RvcmVkUGxhY2Vob2xkZXJSZXF1ZXN0c1twbGFjZWhvbGRlckFjdGlvbi50ZW1wbGF0ZVVybF0hLnJlc29sdmVkVXJsICE9PSByZXNvbHZlZFVybCkpIHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyTmV3UmVxdWVzdHMucHVzaCh7XG4gICAgICAgICAgICAgIHJhd1VybDogcGxhY2Vob2xkZXJBY3Rpb24udGVtcGxhdGVVcmwsXG4gICAgICAgICAgICAgIHJlc29sdmVkVXJsOiB0aGlzLnJlc29sdmVVcmxXaXRoTGFuZyhwbGFjZWhvbGRlckFjdGlvbi50ZW1wbGF0ZVVybCwgbGFuZylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1c2VkVXJsc1twbGFjZWhvbGRlckFjdGlvbi50ZW1wbGF0ZVVybF0gPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9IGFzIHsgW2tleTogc3RyaW5nXTogeyByYXdVcmw6IHN0cmluZzsgcHJpb3JpdHk6IG51bWJlciB9W10gfSk7XG4gICAgICAgIC8vIFVybHMgbm90IHVzZWQgYW55bW9yZSBhbmQgbm90IGFscmVhZHkgZGlzYWJsZWRcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJSZXF1ZXN0c1RvRGlzYWJsZTogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgLy8gVXJscyB1c2VkIHRoYXQgd2VyZSBkaXNhYmxlZFxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlclJlcXVlc3RzVG9FbmFibGU6IHN0cmluZ1tdID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKHN0b3JlZFBsYWNlaG9sZGVyUmVxdWVzdHMpLmZvckVhY2goKHN0b3JlZFBsYWNlaG9sZGVyUmVxdWVzdFJhd1VybCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZWRGcm9tRW5naW5lSXRlcmF0aW9uID0gdXNlZFVybHNbc3RvcmVkUGxhY2Vob2xkZXJSZXF1ZXN0UmF3VXJsXTtcbiAgICAgICAgICBjb25zdCB1c2VkRnJvbVN0b3JlID0gKHN0b3JlZFBsYWNlaG9sZGVyUmVxdWVzdHMgJiYgc3RvcmVkUGxhY2Vob2xkZXJSZXF1ZXN0c1tzdG9yZWRQbGFjZWhvbGRlclJlcXVlc3RSYXdVcmxdKSA/IHN0b3JlZFBsYWNlaG9sZGVyUmVxdWVzdHNbc3RvcmVkUGxhY2Vob2xkZXJSZXF1ZXN0UmF3VXJsXSEudXNlZCA6IGZhbHNlO1xuICAgICAgICAgIGlmICghdXNlZEZyb21FbmdpbmVJdGVyYXRpb24gJiYgdXNlZEZyb21TdG9yZSkge1xuICAgICAgICAgICAgcGxhY2Vob2xkZXJSZXF1ZXN0c1RvRGlzYWJsZS5wdXNoKHN0b3JlZFBsYWNlaG9sZGVyUmVxdWVzdFJhd1VybCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh1c2VkRnJvbUVuZ2luZUl0ZXJhdGlvbiAmJiAhdXNlZEZyb21TdG9yZSkge1xuICAgICAgICAgICAgcGxhY2Vob2xkZXJSZXF1ZXN0c1RvRW5hYmxlLnB1c2goc3RvcmVkUGxhY2Vob2xkZXJSZXF1ZXN0UmF3VXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBQbGFjZWhvbGRlciB0aGF0IGFyZSBubyBsb25nZXIgZmlsbGVkIGJ5IHRoZSBjdXJyZW50IGVuZ2luZSBleGVjdXRpb24gb3V0cHV0IHdpbGwgYmUgY2xlYXJlZFxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNUZW1wbGF0ZXNUb0JlQ2xlYW5lZFVwID0gT2JqZWN0LmtleXMoc3RvcmVkUGxhY2Vob2xkZXJzKVxuICAgICAgICAgIC5maWx0ZXIocGxhY2Vob2xkZXJJZCA9PiAhcGxhY2Vob2xkZXJzVGVtcGxhdGVzW3BsYWNlaG9sZGVySWRdKTtcblxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlcnNUZW1wbGF0ZXNUb0JlU2V0ID0gT2JqZWN0LmtleXMocGxhY2Vob2xkZXJzVGVtcGxhdGVzKS5yZWR1Y2UoKGNoYW5nZWRQbGFjZWhvbGRlclRlbXBsYXRlcywgcGxhY2Vob2xkZXJUZW1wbGF0ZUlkKSA9PiB7XG4gICAgICAgICAgLy8gQ2FjaGluZyBpZiB0aGUgcGxhY2Vob2xkZXIgdGVtcGxhdGUgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSB1cmxzXG4gICAgICAgICAgaWYgKCFzdG9yZWRQbGFjZWhvbGRlcnNbcGxhY2Vob2xkZXJUZW1wbGF0ZUlkXSB8fFxuICAgICAgICAgICAgIShKU09OLnN0cmluZ2lmeShzdG9yZWRQbGFjZWhvbGRlcnNbcGxhY2Vob2xkZXJUZW1wbGF0ZUlkXSEudXJsc1dpdGhQcmlvcml0eSkgPT09IEpTT04uc3RyaW5naWZ5KHBsYWNlaG9sZGVyc1RlbXBsYXRlc1twbGFjZWhvbGRlclRlbXBsYXRlSWRdKSkpIHtcbiAgICAgICAgICAgIGNoYW5nZWRQbGFjZWhvbGRlclRlbXBsYXRlcy5wdXNoKHtcbiAgICAgICAgICAgICAgaWQ6IHBsYWNlaG9sZGVyVGVtcGxhdGVJZCxcbiAgICAgICAgICAgICAgdXJsc1dpdGhQcmlvcml0eTogcGxhY2Vob2xkZXJzVGVtcGxhdGVzW3BsYWNlaG9sZGVyVGVtcGxhdGVJZF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2hhbmdlZFBsYWNlaG9sZGVyVGVtcGxhdGVzO1xuICAgICAgICB9LCBbXSBhcyB7IGlkOiBzdHJpbmc7IHVybHNXaXRoUHJpb3JpdHk6IHsgcmF3VXJsOiBzdHJpbmc7IHByaW9yaXR5OiBudW1iZXIgfVtdIH1bXSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGxhY2Vob2xkZXJzVGVtcGxhdGVzVG9CZUNsZWFuZWRVcCxcbiAgICAgICAgICBwbGFjZWhvbGRlclJlcXVlc3RzVG9EaXNhYmxlLFxuICAgICAgICAgIHBsYWNlaG9sZGVyUmVxdWVzdHNUb0VuYWJsZSxcbiAgICAgICAgICBwbGFjZWhvbGRlcnNUZW1wbGF0ZXNUb0JlU2V0LFxuICAgICAgICAgIHBsYWNlaG9sZGVyTmV3UmVxdWVzdHNcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoZmlsdGVyZWRBY3Rpb25zJC5zdWJzY3JpYmUoKHBsYWNlaG9sZGVyc1VwZGF0ZXMpID0+IHtcbiAgICAgIHBsYWNlaG9sZGVyc1VwZGF0ZXMucGxhY2Vob2xkZXJzVGVtcGxhdGVzVG9CZUNsZWFuZWRVcC5mb3JFYWNoKHBsYWNlaG9sZGVySWQgPT5cbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goZGVsZXRlUGxhY2Vob2xkZXJUZW1wbGF0ZUVudGl0eSh7XG4gICAgICAgICAgaWQ6IHBsYWNlaG9sZGVySWRcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgICAgcGxhY2Vob2xkZXJzVXBkYXRlcy5wbGFjZWhvbGRlcnNUZW1wbGF0ZXNUb0JlU2V0LmZvckVhY2gocGxhY2Vob2xkZXJzVGVtcGxhdGVUb0JlU2V0ID0+IHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goc2V0UGxhY2Vob2xkZXJUZW1wbGF0ZUVudGl0eSh7IGVudGl0eTogcGxhY2Vob2xkZXJzVGVtcGxhdGVUb0JlU2V0IH0pKTtcbiAgICAgIH0pO1xuICAgICAgcGxhY2Vob2xkZXJzVXBkYXRlcy5wbGFjZWhvbGRlclJlcXVlc3RzVG9EaXNhYmxlLmZvckVhY2gocGxhY2Vob2xkZXJSZXF1ZXN0VG9EaXNhYmxlID0+IHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2godXBkYXRlUGxhY2Vob2xkZXJSZXF1ZXN0RW50aXR5KHsgZW50aXR5OiB7IGlkOiBwbGFjZWhvbGRlclJlcXVlc3RUb0Rpc2FibGUsIHVzZWQ6IGZhbHNlIH0gfSkpO1xuICAgICAgfSk7XG4gICAgICBwbGFjZWhvbGRlcnNVcGRhdGVzLnBsYWNlaG9sZGVyUmVxdWVzdHNUb0VuYWJsZS5mb3JFYWNoKHBsYWNlaG9sZGVyUmVxdWVzdFRvRW5hYmxlID0+IHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2godXBkYXRlUGxhY2Vob2xkZXJSZXF1ZXN0RW50aXR5KHsgZW50aXR5OiB7IGlkOiBwbGFjZWhvbGRlclJlcXVlc3RUb0VuYWJsZSwgdXNlZDogdHJ1ZSB9IH0pKTtcbiAgICAgIH0pO1xuICAgICAgcGxhY2Vob2xkZXJzVXBkYXRlcy5wbGFjZWhvbGRlck5ld1JlcXVlc3RzLmZvckVhY2gocGxhY2Vob2xkZXJOZXdSZXF1ZXN0ID0+IHtcbiAgICAgICAgc3RvcmUuZGlzcGF0Y2goc2V0UGxhY2Vob2xkZXJSZXF1ZXN0RW50aXR5RnJvbVVybCh7XG4gICAgICAgICAgcmVzb2x2ZWRVcmw6IHBsYWNlaG9sZGVyTmV3UmVxdWVzdC5yZXNvbHZlZFVybCxcbiAgICAgICAgICBpZDogcGxhY2Vob2xkZXJOZXdSZXF1ZXN0LnJhd1VybCxcbiAgICAgICAgICBjYWxsOiB0aGlzLnJldHJpZXZlVGVtcGxhdGUocGxhY2Vob2xkZXJOZXdSZXF1ZXN0LnJlc29sdmVkVXJsKVxuICAgICAgICB9KSk7XG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogTG9jYWxpemUgdGhlIHVybCwgcmVwbGFjaW5nIHRoZSBsYW5ndWFnZSBtYXJrZXJcbiAgICogQHBhcmFtIHVybFxuICAgKiBAcGFyYW0gbGFuZ3VhZ2VcbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlVXJsV2l0aExhbmcodXJsOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgICBpZiAoIWxhbmd1YWdlICYmIHVybC5pbmNsdWRlcygnW0xBTkdVQUdFXScpKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKGBNaXNzaW5nIGxhbmd1YWdlIHdoZW4gdHJ5aW5nIHRvIHJlc29sdmUgJHt1cmx9YCk7XG4gICAgfVxuICAgIHJldHVybiBsYW5ndWFnZSA/IHVybC5yZXBsYWNlKC9cXFtMQU5HVUFHRV0vZywgbGFuZ3VhZ2UpIDogdXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRlbXBsYXRlIGFzIGpzb24gZnJvbSBhIGdpdmVuIHVybFxuICAgKiBAcGFyYW0gdXJsXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmV0cmlldmVUZW1wbGF0ZSh1cmw6IHN0cmluZyk6IFByb21pc2U8UGxhY2Vob2xkZXJSZXF1ZXN0UmVwbHk+IHtcbiAgICBjb25zdCByZXNvbHZlZFVybCQgPSBpbmplY3QoRHluYW1pY0NvbnRlbnRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pPy5nZXRDb250ZW50UGF0aFN0cmVhbSh1cmwpIHx8IG9mKHVybCk7XG4gICAgY29uc3QgZnVsbFVybCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHJlc29sdmVkVXJsJCk7XG4gICAgcmV0dXJuIGZldGNoKGZ1bGxVcmwpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHB1YmxpYyBleGVjdXRlQWN0aW9ucyhhY3Rpb25zOiBBY3Rpb25VcGRhdGVQbGFjZWhvbGRlckJsb2NrW10pIHtcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhY3Rpb25zLm1hcCgoYWN0aW9uKSA9PiAoe1xuICAgICAgcGxhY2Vob2xkZXJJZDogYWN0aW9uLnBsYWNlaG9sZGVySWQsXG4gICAgICB0ZW1wbGF0ZVVybDogYWN0aW9uLnZhbHVlLFxuICAgICAgcHJpb3JpdHk6IGFjdGlvbi5wcmlvcml0eSB8fCAwXG4gICAgfSkpO1xuXG4gICAgdGhpcy5wbGFjZWhvbGRlcnNBY3Rpb25zJC5uZXh0KHRlbXBsYXRlcyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,3 @@
1
+ /** ActionUpdatePlaceholderBlock */
2
+ export const RULES_ENGINE_PLACEHOLDER_UPDATE_ACTION_TYPE = 'UPDATE_PLACEHOLDER';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIuaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy1lbmdpbmUvcGxhY2Vob2xkZXIuaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxvQ0FBb0M7QUFDcEMsTUFBTSxDQUFDLE1BQU0sMkNBQTJDLEdBQUcsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJ1bGVzRW5naW5lQWN0aW9uIH0gZnJvbSAnQG8zci9jb3JlJztcblxuLyoqIEFjdGlvblVwZGF0ZVBsYWNlaG9sZGVyQmxvY2sgICovXG5leHBvcnQgY29uc3QgUlVMRVNfRU5HSU5FX1BMQUNFSE9MREVSX1VQREFURV9BQ1RJT05fVFlQRSA9ICdVUERBVEVfUExBQ0VIT0xERVInO1xuXG4vKipcbiAqIENvbnRlbnQgb2YgYWN0aW9uIHRoYXQgdXBkYXRlcyBhIHBsYWNlaG9sZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uVXBkYXRlUGxhY2Vob2xkZXJCbG9jayBleHRlbmRzIFJ1bGVzRW5naW5lQWN0aW9uIHtcbiAgYWN0aW9uVHlwZTogdHlwZW9mIFJVTEVTX0VOR0lORV9QTEFDRUhPTERFUl9VUERBVEVfQUNUSU9OX1RZUEU7XG4gIHBsYWNlaG9sZGVySWQ6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgcHJpb3JpdHk/OiBudW1iZXI7XG59XG4iXX0=
@@ -0,0 +1,124 @@
1
+ import { Injectable, Optional } from '@angular/core';
2
+ import { Actions, createEffect, ofType } from '@ngrx/effects';
3
+ import { cancelPlaceholderRequest, failPlaceholderRequestEntity, selectPlaceholderRequestEntityUsage, setPlaceholderRequestEntityFromUrl, updatePlaceholderRequestEntity } from '@o3r/components';
4
+ import { fromApiEffectSwitchMapById } from '@o3r/core';
5
+ import { combineLatest, EMPTY, of } from 'rxjs';
6
+ import { distinctUntilChanged, map, switchMap, take } from 'rxjs/operators';
7
+ import { Store } from '@ngrx/store';
8
+ import { JSONPath } from 'jsonpath-plus';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@ngrx/effects";
11
+ import * as i2 from "@ngrx/store";
12
+ import * as i3 from "@o3r/rules-engine";
13
+ import * as i4 from "@o3r/dynamic-content";
14
+ import * as i5 from "@o3r/localization";
15
+ /**
16
+ * Service to handle async PlaceholderTemplate actions
17
+ */
18
+ export class PlaceholderTemplateResponseEffect {
19
+ constructor(actions$, store, rulesEngineService, dynamicContentService, translationService) {
20
+ this.actions$ = actions$;
21
+ this.store = store;
22
+ this.rulesEngineService = rulesEngineService;
23
+ this.dynamicContentService = dynamicContentService;
24
+ this.translationService = translationService;
25
+ /**
26
+ * Set the PlaceholderRequest entity with the reply content, dispatch failPlaceholderRequestEntity if it catches a failure
27
+ * Handles the rendering of the HTML content from the template and creates the combine latest from facts list if needed
28
+ * Disables unused templates refresh if used is false in the store
29
+ */
30
+ this.setPlaceholderRequestEntityFromUrl$ = createEffect(() => this.actions$.pipe(ofType(setPlaceholderRequestEntityFromUrl), fromApiEffectSwitchMapById((templateResponse, action) => {
31
+ const facts = templateResponse.vars ? Object.values(templateResponse.vars).filter((variable) => variable.type === 'fact') : [];
32
+ const factsStreamsList = this.rulesEngineService ? facts.map((fact) => this.rulesEngineService.engine.retrieveOrCreateFactStream(fact.value).pipe(map((factValue) => ({
33
+ name: fact.value,
34
+ // eslint-disable-next-line new-cap
35
+ factValue: (fact.path && factValue) ? JSONPath({ wrap: false, json: factValue, path: fact.path }) : factValue
36
+ })), distinctUntilChanged((previous, current) => previous.factValue === current.factValue))) : [];
37
+ const factsStreamsList$ = factsStreamsList.length ? combineLatest(factsStreamsList) : of([]);
38
+ return combineLatest([factsStreamsList$, this.store.select(selectPlaceholderRequestEntityUsage(action.id)).pipe(distinctUntilChanged())]).pipe(switchMap(([factsUsedInTemplate, placeholderRequestUsage]) => {
39
+ if (!placeholderRequestUsage) {
40
+ return EMPTY;
41
+ }
42
+ return this.getRenderedHTML$(templateResponse.template, templateResponse.vars, factsUsedInTemplate).pipe(map(({ renderedTemplate, unknownTypeFound }) =>
43
+ // Update instead of set because used already set by the update from url action
44
+ updatePlaceholderRequestEntity({
45
+ entity: {
46
+ ...templateResponse,
47
+ resolvedUrl: action.resolvedUrl,
48
+ id: action.id,
49
+ renderedTemplate,
50
+ unknownTypeFound
51
+ },
52
+ requestId: action.requestId
53
+ })));
54
+ }));
55
+ }, (error, action) => of(failPlaceholderRequestEntity({ ids: [action.id], error, requestId: action.requestId })), (requestIdPayload, action) => cancelPlaceholderRequest({ ...requestIdPayload, id: action.id }))));
56
+ }
57
+ /**
58
+ * Renders the html template, replacing facts and urls and localizationKeys
59
+ * @param template
60
+ * @param vars
61
+ * @param facts
62
+ */
63
+ getRenderedHTML$(template, vars, facts) {
64
+ let unknownTypeFound = false;
65
+ const factset = (facts || []).reduce((set, fact) => {
66
+ set[fact.name] = fact.factValue;
67
+ return set;
68
+ }, {});
69
+ const replacements$ = [];
70
+ if (vars && template) {
71
+ for (const varName in vars) {
72
+ if (Object.prototype.hasOwnProperty.call(vars, varName)) {
73
+ const ejsVar = new RegExp(`<%=\\s*${varName}\\s*%>`, 'g');
74
+ switch (vars[varName].type) {
75
+ case 'relativeUrl': {
76
+ replacements$.push(this.dynamicContentService?.getMediaPathStream(vars[varName].value).pipe(take(1), map((value) => ({ ejsVar, value }))) || of({ ejsVar, value: vars[varName].value }));
77
+ break;
78
+ }
79
+ case 'fullUrl': {
80
+ template = template.replace(ejsVar, vars[varName].value);
81
+ break;
82
+ }
83
+ case 'fact': {
84
+ template = template.replace(ejsVar, factset[vars[varName].value] ?? '');
85
+ break;
86
+ }
87
+ case 'localisation': {
88
+ const linkedParams = (vars[varName].vars || []).reduce((acc, parameter) => {
89
+ const paramName = vars[parameter].value;
90
+ acc[paramName] = factset[paramName];
91
+ return acc;
92
+ }, {});
93
+ replacements$.push(this.translationService ?
94
+ this.translationService.translate(vars[varName].value, linkedParams).pipe(map((value) => (value ? { ejsVar, value } : null))) :
95
+ of(null));
96
+ break;
97
+ }
98
+ default: {
99
+ unknownTypeFound = true;
100
+ break;
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ return replacements$.length > 0 && !!template ?
107
+ combineLatest(replacements$).pipe(map((replacements) => ({
108
+ renderedTemplate: replacements.reduce((acc, replacement) => replacement ? acc.replace(replacement.ejsVar, replacement.value) : acc, template),
109
+ unknownTypeFound
110
+ }))) : of({ renderedTemplate: template, unknownTypeFound });
111
+ }
112
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PlaceholderTemplateResponseEffect, deps: [{ token: i1.Actions }, { token: i2.Store }, { token: i3.RulesEngineRunnerService, optional: true }, { token: i4.DynamicContentService, optional: true }, { token: i5.LocalizationService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
113
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PlaceholderTemplateResponseEffect }); }
114
+ }
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: PlaceholderTemplateResponseEffect, decorators: [{
116
+ type: Injectable
117
+ }], ctorParameters: () => [{ type: i1.Actions }, { type: i2.Store }, { type: i3.RulesEngineRunnerService, decorators: [{
118
+ type: Optional
119
+ }] }, { type: i4.DynamicContentService, decorators: [{
120
+ type: Optional
121
+ }] }, { type: i5.LocalizationService, decorators: [{
122
+ type: Optional
123
+ }] }] });
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Vob2xkZXIucnVsZXMtZW5naW5lLmVmZmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydWxlcy1lbmdpbmUvcGxhY2Vob2xkZXIucnVsZXMtZW5naW5lLmVmZmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUNMLHdCQUF3QixFQUN4Qiw0QkFBNEIsRUFHNUIsbUNBQW1DLEVBQ25DLGtDQUFrQyxFQUNsQyw4QkFBOEIsRUFDL0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFJckQsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFFLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQUV6Qzs7R0FFRztBQUVILE1BQU0sT0FBTyxpQ0FBaUM7SUFtRDVDLFlBQ21CLFFBQWlCLEVBQ2pCLEtBQXFDLEVBQ3pCLGtCQUFtRCxFQUNuRCxxQkFBbUQsRUFDbkQsa0JBQThDO1FBSjFELGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsVUFBSyxHQUFMLEtBQUssQ0FBZ0M7UUFDekIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFpQztRQUNuRCwwQkFBcUIsR0FBckIscUJBQXFCLENBQThCO1FBQ25ELHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBNEI7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OzsyRkFBakMsaUNBQWlDO2tCQUQ3QyxVQUFVOzswQkF1RE4sUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3Rpb25zLCBjcmVhdGVFZmZlY3QsIG9mVHlwZX0gZnJvbSAnQG5ncngvZWZmZWN0cyc7XG5pbXBvcnQge1xuICBjYW5jZWxQbGFjZWhvbGRlclJlcXVlc3QsXG4gIGZhaWxQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHksXG4gIFBsYWNlaG9sZGVyUmVxdWVzdFN0b3JlLFxuICBQbGFjZWhvbGRlclZhcmlhYmxlLFxuICBzZWxlY3RQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHlVc2FnZSxcbiAgc2V0UGxhY2Vob2xkZXJSZXF1ZXN0RW50aXR5RnJvbVVybCxcbiAgdXBkYXRlUGxhY2Vob2xkZXJSZXF1ZXN0RW50aXR5XG59IGZyb20gJ0BvM3IvY29tcG9uZW50cyc7XG5pbXBvcnQge2Zyb21BcGlFZmZlY3RTd2l0Y2hNYXBCeUlkfSBmcm9tICdAbzNyL2NvcmUnO1xuaW1wb3J0IHtEeW5hbWljQ29udGVudFNlcnZpY2V9IGZyb20gJ0BvM3IvZHluYW1pYy1jb250ZW50JztcbmltcG9ydCB7TG9jYWxpemF0aW9uU2VydmljZX0gZnJvbSAnQG8zci9sb2NhbGl6YXRpb24nO1xuaW1wb3J0IHtSdWxlc0VuZ2luZVJ1bm5lclNlcnZpY2V9IGZyb20gJ0BvM3IvcnVsZXMtZW5naW5lJztcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgRU1QVFksIE9ic2VydmFibGUsIG9mfSBmcm9tICdyeGpzJztcbmltcG9ydCB7ZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3dpdGNoTWFwLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1N0b3JlfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBKU09OUGF0aCB9IGZyb20gJ2pzb25wYXRoLXBsdXMnO1xuXG4vKipcbiAqIFNlcnZpY2UgdG8gaGFuZGxlIGFzeW5jIFBsYWNlaG9sZGVyVGVtcGxhdGUgYWN0aW9uc1xuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGxhY2Vob2xkZXJUZW1wbGF0ZVJlc3BvbnNlRWZmZWN0IHtcbiAgLyoqXG4gICAqIFNldCB0aGUgUGxhY2Vob2xkZXJSZXF1ZXN0IGVudGl0eSB3aXRoIHRoZSByZXBseSBjb250ZW50LCBkaXNwYXRjaCBmYWlsUGxhY2Vob2xkZXJSZXF1ZXN0RW50aXR5IGlmIGl0IGNhdGNoZXMgYSBmYWlsdXJlXG4gICAqIEhhbmRsZXMgdGhlIHJlbmRlcmluZyBvZiB0aGUgSFRNTCBjb250ZW50IGZyb20gdGhlIHRlbXBsYXRlIGFuZCBjcmVhdGVzIHRoZSBjb21iaW5lIGxhdGVzdCBmcm9tIGZhY3RzIGxpc3QgaWYgbmVlZGVkXG4gICAqIERpc2FibGVzIHVudXNlZCB0ZW1wbGF0ZXMgcmVmcmVzaCBpZiB1c2VkIGlzIGZhbHNlIGluIHRoZSBzdG9yZVxuICAgKi9cbiAgcHVibGljIHNldFBsYWNlaG9sZGVyUmVxdWVzdEVudGl0eUZyb21VcmwkID0gY3JlYXRlRWZmZWN0KCgpID0+XG4gICAgdGhpcy5hY3Rpb25zJC5waXBlKFxuICAgICAgb2ZUeXBlKHNldFBsYWNlaG9sZGVyUmVxdWVzdEVudGl0eUZyb21VcmwpLFxuICAgICAgZnJvbUFwaUVmZmVjdFN3aXRjaE1hcEJ5SWQoXG4gICAgICAgICh0ZW1wbGF0ZVJlc3BvbnNlLCBhY3Rpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBmYWN0cyA9IHRlbXBsYXRlUmVzcG9uc2UudmFycyA/IE9iamVjdC52YWx1ZXModGVtcGxhdGVSZXNwb25zZS52YXJzKS5maWx0ZXIoKHZhcmlhYmxlOiBQbGFjZWhvbGRlclZhcmlhYmxlKSA9PiB2YXJpYWJsZS50eXBlID09PSAnZmFjdCcpIDogW107XG4gICAgICAgICAgY29uc3QgZmFjdHNTdHJlYW1zTGlzdCA9IHRoaXMucnVsZXNFbmdpbmVTZXJ2aWNlID8gZmFjdHMubWFwKChmYWN0KSA9PlxuICAgICAgICAgICAgdGhpcy5ydWxlc0VuZ2luZVNlcnZpY2UhLmVuZ2luZS5yZXRyaWV2ZU9yQ3JlYXRlRmFjdFN0cmVhbShmYWN0LnZhbHVlKS5waXBlKFxuICAgICAgICAgICAgICBtYXAoKGZhY3RWYWx1ZSkgPT4gKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBmYWN0LnZhbHVlLFxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgICAgICAgICAgICAgZmFjdFZhbHVlOiAoZmFjdC5wYXRoICYmIGZhY3RWYWx1ZSkgPyBKU09OUGF0aCh7IHdyYXA6IGZhbHNlLCBqc29uOiBmYWN0VmFsdWUsIHBhdGg6IGZhY3QucGF0aCB9KSA6IGZhY3RWYWx1ZVxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2aW91cywgY3VycmVudCkgPT4gcHJldmlvdXMuZmFjdFZhbHVlID09PSBjdXJyZW50LmZhY3RWYWx1ZSlcbiAgICAgICAgICAgICkpIDogW107XG5cbiAgICAgICAgICBjb25zdCBmYWN0c1N0cmVhbXNMaXN0JCA9IGZhY3RzU3RyZWFtc0xpc3QubGVuZ3RoID8gY29tYmluZUxhdGVzdChmYWN0c1N0cmVhbXNMaXN0KSA6IG9mKFtdKTtcbiAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbZmFjdHNTdHJlYW1zTGlzdCQsIHRoaXMuc3RvcmUuc2VsZWN0KHNlbGVjdFBsYWNlaG9sZGVyUmVxdWVzdEVudGl0eVVzYWdlKGFjdGlvbi5pZCkpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSldKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChbZmFjdHNVc2VkSW5UZW1wbGF0ZSwgcGxhY2Vob2xkZXJSZXF1ZXN0VXNhZ2VdKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghcGxhY2Vob2xkZXJSZXF1ZXN0VXNhZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVuZGVyZWRIVE1MJCh0ZW1wbGF0ZVJlc3BvbnNlLnRlbXBsYXRlLCB0ZW1wbGF0ZVJlc3BvbnNlLnZhcnMsIGZhY3RzVXNlZEluVGVtcGxhdGUpLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh7cmVuZGVyZWRUZW1wbGF0ZSwgdW5rbm93blR5cGVGb3VuZH0pID0+XG4gICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgaW5zdGVhZCBvZiBzZXQgYmVjYXVzZSB1c2VkIGFscmVhZHkgc2V0IGJ5IHRoZSB1cGRhdGUgZnJvbSB1cmwgYWN0aW9uXG4gICAgICAgICAgICAgICAgICB1cGRhdGVQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHkoe1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHk6IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi50ZW1wbGF0ZVJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVXJsOiBhY3Rpb24ucmVzb2x2ZWRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ6IGFjdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlZFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgIHVua25vd25UeXBlRm91bmRcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBhY3Rpb24ucmVxdWVzdElkXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yLCBhY3Rpb24pID0+IG9mKGZhaWxQbGFjZWhvbGRlclJlcXVlc3RFbnRpdHkoe2lkczogW2FjdGlvbi5pZF0sIGVycm9yLCByZXF1ZXN0SWQ6IGFjdGlvbi5yZXF1ZXN0SWR9KSksXG4gICAgICAgIChyZXF1ZXN0SWRQYXlsb2FkLCBhY3Rpb24pID0+IGNhbmNlbFBsYWNlaG9sZGVyUmVxdWVzdCh7Li4ucmVxdWVzdElkUGF5bG9hZCwgaWQ6IGFjdGlvbi5pZH0pXG4gICAgICApXG4gICAgKVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9ucyQ6IEFjdGlvbnMsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yZTogU3RvcmU8UGxhY2Vob2xkZXJSZXF1ZXN0U3RvcmU+LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgcnVsZXNFbmdpbmVTZXJ2aWNlOiBSdWxlc0VuZ2luZVJ1bm5lclNlcnZpY2UgfCBudWxsLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY0NvbnRlbnRTZXJ2aWNlOiBEeW5hbWljQ29udGVudFNlcnZpY2UgfCBudWxsLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRpb25TZXJ2aWNlOiBMb2NhbGl6YXRpb25TZXJ2aWNlIHwgbnVsbCkge1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGh0bWwgdGVtcGxhdGUsIHJlcGxhY2luZyBmYWN0cyBhbmQgdXJscyBhbmQgbG9jYWxpemF0aW9uS2V5c1xuICAgKiBAcGFyYW0gdGVtcGxhdGVcbiAgICogQHBhcmFtIHZhcnNcbiAgICogQHBhcmFtIGZhY3RzXG4gICAqL1xuICBwcml2YXRlIGdldFJlbmRlcmVkSFRNTCQodGVtcGxhdGU/OiBzdHJpbmcsIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBQbGFjZWhvbGRlclZhcmlhYmxlPiwgZmFjdHM/OiB7IG5hbWU6IHN0cmluZzsgZmFjdFZhbHVlOiBhbnkgfVtdKSB7XG4gICAgbGV0IHVua25vd25UeXBlRm91bmQgPSBmYWxzZTtcbiAgICBjb25zdCBmYWN0c2V0ID0gKGZhY3RzIHx8IFtdKS5yZWR1Y2UoKHNldDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgZmFjdCkgPT4ge1xuICAgICAgc2V0W2ZhY3QubmFtZV0gPSBmYWN0LmZhY3RWYWx1ZTtcbiAgICAgIHJldHVybiBzZXQ7XG4gICAgfSwge30pO1xuICAgIGNvbnN0IHJlcGxhY2VtZW50cyQ6IE9ic2VydmFibGU8eyBlanNWYXI6IFJlZ0V4cDsgdmFsdWU6IHN0cmluZyB9IHwgbnVsbD5bXSA9IFtdO1xuICAgIGlmICh2YXJzICYmIHRlbXBsYXRlKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhck5hbWUgaW4gdmFycykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhcnMsIHZhck5hbWUpKSB7XG4gICAgICAgICAgY29uc3QgZWpzVmFyID0gbmV3IFJlZ0V4cChgPCU9XFxcXHMqJHt2YXJOYW1lfVxcXFxzKiU+YCwgJ2cnKTtcbiAgICAgICAgICBzd2l0Y2ggKHZhcnNbdmFyTmFtZV0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAncmVsYXRpdmVVcmwnOiB7XG4gICAgICAgICAgICAgIHJlcGxhY2VtZW50cyQucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLmR5bmFtaWNDb250ZW50U2VydmljZT8uZ2V0TWVkaWFQYXRoU3RyZWFtKHZhcnNbdmFyTmFtZV0udmFsdWUpLnBpcGUoXG4gICAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgICAgbWFwKCh2YWx1ZTogc3RyaW5nKSA9PiAoe2Vqc1ZhciwgdmFsdWV9KSlcbiAgICAgICAgICAgICAgICApIHx8IG9mKHsgZWpzVmFyLCB2YWx1ZTogdmFyc1t2YXJOYW1lXS52YWx1ZSB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2Z1bGxVcmwnOiB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShlanNWYXIsIHZhcnNbdmFyTmFtZV0udmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2ZhY3QnOiB7XG4gICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUucmVwbGFjZShlanNWYXIsIGZhY3RzZXRbdmFyc1t2YXJOYW1lXS52YWx1ZV0gPz8gJycpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2xvY2FsaXNhdGlvbic6IHtcbiAgICAgICAgICAgICAgY29uc3QgbGlua2VkUGFyYW1zID0gKHZhcnNbdmFyTmFtZV0udmFycyB8fCBbXSkucmVkdWNlKChhY2M6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIHBhcmFtZXRlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHZhcnNbcGFyYW1ldGVyXS52YWx1ZTtcbiAgICAgICAgICAgICAgICBhY2NbcGFyYW1OYW1lXSA9IGZhY3RzZXRbcGFyYW1OYW1lXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgICAgICAgIHJlcGxhY2VtZW50cyQucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZSA/XG4gICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUodmFyc1t2YXJOYW1lXS52YWx1ZSwgbGlua2VkUGFyYW1zKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICBtYXAoKHZhbHVlKSA9PiAodmFsdWUgPyB7IGVqc1ZhciwgdmFsdWUgfSA6IG51bGwpKVxuICAgICAgICAgICAgICAgICAgKSA6XG4gICAgICAgICAgICAgICAgICBvZihudWxsKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQgOiB7XG4gICAgICAgICAgICAgIHVua25vd25UeXBlRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcGxhY2VtZW50cyQubGVuZ3RoID4gMCAmJiAhIXRlbXBsYXRlID9cbiAgICAgIGNvbWJpbmVMYXRlc3QocmVwbGFjZW1lbnRzJCkucGlwZShcbiAgICAgICAgbWFwKChyZXBsYWNlbWVudHMpID0+ICh7XG4gICAgICAgICAgcmVuZGVyZWRUZW1wbGF0ZTogcmVwbGFjZW1lbnRzLnJlZHVjZSgoYWNjLCByZXBsYWNlbWVudCkgPT5cbiAgICAgICAgICAgIHJlcGxhY2VtZW50ID8gYWNjLnJlcGxhY2UocmVwbGFjZW1lbnQuZWpzVmFyLCByZXBsYWNlbWVudC52YWx1ZSkgOiBhY2MsXG4gICAgICAgICAgICB0ZW1wbGF0ZSFcbiAgICAgICAgICApLFxuICAgICAgICAgIHVua25vd25UeXBlRm91bmRcbiAgICAgICAgfSkpXG4gICAgICApIDogb2Yoe3JlbmRlcmVkVGVtcGxhdGU6IHRlbXBsYXRlLCB1bmtub3duVHlwZUZvdW5kfSk7XG4gIH1cbn1cbiJdfQ==