UNPKG

@rdkmaster/jigsaw-labs

Version:

Jigsaw, the next generation component set for RDK

340 lines (306 loc) 49.2 kB
export class CommonUtils { // to avoid compodoc generation error private static _noDataImageSrc = 'data:image/png;base64,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0p8zAAA4amlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTctMDgtMjJUMTU6NDI6MTErMDg6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNy0wOC0yMlQxNTo0MjoyOSswODowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTctMDgtMjJUMTU6NDI6MjkrMDg6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDxwaG90b3Nob3A6SUNDUHJvZmlsZT5zUkdCIElFQzYxOTY2LTIuMTwvcGhvdG9zaG9wOklDQ1Byb2ZpbGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6Mzk5N2M2N2UtY2E3Yi0yMDQ2LTg1M2YtNGFkYzdmMGYwM2NmPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOjM5OTdjNjdlLWNhN2ItMjA0Ni04NTNmLTRhZGM3ZjBmMDNjZjwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOjM5OTdjNjdlLWNhN2ItMjA0Ni04NTNmLTRhZGM3ZjBmMDNjZjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDozOTk3YzY3ZS1jYTdiLTIwNDYtODUzZi00YWRjN2YwZjAzY2Y8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTctMDgtMjJUMTU6NDI6MTErMDg6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE3IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWERpbWVuc2lvbj4yNDk8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MTQzPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz6yYfs9AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAACvGSURBVHja7J1pbFtZlt//3DdRJCVSsiWXRK+1tcty9bTGqMy0Vd0z6cmgnVJnEgRqFGA5X/zBiEuFIE4CGGMJ8IeMEaBVTgzEQICWgZl2vkxaNW5kpibTXXJPTy3qri6qti4vsqh9ocR9e3s+vPvIR4qUqIWPj+I7gCBxf3p8v3v+59xzz9UJggDNNNOstN34KOIG4B855wnU6/9g1L5GzTTb0sbJ7z4Ncs00q29vPQRgbOScJyi7vx/AeQCX6vn/02tfsWaaAQTywI2PIsMEegAYBfBw5JxnrJ7/MZ0Wk2umWc6bDwN4C8AsgACANwCcred4XPPkmmlGbOScJzpyzjME4CyAIAF8FoC73v83zZNrptlmrz4GoB9AFEA3gHsAhkbOeaKaJ9dMs/oHvA/ARQCjI+c8fgAjBPggScRpkFdwEkdvfBQZ1S4nzVRqwwBmR855homMHwbghziVVpfS3agA1H4Ag2RkjALokT3mRompC800q5EX74c4ZfaD4nidXMN1aUp4cj+AGwAmyO0A+QG57wZ5jmaa1doCAN4eOecZP0j/lCKJN5LIuDhyzqMrul8AcG/knGdQu740k+z+ZGgY+QozSSJHZSAGAUwM9PoC2tlSCeSNZnPrMb9C6iTa5XUFDhjggwB+XOHTZwGMARgd6PVFtSuvBpCTBNtbAKYA9JWagrjxUSQA4MxB8egE8AAAl0If+XqX1zVxgCAfg5jd3onFIFanabCXsGon3gIAHgIIbDHHOEGk2EG5UP0KAg4iaw8M5AO9vkECup/I8lL/bx/EBJlkLoi5ncH7k6F+tcj4+5MhN8REc7SWx6RUTO6HuFxvouj+vm0GgHr15pI6qbbFAPi7vK6G814EoH6IU17dRedkaKDXN1bjYxuDWDUnP67hgV7f6IGDnAAeAOAaOefRScX/I+c8UZJ4Kyvl61yylwo9+reB/14Z71XOJg6SVN8DVMPEkxeEMQO9vokaAR7cQs2NDPT6hg+SXJfL13vk9pjsgr9H4q+egyQ5u7yuIPEwxfCPAoiUedlUl9c1CM12I/GH70+Gxsk1JME1fn8y1DPQ6wsqfDij24RrN+5PhsaUPK6qQ04kunzqzC17bJBMrwUa4WLs8rqic+uxcg9HNVxz3tCPwtmJbWPagV5f4P5kqE8Guos4lD6FD7+/6PbbRNWdKXrO6IGBvISNlRgEqimd+4hScO/yLYI7lNBb2Vae+vzcemxonwa8IFET9Qr4TIn7YxBLS8fKyXAC+hDyU3Dn70+G+hSW7XIvfm+g1zdKVMZMKUd3IGLyGsbF/WRAcaEx7eEuXzcBYKxWgwSB9EfbPG0WwGA5eO9PhiaQz74/HOj19Sl4/NGia66UJ1c0Lj+QkBPAf6oJ371FWl1e13ANIPdDXM/QQ0IYN/m71GB9b6DXN1jiPXoAfCq766hSMXCF8/xnlZxSO6iQB1E4raLZ7uxSl9c1phIZ30PgLwZoCkBfcRHM/clQQOY931Zq6ooMUoEtFOQ7A72+ISXPnf4AAt6nAb5vNqyWAxno9QWI1z5aFIqcQekklnxw6lfwOIMQk31TagD8QHpyAvn7Gp/7ZmfVWB9fQhYXzIsXJ/AGen26GqkPN7kZqFXJrdaSWbPtzK3GgyLlr37kE2zDkE2XDfT6gvcnQ7NE1T2s0TGqYnA8iO2fAhBLCDXbHwuq+NgGZX+fJ9VmcusB8A7quOFDVeT6jY8igwCi9bxwfm49NozNZY6a7dwednldfWo+wKIEW01KWdVupeS6n/yuW8i7vK7hufWYG+IyV832oIrIgFkVhbBPmfuo9jU1aEze5XUNkVpxJaWaHztfC61mq+ogSQaQ/j0m9iZkcbkGfCNBTkAPQuFpIDKwjEObxqvEugFMzK3HenZbYUcWp7ghZq8D2iktEZP/+YfhwSJvJ8l1+Ukfq/f9oBQGvQeFFVeabW33tBV41fXkURQu8+yTySAt7tmdggjMrcfuHTDpXk3r105BFT15iez6MJBrKq/Z7r15P7T6+Z0MjDrtLFTHtG2Sqmea+qnctLoGDfK6tB7tFFRs49opqG5MXmwB7bTsWaq7Ia6Yqtg2oklQNLvp/o42dyN4cS00VDIm12xfAB9FhUk3mmEx8fEjBBc3tn1uk8MKp90Cg9EI/7GjaHJYCh53mHUw6oFEMg29wMLpsMLpsKr5dM1i7/Pkmh1EyMlKs2rbjlookWmzHmxuEbyl937vV18hmcru+OAMBgNeePVbm99zdRkrc7MlX+NqacHzzx+H0SgKOItJB4tRh8WlNaRT6Y1Wp/kfLGZj7mCeO9yy0mS3ZKt0frVOszWU62qXwENQqKXTFk0X92wb0SQe/OIz0Axb8nGr1QKbzQqWZZFIpDY9brJYdq6Lw2GsRQ7B4WwW78gKSCXiCH79BABap4F/u81bFK/mkkMaLQr1ojevXNA8tObJdwT4BJTZsKDqRjMsfvJgsizgnUePw+31lXwsm06B4ziYzZaSoHMci9DiArLpNAx6gKEpZDKUODCYLTh15uym95v+8nOlYm859EEUFlwV3w7cvHIhqiHaOJCP4oAsNqEZFg9+MYWNaKrsc/wvvJT3tgpYKhFHKh4Hx7GzDEVZGZq2AADPcTGOY90cy9aqGeYUgEFNERxwyIkXjxxEwI1GA6x2OwwmI5LRGDiOF2PhY8fR3Cp6cptZj06XueB9GF5APMsV3BdJsYr8DwxFgaapwtuUeNtqBCiKQjYr3jbqdYgnkmBZbtef1+Sw4l9/71WYTaqJLGcBjHZ5XaMa5PsHeT8OSOXY3//qy4IsutPdDDOR3FQmi2Q8AQDwelvQfvQUAOB7L3t29VnhdCH0kSRTMEjMblA1OQdSuFFwm+Wg1wFmA5BKpRHeCBe85rDPhQvfUV2kVjf19vWQeOs5CIAXT5M1NTtzgAOA2WoBCOTr62F4u1gYDLv/elrsxi1vN1sN+Hwxrfh5sNodBbeLw5JmAG3dLCKrK1hdXAAALIdi2Igm0epuUtNXenFuPTahlm62W1k9VLxFDwLgj4OreQ/ucsJiK5y/1ul0cDrzAGTi4r+dobmqHFOH2wKbWZ1fv8FghLfjCJyu/ADwaGZVjYeqefL9YqSeAX88s1oAuM1ug9laukBF0OWhS8fCaPJ4MRum8MIhe+5+lhfw+WIKDFcYZrUWeWpPk6msJ2d5Ab+dSyJD86o+d4e7jyPxmbhiN7i4gdfOHlfbIZ7XIN8HI8s2pa6bdQf4xOSjvER32mEpkqtyk0v2UCiM1udYrCX0eOFQ4fPW4sym125KvIWyqHczWSxoanIgmUwhmcqqUbLXxcKaelmgMlRvF2hwcaMAcKvVsiXg5SR7huaRyOYBNup1MOkbZ1Vmc6tXzZJ9QoN8/7z5OMTWunVhG9EkJj7OA26xmGFvdlb02mLJDmBTJryt2dQwkDe5WgoGTpXZqAb5/oI+BOB1AO9CLK98qEa5VFyuarNa4HA1Q6erzPuarfmMeygUBsexm+R5m7NxIJckO4CcZFeJXaqX2vu6Wk/e5XVNdHld/V1eVx/5cQO4pBbYaYbFe7/6Kge4waCH2WGvGPBykp3hBazFaZknN2uSvXYx+LsAXq+HqbNciFfvF0CX1zU2tx4LkPjIVUvAH/xiKreizGgwwOFuzq342omVyrKvJRi0Necr3zo85poVtNRGss/mJHuVs+z3AAx1eV3Rg3L+DkRnGLIeebTWgMvr0XcLeDnJvhilwfL5abNOt7lhJfvSWlX5uwhxUwm3Brn6rGby6YPfThcA3tTs3DXg5SQ7gALJ7rQaG1ayP66+ZO/GAWpJdWAg321z/r1acTVbs7t5UzXbbqxUln0hmoc8nGbB8EIDQZ5feqtQlv08aQSiQa4Wm1uP+RX34J9OFwBud9h31cyhUskeSbGYDCYQTrN4upZBI5nBYITX25ILjxQCvV+DXF02qOSHPZ5ZxRePF3O3bXYbbE2OfXv/cpI9kmLx65mEYktL1WS25vyKvODCOjRrIMiJrBpSEvDiclW7c//LLUtJ9kY2h9ujtGTXIFcJ4INQcPpsaS1aALjZbILZZq/KZ5WS7IDYSOLbJ5vxvZc9+NZRZ8Mk4Gog2aMH4bwZVQJqH/HE7h2+tAcKzo1vRJP4+199lZePVgtszc4dFbvsRrJLjRwz8SiaPF6c8FlhMxsAiKvLGmnO3NbsAdbDOcnu72yt5seNNwzkNz6KjJKY1wWxKmFw5JxnYh/g9kOc+lL9kr3iclWDQV9VwMtJ9iaPV5Psykj2kVrN2Cgu18kGiG/JPGY3gPdvfBTx70McHagHwEuVqza5XVUHvJxkD25QucKYRJbFUoRuGMgNBiNaqy/Z73V5XcONFJMPlbl/cI8eXLE4eq+AF5SrGg1ocrv2VOyyU8nududXsGXiUSSyHH7+uyje+zKCD6YTDTVfDgBWZ96bP55Z2a+3ldelDx6k81XJlVoNEMfqAXAAm8pVbU0OxQCXjINOk+wyc3o8wExestMMu20310beGrmSq/VhGUm9q3iFZMProm3OxMePNpWrmvep2GVHkt1igdFoAMtyuY4xe2nyeFAk+0YuAbeBU0fbt7vuqim/gxC3fQrWK+RDJaT1w5FznrFdfmZ/vQBe3HyxXG82JaypyY5oNJGT7I3uza1OWZZ9cX1byAHcqPYxza3H3gEwrLYVbNvG5CPnPAGIU1VvAxgBcGnknKdvD5/5htovoE++mK24+WKtJHujm9NTmGUvt+WUwvYWVDjtpujmCiSj/qmaL56dNl9U0mIb4dxuJKdeObtvdfL1aiszj3OSva/3+Uq8uVJ2SU1NJZSueHPXE+CVNF9UWrLnvHk8gkY3eZY9uKiqWnZVhaRKZ2+iar1gNqLJAsB30nyxFpI9thGCy3eootdlouuIxZPIptNIJeIAxP3Ni3cz0RsM8Hh9cHpaNn82xyKb3rzjSqn3UcxjeH1Ym58Fw7IVZ9kb0ZkpekZID3VVAv7gF5/lY/Aql6vu1qQsO82wWFxeweGjp7aV7KlEHMEnT0tAy+WAl1s6EccLJSCff/K45PMBwGq34/jLrxTcx1AUFmemSz7fXmLHVoOx9GBhtdu3nElo8bZgdWVN9OYVZNkb0ZnVYth7FypKvpUqV91p80WlJfvM3DyyFIVIaAVtR7becyIb2x8Za7JYgETpxxhqc908TVNlB4Vy9+/EpD3UqEx+ivODT6eRSBVuKmE2G9Hq3jx4OB1WOB1VS6aONzrk42qBnGZYTHz8KAf4XpovKmUMLyBLoFpenN8W8pXltdzfx18+XeAti7chFqEorQwOdXXDZLYgm06B57htPbPZbIHJbAFDV2fhTKmBgmZYfPLlbOUDpsOK5/3tOP18537K/Htq6+Rak62LSXfVM7UGvLiazdXqUTXgkk0/fYpMNguT0YjXzv/RlpL9y19/BI7jYLWacarnWzU53uLtinOgxjeDypeJ/cvlBPYlDDIZ8cMLvXsBfQpiQcy4Gls11+qKHkSNa9dLVbPVA+AA4HE1I5PNgmHZLSV7Np3CyvoaBEGAr7W1ZsdbLjHnKKEAdmrl4GcoCrQsjOA4dpbkHBzZdNpbPOCP/Z8PfnDzyoVxHECryVVNEnB9tQI9uLhRsHqp2d1cV3PO9iYnsCrK8PnZmbKQcxwHSanVywC2UzMYjKUHi80TI93yAWB++kkyk0rK2/n04AB1aJVbzTrDkF7pfojN7BW1Dz6dlsVlNnUBzvPgsxksLyyCTqdKe0abDTZSgRdPJksmvorN5XJBM9FMFgt8hzuK+3UFDur/W9PhndT4DpLFA/1QqIggmcrmFsiYbDb18M0wbCQcNQIARdN4MhPE4fY2psXr27T5mavZyWayWSPHcQgtL3Ad/uOGrd5bEAQagFlDnKih5k3ef0KDvLqwByHugDKq0Efmso16g0EVXwRNUZlENG4rAhPLq2smk9kaczY7C1xxk7PZiLUQAGBuNkh3+I9vGq2W5mdXAbQDQJbhItLfmqE4jp+6eeVCVIP8gJogCDWfE2cZNpWIxoX8bTo3tSUIAhaXFp0n7CcK4mqrzQarxcJlKcqQyWZsDEVtGXY4m92aXpdZPBKelcXpqozFL1+9JuUJuiE2tRi6e/vWWN3E5DW2KRlgtQWcZRELRwCgSQzJuUjXiZM43fMqTHodS56jn5+b35RCdjgcaUBMsC0vzG1ZYeJ0uawa2jLIw2FrHUj1cdlA5ALwYwK+BnkFlvtSqWx2tlYHIQgC4uFoGIBDhJlOdZ046TGaLTCaLXjl1W8Z9QAPAKl0yh5aCxWsMfV4PLkc8tLC3Ka4naFpjeYSxnEsWIaWQpfYzSsXVAf55avX+mSAy62/6Hn+y1ev9V2+es2vQV5oOclDZylnrQCProcXBEFoIYBTnf5jDr2sTttotuD4iZN6aRpsLbTWkslkskWSnQcASbLLLZmIa967hKXi8XQdePFgmfujMsAHITbCeh/AzOWr18Y0yIndvHIhALLhtSAILSzLKg54bCMS5Xn+CABwLJPp9B+zWEps0tDSdgitbhcFCBAEAfNz82Z5WanD4aC2k+wGg6FsuWojWiS0tqF2yO/evhUE8E9Fd8ckB3X56jU3gB8XPX6RKAANcmKj0h/ZdEZRyZ6MxYMcx7nFnAANX0eHzbLFLizHX3jZYjEaswBAM7R+cWExLpPstq0kOwAY9IaGbzAht0wy0VQU96rVJO/zHsSuTP67t29FCeC/KfOaTZA3cnZ9HMCPxLicamtSaO14IhYP0RTtBwCe5+A9dAhNLs/WiRODESdf/Ib1q88D4KFDLBFvbgqHo56WFrck2bMUpS/OsrMMo8n14jwFRYHjOOmEz968ciFYB4f9n+/evhUounaPl3luQPPkeckehJRlFwQbTVV/m6F0MrVOZymfBHizp4VqbqmsIaPD2YzOI100SHy+srrqzmYymWLJvjQ/G8q5AY7T3PemQTZaVqpfv/Ng8PqdB4Hrdx4I1+88GFbB4Urxd48sDndD7HYcA/A/i57/7t3bt8ZV68nvT4b8AHoGen1KyqcxmTdfMlssHdX6oGwmu5RJpTsAQOB5WGxWuqWtfUcQdnT5zdHwBpVIpy0cx2FhfsFw/OQJeDwe20ZYTLwvL87bu0+cKnid2WxOA7BriAPRjVAaQKsc8ut3HgwCGEZhNrtHBYf7W4jLskcvX732byDOwrjJYwsA/guAuxAz7oFSgKsG8vuTITeRIGfuT4YuDfT6xpSW7DRFe6r1IVQmm03FEx1ENcBstUQOdx3d1ee9cPqM5dPJj3hWEPRZmjIvLy5FDnd2eGxWGzLZDDLZjKO4MEav1zMa3mSwTaXky/H81+88mMDmfQBiUHArbLkRTz0EcaWmfI78T4ue+jKACMQmLKN3b9+aKBvuqeTc9yC/vnzwIEl2lmFTyXiClQAXBD57uPvorgcUvcGIky+9nNusOBKLesIb4Q2jwcBKkj04/Xg1Ft5IM6zGdgHg6RQEQZArmhsovdHHUC1i9ctXr/VDnDq7gdJz5KXsDQDvX756bYwMEKqFPFpDmZRTDVSWWtpXwIur2QQu9dyJk3tOhjW7PGhvb2ekabXlleXWdDaTU2VzszPtU59M2qX5dZ1Op9cQB6Ib66sVPO3dm1cujNUA8DEAP8Xul15fBDBRqiJOFV/+QK8vILvpIvG5UpaLY+gs5d6vNxUEAbFwNIOCarZTBcUue7Hu46dMNrM5V9Im77wiCAJoJl/t1uRs1krfACQikew2T5lVUkkWAX5xH97qTCnQ1TTCP5T93VcTyQ7YaYrK7Afg0fXwAgTBBgAsTdHF1Wz7YS+9ctYslb1uZUaTiW10wDmOBU1lcxK4yeVOn3rlLAwGQ0QWh/crvRrt8tVrw0WAS7urjkDstTBV4mVbPccFoEC6q2meXJ4A6ZfLaIUku5hlz2RXzRaLfy+Ab6pmO3Z8y2KX3ZrRbIH/6HH99LOnFa2k89iN+MOTzXBYDHi0ksFv55INA3la1k/OZLaEu0+90LI4M73IcVynLA4PKAx4D/J7tMUADN+9fWu0zPNGSShbciUaqXQbJgydIX8PATVq5FjK7k+GelC4hdLRgV6fIsmP63ce+JHbDBfp1nbfrolMRGNBqdiFZWgc6uoW2zVV0Z58OUWFYzELUBr0bv+x1ZMvnW7/7otutDnzRXE//zqKtTgDj92I777ohsmgw1qifLIukmLBcKWvF5rjEUmXFwxr8domARemnz6LhdePAUD7ka6IwWi0LgWfSdWC925euVALmS45thiAvqKCl1LP95Ny10ql/+t3b9+aUA3kBPQA8ln2dwZ6fUNKffb1Ow9yn+10N2fMFsuOW8YkYvFQrtiF49DS5kOlxS57MZ5j8dknkwzFcqadQh5NsfiXPa0wGWq3pj5FcUjRhVEHzfL4+FkCNLc/1+ejwCdLLMN0AID3cEdsY2XZKAiCA2LDiJ4aAN4HcWEJAJyFmFXvkabCyOOBu7dvRbdRAtG7t28FySo0/93btyZkg8e9u7dvDaot6yqXKm8pnIDLSSAqk13d6YuLq9k8Pm9WCcCBXNmrSY/SQEhLTh+tZHKeeC3BYC3OgOYELESomn7pDosBbU5Twc8RjwWvdjfty/szFAUJcABYX15yEcBjSuZ/ikxSDveIB+9BfipsjAwAPRXwEiCr0QLIJ5Gl9754+eo1t6ogJ0Uw8sUi4wp+fO6zaIpu28kLSTWbVwLcYrPSrlafonXjUtmrIGzOw0XDG26OY7EQofA3gQ383RcR/Px3eQfx0bMEfv51FB8/S+CLxXTZn7UEU/aH4QSo1YpKWeXWV8O2T31yx0Y8+D0itS8S+Ce2eQ9J6f5Y/p5E0kuJ7D41LlAZlMmYM/cnQ2MDvb6qx0s3r1wIXr/zQNrCyU5TVEWSvbiazWK17rqaba/W0eU3r64s0TTLFTRsTGczls8nP8y+cOZVK+wO0CVi57U4gzVsEzcv7u64zAYd3I7yl1q701wyxn+0ktkfyKPhKPKlrJJdUjrRJo+tIRa7zG4Xh+/RaZ0H0KM6yAd6fRP3J0PvQNzQHQAuEtneP9Drq/aoO04gRzadCZstls6tnkyq2RwS4NAhtZdqtv0wg97IAtwmatYjYeuH//g+DHqxcaXDaoHRKBdyOnAAw7J8GgA8zU1mi9mQex9Bp9cB+cD90KF2Pv+YLsPrTDZBpzfIlUUeWGHLxFs1k3LZdCqZjMWKV2y9o0TBC4mr+2Wye4KEhVIYGix67kXkW5RfvHz12tg23lwKby+RvyeQr20PqNmTY6DXN0Tq2aUs4XkAwfuToVEAY1XMuo9L0oehmc6tmjySaracRuUFLtV1/FTNNzPneK78YxyXK5qRF8vIzARScRXfZlPCJ8+eydvcbgqezSbzFgORDnZr4eOCrCjPaDDAJduLXafXcYLOpAeAJodDMBgMsNlt+XOv07O8Pt8Vw2AwwGAwIrqxvhRaWijuvXzv5pULQwoAPipzVJBdxzdkIMsBDoBkw8nrx7B9L/ghWeJtQjZ4FJiqsuvFdn8yNIbSlUBT5ASMFlXL7dmu33mQ8+ZNzc6sRdrFQGY8xyGyEclIxS6k+aJnv4tddmrxaDjz1Zef2+RVrGaTGQ6rGSZjYfolkabB8YXxuyDwYFh11820e9ug33133Skl4nBZ5lxa6CJ52H5yWypdHbl7+9bwPkj/QQBj8uk12TE8VHXTiIFe3+D9ydA4kSLygv0z5Kf//mSob59Bz0FOZbMbFpu1sxAEAbFwdAGCcAQg1WzHjtcccJ5jEV1bYZwOp43jeUAQ8LLfi95TvopevxzO4rPZGNJUXgk0W3VwWQGHRQcDGSNiGQ6JTPmBIEVxBe+xKYfBcKDZ8o9vN9DQNA3r7rrcKAK4lES7fPXaUQDuopg7cPnqtXHk60FeKwFtD7neAwTcAAF5jCiBWYhFM2OXr14bglj04iJevFTuKqr6zjBkffn4/cnQIBkFq70balnJLggCohuRDSWq2XYK+ErwWQw6o8vpaILJoMe55z3wNlcOw+EWK0xGHf7xq3wi+jmPDi5rodd0WY2Ap3qXDcUCWVbYIhwBUtTmx/V6vcAJuiWa5RFJ8y6GKwghqgY4AXAIhdNdAQDjpeJpAu1fAPhPAL5Z9F5uiBnyUfLz1uWr16bINR+DWMbaB7E1849l/9sQNu8+JEn3gKrlehkJ7yYntAfAxH7L9a0kezwSXWRoplNMuilTzVYh4FGWFxMuJoMef/hSK1wO067e771PV3Oe+EynHg6zTvXXhNlsLlig8+USOx9O88/JYvDBKsnyQWxupii3hxDLUAMlYJZq5j2lCl7IcwYJ1AG5HCdSvA9AsNxmC7LKt9frDnIljHQK+TEAmMymxWaPuzMRiy/RWapDismVqmbb0utl0ggtzKV46B37ATgAfBaMYXpF3Gix023guj0wqPm7slgskHfbLQL8nWol2cja759KsTXx3AEit/uId5VCzEvFMF6+eu2vAPyw1GP7cGxukMz93du33EYN6e0lezwSW2NouoMk2aRqNmutAV+ZCzI6vXHfAAeAbp89B3koyTPdHr0qIdfpdDCZTDnAWR74ZI5ZpVlBAvxSlafJpITZD+Rtl4jXDkBs2TRMYA/IpH0/kdIvkZf8N+z/YqxBEqffA1SeXa+xN89J9pw0JtVsh7uOmlUCuGk7wINzi3j8dAbfeOkUOg5VVsgnl+w9Rwywm9T13RiNRuh0OvBkdiBJCcnAAmMQBNiQXzI6Uc1juHz1mgCxmMVfYdw+Wnw9yeztUqvP9urFIdbCB7WOIVt787zlq9lqDXhqbWGeqgRwAFhaWUNwfhE/e+99fDD5KWh6+8KTw568SAmldKqaUzOZTGTAFQFfjvEbgXkGBPBZkmCbUOhwohXG7V8QwFcBvIP8+u9fAogDGN7NHmdlbIx48VEphtcgr+QLVEk1G5VJp9YW500CdJZKJfprvWfxz1//A5jNJnzxu8f4yV8/wOOnM9tK9hzkCU41kJvNZvA8D0l9PlplF5+G2FZBLMaZAtCjYKnqFIAzW8EpS8xJRVL/++7tW0PI15x/G8B/JFBO7BV0kmx7A8BD+fy7Bnlpqd4jj5MEgc8eOXbcUWvAQ4vzFkHQmQHAZTfhO6/4KorB/V2d+OGfXcA3XjwFmmYw8U+TePB3v8BGuLQjcjlMsFvEdA3NCtYsW9vLRKfTwWKx5DLoLA8EFpj5tQQv1TDcg/KLTSR5XbKBIgFWyrz/d/K7n8TtE8gvIPlTiGWpEuh9u5HoZP79Ihl8+uWPa5BvBtxNpLqLxOGR506ctNay2CWdiKdDi/NmXtAZAcDtMOEPX2qF3VJ5TsxsNuG13rP4/vdeR2uLG8urIfz1g/fKSvjDnvwc+1pSqJk3NxgMBQm2FCXgN7P0fCKbS7CN3LxyYVDp1WQkI/4Q+b5qfSVkMwDcB/DnkkiSPU/ytFKcfon8lpab+isEfBBiYu8NiC2h+oqn5LTE22bAJ8gXJ1WzmWtZ7BLbCGUj6+tWPUlye112/Fnfi7CYDKAoCjzPg2YYMAwDnudBVdhW+vOvHuOTqS9A0wwOt/tw4U++UziwUBze+1RcVm826tK/95xe8ZNgNBqJkhKv0fUkn/56heWFfK38pVp0Vi1Kco0j37ZsliS9BpHvNPTw7u1bfcTTSlK6j7x+FPn69rPk9/8A8M/I3++S9w/Katr9ELPz/eSnG1u0jtIg3wx5QAKcY9lsh99vVSvgWxnLsuA4DjTDgGPZ3G+WKywnpWkGn3/1CK0tHvi7Ni+4m/hiHZGkuJDllU4jmszKXSvFBS5zYW5pNsxJjR9iRJ4H1HDdEG86KIP9bZCegcQ8IE0hyO3ctNvlq9ekay6GfFnqTwE8AvD8Nh89SxTD6FYdZDTI84CPkZgGLEOj8+gx1Bjwxcj6eudOAd/OGIYBWwR+Oe//bDWNqRnx2jnkMrLHWgRFYhZ5gQvLA1+vsNORNH9clvDqV/NGhWR+/AaAaYgbE47cvX1rWOa5cz3diBrIqUeImfhvgEyrEXnfg/wSUhB5Htiu35sGeRnAOY5Fa1tbTavZYhuhxdhGuBOkZn6/AN/KeJ4HwzCgZbI/nsri//5mWYyN9Trm97v1VZ0xlwpc5Ak2UuDSLpOvgzXs5rJTyKUa9RjyteQTMs8tB30YhUtTX6+gM0xFptcAfzAkAc7zHFp8vmwtAY9vrC8rDTgA6PV6WCwWOJua4GpuRpvPhxP+5+B1iWqG4wVTnK7eMRiNRhiNxhzgSUpIfjRDp2WA37t55UK/2gEvsq+JpHZBrD2Pkjg6hnw2feju7VtRMrU2QF6X3S/AGx5yUqP+Iwlwu8OheG+2YsCjGxuHJcBf7PYqAvhW9pI/P+CF07pUe3s72tra4PF44Ha74XA44HA4YDabYTbvrk5Iep1U4LIU4+Y/nWeaBCG3E+ulWrRM3oNJgA7K4uw3CNBB4tWnCOg/unz1WpAsG/135Ll/sa8KqVHl+vU7D/pyiRBBgMliSh3uPlazufDl2ZkYQ9EuOeB//K1jNT9P8RSFsb+dApXcgMBS3Pf/4EWDs2n708SyLHiez/3meT7XmUaeUCtOsD1aZRdl89+KlKhWSbJTAMwQp8b8yG+i8A7x2pDVtruKkmk9WyXSNMgrA9xNkhfdEATojYb4kWMnmjXAS9tP/t8XePrFR2DSMQDAqeN+nDpxtOJa+HI5gHg8XpBgm1pgFtO00ClLsA2qJYO+y5hcsrchJs8uyv63IdJc4hUAfwUx2ZYB8Np+N3dsVMiHJJnOsUym+9TztloVu6gdcAAIPFnB+795jGxsFVR0SeA4VgcATU0OnH7xFJ4/cRRms2nXgKcoAVOLzAbH5zqqPkQN9iXbJ8B7ULgTkNxDBwD8EfJlrusAvLLH+6vRvbVRl5r25xM+ppDeYOyqCeDBmVmGYbrVDDgAHOvw4JcmKxzebjjb/PSLLVnLo6czWF4N4cNff4oPf/0pTh33w991pOR8u9wYhkE8Hi9V4CIB/o4SjRarBLgbhctG7wH4FYA3Ic6hF+857iUhySi2mevWIN+D8TzfynMslPbkOcCJqRVwAGh2WOB12bEeS4PnBUtTyyHhwp8c1SWSKXz+1WM8np7B4+kgHk8H8f3vvV5WxmcyGaRSqdztZ+vc6mKUa5c9paYVbPtgwxDns99GPpsOAP9L1kzCTe5zA/iHu7dv/azaB9Xwch0AdAbdwnPHTh5R6vNXZmfmaZp5rh4Al0v2X07NAQA6PJbE7z/fWtD36vHTGVA0U1a6J5NJZLPZXPxdVOCiqgq2vUj1Km6WoEG+Q8jdKKwygt6gm+noPnq0mh6d51iszs2uMmzee337TBd6Th5S/TmTsuwAoNfrqDd6D1fUJVIQBMRisVz8nWUETC2wSzQndMiSUH31EH/L2h+PqxFmTa7L7OaVC1EyhZYDneeEo3NPnqTbOjthdzbbqwH4wvTTBHT6HOB//HvH8KLfWxfnrFiyL4UzQkeLbcsujyzLIhaL5eLvaIZPfbHEIrH6rAMADGbr+zxLX/rRjX8fVTnY/QRueafguoG84ctar995MAz5dIcgwGK3Lbcf6TpcBcCd9Qh4pZJdbhRFIZlM5gBfinHz0yHuOQBYf/IhBL5g9eosGXAnAExUWpNdA7BnISbJxqqVJNMgrx7oPRCzomfyrPPLh57rOrzXRSo8x2Lx2XRYgK6lngEHxI0R7r77ybaSPZVKIZPJb1ZY1EE1xmYTb0ZmA0aIiag+bO6lHyPADykJPEmOjZUAe5yAXZc5A61bqyjfA0S+D4MsEtDp9IdX5ueSTrc72dJ26NBuAV+amV4VoGuvd8ABwGIy4FiHB8+WIuB5wTK7lha62+w6efydSCRAk/3QWR747RyzTuU7qE4B6P+v/+GHQbEbsdhHT7apQB/EopHzENdej2ObTqYEzP4tnjJBfkcrgHSIAF73YDck5NfvPOhHvskdIBZcTJDYaoIkfoZIl9YxAN06nb4pGY01pZOJHSflJMB54WAALtlxAjkAzIVSye42u1OKv5PJZC7BlqSE5GeLDMXxuWKPewCGSiXYiPQdh6x55g4y1aPIr+MuZfLKM10FkI8eBLAbUq7LN0woY9ImihMQmzj+tBBaruKkHJHoywJ0hw8S4MWSHQC++w039OBz02MAsBLnM0/XWE7WweXtm1cujFYxfvbL7iq+nUspyPujN5I1EuRuMur3o3BBQOVWQVKOyqSxFJzJGIwmGwCYTQZ8/7WTOOJrPjDn8mcfPMl585NtxsyhZr1NeqyowKVuF5hokNc/7EME9jO7Y710Uq4YcJNRz/2rbz9vaG/Z3X5pDMOAV8H3I/A8GCafDf96boP+8HerZgAwG3RL3+w2dbCcgN+tsM+SlHBMHn+ruYOLBnnjAN+H8lnerUAvSMoVAw4A3365DT6X5cCdN4bl8TeTi/mLSIcM2dxAsnt1tv5bg1yDvrx8h173zGKx6rOZtFen0+e2y7VbjOF/8c3DLQfxPKUpFn/7yXKph2IQk2tj2tWkQV5P0PfLoO/eyevtFuP0IY+VPeS2ZpNZ1pqi2F11neE4IcpyQnS//q9oivbv9rUUw7MMl6s5l1vdrv/WINdMDr0f+bncHcn7A2wxAKM3r1wY1k5Fg0L+lw8/dyPfgD4GYOjN86fHih4fqsH/Hnjz/OnxEsc7hML2t2WN53hrNkv7WYb1cxx/qFEuGoNBv6LT6bImsylotZmD+/kdVHA9jL55/nRUQ1ddkA+hsNF87M3zp92yL3Sihh7xUtGAM4Z8ix7NFP4OKrwepgD0aaBXbkp0ay32iq6ix/w1/P/7ijxIj3ZJKG49O7we/DW+ZjRPXsKT+yFWkklwv/Pm+dNDssd7kN8hUmm5PlRCKo5VKtc1q8p3sN31MPTm+dMB7dSpCHIZ6H0AoqXiYM0006x69v8HAMmLeT0YN+5UAAAAAElFTkSuQmCC'; public static noDataImageSrc = CommonUtils._noDataImageSrc; private static copy(source: Object, isDeep: boolean): Object { if (this.isUndefined(source) || typeof source !== 'object') { return source; } let copy = (source instanceof Array) ? [] : {}; for (let attr in source) { if (!source.hasOwnProperty(attr)) continue; copy[attr] = isDeep ? CommonUtils.copy(source[attr], true) : source[attr]; } return copy; } /** * 浅拷贝一个对象 * @param source */ public static shallowCopy(source: Object): Object { return CommonUtils.copy(source, false); } /** * 深拷贝一个对象 * @param source */ public static deepCopy(source: Object): Object { return CommonUtils.copy(source, true); } /** * 比较两个对象是否相等,如果提供`trackItemBy`参数,则只比较`trackItemBy`数组列出的属性是否相等; * 如果未提供`trackItemBy`,则按值比较两个对象是否相等。 * * @param item1 待比较的值1 * @param item2 待比较的值2 * @param {string[]} trackItemBy 待比较的属性列表 * @returns {boolean} */ public static compareWithKeyProperty(item1: any, item2: any, trackItemBy: string[]): boolean { if (trackItemBy && trackItemBy.length > 0) { for (let i = 0; i < trackItemBy.length; i++) { if(!item1 || !item2) { // 过滤掉 typeof null == 'object' return false; } else if (typeof item1 === 'object' && typeof item2 === 'object') { if (item1[trackItemBy[i]] != item2[trackItemBy[i]]) { return false; } } else if (typeof item1 !== 'object' && typeof item2 === 'object') { if (item1 != item2[trackItemBy[i]]) { return false; } } else if (typeof item1 === 'object' && typeof item2 !== 'object') { if (item1[trackItemBy[i]] != item2) { return false; } } } return true; } else { return item1 == item2; } } /** * 判断一个对象是否不包含任何属性 * * @param obj * @returns {boolean} */ public static isEmptyObject(obj): boolean { for (let i in obj) return false; return true; } /** * 负责两个对象的合并,将sourceObject 中的属性添加到targetObject 中 * * @param targetObject 要合并的源对象 * @param sourceObject 合并的对象信息 * @returns {Object} 如果`targetObject`非空,则返回`targetObject`,否则返回一个新对象。 */ public static extendObject(targetObject: Object, sourceObject: Object): Object { if (!sourceObject) { return targetObject; } // 目标对象为空,则直接将对象复制给obj if (this.isUndefined(targetObject)) { targetObject = {}; } if (typeof targetObject !== 'object' || typeof sourceObject !== 'object') { return targetObject; } for (let i in sourceObject) { if (!sourceObject.hasOwnProperty(i)) { continue; } if (typeof sourceObject[i] === "object") { // 如果原数据为数组, 已经是属性的值,直接覆盖; if (sourceObject[i] instanceof Array) { targetObject[i] = sourceObject[i]; } else { this.extendObject(targetObject[i], sourceObject[i]); } } else { targetObject[i] = sourceObject[i]; } } return targetObject; } public static extendObjects<T = Object>(targetObject: T, ...sources): T { sources.forEach(s => this.extendObject(targetObject, s)); return targetObject; } /** * 把一个值转为px或% * @param value * @returns string */ public static getCssValue(value: string | number): string { if(CommonUtils.isUndefined(value)) return null; value = typeof value === 'string' ? value : value + ''; const match = value ? value.match(/^\s*\d+\.*\d*\s*$/) : null; return match ? (value + 'px') : value; } /** * * @param element * @param selector 支持'.className' '#id' '[attr]' 'tagName' * @returns {HTMLElement} */ public static getParentNodeBySelector(element: HTMLElement, selector: string): HTMLElement { if (element instanceof HTMLElement) { let parent = element.parentElement; selector = selector.trim(); if (selector.match(/^#.+/)) { selector = selector.replace("#", ''); while (parent && parent.getAttribute('id') !== selector) { parent = parent.parentElement; } return parent; } else if (selector.match(/^\..+/)) { selector = selector.replace(".", ''); while (parent && !parent.classList.contains(selector)) { parent = parent.parentElement; } return parent; } else if (selector.match(/^\[.+\]$/)) { selector = selector.replace(/[\[\]]/g, ''); while (parent && !parent.hasAttribute(selector)) { parent = parent.parentElement; } return parent; } else { while (parent && parent.tagName.toLowerCase() !== selector) { parent = parent.parentElement; } return parent; } } else { return null; } } /** * 获取浏览器的语言,例如 `"zh"` * * @returns string */ public static getBrowserLang(): string { if (typeof window === 'undefined' || typeof window.navigator === 'undefined') { return undefined; } // to avoid compiler mis-error. const w: any = window; let browserLang: any = w.navigator.languages ? w.navigator.languages[0] : null; browserLang = browserLang || w.navigator.language || w.navigator.browserLanguage || w.navigator.userLanguage; if (browserLang.indexOf('-') !== -1) { browserLang = browserLang.split('-')[0]; } if (browserLang.indexOf('_') !== -1) { browserLang = browserLang.split('_')[0]; } return browserLang; } /** * 获取浏览器的语言,例如 `"zh-CN"` * * @returns string */ public static getBrowserCultureLang(): string { if (typeof window === 'undefined' || typeof window.navigator === 'undefined') { return undefined; } // to avoid compiler mis-error. const w: any = window; let browserCultureLang: any = w.navigator.languages ? w.navigator.languages[0] : null; browserCultureLang = browserCultureLang || w.navigator.language || w.navigator.browserLanguage || w.navigator.userLanguage; return browserCultureLang; } /** * 安全的调用一个函数,并返回该函数的返回值。如果该函数执行失败,可以在控制台给出实际的堆栈以协助排查问题 * * @param context 执行函数的上下文 * @param {Function} callback 待执行的回调函数 * @param {any[]} args 传递给回调函数的参数列表 * @returns {any} 返回该函数的返回值 */ public static safeInvokeCallback(context: any, callback: Function, args?: any[]): any { if (CommonUtils.isUndefined(callback)) { return; } try { return callback.apply(context, args); } catch (e) { console.error('invoke callback error: ' + e); console.error(e.stack); } } /** * 可靠的判断一个值是否有效,输入 `""` 和 `0` 均返回true,只有`null`或者`undefined`才会返回false * * @param value 待测验的值 * @returns {boolean} */ public static isDefined(value): boolean { return value !== undefined && value !== null; } /** * 参考 `isDefined` * * @param value * @returns {boolean} */ public static isUndefined(value): boolean { return !this.isDefined(value); } /** * 将url中的参数解析为一个对象 * * @param {string} rawParam 格式为`var1=value1&var2=value2` * @returns {Object} 返回类似`{var1: "value1", var2: "value2"}`的对象 */ public static parseUrlParam(rawParam: string): Object { const result = {}; if (!!rawParam) { rawParam.split(/&/g).forEach(param => { const parts = param.split(/=/); result[this.superDecodeURI(parts[0])] = this.superDecodeURI(parts[1]); }); } return result; } /** * 是浏览器内置uri解码`decodeURI()`函数的火力增强版,可以解码任何uri * * @param {string} uri * @returns {string} */ public static superDecodeURI(uri: string): string { if (!uri) { return uri; } return decodeURI(uri).replace(/%([0-9a-f]{2})/gi, (found, charCode) => String.fromCharCode(parseInt(charCode, 16))); } /** * 判断浏览器是否为IE */ public static isIE(): boolean { return !!navigator.userAgent.match(/MSIE|Trident/g); } public static getBrowserType(): string { if(navigator.userAgent.indexOf("MSIE")!=-1) { return "MSIE"; } if(navigator.userAgent.indexOf("Firefox")!=-1){ return "Firefox"; } if(navigator.userAgent.indexOf("Chrome")!=-1){ return "Chrome"; } if(navigator.userAgent.indexOf("Safari")!=-1) { return "Safari"; } if(navigator.userAgent.indexOf("Opera")!=-1){ return "Opera"; } return null; } public static toTrackByFunction(trackBy: string | string[]) { return function (index: number, item: any) { if (typeof item === 'string') return item; if (!trackBy || !item) return index; let tracker; if (trackBy instanceof Array) { try { tracker = JSON.stringify(trackBy.map(t => item[t] + '')); } catch (e) { console.error('trackBy value must be javascript native object') } } else { tracker = item[trackBy]; } return tracker; } } } export type CallbackRemoval = () => void;