@alauda-fe/workload-util-shared 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/esm2022/alauda-fe-workload-util-shared.mjs +5 -0
  2. package/esm2022/index.mjs +6 -0
  3. package/esm2022/lib/directives/index.mjs +3 -0
  4. package/esm2022/lib/directives/oam-resource-disabled-container.directive.mjs +53 -0
  5. package/esm2022/lib/directives/sync-control.directive.mjs +52 -0
  6. package/esm2022/lib/pipes/index.mjs +4 -0
  7. package/esm2022/lib/pipes/is-oam-resource.pipe.mjs +17 -0
  8. package/esm2022/lib/pipes/range.pipe.mjs +17 -0
  9. package/esm2022/lib/pipes/short-num.pipe.mjs +15 -0
  10. package/esm2022/lib/services/cluster-api.service.mjs +93 -0
  11. package/esm2022/lib/services/feature-gate.service.mjs +50 -0
  12. package/esm2022/lib/services/index.mjs +6 -0
  13. package/esm2022/lib/services/pod-util.service.mjs +70 -0
  14. package/esm2022/lib/services/resource-quota.service.mjs +116 -0
  15. package/esm2022/lib/services/terminal.service.mjs +46 -0
  16. package/esm2022/lib/typings/account.mjs +2 -0
  17. package/esm2022/lib/typings/backend-api.mjs +7 -0
  18. package/esm2022/lib/typings/batch-action.type.mjs +2 -0
  19. package/esm2022/lib/typings/form.mjs +2 -0
  20. package/esm2022/lib/typings/helpers.mjs +14 -0
  21. package/esm2022/lib/typings/index.mjs +10 -0
  22. package/esm2022/lib/typings/k8s-form-model.mjs +12 -0
  23. package/esm2022/lib/typings/k8s-resource-definitions/acp-resource-definition.mjs +258 -0
  24. package/esm2022/lib/typings/k8s-resource-definitions/alu-resource-definition.mjs +281 -0
  25. package/esm2022/lib/typings/k8s-resource-definitions/index.mjs +142 -0
  26. package/esm2022/lib/typings/k8s.mjs +143 -0
  27. package/esm2022/lib/typings/status.mjs +269 -0
  28. package/esm2022/lib/utils/code-editor-config.mjs +2 -0
  29. package/esm2022/lib/utils/constants.mjs +61 -0
  30. package/esm2022/lib/utils/crd.mjs +36 -0
  31. package/esm2022/lib/utils/format-number.mjs +227 -0
  32. package/esm2022/lib/utils/helpers.mjs +27 -0
  33. package/esm2022/lib/utils/index.mjs +14 -0
  34. package/esm2022/lib/utils/k8s-util.service.mjs +28 -0
  35. package/esm2022/lib/utils/patterns.mjs +140 -0
  36. package/esm2022/lib/utils/pod-util.mjs +75 -0
  37. package/esm2022/lib/utils/resource-status.mjs +86 -0
  38. package/esm2022/lib/utils/resources-config-util.mjs +28 -0
  39. package/esm2022/lib/utils/status.mjs +84 -0
  40. package/esm2022/lib/utils/validator.mjs +11 -0
  41. package/esm2022/lib/utils/workspace.mjs +25 -0
  42. package/index.d.ts +5 -0
  43. package/lib/directives/index.d.ts +2 -0
  44. package/lib/directives/oam-resource-disabled-container.directive.d.ts +17 -0
  45. package/lib/directives/sync-control.directive.d.ts +14 -0
  46. package/lib/pipes/index.d.ts +3 -0
  47. package/lib/pipes/is-oam-resource.pipe.d.ts +9 -0
  48. package/lib/pipes/range.pipe.d.ts +7 -0
  49. package/lib/pipes/short-num.pipe.d.ts +7 -0
  50. package/lib/services/cluster-api.service.d.ts +38 -0
  51. package/lib/services/feature-gate.service.d.ts +38 -0
  52. package/lib/services/index.d.ts +5 -0
  53. package/lib/services/pod-util.service.d.ts +18 -0
  54. package/lib/services/resource-quota.service.d.ts +25 -0
  55. package/lib/services/terminal.service.d.ts +15 -0
  56. package/lib/typings/account.d.ts +17 -0
  57. package/lib/typings/backend-api.d.ts +220 -0
  58. package/lib/typings/batch-action.type.d.ts +35 -0
  59. package/lib/typings/form.d.ts +10 -0
  60. package/lib/typings/helpers.d.ts +45 -0
  61. package/lib/typings/index.d.ts +9 -0
  62. package/lib/typings/k8s-form-model.d.ts +128 -0
  63. package/lib/typings/k8s-resource-definitions/acp-resource-definition.d.ts +242 -0
  64. package/lib/typings/k8s-resource-definitions/alu-resource-definition.d.ts +269 -0
  65. package/lib/typings/k8s-resource-definitions/index.d.ts +1911 -0
  66. package/lib/typings/k8s.d.ts +1147 -0
  67. package/lib/typings/status.d.ts +252 -0
  68. package/lib/utils/code-editor-config.d.ts +1 -0
  69. package/lib/utils/constants.d.ts +57 -0
  70. package/lib/utils/crd.d.ts +21 -0
  71. package/lib/utils/format-number.d.ts +11 -0
  72. package/lib/utils/helpers.d.ts +13 -0
  73. package/lib/utils/index.d.ts +13 -0
  74. package/lib/utils/k8s-util.service.d.ts +8 -0
  75. package/lib/utils/patterns.d.ts +132 -0
  76. package/lib/utils/pod-util.d.ts +19 -0
  77. package/lib/utils/resource-status.d.ts +8 -0
  78. package/lib/utils/resources-config-util.d.ts +22 -0
  79. package/lib/utils/status.d.ts +3 -0
  80. package/lib/utils/validator.d.ts +4 -0
  81. package/lib/utils/workspace.d.ts +14 -0
  82. package/package.json +36 -0
