@kuadrant/kuadrant-backstage-plugin-frontend 0.2.0 → 0.3.0-aaa46b4

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 (198) hide show
  1. package/dist/api.esm.js +40 -2
  2. package/dist/api.esm.js.map +1 -1
  3. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +20 -85
  4. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
  5. package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.esm.js +18 -0
  6. package/dist/components/ApiKeyApprovalPage/ApiKeyApprovalPageWithPermissions.esm.js.map +1 -0
  7. package/dist/components/ApiKeyApprovalPage/index.esm.js +1 -0
  8. package/dist/components/ApiKeyApprovalPage/index.esm.js.map +1 -1
  9. package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js +19 -60
  10. package/dist/components/ApiKeyDetailPage/ApiKeyDetailPage.esm.js.map +1 -1
  11. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +66 -113
  12. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
  13. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +3 -2
  14. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
  15. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js +16 -15
  16. package/dist/components/ApprovalQueueTable/ApprovalQueueTable.esm.js.map +1 -1
  17. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +1 -7
  18. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
  19. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js +2 -3
  20. package/dist/components/EditAPIProductDialog/EditAPIProductDialog.esm.js.map +1 -1
  21. package/dist/components/KuadrantIcon/KuadrantIcon.esm.js +22 -0
  22. package/dist/components/KuadrantIcon/KuadrantIcon.esm.js.map +1 -0
  23. package/dist/components/KuadrantPage/ApiProductsPage.esm.js +5 -18
  24. package/dist/components/KuadrantPage/ApiProductsPage.esm.js.map +1 -1
  25. package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js +28 -138
  26. package/dist/components/MyApiKeysTable/MyApiKeysTable.esm.js.map +1 -1
  27. package/dist/components/PermissionGate/PermissionGate.esm.js +2 -2
  28. package/dist/components/PermissionGate/PermissionGate.esm.js.map +1 -1
  29. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js +32 -18
  30. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -1
  31. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js +13 -2
  32. package/dist/components/SimpleRequestAccessDialog/SimpleRequestAccessDialog.esm.js.map +1 -1
  33. package/dist/components/icons.esm.js +11 -0
  34. package/dist/components/icons.esm.js.map +1 -0
  35. package/dist/index.d.ts +54 -6
  36. package/dist/index.esm.js +3 -1
  37. package/dist/index.esm.js.map +1 -1
  38. package/dist/plugin.esm.js +2 -10
  39. package/dist/plugin.esm.js.map +1 -1
  40. package/dist/utils/apikeys.esm.js +21 -0
  41. package/dist/utils/apikeys.esm.js.map +1 -0
  42. package/dist/utils/styles.esm.js +5 -2
  43. package/dist/utils/styles.esm.js.map +1 -1
  44. package/dist-scalprum/internal.plugin-kuadrant.7f1de85661b1b848af15.js +2 -0
  45. package/dist-scalprum/internal.plugin-kuadrant.7f1de85661b1b848af15.js.map +1 -0
  46. package/dist-scalprum/plugin-manifest.json +3 -3
  47. package/dist-scalprum/static/{1037.58dd29ad.chunk.js → 1037.25758556.chunk.js} +1 -1
  48. package/dist-scalprum/static/{1037.58dd29ad.chunk.js.map → 1037.25758556.chunk.js.map} +1 -1
  49. package/dist-scalprum/static/1340.7c4f4722.chunk.js +3 -0
  50. package/dist-scalprum/static/1340.7c4f4722.chunk.js.map +1 -0
  51. package/dist-scalprum/static/1719.52ca7daf.chunk.js +2 -0
  52. package/dist-scalprum/static/1719.52ca7daf.chunk.js.map +1 -0
  53. package/dist-scalprum/static/{1881.8221c002.chunk.js → 1931.f6a5edbb.chunk.js} +2 -2
  54. package/dist-scalprum/static/1931.f6a5edbb.chunk.js.map +1 -0
  55. package/dist-scalprum/static/20.b3a37d1d.chunk.js +3 -0
  56. package/dist-scalprum/static/20.b3a37d1d.chunk.js.map +1 -0
  57. package/dist-scalprum/static/2251.08f3db99.chunk.js +2 -0
  58. package/dist-scalprum/static/2251.08f3db99.chunk.js.map +1 -0
  59. package/dist-scalprum/static/2769.e09b0ab0.chunk.js +2 -0
  60. package/dist-scalprum/static/2769.e09b0ab0.chunk.js.map +1 -0
  61. package/dist-scalprum/static/2821.1ac360ec.chunk.js +2 -0
  62. package/dist-scalprum/static/2821.1ac360ec.chunk.js.map +1 -0
  63. package/dist-scalprum/static/2952.b54bd390.chunk.js +2 -0
  64. package/dist-scalprum/static/2952.b54bd390.chunk.js.map +1 -0
  65. package/dist-scalprum/static/2967.004a950e.chunk.js +2 -0
  66. package/dist-scalprum/static/2967.004a950e.chunk.js.map +1 -0
  67. package/dist-scalprum/static/3015.1fe097c2.chunk.js +3 -0
  68. package/dist-scalprum/static/3015.1fe097c2.chunk.js.LICENSE.txt +9 -0
  69. package/dist-scalprum/static/3015.1fe097c2.chunk.js.map +1 -0
  70. package/dist-scalprum/static/327.74ecd572.chunk.js +2 -0
  71. package/dist-scalprum/static/327.74ecd572.chunk.js.map +1 -0
  72. package/dist-scalprum/static/3657.882640ca.chunk.js +3 -0
  73. package/dist-scalprum/static/3657.882640ca.chunk.js.LICENSE.txt +8 -0
  74. package/dist-scalprum/static/3657.882640ca.chunk.js.map +1 -0
  75. package/dist-scalprum/static/3658.104704cc.chunk.js +2 -0
  76. package/dist-scalprum/static/3658.104704cc.chunk.js.map +1 -0
  77. package/dist-scalprum/static/{3897.ef4554b5.chunk.js → 3897.6e9c07c0.chunk.js} +1 -1
  78. package/dist-scalprum/static/{3897.ef4554b5.chunk.js.map → 3897.6e9c07c0.chunk.js.map} +1 -1
  79. package/dist-scalprum/static/3917.888fba36.chunk.js +2 -0
  80. package/dist-scalprum/static/3917.888fba36.chunk.js.map +1 -0
  81. package/dist-scalprum/static/3947.f5320e89.chunk.js +2 -0
  82. package/dist-scalprum/static/3947.f5320e89.chunk.js.map +1 -0
  83. package/dist-scalprum/static/{4083.488ff7a9.chunk.js → 4083.811c4e7a.chunk.js} +2 -2
  84. package/dist-scalprum/static/{4083.488ff7a9.chunk.js.map → 4083.811c4e7a.chunk.js.map} +1 -1
  85. package/dist-scalprum/static/438.4335b833.chunk.js +2 -0
  86. package/dist-scalprum/static/438.4335b833.chunk.js.map +1 -0
  87. package/dist-scalprum/static/4908.4f21d453.chunk.js +2 -0
  88. package/dist-scalprum/static/4908.4f21d453.chunk.js.map +1 -0
  89. package/dist-scalprum/static/{5010.6241b64f.chunk.js → 5010.4f67737b.chunk.js} +2 -2
  90. package/dist-scalprum/static/{5010.6241b64f.chunk.js.map → 5010.4f67737b.chunk.js.map} +1 -1
  91. package/dist-scalprum/static/5197.53535ff4.chunk.js +2 -0
  92. package/dist-scalprum/static/5197.53535ff4.chunk.js.map +1 -0
  93. package/dist-scalprum/static/5289.6c803140.chunk.js +2 -0
  94. package/dist-scalprum/static/5289.6c803140.chunk.js.map +1 -0
  95. package/dist-scalprum/static/5943.4e1dedc5.chunk.js +2 -0
  96. package/dist-scalprum/static/5943.4e1dedc5.chunk.js.map +1 -0
  97. package/dist-scalprum/static/6038.63d1f832.chunk.js +3 -0
  98. package/dist-scalprum/static/6038.63d1f832.chunk.js.LICENSE.txt +8 -0
  99. package/dist-scalprum/static/6038.63d1f832.chunk.js.map +1 -0
  100. package/dist-scalprum/static/{6272.b5645dc2.chunk.js → 6272.3ed14ea4.chunk.js} +1 -1
  101. package/dist-scalprum/static/{6272.b5645dc2.chunk.js.map → 6272.3ed14ea4.chunk.js.map} +1 -1
  102. package/dist-scalprum/static/6311.da1849d1.chunk.js +2 -0
  103. package/dist-scalprum/static/6311.da1849d1.chunk.js.map +1 -0
  104. package/dist-scalprum/static/635.f63679a5.chunk.js +3 -0
  105. package/dist-scalprum/static/635.f63679a5.chunk.js.map +1 -0
  106. package/dist-scalprum/static/6371.02375475.chunk.js +3 -0
  107. package/dist-scalprum/static/6371.02375475.chunk.js.LICENSE.txt +9 -0
  108. package/dist-scalprum/static/6371.02375475.chunk.js.map +1 -0
  109. package/dist-scalprum/static/{6386.2d20c412.chunk.js → 6386.5922f271.chunk.js} +3 -3
  110. package/dist-scalprum/static/{6386.2d20c412.chunk.js.map → 6386.5922f271.chunk.js.map} +1 -1
  111. package/dist-scalprum/static/6837.6252b97a.chunk.js +2 -0
  112. package/dist-scalprum/static/6837.6252b97a.chunk.js.map +1 -0
  113. package/dist-scalprum/static/{6972.e47ec97e.chunk.js → 6972.f22b9446.chunk.js} +1 -1
  114. package/dist-scalprum/static/{6972.e47ec97e.chunk.js.map → 6972.f22b9446.chunk.js.map} +1 -1
  115. package/dist-scalprum/static/7164.5dc4bc72.chunk.js +2 -0
  116. package/dist-scalprum/static/7164.5dc4bc72.chunk.js.map +1 -0
  117. package/dist-scalprum/static/{7266.e760b8c3.chunk.js → 7266.3c4174cc.chunk.js} +1 -1
  118. package/dist-scalprum/static/{7266.e760b8c3.chunk.js.map → 7266.3c4174cc.chunk.js.map} +1 -1
  119. package/dist-scalprum/static/7270.8ee9d452.chunk.js +2 -0
  120. package/dist-scalprum/static/7270.8ee9d452.chunk.js.map +1 -0
  121. package/dist-scalprum/static/{7791.8f84478d.chunk.js → 7791.ad31cf6d.chunk.js} +2 -2
  122. package/dist-scalprum/static/{7791.8f84478d.chunk.js.map → 7791.ad31cf6d.chunk.js.map} +1 -1
  123. package/dist-scalprum/static/{8563.46f1a3e1.chunk.js → 8563.6501eafb.chunk.js} +2 -2
  124. package/dist-scalprum/static/{8563.46f1a3e1.chunk.js.map → 8563.6501eafb.chunk.js.map} +1 -1
  125. package/dist-scalprum/static/980.744a4d36.chunk.js +2 -0
  126. package/dist-scalprum/static/980.744a4d36.chunk.js.map +1 -0
  127. package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js +3 -0
  128. package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js.LICENSE.txt +9 -0
  129. package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js.map +1 -0
  130. package/dist-scalprum/static/exposed-KuadrantPage.f123b200.chunk.js +2 -0
  131. package/dist-scalprum/static/exposed-KuadrantPage.f123b200.chunk.js.map +1 -0
  132. package/dist-scalprum/static/exposed-PluginRoot.3a5f9157.chunk.js +2 -0
  133. package/dist-scalprum/static/exposed-PluginRoot.3a5f9157.chunk.js.map +1 -0
  134. package/package.json +6 -3
  135. package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js +0 -265
  136. package/dist/components/EntityApiApprovalTab/EntityApiApprovalTab.esm.js.map +0 -1
  137. package/dist/components/EntityApiApprovalTab/index.esm.js +0 -2
  138. package/dist/components/EntityApiApprovalTab/index.esm.js.map +0 -1
  139. package/dist-scalprum/internal.plugin-kuadrant.b3d35dc8b21ce867aa09.js +0 -2
  140. package/dist-scalprum/internal.plugin-kuadrant.b3d35dc8b21ce867aa09.js.map +0 -1
  141. package/dist-scalprum/static/1319.ac195ac2.chunk.js +0 -2
  142. package/dist-scalprum/static/1319.ac195ac2.chunk.js.map +0 -1
  143. package/dist-scalprum/static/1584.ae3779f0.chunk.js +0 -3
  144. package/dist-scalprum/static/1584.ae3779f0.chunk.js.map +0 -1
  145. package/dist-scalprum/static/1881.8221c002.chunk.js.map +0 -1
  146. package/dist-scalprum/static/2967.7c6a34cd.chunk.js +0 -2
  147. package/dist-scalprum/static/2967.7c6a34cd.chunk.js.map +0 -1
  148. package/dist-scalprum/static/3118.daee3324.chunk.js +0 -3
  149. package/dist-scalprum/static/3118.daee3324.chunk.js.map +0 -1
  150. package/dist-scalprum/static/3581.b5b97f08.chunk.js +0 -2
  151. package/dist-scalprum/static/3581.b5b97f08.chunk.js.map +0 -1
  152. package/dist-scalprum/static/369.2374941c.chunk.js +0 -2
  153. package/dist-scalprum/static/369.2374941c.chunk.js.map +0 -1
  154. package/dist-scalprum/static/3947.ad129ba4.chunk.js +0 -2
  155. package/dist-scalprum/static/3947.ad129ba4.chunk.js.map +0 -1
  156. package/dist-scalprum/static/3976.e0873210.chunk.js +0 -2
  157. package/dist-scalprum/static/3976.e0873210.chunk.js.map +0 -1
  158. package/dist-scalprum/static/4434.f92f6ba4.chunk.js +0 -2
  159. package/dist-scalprum/static/4434.f92f6ba4.chunk.js.map +0 -1
  160. package/dist-scalprum/static/483.d55d6ab2.chunk.js +0 -2
  161. package/dist-scalprum/static/483.d55d6ab2.chunk.js.map +0 -1
  162. package/dist-scalprum/static/512.f1c51799.chunk.js +0 -2
  163. package/dist-scalprum/static/512.f1c51799.chunk.js.map +0 -1
  164. package/dist-scalprum/static/5203.3df62d7e.chunk.js +0 -2
  165. package/dist-scalprum/static/5203.3df62d7e.chunk.js.map +0 -1
  166. package/dist-scalprum/static/5289.2e686027.chunk.js +0 -2
  167. package/dist-scalprum/static/5289.2e686027.chunk.js.map +0 -1
  168. package/dist-scalprum/static/5453.3c20d0a6.chunk.js +0 -2
  169. package/dist-scalprum/static/5453.3c20d0a6.chunk.js.map +0 -1
  170. package/dist-scalprum/static/6371.f183dddb.chunk.js +0 -3
  171. package/dist-scalprum/static/6371.f183dddb.chunk.js.map +0 -1
  172. package/dist-scalprum/static/6426.bf20c588.chunk.js +0 -2
  173. package/dist-scalprum/static/6426.bf20c588.chunk.js.map +0 -1
  174. package/dist-scalprum/static/6800.ddabed69.chunk.js +0 -2
  175. package/dist-scalprum/static/6800.ddabed69.chunk.js.map +0 -1
  176. package/dist-scalprum/static/7005.d548f8f1.chunk.js +0 -2
  177. package/dist-scalprum/static/7005.d548f8f1.chunk.js.map +0 -1
  178. package/dist-scalprum/static/7057.fcd688c7.chunk.js +0 -2
  179. package/dist-scalprum/static/7057.fcd688c7.chunk.js.map +0 -1
  180. package/dist-scalprum/static/7270.301a3c46.chunk.js +0 -2
  181. package/dist-scalprum/static/7270.301a3c46.chunk.js.map +0 -1
  182. package/dist-scalprum/static/9051.f095a8a1.chunk.js +0 -2
  183. package/dist-scalprum/static/9051.f095a8a1.chunk.js.map +0 -1
  184. package/dist-scalprum/static/9079.b6d5c19c.chunk.js +0 -2
  185. package/dist-scalprum/static/9079.b6d5c19c.chunk.js.map +0 -1
  186. package/dist-scalprum/static/9625.b0c6610a.chunk.js +0 -2
  187. package/dist-scalprum/static/9625.b0c6610a.chunk.js.map +0 -1
  188. package/dist-scalprum/static/9838.589f2156.chunk.js +0 -2
  189. package/dist-scalprum/static/9838.589f2156.chunk.js.map +0 -1
  190. package/dist-scalprum/static/exposed-PluginRoot.a8448fcc.chunk.js +0 -2
  191. package/dist-scalprum/static/exposed-PluginRoot.a8448fcc.chunk.js.map +0 -1
  192. /package/dist-scalprum/static/{1584.ae3779f0.chunk.js.LICENSE.txt → 1340.7c4f4722.chunk.js.LICENSE.txt} +0 -0
  193. /package/dist-scalprum/static/{3118.daee3324.chunk.js.LICENSE.txt → 20.b3a37d1d.chunk.js.LICENSE.txt} +0 -0
  194. /package/dist-scalprum/static/{4083.488ff7a9.chunk.js.LICENSE.txt → 4083.811c4e7a.chunk.js.LICENSE.txt} +0 -0
  195. /package/dist-scalprum/static/{5010.6241b64f.chunk.js.LICENSE.txt → 5010.4f67737b.chunk.js.LICENSE.txt} +0 -0
  196. /package/dist-scalprum/static/{6371.f183dddb.chunk.js.LICENSE.txt → 635.f63679a5.chunk.js.LICENSE.txt} +0 -0
  197. /package/dist-scalprum/static/{6386.2d20c412.chunk.js.LICENSE.txt → 6386.5922f271.chunk.js.LICENSE.txt} +0 -0
  198. /package/dist-scalprum/static/{8563.46f1a3e1.chunk.js.LICENSE.txt → 8563.6501eafb.chunk.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/9838.589f2156.chunk.js","mappings":"gNAqGIA,EAAwB,aAAiB,SAAkBC,EAAOC,GACpE,IAAIC,EAAmBF,EAAMG,UACzBA,OAAiC,IAArBD,EAA8B,QAAUA,EACpDE,EAAUJ,EAAMI,QAChBC,EAAYL,EAAMK,UAClBC,EAAmBN,EAAMO,UACzBC,OAAiC,IAArBF,EAA8B,OAASA,EACnDG,EAAST,EAAMS,OACfC,EAAiBV,EAAMW,QACvBA,OAA6B,IAAnBD,EAA4B,OAASA,EAC/CE,EAAQZ,EAAMY,MACdC,GAAQ,OAAyBb,EAAO,CAAC,YAAa,UAAW,YAAa,YAAa,SAAU,UAAW,UAEhHc,EAAcC,QAAQF,EAAMG,UAChC,OAAoB,gBAAoBR,GAAW,OAAS,CAC1DP,IAAKA,EACLI,WAAW,OAAKD,EAAQa,KAAMb,EAAQO,GAAUN,EAAWS,GAAe,CAACV,EAAQc,cAAeN,GAASR,EAAQe,YAAaV,GAAUL,EAAQgB,aAA2B,IAAdjB,GAAuBC,EAAQD,KAC7LU,EAAO,CACRQ,OAAO,OAAS,CACdT,MAAOA,EACPH,OAAQA,GACPI,EAAMQ,SAEb,GAiDA,SAAe,IAAAC,YAvKK,SAAgBC,GAClC,MAAO,CAELN,KAAM,CACJO,QAAS,QAETC,iBAAiB,IAAAC,OAAMH,EAAMI,QAAQC,KAAKC,QAAgC,UAAvBN,EAAMI,QAAQG,KAAmB,IAAO,KAC3FrB,OAAQ,SAIVmB,KAAM,CACJG,UAAW,EACXC,aAAc,EACdvB,OAAQ,OACRwB,gBAAiB,QACjBC,UAAW,iBACXC,aAAcZ,EAAMa,MAAMD,aAC1B,iBAAkB,CAChBE,QAAS,aAKbC,KAAM,CAAC,EAGPC,OAAQ,CACNJ,aAAc,OAIhBK,MAAO,CACLrC,UAAW,yCAEb,mBAAoB,CAClB,KAAM,CACJsC,QAAS,GAEX,MAAO,CACLA,QAAS,IAEX,OAAQ,CACNA,QAAS,IAKbC,KAAM,CACJC,SAAU,WACVC,SAAU,SACV,WAAY,CACVzC,UAAW,kCACX0C,WAAY,uCAAuCC,OAAOvB,EAAMI,QAAQoB,OAAOC,MAAO,kBACtFX,QAAS,KACTM,SAAU,WACVT,UAAW,oBAEXe,OAAQ,EACRC,KAAM,EACNC,MAAO,EACPC,IAAK,IAGT,kBAAmB,CACjB,KAAM,CACJlB,UAAW,qBAEb,MAAO,CAELA,UAAW,oBAEb,OAAQ,CACNA,UAAW,qBAKfhB,aAAc,CACZ,QAAS,CACPmC,WAAY,WAKhBlC,WAAY,CACVmC,SAAU,eAIZlC,WAAY,CACVX,OAAQ,QAGd,EAyEkC,CAChC8C,KAAM,eADR,CAEGxD,E,kOC/II,MAAMyD,EAAmB,EAC9BC,OACAC,UACAC,YACAC,UACAC,qBAEA,MAAMC,GAAcC,EAAAA,EAAAA,QAAOC,EAAAA,IAEpBC,EAAUC,IAAeC,EAAAA,EAAAA,UAAS,KAClCC,EAASC,IAAcF,EAAAA,EAAAA,UAAS,KAChCG,EAAQC,IAAaJ,EAAAA,EAAAA,WAAS,IAC9BK,EAAOC,IAAYN,EAAAA,EAAAA,UAAS,KAEnCO,EAAAA,EAAAA,WAAU,KACJjB,GAAQG,IACVM,EAAYN,EAAQe,KAAKV,UAAY,IACrCI,EAAWT,EAAQe,KAAKP,SAAW,IACnCK,EAAS,MAEV,CAAChB,EAAMG,IAEV,MAkCMgB,EAAc,KACbN,IACHG,EAAS,IACTf,MAIJ,OACE,UAACmB,EAAAA,EAAMA,CAACpB,KAAMA,EAAMC,QAASkB,EAAatB,SAAS,KAAKwB,WAAS,E,WAC/D,SAACC,EAAAA,EAAWA,C,SAAC,kBACb,UAACC,EAAAA,EAAaA,C,UACXR,IACC,SAACS,EAAAA,EAAGA,CACFC,GAAI,EACJC,EAAG,EACHC,QAAQ,aACRC,MAAM,qBACNlD,aAAc,E,UAEd,SAACmD,EAAAA,EAAUA,CAAC3E,QAAQ,Q,SAAS6D,OAIjC,UAACe,EAAAA,EAAWA,CAACT,WAAS,EAACU,OAAO,S,WAC5B,SAACC,EAAAA,EAAUA,C,SAAC,UACZ,SAACC,EAAAA,EAAMA,CACLC,MAAO1B,EACP2B,SAAWC,GAAM3B,EAAY2B,EAAEC,OAAOH,OACtCI,SAAUzB,E,SAETT,EAAemC,IAAKC,IACnB,MAAMC,EAAYC,OAAOC,QAAQH,EAAKI,QAAU,CAAC,GAC9CL,IAAI,EAAEM,EAAKC,KAAS,GAAGA,SAAWD,KAClCE,KAAK,MACR,OACE,UAACC,EAAAA,EAAQA,CAAiBd,MAAOM,EAAKS,K,UACnCT,EAAKS,KAAK,IAAER,EAAY,IAAIA,KAAe,KAD/BD,EAAKS,cAQ5B,SAACC,EAAAA,EAASA,CACRC,MAAM,WACNC,YAAY,wCACZC,WAAS,EACTC,KAAM,EACNjC,WAAS,EACTU,OAAO,SACPG,MAAOvB,EACPwB,SAAWC,GAAMxB,EAAWwB,EAAEC,OAAOH,OACrCI,SAAUzB,EACV0C,WAAW,+DAGf,UAACC,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CAACC,QAASvC,EAAamB,SAAUzB,E,SAAQ,YAGhD,SAAC4C,EAAAA,EAAMA,CACLC,QA/FWC,UACjB,GAAKnD,EAAL,CAKAQ,EAAS,IACTF,GAAU,GAEV,IACE,MAAM8C,EAAQ,CACZ1C,KAAM,CACJV,WACAG,QAASA,EAAQkD,eAIfxD,EAAYyD,cAChB3D,EAAQ4D,SAASjE,KACjBK,EAAQ4D,SAASC,UAEjBJ,GAGF1D,IACAD,GACF,CAAE,MAAOgE,GACPC,QAAQnD,MAAM,kCAAmCkD,GACjDjD,EAASiD,aAAeE,MAAQF,EAAIG,QAAU,yBAChD,CAAE,QACAtD,GAAU,EACZ,CA3BA,MAFEE,EAAS,yBA8FLY,MAAM,UACN1E,QAAQ,YACRoF,UAAW9B,GAAYK,EACvBwD,UACExD,GAAS,SAACyD,EAAAA,EAAgBA,CAACC,KAAM,GAAI3C,MAAM,iBAAe4C,E,SAG3D3D,EAAS,YAAc,uB,sBC3J9B4D,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCC,EAAQ,OAAU,EAElB,IAAIC,EAAQF,EAAwB,EAAQ,QAIxCG,GAAW,EAFMJ,EAAuB,EAAQ,QAElBK,SAAuBF,EAAMG,cAAc,OAAQ,CACnFC,EAAG,wCACD,OAEJL,EAAQ,EAAUE,C,ieC0BlB,SAASI,EACPC,EACAC,EACAC,GAEA,MACMC,EAAkBD,EAAS,GAAGA,KAAY,GAEhD,MAAO,CACLE,KAAM,eAAeJ,8BAJLE,EAAS,GAAGA,KAAUD,IAAWA,KAOjDI,OAAQ,2DAEMJ,0BACED,mFAKIG,qJAOpBG,OAAQ,iCAECL,mBACCD,4CAGUG,gGAMpBI,GAAI,qGASSN,wBACED,iIAIoBG,yOAavC,C,eCjDO,MAAMK,EAAsB,EACjC1B,UAAW2B,M,IAyCTC,EAGAA,EA+YaC,EA6d4CC,EAAAA,EAt5B3D,MAAM,OAAEF,IAAWG,EAAAA,EAAAA,MACb1F,GAAcC,EAAAA,EAAAA,QAAOC,EAAAA,GACrByF,GAAc1F,EAAAA,EAAAA,QAAO2F,EAAAA,gBACrBC,GAAW5F,EAAAA,EAAAA,QAAO6F,EAAAA,cACjBC,EAAaC,IAAkB3F,EAAAA,EAAAA,UAAsB,IAAI4F,MACzDC,EAASC,IAAc9F,EAAAA,EAAAA,UAAS,IAChC+F,GAAQC,KAAahG,EAAAA,EAAAA,UAAiB,KACtCiG,GAAWC,KAAgBlG,EAAAA,EAAAA,UAAiB,KAC5CmG,GAAmBC,KAAwBpG,EAAAA,EAAAA,WAAS,IACpDqG,GAAgBC,KAAqBtG,EAAAA,EAAAA,WAAS,IAC9CuG,GAAeC,KAAoBxG,EAAAA,EAAAA,UAAwB,OAC3DyG,GAAYC,KAAiB1G,EAAAA,EAAAA,UAG1B,OACH2G,GAAaC,KAAkB5G,EAAAA,EAAAA,UAAwB,OACvD6G,GAAUC,KAAe9G,EAAAA,EAAAA,UAAwB,OACjD+G,GAAuBC,KAA4BhH,EAAAA,EAAAA,UAExD,IAAI4F,MACCR,GAAmB6B,KAAwBjH,EAAAA,EAAAA,UAG/C,CAAEV,MAAM,EAAOG,QAAS,QACpByH,GAAcC,KAAmBnH,EAAAA,EAAAA,UACtC,IAAIoH,MAECC,GAAeC,KAAoBtH,EAAAA,EAAAA,UAAsB,IAAI4F,MAC7D2B,GAAiBC,KAAsBxH,EAAAA,EAAAA,UAC5C,IAAI4F,MAEC6B,GAAqBC,KAA0B1H,EAAAA,EAAAA,WAAS,IACxD2H,GAAkBC,KAAuB5H,EAAAA,EAAAA,UAGtC,MAGJ6H,IACuB,QAA3B3C,EAAAA,EAAO7B,SAASyE,mBAAhB5C,IAAAA,OAAAA,EAAAA,EAA8B,4BAC9BA,EAAO7B,SAASjE,KACZkE,IACuB,QAA3B4B,EAAAA,EAAO7B,SAASyE,mBAAhB5C,IAAAA,OAAAA,EAAAA,EAA8B,2BAC9BD,GACA,WAEF8C,EAAAA,EAAAA,GAAS9E,UACP,MAAM+E,QAAiB1C,EAAY2C,uBAC7BC,QAAgB5C,EAAY6C,iBAClCnC,GAAUgC,EAASI,eACnBlC,GAAagC,EAAQG,OAAS,KAC7B,CAAC/C,IAEJ,MACE9D,MAAO8G,GACPC,QAASC,GACTnI,MAAOoI,KACLV,EAAAA,EAAAA,GAAS9E,iBACQtD,EAAY+I,uBAAuBpF,KAEzCqF,OAAS,IAAIC,OACvBC,GACCA,EAAErI,KAAKsI,cAAc1J,OAASyI,IAC9BgB,EAAExF,SAASC,YAAcA,IAE5B,CAACuE,GAAgBvE,GAAWuC,EAASlG,KAGtC6B,MAAO2D,GACPoD,QAASQ,GACT1I,MAAO2I,KACLjB,EAAAA,EAAAA,GAAS9E,U,IAGKgG,EAMhB,OAN0B,QAAVA,SAFGtJ,EAAYuJ,kBAEVP,aAALM,IAAAA,OAAAA,EAAAA,EAAYE,KACzBnI,GACCA,EAAEqC,SAASC,YAAcA,IACzBtC,EAAEqC,SAASjE,OAASyI,KAIvB,CAACvE,GAAWuE,GAAgBlI,IAGzByJ,GAAcjE,GAChB,cAAcA,GAAW9B,SAASC,aAAa6B,GAAW9B,SAASjE,YACnE0E,GAGFuF,QAASC,GACTf,QAASgB,GACTlJ,MAAOmJ,KACLC,EAAAA,EAAAA,GAAsBC,EAAAA,GAAgCN,KAGxDC,QAASM,GACTpB,QAASqB,GACTvJ,MAAOwJ,KACLJ,EAAAA,EAAAA,GAAsBK,EAAAA,KAGxBT,QAASU,GACTxB,QAASyB,GACT3J,MAAO4J,KACLR,EAAAA,EAAAA,GAAsBS,EAAAA,KAGxBb,QAASc,GACT5B,QAAS6B,GACT/J,MAAOgK,KACLZ,EAAAA,EAAAA,GAAsBa,EAAAA,IAqGpBC,GAAkB,KACtB7D,GAAc,MACdE,GAAe,OAGX4D,GAAiB,KAChB7D,KArBLH,GAsBkBG,IArBlBL,IAAkB,GAsBlBiE,OAGIE,GAAwB,KAC5B,IAAK9D,GAAa,OAClB,MAAMlH,EAAUkH,GAChB4D,KACAtD,GAAqB,CAAE3H,MAAM,EAAMG,aAa/BiL,GAAoBC,IACxBhF,EAAgBiF,IACd,MAAMC,EAAS,IAAIjF,IAAIgF,GAMvB,OALIC,EAAOC,IAAIH,GACbE,EAAOE,OAAOJ,GAEdE,EAAOG,IAAIL,GAENE,KAILI,IAAoBC,EAAAA,EAAAA,SACxB,IAAM,CACJ,CACEC,OAASlC,I,IAGFxJ,EADL,MAAMA,EAAUwJ,EAAKmC,QACrB,KAAK3L,SAAiB,QAAjBA,EAAAA,EAAS4D,gBAAT5D,IAAAA,OAAAA,EAAAA,EAAmBL,MACtB,OAAO,SAAC0B,EAAAA,EAAGA,CAAAA,GAIb,MAAMqB,EAAM,GAAG1C,EAAQ4D,SAASC,aAAa7D,EAAQ4D,SAASjE,OACxDiM,EAAcnE,GAAaoE,IAAInJ,GACrC,OACE,SAACoJ,GAAAA,CACC9L,QAASA,EACT+L,QAAS3D,GACT4D,eAAgBJ,OAM1B,CAACxD,GAAgBX,KAIbqE,GAAqB,EACzB9L,UACA+L,QAASE,EACTD,qB,IAOiBhM,EAMGA,EAAAA,EAPpB,MAAOkM,EAAkBC,IAAuB5L,EAAAA,EAAAA,UAAS,GACnD6L,GAAyB,QAAdpM,EAAAA,EAAQqM,cAARrM,IAAAA,OAAAA,EAAAA,EAAgBsM,cAAe,GAAGL,qBAG7CM,EAAgBP,GAAkB,iBAIlCQ,ED/VH,SACLC,EACAL,EACApH,GAEA,MAAMD,EAAU,WAAWqH,oBAE3B,OAAKK,EAIDA,EAAYC,oBAEP5H,EAAoCC,EAASC,EADrCyH,EAAaC,oBAAqBzH,QAAU,IAIzDwH,EAAYE,aAwFlB,SACE5H,EACAC,EACA4H,EACA3H,GAIA,MAAO,CACLE,KAAM,eAAeJ,eACjB6H,MAJc3H,EAAS,GAAGA,IAASD,IAAWA,KAMlDI,OAAQ,2DAEMJ,0BACED,kEAKb6H,QAAiB3H,qJAOpBI,OAAQ,iCAECL,mBACCD,2BAGP6H,QAAiB3H,gGAMpBK,GAAI,qGASSN,wBACED,gHAIG6H,QAAiB3H,yOAavC,CAvJa4H,CAA6B9H,EAASC,EAF5ByH,EAAaE,aAAchN,KAC7B8M,EAAaE,aAAc1H,QAAU,IAKpDwH,EAAYK,YAqJlB,SACE/H,EACAC,EACA+H,GAIA,MAAO,CACL5H,KAAM,gBAHgBJ,KAAWgI,KAAa/H,KAK9CI,OAAQ,2DAEMJ,0BACED,KAAWgI,wLAS3B1H,OAAQ,iCAECL,mBACCD,0BAGPgI,6FAMHzH,GAAI,qGASSN,wBACED,KAAWgI,8TAgB9B,CA/MWC,CAA4BjI,EAASC,EAD1ByH,EAAaK,YAAanN,MAI1C8M,EAAYQ,OA8MlB,SACElI,EACAC,EACAkI,GAEA,MAAO,CACL/H,KAAM,eAAeJ,qBACXmI,KAAclI,KAExBI,OAAQ,2DAEMJ,0BACED,4EAKHmI,sJAOb7H,OAAQ,iCAECL,mBACCD,2BAGPmI,+FAMH5H,GAAI,qGASSN,wBACED,6IAKDmI,gQAelB,CA9QWC,CAAuBpI,EAASC,EADpByH,EAAaQ,OAAQtN,MAInCmF,EAAoCC,EAASC,EAAQ,UAzBnDF,EAAoCC,EAASC,EAAQ,SA0BhE,CC6TqBoI,CADiB,QAAdpN,EAAAA,EAAQqM,cAARrM,IAAAA,GAA0B,QAA1BA,EAAAA,EAAgBqN,kBAAhBrN,IAAAA,OAAAA,EAAAA,EAA4ByM,YACOL,EAAUG,GAEjE,OACE,UAAClL,EAAAA,EAAGA,CACFE,EAAG,EACHC,QAAQ,qBACR+B,QAAUtB,GAAMA,EAAEqL,kB,UAEjBtN,EAAQe,KAAKP,UACZ,UAACa,EAAAA,EAAGA,CAACC,GAAI,E,WACP,SAACI,EAAAA,EAAUA,CAAC3E,QAAQ,KAAKwQ,cAAY,E,SAAC,cAGtC,SAAClM,EAAAA,EAAGA,CACFE,EAAG,EACHC,QAAQ,mBACRjD,aAAc,EACdiP,OAAO,gC,UAEP,SAAC9L,EAAAA,EAAUA,CACT3E,QAAQ,QACRU,MAAO,CACLgQ,WAAY,WACZC,UAAW,aACXC,aAAc,c,SAGf3N,EAAQe,KAAKP,gBAKtB,SAACkB,EAAAA,EAAUA,CAAC3E,QAAQ,KAAKwQ,cAAY,E,SAAC,oBAGtC,UAAC7L,EAAAA,EAAUA,CAAC3E,QAAQ,QAAQ6Q,WAAS,E,UAAC,oDACc,IACjD5N,EAAQe,KAAKV,SAAS,iBAEzB,SAACgB,EAAAA,EAAGA,CAACkC,QAAUtB,GAAMA,EAAEqL,kB,UACrB,UAACO,EAAAA,EAAIA,CACH9L,MAAOmK,EACPlK,SAAU,CAACC,EAAG6L,KACZ7L,EAAEqL,kBACFnB,EAAoB2B,IAEtBC,eAAe,U,WAEf,SAACC,EAAAA,EAAGA,CAAChL,MAAM,OAAOO,QAAUtB,GAAMA,EAAEqL,qBACpC,SAACU,EAAAA,EAAGA,CAAChL,MAAM,UAAUO,QAAUtB,GAAMA,EAAEqL,qBACvC,SAACU,EAAAA,EAAGA,CAAChL,MAAM,SAASO,QAAUtB,GAAMA,EAAEqL,qBACtC,SAACU,EAAAA,EAAGA,CAAChL,MAAM,KAAKO,QAAUtB,GAAMA,EAAEqL,0BAGtC,UAACjM,EAAAA,EAAGA,CAAC4M,GAAI,E,UACe,IAArB/B,IACC,SAACgC,EAAAA,EAAWA,CACVlQ,KAAMwO,EAASrH,KACfgJ,SAAS,OACTC,oBAAkB,IAGA,IAArBlC,IACC,SAACgC,EAAAA,EAAWA,CACVlQ,KAAMwO,EAASpH,OACf+I,SAAS,aACTC,oBAAkB,IAGA,IAArBlC,IACC,SAACgC,EAAAA,EAAWA,CACVlQ,KAAMwO,EAASnH,OACf8I,SAAS,SACTC,oBAAkB,IAGA,IAArBlC,IACC,SAACgC,EAAAA,EAAWA,CACVlQ,KAAMwO,EAASlH,GACf6I,SAAS,KACTC,oBAAkB,WAexBxN,GAAQoI,IAAiBO,GACzB8E,GACJtE,IACAK,IACAI,IACAI,GAEF,GAbE7B,IACAO,IACAQ,IACAK,IACAI,IACAI,GASA,OACE,SAACtJ,EAAAA,EAAGA,CAACE,EAAG,E,SACL,IAAI+M,MAAM,IAAIlM,IAAI,CAACmM,EAAGC,KACrB,SAACnN,EAAAA,EAAGA,CAASE,EAAG,E,UACd,SAACpF,EAAAA,EAAQA,CAACY,QAAQ,OAAOC,MAAM,UADvBwR,MAQlB,GAAI5N,GACF,OAAO,SAAC6N,EAAAA,EAAkBA,CAAC7N,MAAOA,KAGpC,GAAIyN,GAAiB,CACnB,MAAMK,EAAmB3E,GACrB,yBACAK,GACE,6BACAI,GACE,6BACAI,GACE,6BACA,UACV,OACE,UAACvJ,EAAAA,EAAGA,CAACE,EAAG,E,WACN,UAACG,EAAAA,EAAUA,CAACD,MAAM,Q,UAAQ,gCACM4M,GAAgBpK,YAEhD,UAACvC,EAAAA,EAAUA,CAAC3E,QAAQ,QAAQ0E,MAAM,gB,UAAgB,eACnCiN,MAEf,SAAChN,EAAAA,EAAUA,CAAC3E,QAAQ,QAAQ0E,MAAM,gB,SAAgB,qDAKxD,CAEA,MAAMkN,IAAe9F,IAAY,IAAiBM,OAC/CC,IAAO9B,GAAsB+D,IAAIjC,EAAExF,SAASjE,OAEzCiP,IAASlJ,UAAkB,QAAlBA,EAAAA,GAAY2G,cAAZ3G,IAAAA,OAAAA,EAAAA,EAAoBmJ,kBAAmB,GAEhDC,GAAkBH,GAAWxF,OAChCC,I,IAAOA,E,QAAQ,QAARA,EAAAA,EAAEiD,cAAFjD,IAAAA,OAAAA,EAAAA,EAAU2F,QAA4B,YAAnB3F,EAAEiD,OAAO0C,QAEhCC,GAAmBL,GAAWxF,OACjCC,I,IAAMA,E,MAAoB,cAAZ,QAARA,EAAAA,EAAEiD,cAAFjD,IAAAA,OAAAA,EAAAA,EAAU2F,SAEbE,GAAmBN,GAAWxF,OACjCC,I,IAAMA,E,MAAoB,cAAZ,QAARA,EAAAA,EAAEiD,cAAFjD,IAAAA,OAAAA,EAAAA,EAAU2F,SAGbG,GAAyC,CAC7C,CACEC,MAAO,OACPC,MAAO,gBACP1D,OAAS2D,IACP,SAACC,EAAAA,EAAIA,CAACtM,MAAOqM,EAAItO,KAAKV,SAAUoB,MAAM,UAAU2C,KAAK,WAGzD,CACE+K,MAAO,WACPC,MAAO,oBACP1D,OAAS2D,I,IAEJA,E,OADH,SAAC3N,EAAAA,EAAUA,CAAC3E,QAAQ,Q,UACP,QAAVsS,EAAAA,EAAIhD,cAAJgD,IAAAA,OAAAA,EAAAA,EAAYE,YACT,IAAIC,KAAKH,EAAIhD,OAAOkD,YAAYE,qBAChC,QAIV,CACEN,MAAO,UACPC,MAAO,mBACPM,YAAY,EACZC,WAAW,EACXjE,OAAS2D,I,IAKcA,EAAAA,EACCA,EALtB,MAAM3M,EAAM,GAAG2M,EAAIzL,SAASC,aAAawL,EAAIzL,SAASjE,OAChDiQ,EAAY3J,EAAYoF,IAAIgE,EAAIzL,SAASjE,MACzCkQ,EAAYjI,GAAcyD,IAAI3I,GAC9BoN,EAAcrI,GAAaoE,IAAInJ,GAC/BqN,EAAyB,QAAVV,EAAAA,EAAIhD,cAAJgD,IAAAA,GAAqB,QAArBA,EAAAA,EAAYW,iBAAZX,IAAAA,OAAAA,EAAAA,EAAuB1P,KACtCsQ,GAA8C,KAApB,QAAVZ,EAAAA,EAAIhD,cAAJgD,IAAAA,OAAAA,EAAAA,EAAYY,eAC5BC,EAAgBpI,GAAgBuD,IAAI3I,KAASuN,EAEnD,OAAKF,EASDG,IAAkBJ,GAElB,SAACK,EAAAA,GAAOA,CAAChB,MAAM,qE,UACb,UAAC9N,EAAAA,EAAGA,CAACzD,QAAQ,OAAOwS,WAAW,S,WAC7B,SAAC1O,EAAAA,EAAUA,CACT3E,QAAQ,QACR0E,MAAM,gBACNhE,MAAO,CAAE4S,WAAY,YAAaC,YAAa,G,SAChD,oBAGD,SAACC,EAAAA,EAAiBA,CAACC,SAAS,QAAQ/O,MAAM,mBAiChD,UAACJ,EAAAA,EAAGA,CAACzD,QAAQ,OAAOwS,WAAW,S,WAC7B,SAAC1O,EAAAA,EAAUA,CACT3E,QAAQ,QACRU,MAAO,CACL4S,WAAY,YACZC,YAAa,G,SAGdT,EACG,aACAD,GAAaE,EACXA,EACA,qBAEPF,GAAaE,IACZ,SAACK,EAAAA,GAAOA,CAAChB,MAAM,oB,UACb,SAACsB,EAAAA,EAAUA,CAACrM,KAAK,QAAQb,QA5BdC,UACbsM,UACIY,UAAUC,UAAUC,UAAUd,GACpC/J,EAAS8K,KAAK,CACZ5M,QAAS,8BACT6M,SAAU,UACVlT,QAAS,gB,UAuBL,SAACmT,EAAAA,EAAYA,CAACP,SAAS,eAI7B,SAACL,EAAAA,GAAOA,CACNhB,MACES,EAAY,eAAiB,iC,UAG/B,SAACoB,OAAAA,C,UACC,SAACP,EAAAA,EAAUA,CACTrM,KAAK,QACLb,QAxDgB,KACpBqM,GAvUa,EAACqB,EAA0BC,KAClD,MAAMxO,EAAM,GAAGuO,KAAoBC,IACnCxJ,GAAiByD,IACf,MAAMgG,EAAO,IAAIxJ,IAAIwD,GAErB,OADAgG,EAAK7F,OAAO5I,GACLyO,KAoUDC,CAAiB/B,EAAIzL,SAASC,UAAWwL,EAAIzL,SAASjE,MACtDsL,GAAiBoE,EAAIzL,SAASjE,OACpBuQ,IAEV/H,GAAoB,CAClBtE,UAAWwL,EAAIzL,SAASC,UACxBlE,KAAM0P,EAAIzL,SAASjE,OAErBsI,IAAuB,KA8CjB9F,SAAU0N,GAAcK,IAAkBJ,E,SAEzCF,GAAY,SAACW,EAAAA,EAAiBA,CAAAA,IAAM,SAACc,EAAAA,EAAcA,CAAAA,aAnF1D,SAAC3P,EAAAA,EAAUA,CAAC3E,QAAQ,QAAQ0E,MAAM,gB,SAAgB,yBA2F1D,CACE0N,MAAO,GACPC,MAAO,UACPM,YAAY,EACZC,WAAW,EACXjE,OAAS2D,IAEP,GADmBjI,KAAaiI,EAAIzL,SAASjE,KAE3C,OAAO,SAACwE,EAAAA,EAAgBA,CAACC,KAAM,KAEjC,MAAMkN,EAAUjC,EAAItO,KAAKwQ,YAAYjL,OAOrC,OANkBkL,EAAAA,EAAAA,GAChBF,EACAhL,GACA4D,GACAI,KAIA,SAACmG,EAAAA,EAAUA,CACTrM,KAAK,QACLb,QAAUtB,IACRA,EAAEqL,kBACF,MAAM5O,EAAOuD,EAAEwP,cAAcC,wBAC7BzK,GAAc,CAAEzH,IAAKd,EAAKW,OAAQC,KAAMZ,EAAKY,OAC7C6H,GAAekI,IAEjBF,MAAM,UACNwC,gBAAe3K,GAAa,oBAAiB3C,EAC7CuN,gBAAc,O,UAEd,SAACC,EAAAA,EAAYA,CAAAA,KAdM,QAqBvBC,GAAwC,CAC5C,CACE3C,MAAO,SACPC,MAAO,eACP1D,OAAS2D,I,IACOA,EAAd,MAAMN,GAAkB,QAAVM,EAAAA,EAAIhD,cAAJgD,IAAAA,OAAAA,EAAAA,EAAYN,QAAS,UAC7BgD,EAAsB,YAAVhD,EAClB,OACE,SAACO,EAAAA,EAAIA,CACHtM,MAAO+L,EACP3K,KAAK,QACL4N,KAAMD,GAAY,SAACE,EAAAA,EAAkBA,CAAAA,IAAM,SAACC,EAAAA,EAAUA,CAAAA,GACtDzQ,MAAOsQ,EAAY,UAAY,gBAKvC,CACE5C,MAAO,OACPC,MAAO,gBACP1D,OAAS2D,IACP,SAACC,EAAAA,EAAIA,CAACtM,MAAOqM,EAAItO,KAAKV,SAAUoB,MAAM,UAAU2C,KAAK,WAGzD,CACE+K,MAAO,WACPC,MAAO,eACP1D,OAAS2D,GACFA,EAAItO,KAAKP,SAIZ,SAAC2P,EAAAA,GAAOA,CAAChB,MAAOE,EAAItO,KAAKP,QAAS2R,UAAU,M,UAC1C,SAACzQ,EAAAA,EAAUA,CACT3E,QAAQ,QACRU,MAAO,CACLiC,SAAU,QACVV,SAAU,SACVoT,aAAc,WACd3E,WAAY,U,SAGb4B,EAAItO,KAAKP,aAbP,SAACkB,EAAAA,EAAUA,CAAC3E,QAAQ,Q,SAAQ,OAmBzC,CACEoS,MAAO,YACPC,MAAO,6BACP1D,OAAS2D,IACP,SAAC3N,EAAAA,EAAUA,CAAC3E,QAAQ,Q,SACjBsS,EAAIzL,SAASyO,kBACV,IAAI7C,KAAKH,EAAIzL,SAASyO,mBAAmB5C,qBACzC,OAIV,CACEN,MAAO,WACPC,MAAO,oBACP1D,OAAS2D,I,IACFA,EAAL,OAAe,QAAVA,EAAAA,EAAIhD,cAAJgD,IAAAA,OAAAA,EAAAA,EAAYE,aAGf,SAAC7N,EAAAA,EAAUA,CAAC3E,QAAQ,Q,SACjB,IAAIyS,KAAKH,EAAIhD,OAAOkD,YAAYE,wBAH5B,SAAC/N,EAAAA,EAAUA,CAAC3E,QAAQ,Q,SAAQ,QAQzC,CACEoS,MAAO,GACPC,MAAO,UACPM,YAAY,EACZC,WAAW,EACXjE,OAAS2D,I,IAKYA,EAHnB,GADmBjI,KAAaiI,EAAIzL,SAASjE,KAE3C,OAAO,SAACwE,EAAAA,EAAgBA,CAACC,KAAM,KAEjC,MAAM2N,IAAuB,QAAV1C,EAAAA,EAAIhD,cAAJgD,IAAAA,OAAAA,EAAAA,EAAYN,QAA8B,YAArBM,EAAIhD,OAAO0C,MAC7CuC,EAAUjC,EAAItO,KAAKwQ,YAAYjL,OAC/BgM,GAAYd,EAAAA,EAAAA,GAChBF,EACAhL,GACA4D,GACAI,IAGF,OAAKyH,IADWrH,IAAoB4G,IAAYhL,IAChBgM,IAE9B,SAAC7B,EAAAA,EAAUA,CACTrM,KAAK,QACLb,QAAUtB,IACRA,EAAEqL,kBACF,MAAM5O,EAAOuD,EAAEwP,cAAcC,wBAC7BzK,GAAc,CAAEzH,IAAKd,EAAKW,OAAQC,KAAMZ,EAAKY,OAC7C6H,GAAekI,IAEjBF,MAAM,UACNwC,gBAAe3K,GAAa,oBAAiB3C,EAC7CuN,gBAAc,O,UAEd,SAACC,EAAAA,EAAYA,CAAAA,KAdkC,QAsBnDU,GAAwBT,GAAe3I,OAC1CqJ,GAAsB,aAAdA,EAAIrD,OAAsC,WAAdqD,EAAIrD,OAG3C,OACE,UAAC9N,EAAAA,EAAGA,CAACE,EAAG,E,WACN,UAACkR,EAAAA,EAAIA,CAACC,WAAS,EAACC,QAAS,EAAGC,UAAU,S,UACnC/I,KACC,SAAC4I,EAAAA,EAAIA,CAACI,MAAI,E,UACR,UAACxR,EAAAA,EAAGA,CACFzD,QAAQ,OACRkV,cAAc,SACd1C,WAAW,WACX9O,GAAI,E,WAEJ,SAACgC,EAAAA,EAAMA,CACLvG,QAAQ,YACR0E,MAAM,UACNyC,WAAW,SAAC6O,EAAAA,EAAOA,CAAAA,GACnBxP,QAAS,IAAMoD,IAAqB,GACpCxE,SAA2B,IAAjByM,GAAMoE,OAChBC,cAAY,4BACZC,mBAAkBtE,GAAMoE,O,SACzB,uBAGiB,IAAjBpE,GAAMoE,SACL,SAACtR,EAAAA,EAAUA,CACT3E,QAAQ,UACR0E,MAAM,gBACNhE,MAAO,CAAEU,UAAW,GACpB8U,cAAY,mB,SAEVvN,GAEE,M,IAEEA,EAAAA,EAIAA,EAAAA,EALF,MAAMyN,EACa,QAAjBzN,EAAAA,GAAW2G,cAAX3G,IAAAA,GAA6B,QAA7BA,EAAAA,EAAmB0N,kBAAnB1N,IAAAA,OAAAA,EAAAA,EAA+BgE,KAC5B2J,GAAsB,UAAXA,EAAEnV,MAEZoV,EACa,QAAjB5N,EAAAA,GAAW2G,cAAX3G,IAAAA,GAA6B,QAA7BA,EAAAA,EAAmB0N,kBAAnB1N,IAAAA,OAAAA,EAAAA,EAA+BgE,KAC5B2J,GAAsB,yBAAXA,EAAEnV,MAGlB,MAA+B,UAA3BiV,aAAAA,EAAAA,EAAgB9G,QACX,yBAAwB8G,aAAAA,EAAAA,EAAgBlP,UAAW,YAE9B,UAA1BqP,aAAAA,EAAAA,EAAejH,QACV,yBAAwBiH,aAAAA,EAAAA,EAAerP,UAAW,wBAEpD,oBACR,EAjBC,GADA,+BAwBc,IAA3B6K,GAAgBkE,QACa,IAA5B/D,GAAiB+D,QACW,IAA5BhE,GAAiBgE,SACf,SAACP,EAAAA,EAAIA,CAACI,MAAI,E,UACR,SAACxR,EAAAA,EAAGA,CAACE,EAAG,EAAGgS,UAAU,S,UACnB,SAAC7R,EAAAA,EAAUA,CAAC3E,QAAQ,QAAQ0E,MAAM,gB,SAAgB,wDAMzDqN,GAAgBkE,OAAS,IACxB,SAACP,EAAAA,EAAIA,CAACI,MAAI,E,UACR,SAACW,EAAAA,EAAKA,CACJrE,MAAM,mBACNsE,QAAS,CACPC,OAAQ5E,GAAgBkE,OAAS,EACjCW,SAAU,GACVC,QAAQ,EACRjE,WAAW,EACXkE,iBAAkB,IAClBC,SAAS,EACTC,qBAAqB,GAEvBC,QAASzB,GACT/I,KAAMsF,OAIXG,GAAiB+D,OAAS,IACzB,SAACP,EAAAA,EAAIA,CAACI,MAAI,E,UACR,SAACW,EAAAA,EAAKA,CACJrE,MAAM,oBACNsE,QAAS,CACPC,OAAQzE,GAAiB+D,OAAS,EAClCW,SAAU,GACVC,QAAQ,EACRjE,WAAW,EACXkE,iBAAkB,IAClBC,SAAS,EACTC,qBAAqB,GAEvBC,QAASlC,GACTtI,KAAMyF,OAIXD,GAAiBgE,OAAS,IACzB,SAACP,EAAAA,EAAIA,CAACI,MAAI,E,UACR,SAACW,EAAAA,EAAKA,CAEJrE,MAAM,WACNsE,QAAS,CACPC,OAAQ1E,GAAiBgE,OAAS,EAClCW,SAAU,GACVC,QAAQ,EACRjE,WAAW,EACXkE,iBAAkB,IAClBC,SAAS,EACTC,qBAAqB,GAEvBC,QAAS9E,GACT1F,KAAMwF,GACNiF,YAAazI,IAbT,wBAmBZ,SAAC0I,EAAAA,EAAmBA,CAClBrU,KAAM6G,GACN5G,QAAS,IAAM6G,IAAqB,GACpC5G,UAAW,KACT4G,IAAqB,GACrBN,EAAY+C,GAAMA,EAAI,IAExBhB,eAAgBA,GAChBvE,UAAWA,GACX2C,UAAWA,GACXoI,MAAOA,MAGT,SAACuF,EAAAA,EAAIA,CACHC,GAAG,eACHvU,KAAM1C,QAAQ6J,IACdlH,QAASgL,GACTuJ,gBAAgB,iBAChBC,eAAgBtN,IAAc,CAAExH,IAAK,EAAGF,KAAM,G,SAE7C4H,IACC,M,IAEKA,EADH,MAAM6K,IACe,QAAlB7K,EAAAA,GAAYmF,cAAZnF,IAAAA,OAAAA,EAAAA,EAAoB6H,QACQ,YAA7B7H,GAAYmF,OAAO0C,MACfuC,EAAUpK,GAAYnG,KAAKwQ,YAAYjL,OAGvC4C,EAAQ,GAad,OAfgBwB,IAAoB4G,IAAYhL,IAAUyL,GAIxD7I,EAAMqL,MACJ,SAAC1R,EAAAA,EAAQA,CAAYU,QAASwH,G,SAAgB,QAAhC,SAKlB7B,EAAMqL,MACJ,SAAC1R,EAAAA,EAAQA,CAAcU,QAASyH,G,SAAuB,UAAzC,WAIT9B,CACR,EArBD,KAwBHpC,KACC,SAAClH,EAAAA,EAAgBA,CACfC,KAAM+G,GACN9G,QAAS,KACP+G,IAAkB,GAClBE,GAAiB,OAEnBhH,UArsBkB,KACxBsG,EAAY+C,GAAMA,EAAI,GACtBvC,IAAkB,GAClBd,EAAS8K,KAAK,CACZ5M,QAAS,kBACT6M,SAAU,UACVlT,QAAS,cAEXmJ,GAAiB,OA8rBX/G,QAAS8G,GACT7G,eAAgB2O,MAIpB,SAAC4F,EAAAA,EAAmBA,CAClB3U,KAAM8F,GAAkB9F,KACxBsP,MAAM,iBACNsF,YAAa,wCAAqF,cAApB,QAAzB9O,EAAAA,GAAkB3F,eAAlB2F,IAAAA,GAAiC,QAAjCA,EAAAA,EAA2B0G,cAA3B1G,IAAAA,OAAAA,EAAAA,EAAmCoJ,OAAuB,UAAY,aAC3H3H,SAAuB,OAAbA,GACVsN,UAnrBsBlR,UACrBmC,GAAkB3F,eAtHGwD,OAAO7D,IAEjC4H,GAA0B4D,GAAS,IAAIhF,IAAIgF,GAAMI,IAAI5L,IACrD0H,GAAY1H,GACZ,UACQO,EAAYyU,cAAc9Q,GAAWlE,GAC3CoG,EAAS8K,KAAK,CACZ5M,QAAS,+BACT6M,SAAU,UACVlT,QAAS,cAEXyI,EAAY+C,GAAMA,EAAI,EACxB,CAAE,MAAOtF,GACP,MAAM8Q,EACJ9Q,aAAeE,MAAQF,EAAIG,QAAU,yBAEvCsD,GAA0B4D,IACxB,MAAMgG,EAAO,IAAIhL,IAAIgF,GAErB,OADAgG,EAAK7F,OAAO3L,GACLwR,IAETpL,EAAS8K,KAAK,CACZ5M,QAAS,6BAA6B2Q,IACtC9D,SAAU,QACVlT,QAAS,aAEb,CAAE,QACAyJ,GAAY,KACd,GA2FMwN,CAAoBlP,GAAkB3F,QAAQ4D,SAASjE,MAC7D6H,GAAqB,CAAE3H,MAAM,EAAOG,QAAS,SAirBzC8U,SA9qBqB,KACzBtN,GAAqB,CAAE3H,MAAM,EAAOG,QAAS,WAgrB3C,UAACiB,EAAAA,EAAMA,CACLpB,KAAMmI,GACNlI,QAAS,KACPmI,IAAuB,GACvBE,GAAoB,OAEtBzI,SAAS,K,WAET,SAACyB,EAAAA,EAAWA,C,UACV,UAACE,EAAAA,EAAGA,CAACzD,QAAQ,OAAOwS,WAAW,S,WAC7B,SAAC2E,EAAAA,EAAWA,CAACtT,MAAM,UAAUhE,MAAO,CAAE6S,YAAa,KAAO,qBAI9D,UAAClP,EAAAA,EAAaA,C,WACZ,UAACM,EAAAA,EAAUA,CAAC3E,QAAQ,QAAQ6Q,WAAS,E,UAAC,oCACJ,SAACoH,SAAAA,C,SAAO,SAAa,wEAGvD,SAACtT,EAAAA,EAAUA,CAAC3E,QAAQ,QAAQ0E,MAAM,gB,SAAgB,0EAIpD,UAAC4B,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CACLC,QAAS,KACP0E,IAAuB,GACvBE,GAAoB,O,SAEvB,YAGD,SAAC7E,EAAAA,EAAMA,CACLvG,QAAQ,YACR0E,MAAM,UACN8B,QAAS,KACH2E,KAjzBc1E,OAC5ByN,EACAC,KAEA,MAAMxO,EAAM,GAAGuO,KAAoBC,IACnC,IAAItJ,GAAcyD,IAAI3I,GAAtB,CAIAmF,GAAkBsD,GAAS,IAAIhF,IAAIgF,GAAMI,IAAI7I,IAC7C,IACE,MAAM8G,QAAatJ,EAAY+U,gBAAgBhE,EAAkBC,GACjExJ,GAAiByD,GAAS,IAAIxD,IAAIwD,GAAM+J,IAAIxS,EAAK8G,EAAKxE,SAEtD+C,GAAoBoD,GAAS,IAAIhF,IAAIgF,GAAMI,IAAI7I,GACjD,CAAE,MAAOoB,GACP,MAAM8Q,EACJ9Q,aAAeE,MAAQF,EAAIG,QAAU,yBACnC2Q,EAAaO,SAAS,QAAUP,EAAaO,SAAS,wBAExDpN,GAAoBoD,GAAS,IAAIhF,IAAIgF,GAAMI,IAAI7I,IAC/CqD,EAAS8K,KAAK,CACZ5M,QACE,sEACF6M,SAAU,UACVlT,QAAS,eAGXmI,EAAS8K,KAAK,CACZ5M,QAAS,4BAA4B2Q,IACrC9D,SAAU,QACVlT,QAAS,aAGf,CAAE,QACAiK,GAAkBsD,IAChB,MAAMgG,EAAO,IAAIhL,IAAIgF,GAErB,OADAgG,EAAK7F,OAAO5I,GACLyO,GAEX,CAjCA,GA2yBYiE,CACElN,GAAiBrE,UACjBqE,GAAiBvI,MAEnBsL,GAAiB/C,GAAiBvI,OAEpCsI,IAAuB,GACvBE,GAAoB,O,SAEvB,4B,qEC5+BX,SAASvC,IACP,MAAMyP,GAAkB,IAAAC,qBACtB,kBAEF,IAAKD,EACH,MAAM,IAAIrR,MAAM,mCAElB,MAAMjC,EAAQsT,EAAgBE,UAAU,GACxC,IAAKxT,EACH,MAAM,IAAIiC,MAAM,kCAElB,IAAKjC,EAAM0D,OACT,MAAM,IAAIzB,MACR,8JAGJ,MAAO,CAAEyB,OAAQ1D,EAAM0D,OACzB,EA3CyB,IAAA+P,wBACvB,iB,sBCJElR,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCC,EAAQ,OAAU,EAElB,IAAIC,EAAQF,EAAwB,EAAQ,QAIxCG,GAAW,EAFMJ,EAAuB,EAAQ,QAElBK,SAAuBF,EAAMG,cAAc,OAAQ,CACnFC,EAAG,sNACD,cAEJL,EAAQ,EAAUE,C,wECjBH,SAAS4D,EAASmN,EAAIC,QACpB,IAATA,IAAmBA,EAAO,IAC9B,IAAIC,ECDO,SAAoBF,EAAIC,EAAME,QAC5B,IAATF,IAAmBA,EAAO,SACT,IAAjBE,IAA2BA,EAAe,CAAE9M,SAAS,IACzD,IAAI+M,GAAa,IAAAC,QAAO,GACpBC,GAAY,EAAAC,EAAA,KACZL,GAAK,IAAApV,UAASqV,GAAeK,EAAQN,EAAG,GAAIT,EAAMS,EAAG,GACrDO,GAAW,IAAAC,aAAY,WAEvB,IADA,IAAIC,EAAO,GACFC,EAAK,EAAGA,EAAKC,UAAUtD,OAAQqD,IACpCD,EAAKC,GAAMC,UAAUD,GAEzB,IAAIE,IAAWV,EAAWW,QAI1B,OAHKP,EAAMnN,SACPoM,EAAI,SAAUuB,GAAa,OAAQ,IAAAC,WAAS,IAAAA,UAAS,CAAC,EAAGD,GAAY,CAAE3N,SAAS,GAAU,GAEvF2M,EAAGkB,WAAM,EAAQP,GAAMQ,KAAK,SAAU7U,GAEzC,OADAgU,KAAeQ,IAAWV,EAAWW,SAAWtB,EAAI,CAAEnT,MAAOA,EAAO+G,SAAS,IACtE/G,CACX,EAAG,SAAUnB,GAET,OADAmV,KAAeQ,IAAWV,EAAWW,SAAWtB,EAAI,CAAEtU,MAAOA,EAAOkI,SAAS,IACtElI,CACX,EACJ,EAAG8U,GACH,MAAO,CAACO,EAAOC,EACnB,CDvBaW,CAAWpB,EAAIC,EAAM,CAC1B5M,SAAS,IACTmN,EAAQN,EAAG,GAAIO,EAAWP,EAAG,GAIjC,OAHA,IAAA7U,WAAU,WACNoV,GACJ,EAAG,CAACA,IACGD,CACX,C,sBETI3R,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCC,EAAQ,OAAU,EAElB,IAAIC,EAAQF,EAAwB,EAAQ,QAIxCG,GAAW,EAFMJ,EAAuB,EAAQ,QAElBK,SAAuBF,EAAMG,cAAc,OAAQ,CACnFC,EAAG,qGACD,QAEJL,EAAQ,EAAUE,C,sBCjBdJ,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCC,EAAQ,OAAU,EAElB,IAAIC,EAAQF,EAAwB,EAAQ,QAIxCG,GAAW,EAFMJ,EAAuB,EAAQ,QAElBK,SAAuBF,EAAMG,cAAc,OAAQ,CACnFC,EAAG,8fACD,iBAEJL,EAAQ,EAAUE,C,sLCSX,MAAM8P,EAAsB,EACjC3U,OACAsP,QACAsF,cACAqC,cACAhG,WAAW,SACX1J,YAAW,EACXsN,YACAI,eAEA,MAAOiC,EAAYC,IAAiBzW,EAAAA,EAAAA,UAAS,KAG7CO,EAAAA,EAAAA,WAAU,KACHjB,GACHmX,EAAc,KAEf,CAACnX,IAEJ,MAAMoX,EAAwC,SAAbnG,GAAuBgG,EAClDI,GAAaD,GAA2BF,IAAeD,EAQ7D,OACE,UAAC7V,EAAAA,EAAMA,CACLpB,KAAMA,EACNC,QAASsH,OAAW/C,EAAYyQ,EAChCpV,SAAS,KACTwB,WAAS,E,WAET,UAACC,EAAAA,EAAWA,C,UACI,SAAb2P,IACC,UAACzP,EAAAA,EAAGA,CAACzD,QAAQ,OAAOwS,WAAW,SAAS3S,MAAO,CAAE0Z,IAAK,G,WACpD,SAACpC,EAAAA,EAAWA,CAACtT,MAAM,WACnB,SAACuP,OAAAA,C,SAAM7B,OAGG,SAAb2B,GAAuB3B,MAE1B,UAAC/N,EAAAA,EAAaA,C,WACZ,SAACgW,EAAAA,EAAiBA,CAAC3Z,MAAO,CAAEgQ,WAAY,Y,SACrCgH,IAEFwC,IACC,UAAC5V,EAAAA,EAAGA,CAAC4M,GAAI,E,WACP,UAACvM,EAAAA,EAAUA,CAAC3E,QAAQ,QAAQ0E,MAAM,gBAAgB8L,cAAY,E,UAAC,SACxD,SAACyH,SAAAA,C,SAAQ8B,IAAqB,mBAErC,SAAC/T,EAAAA,EAASA,CACR7B,WAAS,EACTnE,QAAQ,WACRqH,KAAK,QACLrC,MAAOgV,EACP/U,SAAUC,GAAK+U,EAAc/U,EAAEC,OAAOH,OACtCI,SAAUiF,EACViQ,WAAS,EACTpU,YAAa6T,WAKrB,UAACzT,EAAAA,EAAaA,C,WACZ,SAACC,EAAAA,EAAMA,CAACC,QAASuR,EAAU3S,SAAUiF,E,SAAU,YAG/C,SAAC9D,EAAAA,EAAMA,CACLC,QAjDc,KAChB2T,GACFxC,KAgDIjT,MAAM,YACN1E,QAAQ,YACRoF,SAAUiF,IAAa8P,EACvBhT,UAAWkD,GAAW,SAACjD,EAAAA,EAAgBA,CAACC,KAAM,GAAI3C,MAAM,iBAAe4C,E,SAEtE+C,EAAW,cAAgB,iB,sBCvGlC9C,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCC,EAAQ,OAAU,EAElB,IAAIC,EAAQF,EAAwB,EAAQ,QAIxCG,GAAW,EAFMJ,EAAuB,EAAQ,QAElBK,SAAuBF,EAAMG,cAAc,OAAQ,CACnFC,EAAG,sJACD,YAEJL,EAAQ,EAAUE,C,sBCjBdJ,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCC,EAAQ,OAAU,EAElB,IAAIC,EAAQF,EAAwB,EAAQ,QAIxCG,GAAW,EAFMJ,EAAuB,EAAQ,QAElBK,SAAuBF,EAAMG,cAAc,OAAQ,CACnFC,EAAG,uDACD,WAEJL,EAAQ,EAAUE,C,sBCjBdJ,EAAyB,EAAQ,MAEjCC,EAA0B,EAAQ,OAKtCC,EAAQ,OAAU,EAElB,IAAIC,EAAQF,EAAwB,EAAQ,QAIxCG,GAAW,EAFMJ,EAAuB,EAAQ,QAElBK,SAAuBF,EAAMG,cAAc,OAAQ,CACnFC,EAAG,gJACD,kBAEJL,EAAQ,EAAUE,C","sources":["webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/lab/esm/Skeleton/Skeleton.js","webpack://internal.plugin-kuadrant/./src/components/EditAPIKeyDialog/EditAPIKeyDialog.tsx","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Add.js","webpack://internal.plugin-kuadrant/./src/utils/codeSnippets.ts","webpack://internal.plugin-kuadrant/./src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-catalog-react/dist/hooks/useEntity.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Visibility.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/esm/useAsync.js","webpack://internal.plugin-kuadrant/../../node_modules/react-use/esm/useAsyncFn.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Info.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/VisibilityOff.js","webpack://internal.plugin-kuadrant/./src/components/ConfirmDeleteDialog/ConfirmDeleteDialog.tsx","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/MoreVert.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Warning.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/HourglassEmpty.js"],"sourcesContent":["import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport clsx from 'clsx';\nimport PropTypes from 'prop-types';\nimport { alpha, withStyles } from '@material-ui/core/styles';\nexport var styles = function styles(theme) {\n return {\n /* Styles applied to the root element. */\n root: {\n display: 'block',\n // Create a \"on paper\" color with sufficient contrast retaining the color\n backgroundColor: alpha(theme.palette.text.primary, theme.palette.type === 'light' ? 0.11 : 0.13),\n height: '1.2em'\n },\n\n /* Styles applied to the root element if `variant=\"text\"`. */\n text: {\n marginTop: 0,\n marginBottom: 0,\n height: 'auto',\n transformOrigin: '0 60%',\n transform: 'scale(1, 0.60)',\n borderRadius: theme.shape.borderRadius,\n '&:empty:before': {\n content: '\"\\\\00a0\"'\n }\n },\n\n /* Styles applied to the root element if `variant=\"rect\"`. */\n rect: {},\n\n /* Styles applied to the root element if `variant=\"circle\"`. */\n circle: {\n borderRadius: '50%'\n },\n\n /* Styles applied to the root element if `animation=\"pulse\"`. */\n pulse: {\n animation: '$pulse 1.5s ease-in-out 0.5s infinite'\n },\n '@keyframes pulse': {\n '0%': {\n opacity: 1\n },\n '50%': {\n opacity: 0.4\n },\n '100%': {\n opacity: 1\n }\n },\n\n /* Styles applied to the root element if `animation=\"wave\"`. */\n wave: {\n position: 'relative',\n overflow: 'hidden',\n '&::after': {\n animation: '$wave 1.6s linear 0.5s infinite',\n background: \"linear-gradient(90deg, transparent, \".concat(theme.palette.action.hover, \", transparent)\"),\n content: '\"\"',\n position: 'absolute',\n transform: 'translateX(-100%)',\n // Avoid flash during server-side hydration\n bottom: 0,\n left: 0,\n right: 0,\n top: 0\n }\n },\n '@keyframes wave': {\n '0%': {\n transform: 'translateX(-100%)'\n },\n '60%': {\n // +0.5s of delay between each loop\n transform: 'translateX(100%)'\n },\n '100%': {\n transform: 'translateX(100%)'\n }\n },\n\n /* Styles applied when the component is passed children. */\n withChildren: {\n '& > *': {\n visibility: 'hidden'\n }\n },\n\n /* Styles applied when the component is passed children and no width. */\n fitContent: {\n maxWidth: 'fit-content'\n },\n\n /* Styles applied when the component is passed children and no height. */\n heightAuto: {\n height: 'auto'\n }\n };\n};\nvar Skeleton = /*#__PURE__*/React.forwardRef(function Skeleton(props, ref) {\n var _props$animation = props.animation,\n animation = _props$animation === void 0 ? 'pulse' : _props$animation,\n classes = props.classes,\n className = props.className,\n _props$component = props.component,\n Component = _props$component === void 0 ? 'span' : _props$component,\n height = props.height,\n _props$variant = props.variant,\n variant = _props$variant === void 0 ? 'text' : _props$variant,\n width = props.width,\n other = _objectWithoutProperties(props, [\"animation\", \"classes\", \"className\", \"component\", \"height\", \"variant\", \"width\"]);\n\n var hasChildren = Boolean(other.children);\n return /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref,\n className: clsx(classes.root, classes[variant], className, hasChildren && [classes.withChildren, !width && classes.fitContent, !height && classes.heightAuto], animation !== false && classes[animation])\n }, other, {\n style: _extends({\n width: width,\n height: height\n }, other.style)\n }));\n});\nprocess.env.NODE_ENV !== \"production\" ? Skeleton.propTypes = {\n /**\n * The animation.\n * If `false` the animation effect is disabled.\n */\n animation: PropTypes.oneOf(['pulse', 'wave', false]),\n\n /**\n * Optional children to infer width and height from.\n */\n children: PropTypes.node,\n\n /**\n * Override or extend the styles applied to the component.\n * See [CSS API](#css) below for more details.\n */\n classes: PropTypes.object.isRequired,\n\n /**\n * @ignore\n */\n className: PropTypes.string,\n\n /**\n * The component used for the root node.\n * Either a string to use a HTML element or a component.\n */\n component: PropTypes\n /* @typescript-to-proptypes-ignore */\n .elementType,\n\n /**\n * Height of the skeleton.\n * Useful when you don't want to adapt the skeleton to a text element but for instance a card.\n */\n height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n\n /**\n * The type of content that will be rendered.\n */\n variant: PropTypes.oneOf(['text', 'rect', 'circle']),\n\n /**\n * Width of the skeleton.\n * Useful when the skeleton is inside an inline element with no width of its own.\n */\n width: PropTypes.oneOfType([PropTypes.number, PropTypes.string])\n} : void 0;\nexport default withStyles(styles, {\n name: 'MuiSkeleton'\n})(Skeleton);","import React, { useState, useEffect } from \"react\";\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n TextField,\n Box,\n Typography,\n FormControl,\n InputLabel,\n Select,\n MenuItem,\n CircularProgress,\n} from \"@material-ui/core\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { APIKey } from \"../../types/api-management\";\n\ninterface EditAPIKeyDialogProps {\n open: boolean;\n onClose: () => void;\n onSuccess: () => void;\n request: APIKey;\n availablePlans: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n}\n\nexport const EditAPIKeyDialog = ({\n open,\n onClose,\n onSuccess,\n request,\n availablePlans,\n}: EditAPIKeyDialogProps) => {\n const kuadrantApi = useApi(kuadrantApiRef);\n\n const [planTier, setPlanTier] = useState(\"\");\n const [useCase, setUseCase] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n\n useEffect(() => {\n if (open && request) {\n setPlanTier(request.spec.planTier || \"\");\n setUseCase(request.spec.useCase || \"\");\n setError(\"\");\n }\n }, [open, request]);\n\n const handleSave = async () => {\n if (!planTier) {\n setError(\"Please select a tier\");\n return;\n }\n\n setError(\"\");\n setSaving(true);\n\n try {\n const patch = {\n spec: {\n planTier,\n useCase: useCase.trim(),\n },\n };\n\n await kuadrantApi.updateRequest(\n request.metadata.name,\n request.metadata.namespace,\n // @ts-ignore Applying a partial obj\n patch,\n );\n\n onSuccess();\n onClose();\n } catch (err) {\n console.error(\"Error updating API key request:\", err);\n setError(err instanceof Error ? err.message : \"Unknown error occurred\");\n } finally {\n setSaving(false);\n }\n };\n\n const handleClose = () => {\n if (!saving) {\n setError(\"\");\n onClose();\n }\n };\n\n return (\n <Dialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Edit API Key</DialogTitle>\n <DialogContent>\n {error && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\n <Typography variant=\"body2\">{error}</Typography>\n </Box>\n )}\n\n <FormControl fullWidth margin=\"normal\">\n <InputLabel>Tier</InputLabel>\n <Select\n value={planTier}\n onChange={(e) => setPlanTier(e.target.value as string)}\n disabled={saving}\n >\n {availablePlans.map((plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(\", \");\n return (\n <MenuItem key={plan.tier} value={plan.tier}>\n {plan.tier} {limitDesc ? `(${limitDesc})` : \"\"}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n\n <TextField\n label=\"Use Case\"\n placeholder=\"Describe how you plan to use this API\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={useCase}\n onChange={(e) => setUseCase(e.target.value)}\n disabled={saving}\n helperText=\"Explain your intended use of this API for admin review\"\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={saving}>\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n color=\"primary\"\n variant=\"contained\"\n disabled={!planTier || saving}\n startIcon={\n saving ? <CircularProgress size={16} color=\"inherit\" /> : undefined\n }\n >\n {saving ? \"Saving...\" : \"Save Changes\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\n}), 'Add');\n\nexports.default = _default;","import { Credentials } from '../types/api-management';\n\nexport interface CodeSnippets {\n curl: string;\n nodejs: string;\n python: string;\n go: string;\n}\n\nexport function generateAuthCodeSnippets(\n credentials: Credentials | undefined,\n hostname: string,\n apiKey: string,\n): CodeSnippets {\n const baseUrl = `https://${hostname}/api/v1/endpoint`;\n\n if (!credentials) {\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, 'Bearer');\n }\n\n if (credentials.authorizationHeader) {\n const prefix = credentials!.authorizationHeader!.prefix || '';\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, prefix);\n }\n\n if (credentials.customHeader) {\n const headerName = credentials!.customHeader!.name;\n const prefix = credentials!.customHeader!.prefix || '';\n return generateCustomHeaderSnippets(baseUrl, apiKey, headerName, prefix);\n }\n\n\n if (credentials.queryString) {\n const paramName = credentials!.queryString!.name;\n return generateQueryStringSnippets(baseUrl, apiKey, paramName);\n }\n\n if (credentials.cookie) {\n const cookieName = credentials!.cookie!.name;\n return generateCookieSnippets(baseUrl, apiKey, cookieName);\n }\n // Default to Authorization Bearer if no authScheme specified\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, 'Bearer');\n}\n\nfunction generateAuthorizationHeaderSnippets(\n baseUrl: string,\n apiKey: string,\n prefix: string,\n): CodeSnippets {\n const authValue = prefix ? `${prefix} ${apiKey}` : apiKey;\n const prefixWithSpace = prefix ? `${prefix} ` : '';\n\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n -H \"Authorization: ${authValue}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': '${prefixWithSpace}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nheaders = {\n 'Authorization': '${prefixWithSpace}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"Authorization\", \"${prefixWithSpace}\" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateCustomHeaderSnippets(\n baseUrl: string,\n apiKey: string,\n headerName: string,\n prefix: string,\n): CodeSnippets {\n const headerValue = prefix ? `${prefix}${apiKey}` : apiKey;\n\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n -H \"${headerName}: ${headerValue}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n '${headerName}': '${prefix}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nheaders = {\n '${headerName}': '${prefix}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"${headerName}\", \"${prefix}\" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateQueryStringSnippets(\n baseUrl: string,\n apiKey: string,\n paramName: string,\n): CodeSnippets {\n const urlWithParam = `${baseUrl}?${paramName}=${apiKey}`;\n\n return {\n curl: `curl -X GET \"${urlWithParam}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}?${paramName}=' + apiKey;\n\nfetch(endpoint, {\n method: 'GET'\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nparams = {\n '${paramName}': api_key\n}\n\nresponse = requests.get(endpoint, params=params)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}?${paramName}=\" + apiKey\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateCookieSnippets(\n baseUrl: string,\n apiKey: string,\n cookieName: string,\n): CodeSnippets {\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n --cookie \"${cookieName}=${apiKey}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Cookie': '${cookieName}=' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\ncookies = {\n '${cookieName}': api_key\n}\n\nresponse = requests.get(endpoint, cookies=cookies)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.AddCookie(&http.Cookie{\n Name: \"${cookieName}\",\n Value: apiKey,\n })\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n","import React, { useState, useMemo } from \"react\";\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n ResponseErrorPanel,\n CodeSnippet,\n} from \"@backstage/core-components\";\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Tabs,\n Tab,\n Menu,\n MenuItem,\n Tooltip,\n CircularProgress,\n} from \"@material-ui/core\";\nimport { Skeleton } from \"@material-ui/lab\";\nimport {\n useApi,\n identityApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useEntity } from \"@backstage/plugin-catalog-react\";\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\nimport VisibilityOffIcon from \"@material-ui/icons/VisibilityOff\";\nimport HourglassEmptyIcon from \"@material-ui/icons/HourglassEmpty\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport MoreVertIcon from \"@material-ui/icons/MoreVert\";\nimport FileCopyIcon from \"@material-ui/icons/FileCopy\";\nimport WarningIcon from \"@material-ui/icons/Warning\";\nimport { APIKey, APIProduct, Plan } from \"../../types/api-management\";\nimport {\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n} from \"../../permissions\";\nimport {\n useKuadrantPermission,\n canDeleteResource,\n} from \"../../utils/permissions\";\nimport { EditAPIKeyDialog } from \"../EditAPIKeyDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { generateAuthCodeSnippets } from \"../../utils/codeSnippets\";\nimport { RequestAccessDialog } from \"../RequestAccessDialog\";\n\nexport interface ApiKeyManagementTabProps {\n namespace?: string;\n}\n\nexport const ApiKeyManagementTab = ({\n namespace: propNamespace,\n}: ApiKeyManagementTabProps) => {\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [refresh, setRefresh] = useState(0);\n const [userId, setUserId] = useState<string>(\"\");\n const [userEmail, setUserEmail] = useState<string>(\"\");\n const [requestDialogOpen, setRequestDialogOpen] = useState(false);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [requestToEdit, setRequestToEdit] = useState<APIKey | null>(null);\n const [menuAnchor, setMenuAnchor] = useState<{\n top: number;\n left: number;\n } | null>(null);\n const [menuRequest, setMenuRequest] = useState<APIKey | null>(null);\n const [deleting, setDeleting] = useState<string | null>(null);\n const [optimisticallyDeleted, setOptimisticallyDeleted] = useState<\n Set<string>\n >(new Set());\n const [deleteDialogState, setDeleteDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n }>({ open: false, request: null });\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(\n new Map(),\n );\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n const [alreadyReadKeys, setAlreadyReadKeys] = useState<Set<string>>(\n new Set(),\n );\n const [showOnceWarningOpen, setShowOnceWarningOpen] = useState(false);\n const [pendingKeyReveal, setPendingKeyReveal] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName =\n entity.metadata.annotations?.[\"kuadrant.io/apiproduct\"] ||\n entity.metadata.name;\n const namespace =\n entity.metadata.annotations?.[\"kuadrant.io/namespace\"] ||\n propNamespace ||\n \"default\";\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const profile = await identityApi.getProfileInfo();\n setUserId(identity.userEntityRef);\n setUserEmail(profile.email || \"\");\n }, [identityApi]);\n\n const {\n value: requests,\n loading: requestsLoading,\n error: requestsError,\n } = useAsync(async () => {\n const data = await kuadrantApi.getRequestsByNamespace(namespace);\n // filter by apiproduct name, not httproute name\n return (data.items || []).filter(\n (r: APIKey) =>\n r.spec.apiProductRef.name === apiProductName &&\n r.metadata.namespace === namespace, // APIProducts and APIKeys (and its Secret) will be in the same NS\n );\n }, [apiProductName, namespace, refresh, kuadrantApi]);\n\n const {\n value: apiProduct,\n loading: plansLoading,\n error: plansError,\n } = useAsync(async () => {\n const data = await kuadrantApi.getApiProducts();\n\n const product = data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n\n return product;\n }, [namespace, apiProductName, kuadrantApi]);\n\n // check permissions with resource reference once we have the apiproduct\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const {\n allowed: canCreateRequest,\n loading: createRequestPermissionLoading,\n error: createRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyCreatePermission, resourceRef);\n\n const {\n allowed: canDeleteOwnKey,\n loading: deleteOwnPermissionLoading,\n error: deleteOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllKeys,\n loading: deleteAllPermissionLoading,\n error: deleteAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);\n\n const {\n allowed: canUpdateRequest,\n loading: updateRequestPermissionLoading,\n error: updateRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateOwnPermission);\n\n const handleDeleteRequest = async (name: string) => {\n // optimistic update - remove from UI immediately\n setOptimisticallyDeleted((prev) => new Set(prev).add(name));\n setDeleting(name);\n try {\n await kuadrantApi.deleteRequest(namespace, name);\n alertApi.post({\n message: \"API key deleted successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n setRefresh((r) => r + 1);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n // rollback optimistic update on error\n setOptimisticallyDeleted((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n alertApi.post({\n message: `Failed to delete API key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleting(null);\n }\n };\n\n const fetchApiKeyFromSecret = async (\n requestNamespace: string,\n requestName: string,\n ) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const data = await kuadrantApi.getApiKeySecret(requestNamespace, requestName);\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n // after successful read, mark as already read (show-once behaviour)\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n if (errorMessage.includes(\"403\") || errorMessage.includes(\"already been viewed\")) {\n // secret has already been read\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n alertApi.post({\n message:\n \"This API key has already been viewed and cannot be retrieved again.\",\n severity: \"warning\",\n display: \"transient\",\n });\n } else {\n alertApi.post({\n message: `Failed to fetch api key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n }\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const handleEditRequest = (request: APIKey) => {\n setRequestToEdit(request);\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefresh((r) => r + 1);\n setEditDialogOpen(false);\n alertApi.post({\n message: \"API key updated\",\n severity: \"success\",\n display: \"transient\",\n });\n setRequestToEdit(null);\n };\n\n const handleMenuClose = () => {\n setMenuAnchor(null);\n setMenuRequest(null);\n };\n\n const handleMenuEdit = () => {\n if (!menuRequest) return;\n handleEditRequest(menuRequest);\n handleMenuClose();\n };\n\n const handleMenuDeleteClick = () => {\n if (!menuRequest) return;\n const request = menuRequest;\n handleMenuClose();\n setDeleteDialogState({ open: true, request });\n };\n\n const handleDeleteConfirm = async () => {\n if (!deleteDialogState.request) return;\n await handleDeleteRequest(deleteDialogState.request.metadata.name);\n setDeleteDialogState({ open: false, request: null });\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogState({ open: false, request: null });\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const detailPanelConfig = useMemo(\n () => [\n {\n render: (data: any) => {\n // backstage Table wraps the data in { rowData: actualData }\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n\n // pass already-revealed key from parent state (don't auto-fetch - that consumes show-once)\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const revealedKey = apiKeyValues.get(key);\n return (\n <DetailPanelContent\n request={request}\n apiName={apiProductName}\n revealedApiKey={revealedKey}\n />\n );\n },\n },\n ],\n [apiProductName, apiKeyValues],\n );\n\n // separate component to isolate state\n const DetailPanelContent = ({\n request,\n apiName: api,\n revealedApiKey,\n }: {\n request: APIKey;\n apiName: string;\n revealedApiKey?: string;\n }) => {\n const [selectedLanguage, setSelectedLanguage] = useState(0);\n const hostname = request.status?.apiHostname || `${api}.apps.example.com`;\n\n // use revealed key if available, otherwise show placeholder\n const displayApiKey = revealedApiKey || \"<your-api-key>\";\n\n // Generate code snippets based on authScheme credentials\n const credentials = request.status?.authScheme?.credentials;\n const snippets = generateAuthCodeSnippets(credentials, hostname, displayApiKey);\n\n return (\n <Box\n p={3}\n bgcolor=\"background.default\"\n onClick={(e) => e.stopPropagation()}\n >\n {request.spec.useCase && (\n <Box mb={3}>\n <Typography variant=\"h6\" gutterBottom>\n Use Case\n </Typography>\n <Box\n p={2}\n bgcolor=\"background.paper\"\n borderRadius={1}\n border=\"1px solid rgba(0, 0, 0, 0.12)\"\n >\n <Typography\n variant=\"body2\"\n style={{\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n overflowWrap: \"break-word\",\n }}\n >\n {request.spec.useCase}\n </Typography>\n </Box>\n </Box>\n )}\n <Typography variant=\"h6\" gutterBottom>\n Usage Examples\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use these code examples to test the API with your{\" \"}\n {request.spec.planTier} tier key.\n </Typography>\n <Box onClick={(e) => e.stopPropagation()}>\n <Tabs\n value={selectedLanguage}\n onChange={(e, newValue) => {\n e.stopPropagation();\n setSelectedLanguage(newValue);\n }}\n indicatorColor=\"primary\"\n >\n <Tab label=\"cURL\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Node.js\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Python\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Go\" onClick={(e) => e.stopPropagation()} />\n </Tabs>\n </Box>\n <Box mt={2}>\n {selectedLanguage === 0 && (\n <CodeSnippet\n text={snippets.curl}\n language=\"bash\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 1 && (\n <CodeSnippet\n text={snippets.nodejs}\n language=\"javascript\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 2 && (\n <CodeSnippet\n text={snippets.python}\n language=\"python\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 3 && (\n <CodeSnippet\n text={snippets.go}\n language=\"go\"\n showCopyCodeButton\n />\n )}\n </Box>\n </Box>\n );\n };\n\n const loading =\n requestsLoading ||\n plansLoading ||\n createRequestPermissionLoading ||\n deleteOwnPermissionLoading ||\n deleteAllPermissionLoading ||\n updateRequestPermissionLoading;\n const error = requestsError || plansError;\n const permissionError =\n createRequestPermissionError ||\n deleteOwnPermissionError ||\n deleteAllPermissionError ||\n updateRequestPermissionError;\n\n if (loading) {\n return (\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n const failedPermission = createRequestPermissionError\n ? \"kuadrant.apikey.create\"\n : deleteOwnPermissionError\n ? \"kuadrant.apikey.delete.own\"\n : deleteAllPermissionError\n ? \"kuadrant.apikey.delete.all\"\n : updateRequestPermissionError\n ? \"kuadrant.apikey.update.own\"\n : \"unknown\";\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Permission: {failedPermission}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n const myRequests = ((requests || []) as APIKey[]).filter(\n (r) => !optimisticallyDeleted.has(r.metadata.name),\n );\n const plans = (apiProduct?.status?.discoveredPlans || []) as Plan[];\n\n const pendingRequests = myRequests.filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n const approvedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Approved\",\n );\n const rejectedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Rejected\",\n );\n\n const approvedColumns: TableColumn<APIKey>[] = [\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Approved\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt\n ? new Date(row.status.reviewedAt).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"API Key\",\n field: \"status.secretRef\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const key = `${row.metadata.namespace}/${row.metadata.name}`;\n const isVisible = visibleKeys.has(row.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = row.status?.secretRef?.name;\n const canReadSecret = row.status?.canReadSecret !== false;\n const isAlreadyRead = alreadyReadKeys.has(key) || !canReadSecret;\n\n if (!hasSecretRef) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n Awaiting secret...\n </Typography>\n );\n }\n\n // key has already been viewed and cannot be retrieved again\n if (isAlreadyRead && !apiKeyValue) {\n return (\n <Tooltip title=\"This API key has already been viewed and cannot be retrieved again\">\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n style={{ fontFamily: \"monospace\", marginRight: 8 }}\n >\n Already viewed\n </Typography>\n <VisibilityOffIcon fontSize=\"small\" color=\"disabled\" />\n </Box>\n </Tooltip>\n );\n }\n\n const handleRevealClick = () => {\n if (isVisible) {\n // hiding - clear the value from memory\n clearApiKeyValue(row.metadata.namespace, row.metadata.name);\n toggleVisibility(row.metadata.name);\n } else if (!isAlreadyRead) {\n // show warning dialog before first reveal\n setPendingKeyReveal({\n namespace: row.metadata.namespace,\n name: row.metadata.name,\n });\n setShowOnceWarningOpen(true);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: \"API key copied to clipboard\",\n severity: \"success\",\n display: \"transient\",\n });\n }\n };\n\n return (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: \"monospace\",\n marginRight: 8,\n }}\n >\n {isLoading\n ? \"Loading...\"\n : isVisible && apiKeyValue\n ? apiKeyValue\n : \"••••••••••••••••\"}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={\n isVisible ? \"Hide API key\" : \"Reveal API key (one-time only)\"\n }\n >\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading || (isAlreadyRead && !apiKeyValue)}\n >\n {isVisible ? <VisibilityOffIcon /> : <VisibilityIcon />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n if (!canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const requestColumns: TableColumn<APIKey>[] = [\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row: APIKey) => {\n const phase = row.status?.phase || \"Pending\";\n const isPending = phase === \"Pending\";\n return (\n <Chip\n label={phase}\n size=\"small\"\n icon={isPending ? <HourglassEmptyIcon /> : <CancelIcon />}\n color={isPending ? \"default\" : \"secondary\"}\n />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Use Case\",\n field: \"spec.useCase\",\n render: (row: APIKey) => {\n if (!row.spec.useCase) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n return (\n <Tooltip title={row.spec.useCase} placement=\"top\">\n <Typography\n variant=\"body2\"\n style={{\n maxWidth: \"200px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {row.spec.useCase}\n </Typography>\n </Tooltip>\n );\n },\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp\n ? new Date(row.metadata.creationTimestamp).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"Reviewed\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => {\n if (!row.status?.reviewedAt)\n return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.status.reviewedAt).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const isPending = !row.status?.phase || row.status.phase === \"Pending\";\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n const canEdit = canUpdateRequest && ownerId === userId;\n if (!isPending || (!canEdit && !canDelete)) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n // Filter columns for pending requests (no Reviewed or Reason)\n const pendingRequestColumns = requestColumns.filter(\n (col) => col.title !== \"Reviewed\" && col.title !== \"Reason\",\n );\n\n return (\n <Box p={2}>\n <Grid container spacing={3} direction=\"column\">\n {canCreateRequest && (\n <Grid item>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-end\"\n mb={2}\n >\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setRequestDialogOpen(true)}\n disabled={plans.length === 0}\n data-testid=\"request-api-access-button\"\n data-plans-count={plans.length}\n >\n Request API Access\n </Button>\n {plans.length === 0 && (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n style={{ marginTop: 4 }}\n data-testid=\"no-plans-message\"\n >\n {!apiProduct\n ? \"API product not found\"\n : (() => {\n const readyCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"Ready\",\n );\n const planCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"PlanPolicyDiscovered\",\n );\n\n if (readyCondition?.status !== \"True\") {\n return `HTTPRoute not ready: ${readyCondition?.message || \"unknown\"}`;\n }\n if (planCondition?.status !== \"True\") {\n return `No plans discovered: ${planCondition?.message || \"no PlanPolicy found\"}`;\n }\n return \"No plans available\";\n })()}\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n {pendingRequests.length === 0 &&\n rejectedRequests.length === 0 &&\n approvedRequests.length === 0 && (\n <Grid item>\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys yet. Request access to get started.\n </Typography>\n </Box>\n </Grid>\n )}\n {pendingRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Pending Requests\"\n options={{\n paging: pendingRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={pendingRequestColumns}\n data={pendingRequests}\n />\n </Grid>\n )}\n {rejectedRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Rejected Requests\"\n options={{\n paging: rejectedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={requestColumns}\n data={rejectedRequests}\n />\n </Grid>\n )}\n {approvedRequests.length > 0 && (\n <Grid item>\n <Table\n key=\"api-keys-table\"\n title=\"API Keys\"\n options={{\n paging: approvedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={approvedColumns}\n data={approvedRequests}\n detailPanel={detailPanelConfig}\n />\n </Grid>\n )}\n </Grid>\n\n <RequestAccessDialog\n open={requestDialogOpen}\n onClose={() => setRequestDialogOpen(false)}\n onSuccess={() => {\n setRequestDialogOpen(false);\n setRefresh((r) => r + 1);\n }}\n apiProductName={apiProductName}\n namespace={namespace}\n userEmail={userEmail}\n plans={plans}\n />\n\n <Menu\n id=\"actions-menu\"\n open={Boolean(menuAnchor)}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuAnchor || { top: 0, left: 0 }}\n >\n {menuRequest &&\n (() => {\n const isPending =\n !menuRequest.status?.phase ||\n menuRequest.status.phase === \"Pending\";\n const ownerId = menuRequest.spec.requestedBy.userId;\n const canEdit = canUpdateRequest && ownerId === userId && isPending;\n\n const items = [];\n if (canEdit) {\n items.push(\n <MenuItem key=\"edit\" onClick={handleMenuEdit}>\n Edit\n </MenuItem>,\n );\n }\n items.push(\n <MenuItem key=\"delete\" onClick={handleMenuDeleteClick}>\n Delete\n </MenuItem>,\n );\n return items;\n })()}\n </Menu>\n\n {requestToEdit && (\n <EditAPIKeyDialog\n open={editDialogOpen}\n onClose={() => {\n setEditDialogOpen(false);\n setRequestToEdit(null);\n }}\n onSuccess={handleEditSuccess}\n request={requestToEdit}\n availablePlans={plans}\n />\n )}\n\n <ConfirmDeleteDialog\n open={deleteDialogState.open}\n title=\"Delete Request\"\n description={`Are you sure you want to delete this ${deleteDialogState.request?.status?.phase === \"Approved\" ? \"API key\" : \"request\"}?`}\n deleting={deleting !== null}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n\n <Dialog\n open={showOnceWarningOpen}\n onClose={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n maxWidth=\"sm\"\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\">\n <WarningIcon color=\"primary\" style={{ marginRight: 8 }} />\n View API Key\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\" paragraph>\n This API key can only be viewed <strong>once</strong>. After you\n reveal it, you will not be able to retrieve it again.\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure to copy and store it securely before closing this view.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (pendingKeyReveal) {\n fetchApiKeyFromSecret(\n pendingKeyReveal.namespace,\n pendingKeyReveal.name,\n );\n toggleVisibility(pendingKeyReveal.name);\n }\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Reveal API Key\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n};\n","import { jsx } from 'react/jsx-runtime';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { AnalyticsContext } from '@backstage/core-plugin-api';\nimport { createVersionedContext, useVersionedContext, createVersionedValueMap } from '@backstage/version-bridge';\n\nconst NewEntityContext = createVersionedContext(\n \"entity-context\"\n);\nconst AsyncEntityProvider = (props) => {\n const { children, entity, loading, error, refresh } = props;\n const value = { entity, loading, error, refresh };\n return /* @__PURE__ */ jsx(NewEntityContext.Provider, { value: createVersionedValueMap({ 1: value }), children: /* @__PURE__ */ jsx(\n AnalyticsContext,\n {\n attributes: {\n ...entity ? { entityRef: stringifyEntityRef(entity) } : void 0\n },\n children\n }\n ) });\n};\nconst EntityProvider = (props) => /* @__PURE__ */ jsx(\n AsyncEntityProvider,\n {\n entity: props.entity,\n loading: !Boolean(props.entity),\n error: void 0,\n refresh: void 0,\n children: props.children\n }\n);\nfunction useEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n if (!value.entity) {\n throw new Error(\n \"useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.\"\n );\n }\n return { entity: value.entity };\n}\nfunction useAsyncEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n const { entity, loading, error, refresh } = value;\n return { entity, loading, error, refresh };\n}\n\nexport { AsyncEntityProvider, EntityProvider, useAsyncEntity, useEntity };\n//# sourceMappingURL=useEntity.esm.js.map\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\"\n}), 'Visibility');\n\nexports.default = _default;","import { useEffect } from 'react';\nimport useAsyncFn from './useAsyncFn';\nexport default function useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\n","import { __assign } from \"tslib\";\nimport { useCallback, useRef, useState } from 'react';\nimport useMountedState from './useMountedState';\nexport default function useAsyncFn(fn, deps, initialState) {\n if (deps === void 0) { deps = []; }\n if (initialState === void 0) { initialState = { loading: false }; }\n var lastCallId = useRef(0);\n var isMounted = useMountedState();\n var _a = useState(initialState), state = _a[0], set = _a[1];\n var callback = useCallback(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var callId = ++lastCallId.current;\n if (!state.loading) {\n set(function (prevState) { return (__assign(__assign({}, prevState), { loading: true })); });\n }\n return fn.apply(void 0, args).then(function (value) {\n isMounted() && callId === lastCallId.current && set({ value: value, loading: false });\n return value;\n }, function (error) {\n isMounted() && callId === lastCallId.current && set({ error: error, loading: false });\n return error;\n });\n }, deps);\n return [state, callback];\n}\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"\n}), 'Info');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z\"\n}), 'VisibilityOff');\n\nexports.default = _default;","import React, { useState, useEffect } from 'react';\nimport {\n Dialog,\n DialogTitle,\n DialogContent,\n DialogContentText,\n DialogActions,\n Button,\n TextField,\n Typography,\n Box,\n CircularProgress,\n} from '@material-ui/core';\nimport WarningIcon from '@material-ui/icons/Warning';\n\nexport interface ConfirmDeleteDialogProps {\n open: boolean;\n title: string;\n description: string;\n // for dangerous deletes, require typing this text to confirm\n confirmText?: string;\n // severity affects styling - 'high' shows warning icon and requires text confirmation\n severity?: 'normal' | 'high';\n deleting?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport const ConfirmDeleteDialog = ({\n open,\n title,\n description,\n confirmText,\n severity = 'normal',\n deleting = false,\n onConfirm,\n onCancel,\n}: ConfirmDeleteDialogProps) => {\n const [inputValue, setInputValue] = useState('');\n\n // reset input when dialog opens/closes\n useEffect(() => {\n if (!open) {\n setInputValue('');\n }\n }, [open]);\n\n const requiresTextConfirmation = severity === 'high' && confirmText;\n const canConfirm = requiresTextConfirmation ? inputValue === confirmText : true;\n\n const handleConfirm = () => {\n if (canConfirm) {\n onConfirm();\n }\n };\n\n return (\n <Dialog\n open={open}\n onClose={deleting ? undefined : onCancel}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n {severity === 'high' && (\n <Box display=\"flex\" alignItems=\"center\" style={{ gap: 8 }}>\n <WarningIcon color=\"error\" />\n <span>{title}</span>\n </Box>\n )}\n {severity !== 'high' && title}\n </DialogTitle>\n <DialogContent>\n <DialogContentText style={{ whiteSpace: 'pre-line' }}>\n {description}\n </DialogContentText>\n {requiresTextConfirmation && (\n <Box mt={2}>\n <Typography variant=\"body2\" color=\"textSecondary\" gutterBottom>\n Type <strong>{confirmText}</strong> to confirm:\n </Typography>\n <TextField\n fullWidth\n variant=\"outlined\"\n size=\"small\"\n value={inputValue}\n onChange={e => setInputValue(e.target.value)}\n disabled={deleting}\n autoFocus\n placeholder={confirmText}\n />\n </Box>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={onCancel} disabled={deleting}>\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n color=\"secondary\"\n variant=\"contained\"\n disabled={deleting || !canConfirm}\n startIcon={deleting ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n >\n {deleting ? 'Deleting...' : 'Delete'}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n}), 'MoreVert');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"\n}), 'Warning');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z\"\n}), 'HourglassEmpty');\n\nexports.default = _default;"],"names":["Skeleton","props","ref","_props$animation","animation","classes","className","_props$component","component","Component","height","_props$variant","variant","width","other","hasChildren","Boolean","children","root","withChildren","fitContent","heightAuto","style","withStyles","theme","display","backgroundColor","alpha","palette","text","primary","type","marginTop","marginBottom","transformOrigin","transform","borderRadius","shape","content","rect","circle","pulse","opacity","wave","position","overflow","background","concat","action","hover","bottom","left","right","top","visibility","maxWidth","name","EditAPIKeyDialog","open","onClose","onSuccess","request","availablePlans","kuadrantApi","useApi","kuadrantApiRef","planTier","setPlanTier","useState","useCase","setUseCase","saving","setSaving","error","setError","useEffect","spec","handleClose","Dialog","fullWidth","DialogTitle","DialogContent","Box","mb","p","bgcolor","color","Typography","FormControl","margin","InputLabel","Select","value","onChange","e","target","disabled","map","plan","limitDesc","Object","entries","limits","key","val","join","MenuItem","tier","TextField","label","placeholder","multiline","rows","helperText","DialogActions","Button","onClick","async","patch","trim","updateRequest","metadata","namespace","err","console","Error","message","startIcon","CircularProgress","size","undefined","_interopRequireDefault","_interopRequireWildcard","exports","React","_default","default","createElement","d","generateAuthorizationHeaderSnippets","baseUrl","apiKey","prefix","prefixWithSpace","curl","nodejs","python","go","ApiKeyManagementTab","propNamespace","entity","apiProduct","deleteDialogState","useEntity","identityApi","identityApiRef","alertApi","alertApiRef","visibleKeys","setVisibleKeys","Set","refresh","setRefresh","userId","setUserId","userEmail","setUserEmail","requestDialogOpen","setRequestDialogOpen","editDialogOpen","setEditDialogOpen","requestToEdit","setRequestToEdit","menuAnchor","setMenuAnchor","menuRequest","setMenuRequest","deleting","setDeleting","optimisticallyDeleted","setOptimisticallyDeleted","setDeleteDialogState","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","alreadyReadKeys","setAlreadyReadKeys","showOnceWarningOpen","setShowOnceWarningOpen","pendingKeyReveal","setPendingKeyReveal","apiProductName","annotations","useAsync","identity","getBackstageIdentity","profile","getProfileInfo","userEntityRef","email","requests","loading","requestsLoading","requestsError","getRequestsByNamespace","items","filter","r","apiProductRef","plansLoading","plansError","data","getApiProducts","find","resourceRef","allowed","canCreateRequest","createRequestPermissionLoading","createRequestPermissionError","useKuadrantPermission","kuadrantApiKeyCreatePermission","canDeleteOwnKey","deleteOwnPermissionLoading","deleteOwnPermissionError","kuadrantApiKeyDeleteOwnPermission","canDeleteAllKeys","deleteAllPermissionLoading","deleteAllPermissionError","kuadrantApiKeyDeleteAllPermission","canUpdateRequest","updateRequestPermissionLoading","updateRequestPermissionError","kuadrantApiKeyUpdateOwnPermission","handleMenuClose","handleMenuEdit","handleMenuDeleteClick","toggleVisibility","keyName","prev","newSet","has","delete","add","detailPanelConfig","useMemo","render","rowData","revealedKey","get","DetailPanelContent","apiName","revealedApiKey","api","selectedLanguage","setSelectedLanguage","hostname","status","apiHostname","displayApiKey","snippets","credentials","authorizationHeader","customHeader","headerName","generateCustomHeaderSnippets","queryString","paramName","generateQueryStringSnippets","cookie","cookieName","generateCookieSnippets","generateAuthCodeSnippets","authScheme","stopPropagation","gutterBottom","border","whiteSpace","wordBreak","overflowWrap","paragraph","Tabs","newValue","indicatorColor","Tab","mt","CodeSnippet","language","showCopyCodeButton","permissionError","Array","_","i","ResponseErrorPanel","failedPermission","myRequests","plans","discoveredPlans","pendingRequests","phase","approvedRequests","rejectedRequests","approvedColumns","title","field","row","Chip","reviewedAt","Date","toLocaleDateString","searchable","filtering","isVisible","isLoading","apiKeyValue","hasSecretRef","secretRef","canReadSecret","isAlreadyRead","Tooltip","alignItems","fontFamily","marginRight","VisibilityOffIcon","fontSize","IconButton","navigator","clipboard","writeText","post","severity","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","VisibilityIcon","ownerId","requestedBy","canDeleteResource","currentTarget","getBoundingClientRect","aria-controls","aria-haspopup","MoreVertIcon","requestColumns","isPending","icon","HourglassEmptyIcon","CancelIcon","placement","textOverflow","creationTimestamp","canDelete","pendingRequestColumns","col","Grid","container","spacing","direction","item","flexDirection","AddIcon","length","data-testid","data-plans-count","readyCondition","conditions","c","planCondition","textAlign","Table","options","paging","pageSize","search","debounceInterval","toolbar","emptyRowsWhenPaging","columns","detailPanel","RequestAccessDialog","Menu","id","anchorReference","anchorPosition","push","ConfirmDeleteDialog","description","onConfirm","deleteRequest","errorMessage","handleDeleteRequest","onCancel","WarningIcon","strong","getApiKeySecret","set","includes","fetchApiKeyFromSecret","versionedHolder","useVersionedContext","atVersion","createVersionedContext","fn","deps","_a","initialState","lastCallId","useRef","isMounted","useMountedState","state","callback","useCallback","args","_i","arguments","callId","current","prevState","__assign","apply","then","useAsyncFn","confirmText","inputValue","setInputValue","requiresTextConfirmation","canConfirm","gap","DialogContentText","autoFocus"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[879],{72627:(e,n,t)=>{t.r(n),t.d(n,{ApiKeyApprovalPage:()=>u,ApiKeyDetailPage:()=>A,ApiProductDetailPage:()=>b,ApiProductsPage:()=>d,EntityKuadrantApiAccessCard:()=>m,EntityKuadrantApiApprovalTab:()=>y,EntityKuadrantApiKeyManagementTab:()=>c,EntityKuadrantApiKeysContent:()=>P,EntityKuadrantApiProductInfoContent:()=>s,EntityKuadrantApiProductOpenApiAlert:()=>K,KuadrantPage:()=>p,MyApiKeysPage:()=>l,kuadrantPlugin:()=>r});var a=t(22097);const o=(0,a.createRouteRef)({id:"kuadrant"}),i=(0,a.createSubRouteRef)({id:"kuadrant/resource",parent:o,path:"/:kind/:namespace/:name"}),r=(0,a.createPlugin)({id:"kuadrant",routes:{root:o,resource:i}}),p=r.provide((0,a.createRoutableExtension)({name:"KuadrantPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(4434),t.e(369),t.e(7293),t.e(7076),t.e(9625),t.e(7057),t.e(5010),t.e(8563),t.e(1881),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(1319),t.e(5289),t.e(7005)]).then(t.bind(t,94251)).then(e=>e.ApiProductsPage),mountPoint:o})),d=r.provide((0,a.createRoutableExtension)({name:"ApiProductsPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(4434),t.e(369),t.e(7293),t.e(7076),t.e(9625),t.e(7057),t.e(5010),t.e(8563),t.e(1881),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(1319),t.e(5289),t.e(7005)]).then(t.bind(t,94251)).then(e=>e.ApiProductsPage),mountPoint:o})),l=r.provide((0,a.createRoutableExtension)({name:"MyApiKeysPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(4434),t.e(369),t.e(7076),t.e(9625),t.e(7057),t.e(5010),t.e(8563),t.e(6426),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(7270)]).then(t.bind(t,37270)).then(e=>e.MyApiKeysPage),mountPoint:o})),u=r.provide((0,a.createRoutableExtension)({name:"ApiKeyApprovalPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(4434),t.e(369),t.e(7293),t.e(7076),t.e(9625),t.e(7057),t.e(5010),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(483),t.e(3976)]).then(t.bind(t,43976)).then(e=>e.ApiKeyApprovalPage),mountPoint:o})),m=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiAccessCard",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(4434),t.e(369),t.e(7293),t.e(512),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(9051),t.e(5203)]).then(t.bind(t,60441)).then(e=>e.ApiAccessCard)}})),c=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeyManagementTab",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(4434),t.e(369),t.e(7293),t.e(7076),t.e(9625),t.e(7057),t.e(5010),t.e(5478),t.e(5427),t.e(484),t.e(1942),t.e(7976),t.e(9051),t.e(9838)]).then(t.bind(t,23650)).then(e=>e.ApiKeyManagementTab)}})),P=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiKeysContent",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(4434),t.e(369),t.e(7293),t.e(7076),t.e(9625),t.e(7057),t.e(5010),t.e(5478),t.e(5427),t.e(484),t.e(1942),t.e(7976),t.e(9051),t.e(9838)]).then(t.bind(t,23650)).then(e=>e.ApiKeyManagementTab)}})),s=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductInfoContent",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(7293),t.e(9625),t.e(3581),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(1319),t.e(3947),t.e(5453)]).then(t.bind(t,75453)).then(e=>e.ApiProductInfoCard)}})),A=r.provide((0,a.createRoutableExtension)({name:"ApiKeyDetailPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(4434),t.e(7076),t.e(8563),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(2967)]).then(t.bind(t,72967)).then(e=>e.ApiKeyDetailPage),mountPoint:o})),y=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiApprovalTab",component:{lazy:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(4434),t.e(369),t.e(7293),t.e(7076),t.e(9625),t.e(7057),t.e(5010),t.e(5478),t.e(5427),t.e(484),t.e(1942),t.e(7976),t.e(483),t.e(6800)]).then(t.bind(t,46800)).then(e=>e.EntityApiApprovalTab)}})),K=r.provide((0,a.createComponentExtension)({name:"EntityKuadrantApiProductOpenApiAlert",component:{lazy:()=>Promise.all([t.e(9400),t.e(3118),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(6371)]).then(t.bind(t,36371)).then(e=>e.ApiProductOpenApiAlert)}})),b=r.provide((0,a.createRoutableExtension)({name:"ApiProductDetailPage",component:()=>Promise.all([t.e(4083),t.e(9400),t.e(3118),t.e(1584),t.e(4434),t.e(369),t.e(7293),t.e(7076),t.e(9625),t.e(7057),t.e(8563),t.e(9079),t.e(5478),t.e(5427),t.e(9634),t.e(484),t.e(1942),t.e(7976),t.e(1319),t.e(5289),t.e(3947),t.e(7791)]).then(t.bind(t,57791)).then(e=>e.ApiProductDetailPage),mountPoint:o}))}}]);
2
- //# sourceMappingURL=exposed-PluginRoot.a8448fcc.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/exposed-PluginRoot.a8448fcc.chunk.js","mappings":"qiBAEO,MAAMA,GAAeC,EAAAA,EAAAA,gBAAe,CACzCC,GAAI,aAGOC,GAAmBC,EAAAA,EAAAA,mBAAkB,CAChDF,GAAI,oBACJG,OAAQL,EACRM,KAAM,4BCDKC,GAAiBC,EAAAA,EAAAA,cAAa,CACzCN,GAAI,WACJO,OAAQ,CACNC,KAAMV,EACNW,SAAUR,KAIDS,EAAeL,EAAeM,SACzCC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,eACNC,UAAW,IACT,+PAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYpB,KAIHmB,EAAkBZ,EAAeM,SAC5CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,kBACNC,UAAW,IACT,+PAAoCC,KAAKC,GAAKA,EAAEC,iBAClDC,WAAYpB,KAIHqB,EAAgBd,EAAeM,SAC1CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,gBACNC,UAAW,IACT,iOAAqCC,KAAKC,GAAKA,EAAEG,eACnDD,WAAYpB,KAIHsB,EAAqBf,EAAeM,SAC/CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,qBACNC,UAAW,IACT,0OAA0CC,KAAKC,GAAKA,EAAEI,oBACxDF,WAAYpB,KAIHuB,EAA8BhB,EAAeM,SACxDW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,8BACNC,UAAW,CACTS,KAAM,IACJ,kMAAqCR,KAAKC,GAAKA,EAAEQ,mBAK5CC,EAAoCpB,EAAeM,SAC9DW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,oCACNC,UAAW,CACTS,KAAM,IACJ,uNAA2CR,KAAKC,GAAKA,EAAEU,yBAMlDC,EAA+BtB,EAAeM,SACzDW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,+BACNC,UAAW,CACTS,KAAM,IACJ,uNAA2CR,KAAKC,GAAKA,EAAEU,yBAKlDE,EAAsCvB,EAAeM,SAChEW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,sCACNC,UAAW,CACTS,KAAM,IACJ,oMAA0CR,KAAKC,GAAKA,EAAEa,wBAKjDC,EAAmBzB,EAAeM,SAC7CC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,mBACNC,UAAW,IACT,gLAAwCC,KAAKC,GAAKA,EAAEc,kBACtDZ,WAAYpB,KAIHiC,EAA+B1B,EAAeM,SACzDW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,+BACNC,UAAW,CACTS,KAAM,IACJ,sNAA4CR,KAAKC,GAAKA,EAAEgB,0BAKnDC,EAAuC5B,EAAeM,SACjEW,EAAAA,EAAAA,0BAAyB,CACvBT,KAAM,uCACNC,UAAW,CACTS,KAAM,IACJ,8HAA8CR,KAAKC,GAAKA,EAAEkB,4BAKrDC,EAAuB9B,EAAeM,SACjDC,EAAAA,EAAAA,yBAAwB,CACtBC,KAAM,uBACNC,UAAW,IACT,+PAA4CC,KAAKC,GAAKA,EAAEmB,sBAC1DjB,WAAYpB,I","sources":["webpack://internal.plugin-kuadrant/./src/routes.ts","webpack://internal.plugin-kuadrant/./src/plugin.ts"],"sourcesContent":["import { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'kuadrant',\n});\n\nexport const resourceRouteRef = createSubRouteRef({\n id: 'kuadrant/resource',\n parent: rootRouteRef,\n path: '/:kind/:namespace/:name',\n});\n","import {\n createPlugin,\n createRoutableExtension,\n createComponentExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, resourceRouteRef } from './routes';\n\nexport const kuadrantPlugin = createPlugin({\n id: 'kuadrant',\n routes: {\n root: rootRouteRef,\n resource: resourceRouteRef,\n },\n});\n\nexport const KuadrantPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'KuadrantPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiProductsPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductsPage',\n component: () =>\n import('./components/KuadrantPage').then(m => m.ApiProductsPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const MyApiKeysPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'MyApiKeysPage',\n component: () =>\n import('./components/MyApiKeysPage').then(m => m.MyApiKeysPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const ApiKeyApprovalPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyApprovalPage',\n component: () =>\n import('./components/ApiKeyApprovalPage').then(m => m.ApiKeyApprovalPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiAccessCard = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiAccessCard',\n component: {\n lazy: () =>\n import('./components/ApiAccessCard').then(m => m.ApiAccessCard),\n },\n }),\n);\n\nexport const EntityKuadrantApiKeyManagementTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeyManagementTab',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\n// entity content extension for api keys tab\nexport const EntityKuadrantApiKeysContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiKeysContent',\n component: {\n lazy: () =>\n import('./components/ApiKeyManagementTab').then(m => m.ApiKeyManagementTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductInfoContent = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductInfoContent',\n component: {\n lazy: () =>\n import('./components/ApiProductInfoCard').then(m => m.ApiProductInfoCard),\n },\n }),\n);\n\nexport const ApiKeyDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiKeyDetailPage',\n component: () =>\n import('./components/ApiKeyDetailPage').then(m => m.ApiKeyDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n\nexport const EntityKuadrantApiApprovalTab = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiApprovalTab',\n component: {\n lazy: () =>\n import('./components/EntityApiApprovalTab').then(m => m.EntityApiApprovalTab),\n },\n }),\n);\n\nexport const EntityKuadrantApiProductOpenApiAlert = kuadrantPlugin.provide(\n createComponentExtension({\n name: 'EntityKuadrantApiProductOpenApiAlert',\n component: {\n lazy: () =>\n import('./components/ApiProductOpenApiAlert').then(m => m.ApiProductOpenApiAlert),\n },\n }),\n);\n\nexport const ApiProductDetailPage = kuadrantPlugin.provide(\n createRoutableExtension({\n name: 'ApiProductDetailPage',\n component: () =>\n import('./components/ApiProductDetailPage').then(m => m.ApiProductDetailPage),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":["rootRouteRef","createRouteRef","id","resourceRouteRef","createSubRouteRef","parent","path","kuadrantPlugin","createPlugin","routes","root","resource","KuadrantPage","provide","createRoutableExtension","name","component","then","m","ApiProductsPage","mountPoint","MyApiKeysPage","ApiKeyApprovalPage","EntityKuadrantApiAccessCard","createComponentExtension","lazy","ApiAccessCard","EntityKuadrantApiKeyManagementTab","ApiKeyManagementTab","EntityKuadrantApiKeysContent","EntityKuadrantApiProductInfoContent","ApiProductInfoCard","ApiKeyDetailPage","EntityKuadrantApiApprovalTab","EntityApiApprovalTab","EntityKuadrantApiProductOpenApiAlert","ApiProductOpenApiAlert","ApiProductDetailPage"],"sourceRoot":""}