# ----------------------------------------------------------------------------
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
# CANN Open Software License Agreement Version 2.0 (the "License").
# Please refer to the License for details. You may not use this file except in compliance with the License.
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
# See LICENSE in the root of the software repository for the full text of the License.
# ----------------------------------------------------------------------------

function strip(input) {
    sub("^ +", "", input)
    sub(" +$", "", input)
    return input
}

function check_compatible_le(version_arr, len_version_arr, require_arr, len_require_arr,  i) {
    for (i = 1; i <= len_require_arr; i++) {
        if (require_arr[i] == "") {
            continue
        }
        # len_version_arr lt len_require_arr
        if (i > len_version_arr) {
            return 1
        }
        if (version_arr[i] < require_arr[i]) {
            return 1
        }
        if (version_arr[i] > require_arr[i]) {
            return 0
        }
    }
    if (len_version_arr > len_require_arr) {
        return 1
    }
    # len_version_arr eq len_require_arr
    return 1
}

function check_compatible_lt(version_arr, len_version_arr, require_arr, len_require_arr,  i) {
    for (i = 1; i <= len_require_arr; i++) {
        if (require_arr[i] == "") {
            continue
        }
        # len_version_arr lt len_require_arr
        if (i > len_version_arr) {
            return 1
        }
        if (version_arr[i] < require_arr[i]) {
            return 1
        }
        if (version_arr[i] > require_arr[i]) {
            return 0
        }
    }
    if (len_version_arr > len_require_arr) {
        return 0
    }
    # len_version_arr eq len_require_arr
    return 0
}

function check_compatible_ge(version_arr, len_version_arr, require_arr, len_require_arr,  i) {
    for (i = 1; i <= len_require_arr; i++) {
        if (require_arr[i] == "") {
            continue
        }
        # len_version_arr lt len_require_arr
        if (i > len_version_arr) {
            return 0
        }
        if (version_arr[i] < require_arr[i]) {
            return 0
        }
        if (version_arr[i] > require_arr[i]) {
            return 1
        }
    }
    if (len_version_arr > len_require_arr) {
        return 1
    }
    # len_version_arr eq len_require_arr
    return 1
}

function check_compatible_gt(version_arr, len_version_arr, require_arr, len_require_arr,  i) {
    for (i = 1; i <= len_require_arr; i++) {
        if (require_arr[i] == "") {
            continue
        }
        # len_version_arr lt len_require_arr
        if (i > len_version_arr) {
            return 0
        }
        if (version_arr[i] < require_arr[i]) {
            return 0
        }
        if (version_arr[i] > require_arr[i]) {
            return 1
        }
    }
    if (len_version_arr > len_require_arr) {
        return 1
    }
    # len_version_arr eq len_require_arr
    return 0
}

function check_compatible_eq(version_arr, len_version_arr, require_arr, len_require_arr,  i) {
    for (i = 1; i <= len_require_arr; i++) {
        if (require_arr[i] == "") {
            continue
        }
        # len_version_arr lt len_require_arr
        if (i > len_version_arr) {
            return 0
        }
        if (version_arr[i] != require_arr[i]) {
            return 0
        }
    }
    if (len_version_arr > len_require_arr) {
        return 1
    }
    # len_version_arr eq len_require_arr
    return 1
}

function check_compatible(version_arr, len_version_arr, require,  require_arr, len_require_arr, pos) {
    len_require_arr = split(require, require_arr, ".")

    pos = match(require_arr[1], /^>=/)
    if (pos != 0) {
        require_arr[1] = substr(require_arr[1], pos + RLENGTH)
        return check_compatible_ge(version_arr, len_version_arr, require_arr, len_require_arr)
    }

    pos = match(require_arr[1], /^>/)
    if (pos != 0) {
        require_arr[1] = substr(require_arr[1], pos + RLENGTH)
        return check_compatible_gt(version_arr, len_version_arr, require_arr, len_require_arr)
    }

    pos = match(require_arr[1], /^<=/)
    if (pos != 0) {
        require_arr[1] = substr(require_arr[1], pos + RLENGTH)
        return check_compatible_le(version_arr, len_version_arr, require_arr, len_require_arr)
    }

    pos = match(require_arr[1], /^</)
    if (pos != 0) {
        require_arr[1] = substr(require_arr[1], pos + RLENGTH)
        return check_compatible_lt(version_arr, len_version_arr, require_arr, len_require_arr)
    }

    return check_compatible_eq(version_arr, len_version_arr, require_arr, len_require_arr)
}

BEGIN {
    len_all_required_arr = split(all_required, all_required_arr, ",")

    compated = 0

    in_gt = 0
    matched_gt = 0

    len_version_arr = split(version, version_arr, ".")

    for (i = 1; i <= len_all_required_arr; i++) {
        all_required_arr[i] = strip(all_required_arr[i])
        one_compated = check_compatible(version_arr, len_version_arr, all_required_arr[i])

        pos = match(all_required_arr[i], /^>/)
        if (pos != 0) {
            gt_require = 1
            lt_require = 0
            eq_require = 0
        } else {
            pos = match(all_required_arr[i], /^</)
            if (pos != 0) {
                gt_require = 0
                lt_require = 1
                eq_require = 0
            } else {
                gt_require = 0
                lt_require = 0
                eq_require = 1
            }
        }

        if (matched_gt) {
            if (one_compated) {
                # gt after gt, all compated.
                if (gt_require) {
                    matched_gt = 1
                    in_gt = 1
                    continue
                }
                # lt after gt, all compated.
                if (lt_require) {
                    compated = 1
                    matched_gt = 0
                    in_gt = 0
                    break
                }
                # eq after gt, all compated.
                if (eq_require) {
                    # eq compated, go.
                    compated = 1
                    break
                }
            } else {
                # miscompated.
                # gt after gt, compated first gt. miscompated second gt.
                if (gt_require) {
                    matched_gt = 0
                    in_gt = 1
                    continue
                }
                # lt after gt, compated first gt. miscompated second lt.
                if (lt_require) {
                    matched_gt = 0
                    in_gt = 0
                    continue
                }
                # eq after gt, compated first gt. miscompated second eq.
                if (eq_require) {
                    continue
                }
            }
        } else {
            if (one_compated) {
                if (gt_require) {
                    matched_gt = 1
                    in_gt = 1
                    continue
                }
                if (lt_require) {
                    if (in_gt) {
                        matched_gt = 0
                        in_gt = 0
                        continue
                    } else {
                        compated = 1
                        break
                    }
                }
                if (eq_require) {
                    # eq compated, go.
                    compated = 1
                    break
                }
            } else {
                # miscompated.
                if (gt_require) {
                    matched_gt = 0
                    in_gt = 1
                    continue
                }
                if (lt_require) {
                    matched_gt = 0
                    in_gt = 0
                    continue
                }
                if (eq_require) {
                    continue
                }
            }
        }
    }

    if (matched_gt) {
        compated = 1
    }

    if (compated == 0) {
        printf("F")
    } else {
        printf("T")
    }
}