// Exponentiation operator. (2.00)
 
import Foundation
 
precedencegroup ExponentiationPrecedence {
    associativity: right
    higherThan: MultiplicationPrecedence
}
 
infix operator ** : ExponentiationPrecedence
 
func ** <T: BinaryFloatingPoint>(_ x: T, _ y: T) -> Double {
    return pow(Double
(x
), Double
(y
)) }
 
func ** <T: BinaryInteger>(_ x: T, _ y: T) -> Int {
    let base = Int(x)
    let expt = Int(y)
 
    if base == 0 || base == 1 {
        return base
    }
    if base == -1 {
        return expt % 2 == 0 ? 1 : -1
    }
    if expt < 0 {
        return 0
    }
 
    func detail(_ base: Int, _ expt: Int) -> Int {
        switch expt {
        case 0:
            return 1
        case 1:
            return base
        case _ where expt % 2 == 0:
            return detail(base * base, expt / 2)
        default:
            return base * detail(base, expt - 1)
        }
    }
 
    return detail(base, expt)
}
 
// Test.
 
func check<T: Equatable>(_ f: () -> Any, expect: T) {
    let result = f()
    print(result, terminator: "\t")
    if let x = result as? T {
        print(x == expect ? "Pass." : "Fail: \(expect)")
    } else {
        print("Fail: \(type(of: result)) not \(T.self)")
    }
}
 
#if DEBUG
check({2 ** 0},          expect: 2)
check({2 ** Int8(1)},    expect: 2.0)
check({2.0 ** 2},        expect: 4)
#endif
 
check({0 ** 0},          expect: 0)
check({0 ** 1},          expect: 0)
check({1 ** 0},          expect: 1)
check({1 ** 1},          expect: 1)
check({1 ** -1},         expect: 1)
check({1 ** -2},         expect: 1)
 
check({-1 ** 0},         expect: 1)
check({-1 ** 1},         expect: -1)
check({-1 ** 2},         expect: 1)
check({-1 ** -1},        expect: -1)
check({-1 ** -2},        expect: 1)
 
check({-2 ** 0},         expect: 1)
check({-2 ** 1},         expect: -2)
check({-2 ** 2},         expect: 4)
check({-2 ** -1},        expect: 0)
check({-2 ** -2},        expect: 0)
 