@@ -0,0 +1,61 @@
1
+ export const RESOURCE_ROUTE_MAPPER = {
2
+ Application: 'app',
3
+ };
4
+ export const STANDALONE_NG_MODEL = {
5
+ standalone: true,
6
+ };
7
+ export const PROMQL_EXPORT_EXTRA = [
8
+ {
9
+ icon: 'file_export',
10
+ title: { zh: '导出', en: 'Export' },
11
+ type: 'export',
12
+ },
13
+ ];
14
+ export const ASSIGN_ALL = 'ALL_ALL';
15
+ export const DEFAULT = 'default';
16
+ export const TRUE = 'true';
17
+ export const FALSE = 'false';
18
+ export const TYPE = 'type';
19
+ export const ACTION = 'action';
20
+ export const KIND = 'kind';
21
+ export const STATUS = 'status';
22
+ export const ADDED_TIME = 'added_time';
23
+ export const CREATED_AT = 'created_at';
24
+ export const APP_MARKET = 'app-market';
25
+ export const ALL = 'ALL';
26
+ export const DOMAIN = 'domain';
27
+ export const PORT = 'port';
28
+ export const WEIGHT = 'weight';
29
+ export const OPERATORS_NAMESPACE = 'operators';
30
+ export const OCP_OPERATORS_NAMESPACE = 'openshift-operators';
31
+ export const CRON_RULE_DOC_PATH = 'cp-faq/11crontab/';
32
+ export const ACP_SAFEMODE = 'acp-safemode';
33
+ export const S2I_GIT = 's2i-git';
34
+ export const WORKLOAD_TYPES = [
35
+ 'Deployment',
36
+ 'DaemonSet',
37
+ 'StatefulSet',
38
+ ];
39
+ export const BASE_CLUSTER_ARCH = 'amd64';
40
+ export const HARDWARE_ARCHITECTURE_MAPPER = {
41
+ amd64: 'x86',
42
+ arm64: 'ARM',
43
+ };
44
+ export const SPECIAL_SYMBOL = Symbol('special symbol for ui usage');
45
+ /**
46
+ * system 不对外暴露
47
+ *
48
+ * reference: http://confluence.alauda.cn/pages/viewpage.action?pageId=81426797
49
+ */
50
+ export const OPERATOR_CATALOG_MAPPER = {
51
+ PLATFORM: 'platform',
52
+ SYSTEM: 'system',
53
+ };
54
+ export const V1BETA1 = 'v1beta1';
55
+ export const MAX_PORT = 65_535;
56
+ export var CRD_SCOPE;
57
+ (function (CRD_SCOPE) {
58
+ CRD_SCOPE["NAMESPACED"] = "Namespaced";
59
+ CRD_SCOPE["CLUSTER"] = "Cluster";
60
+ })(CRD_SCOPE || (CRD_SCOPE = {}));
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy93b3JrbG9hZC91dGlsLXNoYXJlZC9zcmMvbGliL3V0aWxzL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBYztJQUM5QyxXQUFXLEVBQUUsS0FBSztDQUNuQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDO1FBQ0UsSUFBSSxFQUFFLGFBQWE7UUFDbkIsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFO1FBQ2pDLElBQUksRUFBRSxRQUFRO0tBQ2Y7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQztBQUNwQyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQ2pDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7QUFDM0IsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUM3QixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBQzNCLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUM7QUFDL0IsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUMzQixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDekIsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBQzNCLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUM7QUFFL0IsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLHFCQUFxQixDQUFDO0FBRTdELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO0FBRXRELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUM7QUFDM0MsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUVqQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsWUFBWTtJQUNaLFdBQVc7SUFDWCxhQUFhO0NBQ0wsQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRztJQUMxQyxLQUFLLEVBQUUsS0FBSztJQUNaLEtBQUssRUFBRSxLQUFLO0NBQ2IsQ0FBQztBQUlGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUdwRTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsUUFBUSxFQUFFLFVBQVU7SUFDcEIsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUUvQixNQUFNLENBQU4sSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ25CLHNDQUF5QixDQUFBO0lBQ3pCLGdDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gJ0BhbGF1ZGEtZmUvY29tbW9uJztcblxuZXhwb3J0IGNvbnN0IFJFU09VUkNFX1JPVVRFX01BUFBFUjogU3RyaW5nTWFwID0ge1xuICBBcHBsaWNhdGlvbjogJ2FwcCcsXG59O1xuXG5leHBvcnQgY29uc3QgU1RBTkRBTE9ORV9OR19NT0RFTCA9IHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCBQUk9NUUxfRVhQT1JUX0VYVFJBID0gW1xuICB7XG4gICAgaWNvbjogJ2ZpbGVfZXhwb3J0JyxcbiAgICB0aXRsZTogeyB6aDogJ+WvvOWHuicsIGVuOiAnRXhwb3J0JyB9LFxuICAgIHR5cGU6ICdleHBvcnQnLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IEFTU0lHTl9BTEwgPSAnQUxMX0FMTCc7XG5leHBvcnQgY29uc3QgREVGQVVMVCA9ICdkZWZhdWx0JztcbmV4cG9ydCBjb25zdCBUUlVFID0gJ3RydWUnO1xuZXhwb3J0IGNvbnN0IEZBTFNFID0gJ2ZhbHNlJztcbmV4cG9ydCBjb25zdCBUWVBFID0gJ3R5cGUnO1xuZXhwb3J0IGNvbnN0IEFDVElPTiA9ICdhY3Rpb24nO1xuZXhwb3J0IGNvbnN0IEtJTkQgPSAna2luZCc7XG5leHBvcnQgY29uc3QgU1RBVFVTID0gJ3N0YXR1cyc7XG5leHBvcnQgY29uc3QgQURERURfVElNRSA9ICdhZGRlZF90aW1lJztcbmV4cG9ydCBjb25zdCBDUkVBVEVEX0FUID0gJ2NyZWF0ZWRfYXQnO1xuZXhwb3J0IGNvbnN0IEFQUF9NQVJLRVQgPSAnYXBwLW1hcmtldCc7XG5leHBvcnQgY29uc3QgQUxMID0gJ0FMTCc7XG5leHBvcnQgY29uc3QgRE9NQUlOID0gJ2RvbWFpbic7XG5leHBvcnQgY29uc3QgUE9SVCA9ICdwb3J0JztcbmV4cG9ydCBjb25zdCBXRUlHSFQgPSAnd2VpZ2h0JztcblxuZXhwb3J0IGNvbnN0IE9QRVJBVE9SU19OQU1FU1BBQ0UgPSAnb3BlcmF0b3JzJztcblxuZXhwb3J0IGNvbnN0IE9DUF9PUEVSQVRPUlNfTkFNRVNQQUNFID0gJ29wZW5zaGlmdC1vcGVyYXRvcnMnO1xuXG5leHBvcnQgY29uc3QgQ1JPTl9SVUxFX0RPQ19QQVRIID0gJ2NwLWZhcS8xMWNyb250YWIvJztcblxuZXhwb3J0IGNvbnN0IEFDUF9TQUZFTU9ERSA9ICdhY3Atc2FmZW1vZGUnO1xuZXhwb3J0IGNvbnN0IFMySV9HSVQgPSAnczJpLWdpdCc7XG5cbmV4cG9ydCBjb25zdCBXT1JLTE9BRF9UWVBFUyA9IFtcbiAgJ0RlcGxveW1lbnQnLFxuICAnRGFlbW9uU2V0JyxcbiAgJ1N0YXRlZnVsU2V0Jyxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBCQVNFX0NMVVNURVJfQVJDSCA9ICdhbWQ2NCc7XG5cbmV4cG9ydCBjb25zdCBIQVJEV0FSRV9BUkNISVRFQ1RVUkVfTUFQUEVSID0ge1xuICBhbWQ2NDogJ3g4NicsXG4gIGFybTY0OiAnQVJNJyxcbn07XG5cbmV4cG9ydCB0eXBlIEhhcmR3YXJlQXJjaGl0ZWN0dXJlID0ga2V5b2YgdHlwZW9mIEhBUkRXQVJFX0FSQ0hJVEVDVFVSRV9NQVBQRVI7XG5cbmV4cG9ydCBjb25zdCBTUEVDSUFMX1NZTUJPTCA9IFN5bWJvbCgnc3BlY2lhbCBzeW1ib2wgZm9yIHVpIHVzYWdlJyk7XG5leHBvcnQgdHlwZSBTcGVjaWFsU3ltYm9sID0gdHlwZW9mIFNQRUNJQUxfU1lNQk9MO1xuXG4vKipcbiAqIHN5c3RlbSDkuI3lr7nlpJbmmrTpnLJcbiAqXG4gKiByZWZlcmVuY2U6IGh0dHA6Ly9jb25mbHVlbmNlLmFsYXVkYS5jbi9wYWdlcy92aWV3cGFnZS5hY3Rpb24/cGFnZUlkPTgxNDI2Nzk3XG4gKi9cbmV4cG9ydCBjb25zdCBPUEVSQVRPUl9DQVRBTE9HX01BUFBFUiA9IHtcbiAgUExBVEZPUk06ICdwbGF0Zm9ybScsXG4gIFNZU1RFTTogJ3N5c3RlbScsXG59O1xuXG5leHBvcnQgY29uc3QgVjFCRVRBMSA9ICd2MWJldGExJztcblxuZXhwb3J0IGNvbnN0IE1BWF9QT1JUID0gNjVfNTM1O1xuXG5leHBvcnQgZW51bSBDUkRfU0NPUEUge1xuICBOQU1FU1BBQ0VEID0gJ05hbWVzcGFjZWQnLFxuICBDTFVTVEVSID0gJ0NsdXN0ZXInLFxufVxuIl19
@@ -0,0 +1,36 @@
1
+ import { get } from 'lodash-es';
2
+ import { CRD_SCOPE } from './constants';
3
+ export const getCRDVersionList = (crd) => get(crd, 'spec.versions', []);
4
+ export const getCRDScopeDisplay = (crd) => {
5
+ if (crd.spec.scope === CRD_SCOPE.NAMESPACED) {
6
+ return 'namespace';
7
+ }
8
+ return 'cluster';
9
+ };
10
+ export const getStorageCRDVersion = (crd) => getCRDVersionList(crd).find(c => !!c.storage);
11
+ export const getStorageCrdOpenApiSchema = (crd) => getStorageCRDVersion(crd)?.schema?.openAPIV3Schema;
12
+ export const isCrdNamespaceScoped = (crd) => getCRDScopeDisplay(crd) === 'namespace';
13
+ export const isNotCrdNamespaceScoped = (crd) => getCRDScopeDisplay(crd) !== 'namespace';
14
+ export const getCRDVersionDesc = (crd, translate, _locale) => {
15
+ const suffix = ` (${translate.get('storage_version')})`;
16
+ return getCRDVersionList(crd)
17
+ .map(v => `${v.name}${(v.storage && suffix) || ''}`)
18
+ .join(', ');
19
+ };
20
+ export const getCRDefinitionType = (crd) => ({
21
+ apiGroup: crd.spec.group,
22
+ type: crd.spec.names.plural,
23
+ apiVersion: getStorageCRDVersion(crd)?.name,
24
+ });
25
+ export const encodeCRPathSuffix = (cr) => [cr.metadata.name, cr.metadata.namespace].join('~');
26
+ export const decodeCRPathSuffix = (crPath = '') => {
27
+ const [name, namespace] = crPath.split('~');
28
+ return {
29
+ name,
30
+ namespace,
31
+ };
32
+ };
33
+ export const getCrTypeByCrd = (crdName) => crdName?.split('.')[0];
34
+ export const getVersionSchemaFromCrd = (version) => get(version, ['schema', 'openAPIV3Schema', 'properties', 'spec']);
35
+ export const getCrdSpecKind = (crd) => crd?.spec?.names?.kind;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbW9kdWxlcy93b3JrbG9hZC91dGlsLXNoYXJlZC9zcmMvbGliL3V0aWxzL2NyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FDL0IsR0FBNkIsRUFDTSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFdEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUE2QixFQUFFLEVBQUU7SUFDbEUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUMsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsR0FBNkIsRUFBRSxFQUFFLENBQ3BFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFaEQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUE2QixFQUFFLEVBQUUsQ0FDMUUsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQTZCLEVBQUUsRUFBRSxDQUNwRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxXQUFXLENBQUM7QUFFMUMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxHQUE2QixFQUFFLEVBQUUsQ0FDdkUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssV0FBVyxDQUFDO0FBRTFDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQy9CLEdBQTZCLEVBQzdCLFNBQTJCLEVBQzNCLE9BQWdCLEVBQ2hCLEVBQUU7SUFDRixNQUFNLE1BQU0sR0FBRyxLQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDO0lBQ3hELE9BQU8saUJBQWlCLENBQUMsR0FBRyxDQUFDO1NBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBNkIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRSxRQUFRLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLO0lBQ3hCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO0lBQzNCLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJO0NBQzVDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsRUFBc0IsRUFBRSxFQUFFLENBQzNELENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLEVBQUU7SUFDaEQsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLE9BQU87UUFDTCxJQUFJO1FBQ0osU0FBUztLQUNWLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFMUUsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FDckMsT0FBd0MsRUFDeEMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFFdkUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBNkIsRUFBRSxFQUFFLENBQzlELEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEN1c3RvbVJlc291cmNlRGVmaW5pdGlvbixcbiAgQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uVmVyc2lvbixcbiAgS3ViZXJuZXRlc1Jlc291cmNlLFxuICBUcmFuc2xhdGVTZXJ2aWNlLFxufSBmcm9tICdAYWxhdWRhLWZlL2NvbW1vbic7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBDUkRfU0NPUEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjb25zdCBnZXRDUkRWZXJzaW9uTGlzdCA9IChcbiAgY3JkOiBDdXN0b21SZXNvdXJjZURlZmluaXRpb24sXG4pOiBDdXN0b21SZXNvdXJjZURlZmluaXRpb25WZXJzaW9uW10gPT4gZ2V0KGNyZCwgJ3NwZWMudmVyc2lvbnMnLCBbXSk7XG5cbmV4cG9ydCBjb25zdCBnZXRDUkRTY29wZURpc3BsYXkgPSAoY3JkOiBDdXN0b21SZXNvdXJjZURlZmluaXRpb24pID0+IHtcbiAgaWYgKGNyZC5zcGVjLnNjb3BlID09PSBDUkRfU0NPUEUuTkFNRVNQQUNFRCkge1xuICAgIHJldHVybiAnbmFtZXNwYWNlJztcbiAgfVxuICByZXR1cm4gJ2NsdXN0ZXInO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFN0b3JhZ2VDUkRWZXJzaW9uID0gKGNyZDogQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uKSA9PlxuICBnZXRDUkRWZXJzaW9uTGlzdChjcmQpLmZpbmQoYyA9PiAhIWMuc3RvcmFnZSk7XG5cbmV4cG9ydCBjb25zdCBnZXRTdG9yYWdlQ3JkT3BlbkFwaVNjaGVtYSA9IChjcmQ6IEN1c3RvbVJlc291cmNlRGVmaW5pdGlvbikgPT5cbiAgZ2V0U3RvcmFnZUNSRFZlcnNpb24oY3JkKT8uc2NoZW1hPy5vcGVuQVBJVjNTY2hlbWE7XG5cbmV4cG9ydCBjb25zdCBpc0NyZE5hbWVzcGFjZVNjb3BlZCA9IChjcmQ6IEN1c3RvbVJlc291cmNlRGVmaW5pdGlvbikgPT5cbiAgZ2V0Q1JEU2NvcGVEaXNwbGF5KGNyZCkgPT09ICduYW1lc3BhY2UnO1xuXG5leHBvcnQgY29uc3QgaXNOb3RDcmROYW1lc3BhY2VTY29wZWQgPSAoY3JkOiBDdXN0b21SZXNvdXJjZURlZmluaXRpb24pID0+XG4gIGdldENSRFNjb3BlRGlzcGxheShjcmQpICE9PSAnbmFtZXNwYWNlJztcblxuZXhwb3J0IGNvbnN0IGdldENSRFZlcnNpb25EZXNjID0gKFxuICBjcmQ6IEN1c3RvbVJlc291cmNlRGVmaW5pdGlvbixcbiAgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICBfbG9jYWxlPzogc3RyaW5nLFxuKSA9PiB7XG4gIGNvbnN0IHN1ZmZpeCA9IGAgKCR7dHJhbnNsYXRlLmdldCgnc3RvcmFnZV92ZXJzaW9uJyl9KWA7XG4gIHJldHVybiBnZXRDUkRWZXJzaW9uTGlzdChjcmQpXG4gICAgLm1hcCh2ID0+IGAke3YubmFtZX0keyh2LnN0b3JhZ2UgJiYgc3VmZml4KSB8fCAnJ31gKVxuICAgIC5qb2luKCcsICcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENSRGVmaW5pdGlvblR5cGUgPSAoY3JkOiBDdXN0b21SZXNvdXJjZURlZmluaXRpb24pID0+ICh7XG4gIGFwaUdyb3VwOiBjcmQuc3BlYy5ncm91cCxcbiAgdHlwZTogY3JkLnNwZWMubmFtZXMucGx1cmFsLFxuICBhcGlWZXJzaW9uOiBnZXRTdG9yYWdlQ1JEVmVyc2lvbihjcmQpPy5uYW1lLFxufSk7XG5cbmV4cG9ydCBjb25zdCBlbmNvZGVDUlBhdGhTdWZmaXggPSAoY3I6IEt1YmVybmV0ZXNSZXNvdXJjZSkgPT5cbiAgW2NyLm1ldGFkYXRhLm5hbWUsIGNyLm1ldGFkYXRhLm5hbWVzcGFjZV0uam9pbignficpO1xuXG5leHBvcnQgY29uc3QgZGVjb2RlQ1JQYXRoU3VmZml4ID0gKGNyUGF0aCA9ICcnKSA9PiB7XG4gIGNvbnN0IFtuYW1lLCBuYW1lc3BhY2VdID0gY3JQYXRoLnNwbGl0KCd+Jyk7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBuYW1lc3BhY2UsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JUeXBlQnlDcmQgPSAoY3JkTmFtZTogc3RyaW5nKSA9PiBjcmROYW1lPy5zcGxpdCgnLicpWzBdO1xuXG5leHBvcnQgY29uc3QgZ2V0VmVyc2lvblNjaGVtYUZyb21DcmQgPSAoXG4gIHZlcnNpb246IEN1c3RvbVJlc291cmNlRGVmaW5pdGlvblZlcnNpb24sXG4pID0+IGdldCh2ZXJzaW9uLCBbJ3NjaGVtYScsICdvcGVuQVBJVjNTY2hlbWEnLCAncHJvcGVydGllcycsICdzcGVjJ10pO1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JkU3BlY0tpbmQgPSAoY3JkOiBDdXN0b21SZXNvdXJjZURlZmluaXRpb24pID0+XG4gIGNyZD8uc3BlYz8ubmFtZXM/LmtpbmQ7XG4iXX0=
@@ -0,0 +1,227 @@
1
+ const MAX_DIGITS = 22;
2
+ const DECIMAL_SEP = '.';
3
+ const ZERO_CHAR = '0';
4
+ const SymbolInfinity = '∞';
5
+ const SymbolDecimal = '.';
6
+ const SymbolGroup = '';
7
+ const SymbolExponential = 'E';
8
+ const SymbolNumberPattern = {
9
+ gSize: 3,
10
+ lgSize: 3,
11
+ maxFrac: 3,
12
+ minFrac: 0,
13
+ minInt: 1,
14
+ negPre: '-',
15
+ negSuf: '',
16
+ posPre: '',
17
+ posSuf: '',
18
+ };
19
+ /**
20
+ * Transforms a number to a locale string based on a style and a format
21
+ */
22
+ function formatNumberToLocaleString(value, pattern, digitsInfo) {
23
+ let formattedText = '';
24
+ let isZero = false;
25
+ if (isFinite(value)) {
26
+ const parsedNumber = parseNumber(value);
27
+ const minInt = digitsInfo[0] || 0;
28
+ const minFraction = digitsInfo[1] || 0;
29
+ const maxFraction = digitsInfo[2] || 0;
30
+ roundNumber(parsedNumber, minFraction, maxFraction);
31
+ let digits = parsedNumber.digits;
32
+ let integerLen = parsedNumber.integerLen;
33
+ const exponent = parsedNumber.exponent;
34
+ let decimals = [];
35
+ isZero = digits.every(d => !d);
36
+ // pad zeros for small numbers
37
+ for (; integerLen < minInt; integerLen++) {
38
+ digits.unshift(0);
39
+ }
40
+ // pad zeros for small numbers
41
+ for (; integerLen < 0; integerLen++) {
42
+ digits.unshift(0);
43
+ }
44
+ // extract decimals digits
45
+ if (integerLen > 0) {
46
+ decimals = digits.splice(integerLen, digits.length);
47
+ }
48
+ else {
49
+ decimals = digits;
50
+ digits = [0];
51
+ }
52
+ // format the integer digits with grouping separators
53
+ const groups = [];
54
+ if (digits.length >= pattern.lgSize) {
55
+ groups.unshift(digits.splice(-pattern.lgSize, digits.length).join(''));
56
+ }
57
+ while (digits.length > pattern.gSize) {
58
+ groups.unshift(digits.splice(-pattern.gSize, digits.length).join(''));
59
+ }
60
+ if (digits.length > 0) {
61
+ groups.unshift(digits.join(''));
62
+ }
63
+ formattedText = groups.join(SymbolGroup);
64
+ // append the decimal digits
65
+ if (decimals.length > 0) {
66
+ formattedText += SymbolDecimal + decimals.join('');
67
+ }
68
+ if (exponent) {
69
+ formattedText += SymbolExponential + '+' + exponent;
70
+ }
71
+ }
72
+ else {
73
+ formattedText = SymbolInfinity;
74
+ }
75
+ formattedText =
76
+ value < 0 && !isZero
77
+ ? pattern.negPre + formattedText + pattern.negSuf
78
+ : pattern.posPre + formattedText + pattern.posSuf;
79
+ return formattedText;
80
+ }
81
+ /**
82
+ * @ngModule CommonModule
83
+ *
84
+ * Formats a number as text. Group sizing and separator and other locale-specific
85
+ * configurations are based on the locale.
86
+ *
87
+ * Where:
88
+ * - `value` is a number.
89
+ * - `digitInfo` See {@link DecimalPipe} for more details.
90
+ */
91
+ export function formatNumber(value, digitsInfo) {
92
+ return formatNumberToLocaleString(value, SymbolNumberPattern, digitsInfo);
93
+ }
94
+ /**
95
+ * Parses a number.
96
+ * Significant bits of this parse algorithm came from https://github.com/MikeMcl/big.js/
97
+ */
98
+ function parseNumber(num) {
99
+ let numStr = Math.abs(num) + '';
100
+ let exponent = 0;
101
+ let digits;
102
+ let integerLen;
103
+ let i;
104
+ let j;
105
+ let zeros;
106
+ // Decimal point?
107
+ if ((integerLen = numStr.indexOf(DECIMAL_SEP)) > -1) {
108
+ numStr = numStr.replace(DECIMAL_SEP, '');
109
+ }
110
+ // Exponential form?
111
+ if ((i = numStr.search(/e/i)) > 0) {
112
+ // Work out the exponent.
113
+ if (integerLen < 0) {
114
+ integerLen = i;
115
+ }
116
+ integerLen += +numStr.slice(i + 1);
117
+ numStr = numStr.slice(0, Math.max(0, i));
118
+ }
119
+ else if (integerLen < 0) {
120
+ // There was no decimal point or exponent so it is an integer.
121
+ integerLen = numStr.length;
122
+ }
123
+ // Count the number of leading zeros.
124
+ for (i = 0; numStr.charAt(i) === ZERO_CHAR; i++) {
125
+ /* empty */
126
+ }
127
+ if (i === (zeros = numStr.length)) {
128
+ // The digits are all zero.
129
+ digits = [0];
130
+ integerLen = 1;
131
+ }
132
+ else {
133
+ // Count the number of trailing zeros
134
+ zeros--;
135
+ while (numStr.charAt(zeros) === ZERO_CHAR) {
136
+ zeros--;
137
+ }
138
+ // Trailing zeros are insignificant so ignore them
139
+ integerLen -= i;
140
+ digits = [];
141
+ // Convert string to array of digits without leading/trailing zeros.
142
+ for (j = 0; i <= zeros; i++, j++) {
143
+ digits[j] = Number(numStr.charAt(i));
144
+ }
145
+ }
146
+ // If the number overflows the maximum allowed digits then use an exponent.
147
+ if (integerLen > MAX_DIGITS) {
148
+ digits = digits.splice(0, MAX_DIGITS - 1);
149
+ exponent = integerLen - 1;
150
+ integerLen = 1;
151
+ }
152
+ return { digits, exponent, integerLen };
153
+ }
154
+ /**
155
+ * Round the parsed number to the specified number of decimal places
156
+ * This function changes the parsedNumber in-place
157
+ */
158
+ function roundNumber(parsedNumber, minFrac, maxFrac) {
159
+ if (minFrac > maxFrac) {
160
+ throw new Error(`The minimum number of digits after fraction (${minFrac}) is higher than the maximum (${maxFrac}).`);
161
+ }
162
+ const digits = parsedNumber.digits;
163
+ let fractionLen = digits.length - parsedNumber.integerLen;
164
+ const fractionSize = Math.min(Math.max(minFrac, fractionLen), maxFrac);
165
+ // The index of the digit to where rounding is to occur
166
+ let roundAt = fractionSize + parsedNumber.integerLen;
167
+ const digit = digits[roundAt];
168
+ if (roundAt > 0) {
169
+ // Drop fractional digits beyond `roundAt`
170
+ digits.splice(Math.max(parsedNumber.integerLen, roundAt));
171
+ // Set non-fractional digits beyond `roundAt` to 0
172
+ for (let j = roundAt; j < digits.length; j++) {
173
+ digits[j] = 0;
174
+ }
175
+ }
176
+ else {
177
+ // We rounded to zero so reset the parsedNumber
178
+ fractionLen = Math.max(0, fractionLen);
179
+ parsedNumber.integerLen = 1;
180
+ digits.length = Math.max(1, (roundAt = fractionSize + 1));
181
+ digits[0] = 0;
182
+ for (let i = 1; i < roundAt; i++) {
183
+ digits[i] = 0;
184
+ }
185
+ }
186
+ if (digit >= 5) {
187
+ if (roundAt - 1 < 0) {
188
+ for (let k = 0; k > roundAt; k--) {
189
+ digits.unshift(0);
190
+ parsedNumber.integerLen++;
191
+ }
192
+ digits.unshift(1);
193
+ parsedNumber.integerLen++;
194
+ }
195
+ else {
196
+ digits[roundAt - 1]++;
197
+ }
198
+ }
199
+ // Pad out with zeros to get the required fraction length
200
+ for (; fractionLen < Math.max(0, fractionSize); fractionLen++) {
201
+ digits.push(0);
202
+ }
203
+ let dropTrailingZeros = fractionSize !== 0;
204
+ // Minimal length = nb of decimals required + current nb of integers
205
+ // Any number besides that is optional and can be removed if it's a trailing 0
206
+ const minLen = minFrac + parsedNumber.integerLen;
207
+ // Do any carrying, e.g. a digit was rounded up to 10
208
+ const carry = digits.reduceRight((c, d, i, ds) => {
209
+ d = d + c;
210
+ ds[i] = d < 10 ? d : d - 10; // d % 10
211
+ if (dropTrailingZeros) {
212
+ // Do not keep meaningless fractional trailing zeros (e.g. 15.52000 --> 15.52)
213
+ if (ds[i] === 0 && i >= minLen) {
214
+ ds.pop();
215
+ }
216
+ else {
217
+ dropTrailingZeros = false;
218
+ }
219
+ }
220
+ return d >= 10 ? 1 : 0;
221
+ }, 0);
222
+ if (carry) {
223
+ digits.unshift(carry);
224
+ parsedNumber.integerLen++;
225
+ }
226
+ }
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LW51bWJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvd29ya2xvYWQvdXRpbC1zaGFyZWQvc3JjL2xpYi91dGlscy9mb3JtYXQtbnVtYmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztBQUN0QixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFDeEIsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUMzQixNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFDMUIsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBQzlCLE1BQU0sbUJBQW1CLEdBQUc7SUFDMUIsS0FBSyxFQUFFLENBQUM7SUFDUixNQUFNLEVBQUUsQ0FBQztJQUNULE9BQU8sRUFBRSxDQUFDO0lBQ1YsT0FBTyxFQUFFLENBQUM7SUFDVixNQUFNLEVBQUUsQ0FBQztJQUNULE1BQU0sRUFBRSxHQUFHO0lBQ1gsTUFBTSxFQUFFLEVBQUU7SUFDVixNQUFNLEVBQUUsRUFBRTtJQUNWLE1BQU0sRUFBRSxFQUFFO0NBQ1gsQ0FBQztBQUVGOztHQUVHO0FBRUgsU0FBUywwQkFBMEIsQ0FDakMsS0FBYSxFQUNiLE9BQTJCLEVBQzNCLFVBQXFCO0lBRXJCLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFbkIsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNwQixNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFeEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLFdBQVcsR0FBRyxVQUFVLENB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QUFDO0lBQzVCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgTUFYX0RJR0lUUyA9IDIyO1xuY29uc3QgREVDSU1BTF9TRVAgPSAnLic7XG5jb25zdCBaRVJPX0NIQVIgPSAnMCc7XG5jb25zdCBTeW1ib2xJbmZpbml0eSA9ICfiiJ4nO1xuY29uc3QgU3ltYm9sRGVjaW1hbCA9ICcuJztcbmNvbnN0IFN5bWJvbEdyb3VwID0gJyc7XG5jb25zdCBTeW1ib2xFeHBvbmVudGlhbCA9ICdFJztcbmNvbnN0IFN5bWJvbE51bWJlclBhdHRlcm4gPSB7XG4gIGdTaXplOiAzLFxuICBsZ1NpemU6IDMsXG4gIG1heEZyYWM6IDMsXG4gIG1pbkZyYWM6IDAsXG4gIG1pbkludDogMSxcbiAgbmVnUHJlOiAnLScsXG4gIG5lZ1N1ZjogJycsXG4gIHBvc1ByZTogJycsXG4gIHBvc1N1ZjogJycsXG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYSBudW1iZXIgdG8gYSBsb2NhbGUgc3RyaW5nIGJhc2VkIG9uIGEgc3R5bGUgYW5kIGEgZm9ybWF0XG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcoXG4gIHZhbHVlOiBudW1iZXIsXG4gIHBhdHRlcm46IFBhcnNlZE51bWJlckZvcm1hdCxcbiAgZGlnaXRzSW5mbz86IG51bWJlcltdLFxuKTogc3RyaW5nIHtcbiAgbGV0IGZvcm1hdHRlZFRleHQgPSAnJztcbiAgbGV0IGlzWmVybyA9IGZhbHNlO1xuXG4gIGlmIChpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICBjb25zdCBwYXJzZWROdW1iZXIgPSBwYXJzZU51bWJlcih2YWx1ZSk7XG5cbiAgICBjb25zdCBtaW5JbnQgPSBkaWdpdHNJbmZvWzBdIHx8IDA7XG4gICAgY29uc3QgbWluRnJhY3Rpb24gPSBkaWdpdHNJbmZvWzFdIHx8IDA7XG4gICAgY29uc3QgbWF4RnJhY3Rpb24gPSBkaWdpdHNJbmZvWzJdIHx8IDA7XG5cbiAgICByb3VuZE51bWJlcihwYXJzZWROdW1iZXIsIG1pbkZyYWN0aW9uLCBtYXhGcmFjdGlvbik7XG5cbiAgICBsZXQgZGlnaXRzID0gcGFyc2VkTnVtYmVyLmRpZ2l0cztcbiAgICBsZXQgaW50ZWdlckxlbiA9IHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuO1xuICAgIGNvbnN0IGV4cG9uZW50ID0gcGFyc2VkTnVtYmVyLmV4cG9uZW50O1xuICAgIGxldCBkZWNpbWFscyA9IFtdO1xuICAgIGlzWmVybyA9IGRpZ2l0cy5ldmVyeShkID0+ICFkKTtcblxuICAgIC8vIHBhZCB6ZXJvcyBmb3Igc21hbGwgbnVtYmVyc1xuICAgIGZvciAoOyBpbnRlZ2VyTGVuIDwgbWluSW50OyBpbnRlZ2VyTGVuKyspIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KDApO1xuICAgIH1cblxuICAgIC8vIHBhZCB6ZXJvcyBmb3Igc21hbGwgbnVtYmVyc1xuICAgIGZvciAoOyBpbnRlZ2VyTGVuIDwgMDsgaW50ZWdlckxlbisrKSB7XG4gICAgICBkaWdpdHMudW5zaGlmdCgwKTtcbiAgICB9XG5cbiAgICAvLyBleHRyYWN0IGRlY2ltYWxzIGRpZ2l0c1xuICAgIGlmIChpbnRlZ2VyTGVuID4gMCkge1xuICAgICAgZGVjaW1hbHMgPSBkaWdpdHMuc3BsaWNlKGludGVnZXJMZW4sIGRpZ2l0cy5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWNpbWFscyA9IGRpZ2l0cztcbiAgICAgIGRpZ2l0cyA9IFswXTtcbiAgICB9XG5cbiAgICAvLyBmb3JtYXQgdGhlIGludGVnZXIgZGlnaXRzIHdpdGggZ3JvdXBpbmcgc2VwYXJhdG9yc1xuICAgIGNvbnN0IGdyb3VwcyA9IFtdO1xuICAgIGlmIChkaWdpdHMubGVuZ3RoID49IHBhdHRlcm4ubGdTaXplKSB7XG4gICAgICBncm91cHMudW5zaGlmdChkaWdpdHMuc3BsaWNlKC1wYXR0ZXJuLmxnU2l6ZSwgZGlnaXRzLmxlbmd0aCkuam9pbignJykpO1xuICAgIH1cblxuICAgIHdoaWxlIChkaWdpdHMubGVuZ3RoID4gcGF0dGVybi5nU2l6ZSkge1xuICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLnNwbGljZSgtcGF0dGVybi5nU2l6ZSwgZGlnaXRzLmxlbmd0aCkuam9pbignJykpO1xuICAgIH1cblxuICAgIGlmIChkaWdpdHMubGVuZ3RoID4gMCkge1xuICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLmpvaW4oJycpKTtcbiAgICB9XG5cbiAgICBmb3JtYXR0ZWRUZXh0ID0gZ3JvdXBzLmpvaW4oU3ltYm9sR3JvdXApO1xuXG4gICAgLy8gYXBwZW5kIHRoZSBkZWNpbWFsIGRpZ2l0c1xuICAgIGlmIChkZWNpbWFscy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3JtYXR0ZWRUZXh0ICs9IFN5bWJvbERlY2ltYWwgKyBkZWNpbWFscy5qb2luKCcnKTtcbiAgICB9XG5cbiAgICBpZiAoZXhwb25lbnQpIHtcbiAgICAgIGZvcm1hdHRlZFRleHQgKz0gU3ltYm9sRXhwb25lbnRpYWwgKyAnKycgKyBleHBvbmVudDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9ybWF0dGVkVGV4dCA9IFN5bWJvbEluZmluaXR5O1xuICB9XG5cbiAgZm9ybWF0dGVkVGV4dCA9XG4gICAgdmFsdWUgPCAwICYmICFpc1plcm9cbiAgICAgID8gcGF0dGVybi5uZWdQcmUgKyBmb3JtYXR0ZWRUZXh0ICsgcGF0dGVybi5uZWdTdWZcbiAgICAgIDogcGF0dGVybi5wb3NQcmUgKyBmb3JtYXR0ZWRUZXh0ICsgcGF0dGVybi5wb3NTdWY7XG5cbiAgcmV0dXJuIGZvcm1hdHRlZFRleHQ7XG59XG5cbi8qKlxuICogQG5nTW9kdWxlIENvbW1vbk1vZHVsZVxuICpcbiAqIEZvcm1hdHMgYSBudW1iZXIgYXMgdGV4dC4gR3JvdXAgc2l6aW5nIGFuZCBzZXBhcmF0b3IgYW5kIG90aGVyIGxvY2FsZS1zcGVjaWZpY1xuICogY29uZmlndXJhdGlvbnMgYXJlIGJhc2VkIG9uIHRoZSBsb2NhbGUuXG4gKlxuICogV2hlcmU6XG4gKiAtIGB2YWx1ZWAgaXMgYSBudW1iZXIuXG4gKiAtIGBkaWdpdEluZm9gIFNlZSB7QGxpbmsgRGVjaW1hbFBpcGV9IGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXROdW1iZXIodmFsdWU6IG51bWJlciwgZGlnaXRzSW5mbz86IG51bWJlcltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZvcm1hdE51bWJlclRvTG9jYWxlU3RyaW5nKHZhbHVlLCBTeW1ib2xOdW1iZXJQYXR0ZXJuLCBkaWdpdHNJbmZvKTtcbn1cblxuaW50ZXJmYWNlIFBhcnNlZE51bWJlckZvcm1hdCB7XG4gIG1pbkludDogbnVtYmVyO1xuICAvLyB0aGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIHJlcXVpcmVkIGluIHRoZSBmcmFjdGlvbiBwYXJ0IG9mIHRoZSBudW1iZXJcbiAgbWluRnJhYzogbnVtYmVyO1xuICAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzIHJlcXVpcmVkIGluIHRoZSBmcmFjdGlvbiBwYXJ0IG9mIHRoZSBudW1iZXJcbiAgbWF4RnJhYzogbnVtYmVyO1xuICAvLyB0aGUgcHJlZml4IGZvciBhIHBvc2l0aXZlIG51bWJlclxuICBwb3NQcmU6IHN0cmluZztcbiAgLy8gdGhlIHN1ZmZpeCBmb3IgYSBwb3NpdGl2ZSBudW1iZXJcbiAgcG9zU3VmOiBzdHJpbmc7XG4gIC8vIHRoZSBwcmVmaXggZm9yIGEgbmVnYXRpdmUgbnVtYmVyIChlLmcuIGAtYCBvciBgKGApKVxuICBuZWdQcmU6IHN0cmluZztcbiAgLy8gdGhlIHN1ZmZpeCBmb3IgYSBuZWdhdGl2ZSBudW1iZXIgKGUuZy4gYClgKVxuICBuZWdTdWY6IHN0cmluZztcbiAgLy8gbnVtYmVyIG9mIGRpZ2l0cyBpbiBlYWNoIGdyb3VwIG9mIHNlcGFyYXRlZCBkaWdpdHNcbiAgZ1NpemU6IG51bWJlcjtcbiAgLy8gbnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgbGFzdCBncm91cCBvZiBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsIHNlcGFyYXRvclxuICBsZ1NpemU6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFBhcnNlZE51bWJlciB7XG4gIC8vIGFuIGFycmF5IG9mIGRpZ2l0cyBjb250YWluaW5nIGxlYWRpbmcgemVyb3MgYXMgbmVjZXNzYXJ5XG4gIGRpZ2l0czogbnVtYmVyW107XG4gIC8vIHRoZSBleHBvbmVudCBmb3IgbnVtYmVycyB0aGF0IHdvdWxkIG5lZWQgbW9yZSB0aGFuIGBNQVhfRElHSVRTYCBkaWdpdHMgaW4gYGRgXG4gIGV4cG9uZW50OiBudW1iZXI7XG4gIC8vIHRoZSBudW1iZXIgb2YgdGhlIGRpZ2l0cyBpbiBgZGAgdGhhdCBhcmUgdG8gdGhlIGxlZnQgb2YgdGhlIGRlY2ltYWwgcG9pbnRcbiAgaW50ZWdlckxlbjogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIG51bWJlci5cbiAqIFNpZ25pZmljYW50IGJpdHMgb2YgdGhpcyBwYXJzZSBhbGdvcml0aG0gY2FtZSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWtlTWNsL2JpZy5qcy9cbiAqL1xuZnVuY3Rpb24gcGFyc2VOdW1iZXIobnVtOiBudW1iZXIpOiBQYXJzZWROdW1iZXIge1xuICBsZXQgbnVtU3RyID0gTWF0aC5hYnMobnVtKSArICcnO1xuICBsZXQgZXhwb25lbnQgPSAwO1xuICBsZXQgZGlnaXRzOiBudW1iZXJbXTtcbiAgbGV0IGludGVnZXJMZW46IG51bWJlcjtcbiAgbGV0IGk6IG51bWJlcjtcbiAgbGV0IGo6IG51bWJlcjtcbiAgbGV0IHplcm9zOiBudW1iZXI7XG5cbiAgLy8gRGVjaW1hbCBwb2ludD9cbiAgaWYgKChpbnRlZ2VyTGVuID0gbnVtU3RyLmluZGV4T2YoREVDSU1BTF9TRVApKSA+IC0xKSB7XG4gICAgbnVtU3RyID0gbnVtU3RyLnJlcGxhY2UoREVDSU1BTF9TRVAsICcnKTtcbiAgfVxuXG4gIC8vIEV4cG9uZW50aWFsIGZvcm0/XG4gIGlmICgoaSA9IG51bVN0ci5zZWFyY2goL2UvaSkpID4gMCkge1xuICAgIC8vIFdvcmsgb3V0IHRoZSBleHBvbmVudC5cbiAgICBpZiAoaW50ZWdlckxlbiA8IDApIHtcbiAgICAgIGludGVnZXJMZW4gPSBpO1xuICAgIH1cbiAgICBpbnRlZ2VyTGVuICs9ICtudW1TdHIuc2xpY2UoaSArIDEpO1xuICAgIG51bVN0ciA9IG51bVN0ci5zbGljZSgwLCBNYXRoLm1heCgwLCBpKSk7XG4gIH0gZWxzZSBpZiAoaW50ZWdlckxlbiA8IDApIHtcbiAgICAvLyBUaGVyZSB3YXMgbm8gZGVjaW1hbCBwb2ludCBvciBleHBvbmVudCBzbyBpdCBpcyBhbiBpbnRlZ2VyLlxuICAgIGludGVnZXJMZW4gPSBudW1TdHIubGVuZ3RoO1xuICB9XG5cbiAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsZWFkaW5nIHplcm9zLlxuICBmb3IgKGkgPSAwOyBudW1TdHIuY2hhckF0KGkpID09PSBaRVJPX0NIQVI7IGkrKykge1xuICAgIC8qIGVtcHR5ICovXG4gIH1cblxuICBpZiAoaSA9PT0gKHplcm9zID0gbnVtU3RyLmxlbmd0aCkpIHtcbiAgICAvLyBUaGUgZGlnaXRzIGFyZSBhbGwgemVyby5cbiAgICBkaWdpdHMgPSBbMF07XG4gICAgaW50ZWdlckxlbiA9IDE7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvc1xuICAgIHplcm9zLS07XG4gICAgd2hpbGUgKG51bVN0ci5jaGFyQXQoemVyb3MpID09PSBaRVJPX0NIQVIpIHtcbiAgICAgIHplcm9zLS07XG4gICAgfVxuXG4gICAgLy8gVHJhaWxpbmcgemVyb3MgYXJlIGluc2lnbmlmaWNhbnQgc28gaWdub3JlIHRoZW1cbiAgICBpbnRlZ2VyTGVuIC09IGk7XG4gICAgZGlnaXRzID0gW107XG4gICAgLy8gQ29udmVydCBzdHJpbmcgdG8gYXJyYXkgb2YgZGlnaXRzIHdpdGhvdXQgbGVhZGluZy90cmFpbGluZyB6ZXJvcy5cbiAgICBmb3IgKGogPSAwOyBpIDw9IHplcm9zOyBpKyssIGorKykge1xuICAgICAgZGlnaXRzW2pdID0gTnVtYmVyKG51bVN0ci5jaGFyQXQoaSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIHRoZSBudW1iZXIgb3ZlcmZsb3dzIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGlnaXRzIHRoZW4gdXNlIGFuIGV4cG9uZW50LlxuICBpZiAoaW50ZWdlckxlbiA+IE1BWF9ESUdJVFMpIHtcbiAgICBkaWdpdHMgPSBkaWdpdHMuc3BsaWNlKDAsIE1BWF9ESUdJVFMgLSAxKTtcbiAgICBleHBvbmVudCA9IGludGVnZXJMZW4gLSAxO1xuICAgIGludGVnZXJMZW4gPSAxO1xuICB9XG5cbiAgcmV0dXJuIHsgZGlnaXRzLCBleHBvbmVudCwgaW50ZWdlckxlbiB9O1xufVxuXG4vKipcbiAqIFJvdW5kIHRoZSBwYXJzZWQgbnVtYmVyIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXG4gKiBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIHBhcnNlZE51bWJlciBpbi1wbGFjZVxuICovXG5cbmZ1bmN0aW9uIHJvdW5kTnVtYmVyKFxuICBwYXJzZWROdW1iZXI6IFBhcnNlZE51bWJlcixcbiAgbWluRnJhYzogbnVtYmVyLFxuICBtYXhGcmFjOiBudW1iZXIsXG4pIHtcbiAgaWYgKG1pbkZyYWMgPiBtYXhGcmFjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBtaW5pbXVtIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgZnJhY3Rpb24gKCR7bWluRnJhY30pIGlzIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtICgke21heEZyYWN9KS5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBkaWdpdHMgPSBwYXJzZWROdW1iZXIuZGlnaXRzO1xuICBsZXQgZnJhY3Rpb25MZW4gPSBkaWdpdHMubGVuZ3RoIC0gcGFyc2VkTnVtYmVyLmludGVnZXJMZW47XG4gIGNvbnN0IGZyYWN0aW9uU2l6ZSA9IE1hdGgubWluKE1hdGgubWF4KG1pbkZyYWMsIGZyYWN0aW9uTGVuKSwgbWF4RnJhYyk7XG5cbiAgLy8gVGhlIGluZGV4IG9mIHRoZSBkaWdpdCB0byB3aGVyZSByb3VuZGluZyBpcyB0byBvY2N1clxuICBsZXQgcm91bmRBdCA9IGZyYWN0aW9uU2l6ZSArIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuO1xuICBjb25zdCBkaWdpdCA9IGRpZ2l0c1tyb3VuZEF0XTtcblxuICBpZiAocm91bmRBdCA+IDApIHtcbiAgICAvLyBEcm9wIGZyYWN0aW9uYWwgZGlnaXRzIGJleW9uZCBgcm91bmRBdGBcbiAgICBkaWdpdHMuc3BsaWNlKE1hdGgubWF4KHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuLCByb3VuZEF0KSk7XG5cbiAgICAvLyBTZXQgbm9uLWZyYWN0aW9uYWwgZGlnaXRzIGJleW9uZCBgcm91bmRBdGAgdG8gMFxuICAgIGZvciAobGV0IGogPSByb3VuZEF0OyBqIDwgZGlnaXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICBkaWdpdHNbal0gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBXZSByb3VuZGVkIHRvIHplcm8gc28gcmVzZXQgdGhlIHBhcnNlZE51bWJlclxuICAgIGZyYWN0aW9uTGVuID0gTWF0aC5tYXgoMCwgZnJhY3Rpb25MZW4pO1xuICAgIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuID0gMTtcbiAgICBkaWdpdHMubGVuZ3RoID0gTWF0aC5tYXgoMSwgKHJvdW5kQXQgPSBmcmFjdGlvblNpemUgKyAxKSk7XG4gICAgZGlnaXRzWzBdID0gMDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJvdW5kQXQ7IGkrKykge1xuICAgICAgZGlnaXRzW2ldID0gMDtcbiAgICB9XG4gIH1cblxuICBpZiAoZGlnaXQgPj0gNSkge1xuICAgIGlmIChyb3VuZEF0IC0gMSA8IDApIHtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrID4gcm91bmRBdDsgay0tKSB7XG4gICAgICAgIGRpZ2l0cy51bnNoaWZ0KDApO1xuICAgICAgICBwYXJzZWROdW1iZXIuaW50ZWdlckxlbisrO1xuICAgICAgfVxuICAgICAgZGlnaXRzLnVuc2hpZnQoMSk7XG4gICAgICBwYXJzZWROdW1iZXIuaW50ZWdlckxlbisrO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWdpdHNbcm91bmRBdCAtIDFdKys7XG4gICAgfVxuICB9XG5cbiAgLy8gUGFkIG91dCB3aXRoIHplcm9zIHRvIGdldCB0aGUgcmVxdWlyZWQgZnJhY3Rpb24gbGVuZ3RoXG4gIGZvciAoOyBmcmFjdGlvbkxlbiA8IE1hdGgubWF4KDAsIGZyYWN0aW9uU2l6ZSk7IGZyYWN0aW9uTGVuKyspIHtcbiAgICBkaWdpdHMucHVzaCgwKTtcbiAgfVxuXG4gIGxldCBkcm9wVHJhaWxpbmdaZXJvcyA9IGZyYWN0aW9uU2l6ZSAhPT0gMDtcbiAgLy8gTWluaW1hbCBsZW5ndGggPSBuYiBvZiBkZWNpbWFscyByZXF1aXJlZCArIGN1cnJlbnQgbmIgb2YgaW50ZWdlcnNcbiAgLy8gQW55IG51bWJlciBiZXNpZGVzIHRoYXQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmIGl0J3MgYSB0cmFpbGluZyAwXG4gIGNvbnN0IG1pbkxlbiA9IG1pbkZyYWMgKyBwYXJzZWROdW1iZXIuaW50ZWdlckxlbjtcbiAgLy8gRG8gYW55IGNhcnJ5aW5nLCBlLmcuIGEgZGlnaXQgd2FzIHJvdW5kZWQgdXAgdG8gMTBcbiAgY29uc3QgY2FycnkgPSBkaWdpdHMucmVkdWNlUmlnaHQoKGMsIGQsIGksIGRzKSA9PiB7XG4gICAgZCA9IGQgKyBjO1xuICAgIGRzW2ldID0gZCA8IDEwID8gZCA6IGQgLSAxMDsgLy8gZCAlIDEwXG4gICAgaWYgKGRyb3BUcmFpbGluZ1plcm9zKSB7XG4gICAgICAvLyBEbyBub3Qga2VlcCBtZWFuaW5nbGVzcyBmcmFjdGlvbmFsIHRyYWlsaW5nIHplcm9zIChlLmcuIDE1LjUyMDAwIC0tPiAxNS41MilcbiAgICAgIGlmIChkc1tpXSA9PT0gMCAmJiBpID49IG1pbkxlbikge1xuICAgICAgICBkcy5wb3AoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyb3BUcmFpbGluZ1plcm9zID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkID49IDEwID8gMSA6IDA7XG4gIH0sIDApO1xuICBpZiAoY2FycnkpIHtcbiAgICBkaWdpdHMudW5zaGlmdChjYXJyeSk7XG4gICAgcGFyc2VkTnVtYmVyLmludGVnZXJMZW4rKztcbiAgfVxufVxuIl19
@@ -0,0 +1,27 @@
1
+ import { get, isEmpty } from 'lodash-es';
2
+ /**
3
+ *
4
+ * @param source 源复制对象
5
+ * @param other 待合并对象
6
+ * @returns 将待合并对象中 value 为真值的 key-value 合并到 source 中返回新对象
7
+ */
8
+ export function mergeIfValueTruthy(source, other) {
9
+ if (!other) {
10
+ return source;
11
+ }
12
+ const obj = { ...source };
13
+ Object.entries(other).forEach(([key, value]) => {
14
+ if (value != null) {
15
+ Object.assign(obj, { [key]: value });
16
+ }
17
+ });
18
+ return obj;
19
+ }
20
+ export function getRootCloudAnnotationAppLink(annotationKey) {
21
+ return get(/app\.(.*)\.url/.exec(annotationKey), '[1]', '');
22
+ }
23
+ export function keyValueFormTableRequiredValidatorFn(control) {
24
+ return isEmpty(control.value) ? { required: true } : null;
25
+ }
26
+ export const placeObjectValues = (condition, value) => (condition ? { ...value } : {});
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvd29ya2xvYWQvdXRpbC1zaGFyZWQvc3JjL2xpYi91dGlscy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXpDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFPLE1BQVMsRUFBRSxLQUFRO0lBQzFELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDMUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQzdDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxhQUFxQjtJQUNqRSxPQUFPLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCxNQUFNLFVBQVUsb0NBQW9DLENBQUMsT0FBd0I7SUFDM0UsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxDQUMvQixTQUFrQixFQUNsQixLQUE4QixFQUNMLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGdldCwgaXNFbXB0eSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBzb3VyY2Ug5rqQ5aSN5Yi25a+56LGhXG4gKiBAcGFyYW0gb3RoZXIg5b6F5ZCI5bm25a+56LGhXG4gKiBAcmV0dXJucyDlsIblvoXlkIjlubblr7nosaHkuK0gdmFsdWUg5Li655yf5YC855qEIGtleS12YWx1ZSDlkIjlubbliLAgc291cmNlIOS4rei/lOWbnuaWsOWvueixoVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VJZlZhbHVlVHJ1dGh5PFQsIEs+KHNvdXJjZTogVCwgb3RoZXI6IEspOiBUIHwgKFQgJiBLKSB7XG4gIGlmICghb3RoZXIpIHtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG4gIGNvbnN0IG9iaiA9IHsgLi4uc291cmNlIH07XG4gIE9iamVjdC5lbnRyaWVzKG90aGVyKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHsgW2tleV06IHZhbHVlIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb290Q2xvdWRBbm5vdGF0aW9uQXBwTGluayhhbm5vdGF0aW9uS2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGdldCgvYXBwXFwuKC4qKVxcLnVybC8uZXhlYyhhbm5vdGF0aW9uS2V5KSwgJ1sxXScsICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGtleVZhbHVlRm9ybVRhYmxlUmVxdWlyZWRWYWxpZGF0b3JGbihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgcmV0dXJuIGlzRW1wdHkoY29udHJvbC52YWx1ZSkgPyB7IHJlcXVpcmVkOiB0cnVlIH0gOiBudWxsO1xufVxuXG5leHBvcnQgY29uc3QgcGxhY2VPYmplY3RWYWx1ZXMgPSAoXG4gIGNvbmRpdGlvbjogYm9vbGVhbixcbiAgdmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gKGNvbmRpdGlvbiA/IHsgLi4udmFsdWUgfSA6IHt9KTtcbiJdfQ==
@@ -0,0 +1,14 @@
1
+ export * from './code-editor-config';
2
+ export * from './constants';
3
+ export * from './crd';
4
+ export * from './format-number';
5
+ export * from './helpers';
6
+ export * from './k8s-util.service';
7
+ export * from './patterns';
8
+ export * from './pod-util';
9
+ export * from './resource-status';
10
+ export * from './resources-config-util';
11
+ export * from './status';
12
+ export * from './validator';
13
+ export * from './workspace';
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3dvcmtsb2FkL3V0aWwtc2hhcmVkL3NyYy9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLE9BQU8sQ0FBQztBQUN0QixjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jb2RlLWVkaXRvci1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jcmQnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3JtYXQtbnVtYmVyJztcbmV4cG9ydCAqIGZyb20gJy4vaGVscGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2s4cy11dGlsLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXR0ZXJucyc7XG5leHBvcnQgKiBmcm9tICcuL3BvZC11dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vcmVzb3VyY2Utc3RhdHVzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVzb3VyY2VzLWNvbmZpZy11dGlsJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhdHVzJztcbmV4cG9ydCAqIGZyb20gJy4vdmFsaWRhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vd29ya3NwYWNlJztcbiJdfQ==
@@ -0,0 +1,28 @@
1
+ import { NAME, K8sSharedUtilService, } from '@alauda-fe/common';
2
+ import { CALICO_ANNOTATION_PREFIX, KUBE_OVN_ANNOTATION_PREFIX, } from '@alauda-fe/network';
3
+ import { Injectable } from '@angular/core';
4
+ import * as i0 from "@angular/core";
5
+ export class K8sUtilService extends K8sSharedUtilService {
6
+ isGrayRelease(resource) {
7
+ return !!this.getLabel(resource, 'canaryrefer', 'servicemesh');
8
+ }
9
+ getReadonlyPodAnnotationKeys() {
10
+ return [
11
+ `${KUBE_OVN_ANNOTATION_PREFIX}/ip_pool`,
12
+ `${KUBE_OVN_ANNOTATION_PREFIX}/egress_rate`,
13
+ `${KUBE_OVN_ANNOTATION_PREFIX}/ingress_rate`,
14
+ `${CALICO_ANNOTATION_PREFIX}/ipAddrs`,
15
+ this.normalizeType(NAME, 'subnet'),
16
+ this.normalizeType('ipAddrs', 'subnet'),
17
+ ];
18
+ }
19
+ static { this.ɵfac = /*@__PURE__*/ (() => { let ɵK8sUtilService_BaseFactory; return function K8sUtilService_Factory(t) { return (ɵK8sUtilService_BaseFactory || (ɵK8sUtilService_BaseFactory = i0.ɵɵgetInheritedFactory(K8sUtilService)))(t || K8sUtilService); }; })(); }
20
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: K8sUtilService, factory: K8sUtilService.ɵfac, providedIn: 'root' }); }
21
+ }
22
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(K8sUtilService, [{
23
+ type: Injectable,
24
+ args: [{
25
+ providedIn: 'root',
26
+ }]
27
+ }], null, null); })();
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiazhzLXV0aWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL21vZHVsZXMvd29ya2xvYWQvdXRpbC1zaGFyZWQvc3JjL2xpYi91dGlscy9rOHMtdXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxJQUFJLEVBQ0osb0JBQW9CLEdBRXJCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwwQkFBMEIsR0FDM0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sY0FFWCxTQUFRLG9CQUF1QjtJQUMvQixhQUFhLENBQStCLFFBQVc7UUFDckQsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCw0QkFBNEI7UUFDMUIsT0FBTztZQUNMLEdBQUcsMEJBQTBCLFVBQVU7WUFDdkMsR0FBRywwQkFBMEIsY0FBYztZQUMzQyxHQUFHLDBCQUEwQixlQUFlO1lBQzVDLEdBQUcsd0JBQXdCLFVBQVU7WUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztTQUN4QyxDQUFDO0lBQ0osQ0FBQzs0TkFoQlUsY0FBYyxTQUFkLGNBQWM7dUVBQWQsY0FBYyxXQUFkLGNBQWMsbUJBRmIsTUFBTTs7aUZBRVAsY0FBYztjQUgxQixVQUFVO2VBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBLdWJlcm5ldGVzUmVzb3VyY2UsXG4gIE5BTUUsXG4gIEs4c1NoYXJlZFV0aWxTZXJ2aWNlLFxuICBSZXNvdXJjZVR5cGUsXG59IGZyb20gJ0BhbGF1ZGEtZmUvY29tbW9uJztcbmltcG9ydCB7XG4gIENBTElDT19BTk5PVEFUSU9OX1BSRUZJWCxcbiAgS1VCRV9PVk5fQU5OT1RBVElPTl9QUkVGSVgsXG59IGZyb20gJ0BhbGF1ZGEtZmUvbmV0d29yayc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBLOHNVdGlsU2VydmljZTxcbiAgUiBleHRlbmRzIHN0cmluZyA9IFJlc291cmNlVHlwZSxcbj4gZXh0ZW5kcyBLOHNTaGFyZWRVdGlsU2VydmljZTxSPiB7XG4gIGlzR3JheVJlbGVhc2U8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT4ocmVzb3VyY2U6IFQpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldExhYmVsKHJlc291cmNlLCAnY2FuYXJ5cmVmZXInLCAnc2VydmljZW1lc2gnKTtcbiAgfVxuXG4gIGdldFJlYWRvbmx5UG9kQW5ub3RhdGlvbktleXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGAke0tVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYfS9pcF9wb29sYCxcbiAgICAgIGAke0tVQkVfT1ZOX0FOTk9UQVRJT05fUFJFRklYfS9lZ3Jlc3NfcmF0ZWAsXG4gICAgICBgJHtLVUJFX09WTl9BTk5PVEFUSU9OX1BSRUZJWH0vaW5ncmVzc19yYXRlYCxcbiAgICAgIGAke0NBTElDT19BTk5PVEFUSU9OX1BSRUZJWH0vaXBBZGRyc2AsXG4gICAgICB0aGlzLm5vcm1hbGl6ZVR5cGUoTkFNRSwgJ3N1Ym5ldCcpLFxuICAgICAgdGhpcy5ub3JtYWxpemVUeXBlKCdpcEFkZHJzJywgJ3N1Ym5ldCcpLFxuICAgIF07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,140 @@
1
+ export const K8S_RESOURCE_NAME_BASE = {
2
+ pattern: /^[\da-z]([\da-z-]*[\da-z])?$/,
3
+ tip: 'regexp_tip_k8s_resource_name_base',
4
+ };
5
+ export const LOOSE_K8S_RESOURCE_NAME_BASE = {
6
+ pattern: /^[\da-z]([\da-z-]*[\da-z])?(\.[\da-z]([\da-z-]*[\da-z])?)*$/,
7
+ tip: 'regexp_tip_k8s_resource_name_loose',
8
+ };
9
+ export const K8S_CONFIGMAP_KEY = {
10
+ pattern: /^[\w-][\w.-]*$/,
11
+ tip: 'regexp_tip_k8s_configmap_key',
12
+ };
13
+ export const K8S_ENV_VARIABLE_NAME = {
14
+ pattern: /^[.A-Z_a-z-][\w.-]*$/,
15
+ tip: 'regexp_tip_k8s_env_variable_name',
16
+ };
17
+ export const INT_PATTERN = {
18
+ pattern: /^-?\d+$/,
19
+ tip: 'integer_pattern',
20
+ };
21
+ export const POSITIVE_INT_PATTERN = {
22
+ pattern: /^[1-9]\d*$/,
23
+ tip: 'positive_integer_pattern',
24
+ };
25
+ export const POSITIVE_INT_32_PATTERN = {
26
+ pattern: /^(\d{1,9}|1\d{9}|2(0\d{8}|1([0-3]\d{7}|4([0-6]\d{6}|7([0-3]\d{5}|4([0-7]\d{4}|8([0-2]\d{3}|3([0-5]\d{2}|6([0-3]\d|4[0-7])))))))))$/,
27
+ tip: 'positive_integer_pattern',
28
+ };
29
+ export const POSITIVE_NUMBER_PATTERN = {
30
+ pattern: /^([1-9]\d*\.?|0\.)\d*$/,
31
+ tip: 'regexp_tip_positive_number_pattern',
32
+ };
33
+ export const NATURAL_NUMBER_PATTERN = {
34
+ pattern: /^\d+$/,
35
+ tip: 'natural_number_pattern',
36
+ };
37
+ export const AUTO_SCALER_COOL_TIME_PATTERN = {
38
+ pattern: /^(\d|[1-9]\d|[1-9]\d\d|[12]\d\d\d|3[0-5]\d\d|(3600))$/,
39
+ tip: 'natural_number_less_than_3600',
40
+ error: 'natural_number_less_than_3600_error',
41
+ };
42
+ export const REGISTRY_PATH = {
43
+ pattern: /^[\da-z]([\d._a-z-]*[\da-z])?$/,
44
+ tip: 'registry_path_rule',
45
+ };
46
+ export const INGRESS_PATH_PATTERN = {
47
+ pattern: /^\/.*/,
48
+ tip: 'ingress_path_pattern',
49
+ };
50
+ const IP_PATTERN_BASE = '^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d{1,2})\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d{1,2})$';
51
+ export const IP_ADDRESS_PATTERN = {
52
+ pattern: new RegExp(IP_PATTERN_BASE),
53
+ tip: 'regexp_tip_ip_address',
54
+ };
55
+ const IP_V6_ADDRESS_BASE = '^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9]).){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9]).){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))$';
56
+ export const IP_V6_ADDRESS_PATTERN = {
57
+ pattern: new RegExp(IP_V6_ADDRESS_BASE),
58
+ };
59
+ export const IP_V4_OR_V6_PATTERN = {
60
+ pattern: new RegExp(`(${IP_PATTERN_BASE})|(${IP_V6_ADDRESS_BASE})`),
61
+ };
62
+ export const IP_ADDRESS_PORT_PATTERN = {
63
+ pattern: new RegExp(`${IP_PATTERN_BASE.slice(0, -1)}(?::\\d+)?$`),
64
+ tip: 'regexp_tip_ip_address',
65
+ };
66
+ export const TCP_ADDRESS_PATTERN = {
67
+ pattern: /^(?:(?:[1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:[1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]):\d+$/,
68
+ tip: 'input_tcp_placeholder',
69
+ };
70
+ export const CIDR_IP_PATTERN = {
71
+ pattern: /^((2(5[0-5]|[0-4]\d))|1\d{2}|[1-9]\d|\d)(\.(((2(5[0-5]|[0-4]\d))|1\d{1,2}|[1-9]\d|\d))){3}$/,
72
+ };
73
+ export const CIDR_FULL_PATTEN = {
74
+ pattern: /^((2(5[0-5]|[0-4]\d))|1\d{2}|[1-9]\d|\d)(\.(((2(5[0-5]|[0-4]\d))|1\d{1,2}|[1-9]\d|\d))){3}(\/(\d|[12]\d|3[0-2]))$/,
75
+ tip: 'regexp_cidr_pattern',
76
+ };
77
+ export const CIDR_PATTERN = {
78
+ pattern: /^((2(5[0-5]|[0-4]\d))|1\d{2}|[1-9]\d|\d)(\.(((2(5[0-5]|[0-4]\d))|1\d{1,2}|[1-9]\d|\d))){3}(\/(\d|[12]\d|3[0-2]))?$/,
79
+ tip: 'regexp_cidr_pattern',
80
+ };
81
+ export const RESERVED_IP_PATTERN = {
82
+ pattern: /^((2(5[0-5]|[0-4]\d))|1\d{2}|[1-9]\d|\d)(\.(((2(5[0-5]|[0-4]\d))|1\d{1,2}|[1-9]\d|\d))){3}(\.\.((2(5[0-5]|[0-4]\d))|1\d{2}|[1-9]\d|\d)(\.(((2(5[0-5]|[0-4]\d))|1\d{1,2}|[1-9]\d|\d))){3})?$/,
83
+ };
84
+ export const RESERVED_IP_SEGMENT_PATTERN = {
85
+ pattern: /^((2(5[0-5]|[0-4]\d))|1\d{2}|[1-9]\d|\d)(\.(((2(5[0-5]|[0-4]\d))|1\d{1,2}|[1-9]\d|\d))){3}(\.\.((2(5[0-5]|[0-4]\d))|1\d{2}|[1-9]\d|\d)(\.(((2(5[0-5]|[0-4]\d))|1\d{1,2}|[1-9]\d|\d))){3})$/,
86
+ };
87
+ export const CUSTOM_ALARM_NAME_BASE = {
88
+ pattern: /^[\da-z]([\d.a-z]*[\da-z])?$/,
89
+ tip: 'custom_alert_name_placeholder',
90
+ };
91
+ export const ALARM_LABEL_KEY_NAME_PATTERN = {
92
+ pattern: /^[A-Z_a-z]\w*$/,
93
+ tip: 'regexp_tip_alert_label_key_name',
94
+ };
95
+ export const ALARM_THRESHOLD_PATTERN = {
96
+ pattern: /^(?!0\d)\d{0,17}(\.\d{1,4})?$/,
97
+ tip: 'regexp_tip_alert_threshold',
98
+ };
99
+ export const ALARM_METRIC_PATTERN = {
100
+ pattern: /^[\u0020-\u007E]*$/,
101
+ tip: 'regexp_tip_alert_metric',
102
+ };
103
+ export const EMAIL_PATTERN = {
104
+ pattern: /^[\w!#$%&'*+/=?^`{|}~-]+(?:\.[\w!#$%&'*+/=?^`{|}~-]+)*@(?:[\dA-Za-z](?:[\dA-Za-z-]*[\dA-Za-z])?\.)+[\dA-Za-z](?:[\dA-Za-z-]*[\dA-Za-z])?$/,
105
+ tip: 'email_format_limit',
106
+ };
107
+ export const PHONE_PATTERN = {
108
+ pattern: /^\+?\d{7,15}$/,
109
+ tip: 'phone_format_limit',
110
+ };
111
+ export const PUBLIC_KEY_PATTERN = {
112
+ pattern: /^(-{5}BEGIN CERTIFICATE-{5}[\d\n+/=A-Za-z]*-{5}END CERTIFICATE-{5}\n*)+$/,
113
+ placeholder: `-----BEGIN CERTIFICATE-----
114
+ MIIDLjCCAhYCCQDAOF9tLsaXWjANBgkqhkiG9w0BAQsFADBaM
115
+ -----END CERTIFICATE-----`,
116
+ };
117
+ export const PRIVATE_KEY_PATTERN = {
118
+ pattern: /^(-{5}BEGIN (RSA |EC |DSA )?PRIVATE KEY-{5}[\d\n+/=A-Za-z]*-{5}END \2PRIVATE KEY-{5}\n*)+$/,
119
+ placeholder: `-----BEGIN RSA PRIVATE KEY-----
120
+ MIIDLjCCAhYCCQDAOF9tLsaXWjANBgkqhkiG9w0BAQsFADBaM
121
+ -----END RSA PRIVATE KEY-----`,
122
+ };
123
+ export const STRONG_PASSWORD_PATTERN = {
124
+ pattern: /^(?!\/)(?=.*[A-Za-z])(?=.*\d)(?=.*[!#$%&'()*+,./:;<=>?@[\]^_`{|}~-]).{8,30}$/,
125
+ tip: 'regexp_tip_strong_password',
126
+ };
127
+ export const POSITIVE_PERCENTAGE_PATTERN = {
128
+ pattern: /^([1-9]\d?|100)$/,
129
+ tip: 'regexp_positive_percentage_tips',
130
+ };
131
+ export const CUSTOM_INDICATOR_PATTERN = {
132
+ // cspell:disable-next-line
133
+ pattern: /^([+-]?[\d.]+)([EGKMPTeikmnu]*[+-]?\d*)$/,
134
+ tip: '',
135
+ };
136
+ export const PATCH_PATH_PATTERN = {
137
+ pattern: /^\/.*/,
138
+ tip: 'oam_patch_path_pattern',
139
+ };
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3dvcmtsb2FkL3V0aWwtc2hhcmVkL3NyYy9saWIvdXRpbHMvcGF0dGVybnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUc7SUFDcEMsT0FBTyxFQUFFLDhCQUE4QjtJQUN2QyxHQUFHLEVBQUUsbUNBQW1DO0NBQ3pDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRztJQUMxQyxPQUFPLEVBQUUsNkRBQTZEO0lBQ3RFLEdBQUcsRUFBRSxvQ0FBb0M7Q0FDMUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQy9CLE9BQU8sRUFBRSxnQkFBZ0I7SUFDekIsR0FBRyxFQUFFLDhCQUE4QjtDQUNwQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUc7SUFDbkMsT0FBTyxFQUFFLHNCQUFzQjtJQUMvQixHQUFHLEVBQUUsa0NBQWtDO0NBQ3hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDekIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsR0FBRyxFQUFFLGlCQUFpQjtDQUN2QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUc7SUFDbEMsT0FBTyxFQUFFLFlBQVk7SUFDckIsR0FBRyxFQUFFLDBCQUEwQjtDQUNoQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsT0FBTyxFQUNMLG9JQUFvSTtJQUN0SSxHQUFHLEVBQUUsMEJBQTBCO0NBQ2hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRztJQUNyQyxPQUFPLEVBQUUsd0JBQXdCO0lBQ2pDLEdBQUcsRUFBRSxvQ0FBb0M7Q0FDMUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFH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R0FBRztJQUMzQixPQUFPLEVBQUUsZUFBZTtJQUN4QixHQUFHLEVBQUUsb0JBQW9CO0NBQzFCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRztJQUNoQyxPQUFPLEVBQ0wsMEVBQTBFO0lBQzVFLFdBQVcsRUFBRTs7MEJBRVc7Q0FDekIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLE9BQU8sRUFDTCw0RkFBNEY7SUFDOUYsV0FBVyxFQUFFOzs4QkFFZTtDQUM3QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsT0FBTyxFQUNMLDhFQUE4RTtJQUNoRixHQUFHLEVBQUUsNEJBQTRCO0NBQ2xDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRztJQUN6QyxPQUFPLEVBQUUsa0JBQWtCO0lBQzNCLEdBQUcsRUFBRSxpQ0FBaUM7Q0FDdkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHO0lBQ3RDLDJCQUEyQjtJQUMzQixPQUFPLEVBQUUsMENBQTBDO0lBQ25ELEdBQUcsRUFBRSxFQUFFO0NBQ1IsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLEdBQUcsRUFBRSx3QkFBd0I7Q0FDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBLOFNfUkVTT1VSQ0VfTkFNRV9CQVNFID0ge1xuICBwYXR0ZXJuOiAvXltcXGRhLXpdKFtcXGRhLXotXSpbXFxkYS16XSk/JC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfazhzX3Jlc291cmNlX25hbWVfYmFzZScsXG59O1xuXG5leHBvcnQgY29uc3QgTE9PU0VfSzhTX1JFU09VUkNFX05BTUVfQkFTRSA9IHtcbiAgcGF0dGVybjogL15bXFxkYS16XShbXFxkYS16LV0qW1xcZGEtel0pPyhcXC5bXFxkYS16XShbXFxkYS16LV0qW1xcZGEtel0pPykqJC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfazhzX3Jlc291cmNlX25hbWVfbG9vc2UnLFxufTtcblxuZXhwb3J0IGNvbnN0IEs4U19DT05GSUdNQVBfS0VZID0ge1xuICBwYXR0ZXJuOiAvXltcXHctXVtcXHcuLV0qJC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfazhzX2NvbmZpZ21hcF9rZXknLFxufTtcblxuZXhwb3J0IGNvbnN0IEs4U19FTlZfVkFSSUFCTEVfTkFNRSA9IHtcbiAgcGF0dGVybjogL15bLkEtWl9hLXotXVtcXHcuLV0qJC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfazhzX2Vudl92YXJpYWJsZV9uYW1lJyxcbn07XG5cbmV4cG9ydCBjb25zdCBJTlRfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL14tP1xcZCskLyxcbiAgdGlwOiAnaW50ZWdlcl9wYXR0ZXJuJyxcbn07XG5cbmV4cG9ydCBjb25zdCBQT1NJVElWRV9JTlRfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL15bMS05XVxcZCokLyxcbiAgdGlwOiAncG9zaXRpdmVfaW50ZWdlcl9wYXR0ZXJuJyxcbn07XG5cbmV4cG9ydCBjb25zdCBQT1NJVElWRV9JTlRfMzJfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjpcbiAgICAvXihcXGR7MSw5fXwxXFxkezl9fDIoMFxcZHs4fXwxKFswLTNdXFxkezd9fDQoWzAtNl1cXGR7Nn18NyhbMC0zXVxcZHs1fXw0KFswLTddXFxkezR9fDgoWzAtMl1cXGR7M318MyhbMC01XVxcZHsyfXw2KFswLTNdXFxkfDRbMC03XSkpKSkpKSkpKSQvLFxuICB0aXA6ICdwb3NpdGl2ZV9pbnRlZ2VyX3BhdHRlcm4nLFxufTtcblxuZXhwb3J0IGNvbnN0IFBPU0lUSVZFX05VTUJFUl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXihbMS05XVxcZCpcXC4/fDBcXC4pXFxkKiQvLFxuICB0aXA6ICdyZWdleHBfdGlwX3Bvc2l0aXZlX251bWJlcl9wYXR0ZXJuJyxcbn07XG5cbmV4cG9ydCBjb25zdCBOQVRVUkFMX05VTUJFUl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXlxcZCskLyxcbiAgdGlwOiAnbmF0dXJhbF9udW1iZXJfcGF0dGVybicsXG59O1xuXG5leHBvcnQgY29uc3QgQVVUT19TQ0FMRVJfQ09PTF9USU1FX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IC9eKFxcZHxbMS05XVxcZHxbMS05XVxcZFxcZHxbMTJdXFxkXFxkXFxkfDNbMC01XVxcZFxcZHwoMzYwMCkpJC8sXG4gIHRpcDogJ25hdHVyYWxfbnVtYmVyX2xlc3NfdGhhbl8zNjAwJyxcbiAgZXJyb3I6ICduYXR1cmFsX251bWJlcl9sZXNzX3RoYW5fMzYwMF9lcnJvcicsXG59O1xuXG5leHBvcnQgY29uc3QgUkVHSVNUUllfUEFUSCA9IHtcbiAgcGF0dGVybjogL15bXFxkYS16XShbXFxkLl9hLXotXSpbXFxkYS16XSk/JC8sXG4gIHRpcDogJ3JlZ2lzdHJ5X3BhdGhfcnVsZScsXG59O1xuXG5leHBvcnQgY29uc3QgSU5HUkVTU19QQVRIX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IC9eXFwvLiovLFxuICB0aXA6ICdpbmdyZXNzX3BhdGhfcGF0dGVybicsXG59O1xuXG5jb25zdCBJUF9QQVRURVJOX0JBU0UgPVxuICAnXig/Oig/OjI1WzAtNV18MlswLTRdXFxcXGR8WzAxXT9cXFxcZHsxLDJ9KVxcXFwuKXszfSg/OjI1WzAtNV18MlswLTRdXFxcXGR8WzAxXT9cXFxcZHsxLDJ9KSQnO1xuXG5leHBvcnQgY29uc3QgSVBfQUREUkVTU19QQVRURVJOID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKElQX1BBVFRFUk5fQkFTRSksXG4gIHRpcDogJ3JlZ2V4cF90aXBfaXBfYWRkcmVzcycsXG59O1xuXG5jb25zdCBJUF9WNl9BRERSRVNTX0JBU0UgPVxuICAnXigoWzAtOWEtZkEtRl17MSw0fTopezd9WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsN306fChbMC05YS1mQS1GXXsxLDR9Oil7MSw2fTpbMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw1fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwyfXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH0oOlswLTlhLWZBLUZdezEsNH0pezEsM318KFswLTlhLWZBLUZdezEsNH06KXsxLDN9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwyfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw1fXxbMC05YS1mQS1GXXsxLDR9OigoOlswLTlhLWZBLUZdezEsNH0pezEsNn0pfDooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDd9fDopfGZlODA6KDpbMC05YS1mQS1GXXswLDR9KXswLDR9JVswLTlhLXpBLVpdK3w6OihmZmZmKDowezEsNH0pPzopPygoMjVbMC01XXwoMlswLTRdfDE/WzAtOV0pP1swLTldKS4pezN9KDI1WzAtNV18KDJbMC00XXwxP1swLTldKT9bMC05XSl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDE/WzAtOV0pP1swLTldKS4pezN9KDI1WzAtNV18KDJbMC00XXwxP1swLTldKT9bMC05XSkpJCc7XG5cbmV4cG9ydCBjb25zdCBJUF9WNl9BRERSRVNTX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IG5ldyBSZWdFeHAoSVBfVjZfQUREUkVTU19CQVNFKSxcbn07XG5cbmV4cG9ydCBjb25zdCBJUF9WNF9PUl9WNl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKGAoJHtJUF9QQVRURVJOX0JBU0V9KXwoJHtJUF9WNl9BRERSRVNTX0JBU0V9KWApLFxufTtcblxuZXhwb3J0IGNvbnN0IElQX0FERFJFU1NfUE9SVF9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiBuZXcgUmVnRXhwKGAke0lQX1BBVFRFUk5fQkFTRS5zbGljZSgwLCAtMSl9KD86OlxcXFxkKyk/JGApLFxuICB0aXA6ICdyZWdleHBfdGlwX2lwX2FkZHJlc3MnLFxufTtcblxuZXhwb3J0IGNvbnN0IFRDUF9BRERSRVNTX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46XG4gICAgL14oPzooPzpbMS05XT9cXGR8MVxcZHsyfXwyWzAtNF1cXGR8MjVbMC01XSlcXC4pezN9KD86WzEtOV0/XFxkfDFcXGR7Mn18MlswLTRdXFxkfDI1WzAtNV0pOlxcZCskLyxcbiAgdGlwOiAnaW5wdXRfdGNwX3BsYWNlaG9sZGVyJyxcbn07XG5cbmV4cG9ydCBjb25zdCBDSURSX0lQX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46XG4gICAgL14oKDIoNVswLTVdfFswLTRdXFxkKSl8MVxcZHsyfXxbMS05XVxcZHxcXGQpKFxcLigoKDIoNVswLTVdfFswLTRdXFxkKSl8MVxcZHsxLDJ9fFsxLTldXFxkfFxcZCkpKXszfSQvLFxufTtcblxuZXhwb3J0IGNvbnN0IENJRFJfRlVMTF9QQVRURU4gPSB7XG4gIHBhdHRlcm46XG4gICAgL14oKDIoNVswLTVdfFswLTRdXFxkKSl8MVxcZHsyfXxbMS05XVxcZHxcXGQpKFxcLigoKDIoNVswLTVdfFswLTRdXFxkKSl8MVxcZHsxLDJ9fFsxLTldXFxkfFxcZCkpKXszfShcXC8oXFxkfFsxMl1cXGR8M1swLTJdKSkkLyxcbiAgdGlwOiAncmVnZXhwX2NpZHJfcGF0dGVybicsXG59O1xuXG5leHBvcnQgY29uc3QgQ0lEUl9QQVRURVJOID0ge1xuICBwYXR0ZXJuOlxuICAgIC9eKCgyKDVbMC01XXxbMC00XVxcZCkpfDFcXGR7Mn18WzEtOV1cXGR8XFxkKShcXC4oKCgyKDVbMC01XXxbMC00XVxcZCkpfDFcXGR7MSwyfXxbMS05XVxcZHxcXGQpKSl7M30oXFwvKFxcZHxbMTJdXFxkfDNbMC0yXSkpPyQvLFxuICB0aXA6ICdyZWdleHBfY2lkcl9wYXR0ZXJuJyxcbn07XG5cbmV4cG9ydCBjb25zdCBSRVNFUlZFRF9JUF9QQVRURVJOID0ge1xuICBwYXR0ZXJuOlxuICAgIC9eKCgyKDVbMC01XXxbMC00XVxcZCkpfDFcXGR7Mn18WzEtOV1cXGR8XFxkKShcXC4oKCgyKDVbMC01XXxbMC00XVxcZCkpfDFcXGR7MSwyfXxbMS05XVxcZHxcXGQpKSl7M30oXFwuXFwuKCgyKDVbMC01XXxbMC00XVxcZCkpfDFcXGR7Mn18WzEtOV1cXGR8XFxkKShcXC4oKCgyKDVbMC01XXxbMC00XVxcZCkpfDFcXGR7MSwyfXxbMS05XVxcZHxcXGQpKSl7M30pPyQvLFxufTtcblxuZXhwb3J0IGNvbnN0IFJFU0VSVkVEX0lQX1NFR01FTlRfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjpcbiAgICAvXigoMig1WzAtNV18WzAtNF1cXGQpKXwxXFxkezJ9fFsxLTldXFxkfFxcZCkoXFwuKCgoMig1WzAtNV18WzAtNF1cXGQpKXwxXFxkezEsMn18WzEtOV1cXGR8XFxkKSkpezN9KFxcLlxcLigoMig1WzAtNV18WzAtNF1cXGQpKXwxXFxkezJ9fFsxLTldXFxkfFxcZCkoXFwuKCgoMig1WzAtNV18WzAtNF1cXGQpKXwxXFxkezEsMn18WzEtOV1cXGR8XFxkKSkpezN9KSQvLFxufTtcblxuZXhwb3J0IGNvbnN0IENVU1RPTV9BTEFSTV9OQU1FX0JBU0UgPSB7XG4gIHBhdHRlcm46IC9eW1xcZGEtel0oW1xcZC5hLXpdKltcXGRhLXpdKT8kLyxcbiAgdGlwOiAnY3VzdG9tX2FsZXJ0X25hbWVfcGxhY2Vob2xkZXInLFxufTtcblxuZXhwb3J0IGNvbnN0IEFMQVJNX0xBQkVMX0tFWV9OQU1FX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46IC9eW0EtWl9hLXpdXFx3KiQvLFxuICB0aXA6ICdyZWdleHBfdGlwX2FsZXJ0X2xhYmVsX2tleV9uYW1lJyxcbn07XG5cbmV4cG9ydCBjb25zdCBBTEFSTV9USFJFU0hPTERfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL14oPyEwXFxkKVxcZHswLDE3fShcXC5cXGR7MSw0fSk/JC8sXG4gIHRpcDogJ3JlZ2V4cF90aXBfYWxlcnRfdGhyZXNob2xkJyxcbn07XG5cbmV4cG9ydCBjb25zdCBBTEFSTV9NRVRSSUNfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL15bXFx1MDAyMC1cXHUwMDdFXSokLyxcbiAgdGlwOiAncmVnZXhwX3RpcF9hbGVydF9tZXRyaWMnLFxufTtcblxuZXhwb3J0IGNvbnN0IEVNQUlMX1BBVFRFUk4gPSB7XG4gIHBhdHRlcm46XG4gICAgL15bXFx3ISMkJSYnKisvPT9eYHt8fX4tXSsoPzpcXC5bXFx3ISMkJSYnKisvPT9eYHt8fX4tXSspKkAoPzpbXFxkQS1aYS16XSg/OltcXGRBLVphLXotXSpbXFxkQS1aYS16XSk/XFwuKStbXFxkQS1aYS16XSg/OltcXGRBLVphLXotXSpbXFxkQS1aYS16XSk/JC8sXG4gIHRpcDogJ2VtYWlsX2Zvcm1hdF9saW1pdCcsXG59O1xuXG5leHBvcnQgY29uc3QgUEhPTkVfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL15cXCs/XFxkezcsMTV9JC8sXG4gIHRpcDogJ3Bob25lX2Zvcm1hdF9saW1pdCcsXG59O1xuXG5leHBvcnQgY29uc3QgUFVCTElDX0tFWV9QQVRURVJOID0ge1xuICBwYXR0ZXJuOlxuICAgIC9eKC17NX1CRUdJTiBDRVJUSUZJQ0FURS17NX1bXFxkXFxuKy89QS1aYS16XSotezV9RU5EIENFUlRJRklDQVRFLXs1fVxcbiopKyQvLFxuICBwbGFjZWhvbGRlcjogYC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRExqQ0NBaFlDQ1FEQU9GOXRMc2FYV2pBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLWAsXG59O1xuXG5leHBvcnQgY29uc3QgUFJJVkFURV9LRVlfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjpcbiAgICAvXigtezV9QkVHSU4gKFJTQSB8RUMgfERTQSApP1BSSVZBVEUgS0VZLXs1fVtcXGRcXG4rLz1BLVphLXpdKi17NX1FTkQgXFwyUFJJVkFURSBLRVktezV9XFxuKikrJC8sXG4gIHBsYWNlaG9sZGVyOiBgLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLVxuTUlJRExqQ0NBaFlDQ1FEQU9GOXRMc2FYV2pBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVxuLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS1gLFxufTtcblxuZXhwb3J0IGNvbnN0IFNUUk9OR19QQVNTV09SRF9QQVRURVJOID0ge1xuICBwYXR0ZXJuOlxuICAgIC9eKD8hXFwvKSg/PS4qW0EtWmEtel0pKD89LipcXGQpKD89LipbISMkJSYnKCkqKywuLzo7PD0+P0BbXFxdXl9ge3x9fi1dKS57OCwzMH0kLyxcbiAgdGlwOiAncmVnZXhwX3RpcF9zdHJvbmdfcGFzc3dvcmQnLFxufTtcblxuZXhwb3J0IGNvbnN0IFBPU0lUSVZFX1BFUkNFTlRBR0VfUEFUVEVSTiA9IHtcbiAgcGF0dGVybjogL14oWzEtOV1cXGQ/fDEwMCkkLyxcbiAgdGlwOiAncmVnZXhwX3Bvc2l0aXZlX3BlcmNlbnRhZ2VfdGlwcycsXG59O1xuXG5leHBvcnQgY29uc3QgQ1VTVE9NX0lORElDQVRPUl9QQVRURVJOID0ge1xuICAvLyBjc3BlbGw6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgcGF0dGVybjogL14oWystXT9bXFxkLl0rKShbRUdLTVBUZWlrbW51XSpbKy1dP1xcZCopJC8sXG4gIHRpcDogJycsXG59O1xuXG5leHBvcnQgY29uc3QgUEFUQ0hfUEFUSF9QQVRURVJOID0ge1xuICBwYXR0ZXJuOiAvXlxcLy4qLyxcbiAgdGlwOiAnb2FtX3BhdGNoX3BhdGhfcGF0dGVybicsXG59O1xuIl19