check({2 ** 0},          expect: 1)
check({2 ** Int8(1)},    expect: 2)
check({2.0 ** 2},        expect: 4.0)
check({2.0 ** Float(3)}, expect: 8.0)
check({2 ** 4.0},        expect: 16.0)
check({2.0 ** 5.0},      expect: 32.0)
check({2 * 2 ** 4 * 2},  expect: 64)
				Ly8gRXhwb25lbnRpYXRpb24gb3BlcmF0b3IuICgyLjAwKQoKaW1wb3J0IEZvdW5kYXRpb24KCnByZWNlZGVuY2Vncm91cCBFeHBvbmVudGlhdGlvblByZWNlZGVuY2UgewogICAgYXNzb2NpYXRpdml0eTogcmlnaHQKICAgIGhpZ2hlclRoYW46IE11bHRpcGxpY2F0aW9uUHJlY2VkZW5jZQp9CgppbmZpeCBvcGVyYXRvciAqKiA6IEV4cG9uZW50aWF0aW9uUHJlY2VkZW5jZQoKZnVuYyAqKiA8VDogQmluYXJ5RmxvYXRpbmdQb2ludD4oXyB4OiBULCBfIHk6IFQpIC0+IERvdWJsZSB7CiAgICByZXR1cm4gcG93KERvdWJsZSh4KSwgRG91YmxlKHkpKQp9CgpmdW5jICoqIDxUOiBCaW5hcnlJbnRlZ2VyPihfIHg6IFQsIF8geTogVCkgLT4gSW50IHsKICAgIGxldCBiYXNlID0gSW50KHgpCiAgICBsZXQgZXhwdCA9IEludCh5KQoKICAgIGlmIGJhc2UgPT0gMCB8fCBiYXNlID09IDEgewogICAgICAgIHJldHVybiBiYXNlCiAgICB9CiAgICBpZiBiYXNlID09IC0xIHsKICAgICAgICByZXR1cm4gZXhwdCAlIDIgPT0gMCA/IDEgOiAtMQogICAgfQogICAgaWYgZXhwdCA8IDAgewogICAgICAgIHJldHVybiAwCiAgICB9CgogICAgZnVuYyBkZXRhaWwoXyBiYXNlOiBJbnQsIF8gZXhwdDogSW50KSAtPiBJbnQgewogICAgICAgIHN3aXRjaCBleHB0IHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICByZXR1cm4gYmFzZQogICAgICAgIGNhc2UgXyB3aGVyZSBleHB0ICUgMiA9PSAwOgogICAgICAgICAgICByZXR1cm4gZGV0YWlsKGJhc2UgKiBiYXNlLCBleHB0IC8gMikKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gYmFzZSAqIGRldGFpbChiYXNlLCBleHB0IC0gMSkKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGRldGFpbChiYXNlLCBleHB0KQp9CgovLyBUZXN0LgoKZnVuYyBjaGVjazxUOiBFcXVhdGFibGU+KF8gZjogKCkgLT4gQW55LCBleHBlY3Q6IFQpIHsKICAgIGxldCByZXN1bHQgPSBmKCkKICAgIHByaW50KHJlc3VsdCwgdGVybWluYXRvcjogIlx0IikKICAgIGlmIGxldCB4ID0gcmVzdWx0IGFzPyBUIHsKICAgICAgICBwcmludCh4ID09IGV4cGVjdCA/ICJQYXNzLiIgOiAiRmFpbDogXChleHBlY3QpIikKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnQoIkZhaWw6IFwodHlwZShvZjogcmVzdWx0KSkgbm90IFwoVC5zZWxmKSIpCiAgICB9Cn0KCiNpZiBERUJVRwpjaGVjayh7MiAqKiAwfSwgICAgICAgICAgZXhwZWN0OiAyKQpjaGVjayh7MiAqKiBJbnQ4KDEpfSwgICAgZXhwZWN0OiAyLjApCmNoZWNrKHsyLjAgKiogMn0sICAgICAgICBleHBlY3Q6IDQpCiNlbmRpZgoKY2hlY2soezAgKiogMH0sICAgICAgICAgIGV4cGVjdDogMCkKY2hlY2soezAgKiogMX0sICAgICAgICAgIGV4cGVjdDogMCkKY2hlY2soezEgKiogMH0sICAgICAgICAgIGV4cGVjdDogMSkKY2hlY2soezEgKiogMX0sICAgICAgICAgIGV4cGVjdDogMSkKY2hlY2soezEgKiogLTF9LCAgICAgICAgIGV4cGVjdDogMSkKY2hlY2soezEgKiogLTJ9LCAgICAgICAgIGV4cGVjdDogMSkKCmNoZWNrKHstMSAqKiAwfSwgICAgICAgICBleHBlY3Q6IDEpCmNoZWNrKHstMSAqKiAxfSwgICAgICAgICBleHBlY3Q6IC0xKQpjaGVjayh7LTEgKiogMn0sICAgICAgICAgZXhwZWN0OiAxKQpjaGVjayh7LTEgKiogLTF9LCAgICAgICAgZXhwZWN0OiAtMSkKY2hlY2soey0xICoqIC0yfSwgICAgICAgIGV4cGVjdDogMSkKCmNoZWNrKHstMiAqKiAwfSwgICAgICAgICBleHBlY3Q6IDEpCmNoZWNrKHstMiAqKiAxfSwgICAgICAgICBleHBlY3Q6IC0yKQpjaGVjayh7LTIgKiogMn0sICAgICAgICAgZXhwZWN0OiA0KQpjaGVjayh7LTIgKiogLTF9LCAgICAgICAgZXhwZWN0OiAwKQpjaGVjayh7LTIgKiogLTJ9LCAgICAgICAgZXhwZWN0OiAwKQoKY2hlY2soezIgKiogMH0sICAgICAgICAgIGV4cGVjdDogMSkKY2hlY2soezIgKiogSW50OCgxKX0sICAgIGV4cGVjdDogMikKY2hlY2soezIuMCAqKiAyfSwgICAgICAgIGV4cGVjdDogNC4wKQpjaGVjayh7Mi4wICoqIEZsb2F0KDMpfSwgZXhwZWN0OiA4LjApCmNoZWNrKHsyICoqIDQuMH0sICAgICAgICBleHBlY3Q6IDE2LjApCmNoZWNrKHsyLjAgKiogNS4wfSwgICAgICBleHBlY3Q6IDMyLjApCmNoZWNrKHsyICogMiAqKiA0ICogMn0sICBleHBlY3Q6IDY0KQ==