13c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky// RUN: %clang_cc1 %s -verify -fexceptions 20f44b5a85e612e1644d688be93151b22f08604a7Anders Carlssonclass A { 3350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian void f() __attribute__((deprecated)); // expected-note 2 {{declared here}} 40f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson void g(A* a); 5fb7ef75a28af7b6a7f666df2a5db53cf90d957b1Anders Carlsson void h(A* a) __attribute__((deprecated)); 60f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson 7350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian int b __attribute__((deprecated)); // expected-note 2 {{declared here}} 80f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson}; 90f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson 100f44b5a85e612e1644d688be93151b22f08604a7Anders Carlssonvoid A::g(A* a) 110f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson{ 120f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson f(); // expected-warning{{'f' is deprecated}} 130f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson a->f(); // expected-warning{{'f' is deprecated}} 140f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson 150f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson (void)b; // expected-warning{{'b' is deprecated}} 160f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson (void)a->b; // expected-warning{{'b' is deprecated}} 170f44b5a85e612e1644d688be93151b22f08604a7Anders Carlsson} 18fb7ef75a28af7b6a7f666df2a5db53cf90d957b1Anders Carlsson 19fb7ef75a28af7b6a7f666df2a5db53cf90d957b1Anders Carlssonvoid A::h(A* a) 20fb7ef75a28af7b6a7f666df2a5db53cf90d957b1Anders Carlsson{ 21fb7ef75a28af7b6a7f666df2a5db53cf90d957b1Anders Carlsson f(); 22fb7ef75a28af7b6a7f666df2a5db53cf90d957b1Anders Carlsson a->f(); 23fb7ef75a28af7b6a7f666df2a5db53cf90d957b1Anders Carlsson 24fb7ef75a28af7b6a7f666df2a5db53cf90d957b1Anders Carlsson (void)b; 25fb7ef75a28af7b6a7f666df2a5db53cf90d957b1Anders Carlsson (void)a->b; 26fb7ef75a28af7b6a7f666df2a5db53cf90d957b1Anders Carlsson} 270f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson 280f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlssonstruct B { 29350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian virtual void f() __attribute__((deprecated)); // expected-note 4 {{declared here}} 30ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson void g(); 310f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson}; 320f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson 33ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlssonvoid B::g() { 34ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson f(); 35ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson B::f(); // expected-warning{{'f' is deprecated}} 36ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson} 37ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson 380f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlssonstruct C : B { 390f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson virtual void f(); 40ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson void g(); 410f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson}; 420f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson 43ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlssonvoid C::g() { 44ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson f(); 45ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson C::f(); 46ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson B::f(); // expected-warning{{'f' is deprecated}} 47ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson} 48ed90c4ee8cfed90be92741313e1715d308ed2fe3Anders Carlsson 490f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlssonvoid f(B* b, C *c) { 500f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson b->f(); 510f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson b->B::f(); // expected-warning{{'f' is deprecated}} 520f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson 530f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson c->f(); 540f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson c->C::f(); 550f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson c->B::f(); // expected-warning{{'f' is deprecated}} 560f728566b9fc1a013be3c0f3ca43a074307dc081Anders Carlsson} 578195bc932d27e21be46b9a1f8ce268ebd419246bAnders Carlsson 588195bc932d27e21be46b9a1f8ce268ebd419246bAnders Carlssonstruct D { 598195bc932d27e21be46b9a1f8ce268ebd419246bAnders Carlsson virtual void f() __attribute__((deprecated)); 608195bc932d27e21be46b9a1f8ce268ebd419246bAnders Carlsson}; 618195bc932d27e21be46b9a1f8ce268ebd419246bAnders Carlsson 628195bc932d27e21be46b9a1f8ce268ebd419246bAnders Carlssonvoid D::f() { } 638195bc932d27e21be46b9a1f8ce268ebd419246bAnders Carlsson 648195bc932d27e21be46b9a1f8ce268ebd419246bAnders Carlssonvoid f(D* d) { 658195bc932d27e21be46b9a1f8ce268ebd419246bAnders Carlsson d->f(); 668195bc932d27e21be46b9a1f8ce268ebd419246bAnders Carlsson} 67b697e084341185a08b3946df032fbc75f76a66e0John McCall 68b697e084341185a08b3946df032fbc75f76a66e0John McCall 69b697e084341185a08b3946df032fbc75f76a66e0John McCall// Overloaded namespace members. 70b697e084341185a08b3946df032fbc75f76a66e0John McCallnamespace test1 { 71350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian void foo(int) __attribute__((deprecated)); // expected-note {{declared here}} 72b697e084341185a08b3946df032fbc75f76a66e0John McCall void test1() { foo(10); } // expected-warning {{deprecated}} 73350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian void foo(short) __attribute__((deprecated)); // expected-note {{declared here}} 74b697e084341185a08b3946df032fbc75f76a66e0John McCall void test2(short s) { foo(s); } // expected-warning {{deprecated}} 75b697e084341185a08b3946df032fbc75f76a66e0John McCall void foo(long); 76b697e084341185a08b3946df032fbc75f76a66e0John McCall void test3(long l) { foo(l); } 77b697e084341185a08b3946df032fbc75f76a66e0John McCall struct A { 78350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian friend void foo(A*) __attribute__((deprecated)); // expected-note {{declared here}} 79b697e084341185a08b3946df032fbc75f76a66e0John McCall }; 80b697e084341185a08b3946df032fbc75f76a66e0John McCall void test4(A *a) { foo(a); } // expected-warning {{deprecated}} 81b697e084341185a08b3946df032fbc75f76a66e0John McCall 82b697e084341185a08b3946df032fbc75f76a66e0John McCall namespace ns { 83b697e084341185a08b3946df032fbc75f76a66e0John McCall struct Foo {}; 84350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian void foo(const Foo &f) __attribute__((deprecated)); // expected-note {{declared here}} 85b697e084341185a08b3946df032fbc75f76a66e0John McCall } 86b697e084341185a08b3946df032fbc75f76a66e0John McCall void test5() { 87b697e084341185a08b3946df032fbc75f76a66e0John McCall foo(ns::Foo()); // expected-warning {{deprecated}} 88b697e084341185a08b3946df032fbc75f76a66e0John McCall } 89b697e084341185a08b3946df032fbc75f76a66e0John McCall} 90b697e084341185a08b3946df032fbc75f76a66e0John McCall 91b697e084341185a08b3946df032fbc75f76a66e0John McCall// Overloaded class members. 92b697e084341185a08b3946df032fbc75f76a66e0John McCallnamespace test2 { 93b697e084341185a08b3946df032fbc75f76a66e0John McCall struct A { 94350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian void foo(int) __attribute__((deprecated)); // expected-note 2 {{declared here}} 95b697e084341185a08b3946df032fbc75f76a66e0John McCall void foo(long); 96350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian static void bar(int) __attribute__((deprecated)); // expected-note 3 {{declared here}} 97b697e084341185a08b3946df032fbc75f76a66e0John McCall static void bar(long); 98b697e084341185a08b3946df032fbc75f76a66e0John McCall 99b697e084341185a08b3946df032fbc75f76a66e0John McCall void test2(int i, long l); 100b697e084341185a08b3946df032fbc75f76a66e0John McCall }; 101b697e084341185a08b3946df032fbc75f76a66e0John McCall void test1(int i, long l) { 102b697e084341185a08b3946df032fbc75f76a66e0John McCall A a; 103b697e084341185a08b3946df032fbc75f76a66e0John McCall a.foo(i); // expected-warning {{deprecated}} 104b697e084341185a08b3946df032fbc75f76a66e0John McCall a.foo(l); 105b697e084341185a08b3946df032fbc75f76a66e0John McCall a.bar(i); // expected-warning {{deprecated}} 106b697e084341185a08b3946df032fbc75f76a66e0John McCall a.bar(l); 107b697e084341185a08b3946df032fbc75f76a66e0John McCall A::bar(i); // expected-warning {{deprecated}} 108b697e084341185a08b3946df032fbc75f76a66e0John McCall A::bar(l); 109b697e084341185a08b3946df032fbc75f76a66e0John McCall } 110b697e084341185a08b3946df032fbc75f76a66e0John McCall 111b697e084341185a08b3946df032fbc75f76a66e0John McCall void A::test2(int i, long l) { 112b697e084341185a08b3946df032fbc75f76a66e0John McCall foo(i); // expected-warning {{deprecated}} 113b697e084341185a08b3946df032fbc75f76a66e0John McCall foo(l); 114b697e084341185a08b3946df032fbc75f76a66e0John McCall bar(i); // expected-warning {{deprecated}} 115b697e084341185a08b3946df032fbc75f76a66e0John McCall bar(l); 116b697e084341185a08b3946df032fbc75f76a66e0John McCall } 117b697e084341185a08b3946df032fbc75f76a66e0John McCall} 118b697e084341185a08b3946df032fbc75f76a66e0John McCall 119b697e084341185a08b3946df032fbc75f76a66e0John McCall// Overloaded operators. 120b697e084341185a08b3946df032fbc75f76a66e0John McCallnamespace test3 { 121b697e084341185a08b3946df032fbc75f76a66e0John McCall struct A { 122b697e084341185a08b3946df032fbc75f76a66e0John McCall void operator*(const A &); 123350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian void operator*(int) __attribute__((deprecated)); // expected-note {{declared here}} 124b697e084341185a08b3946df032fbc75f76a66e0John McCall void operator-(const A &) const; 125b697e084341185a08b3946df032fbc75f76a66e0John McCall }; 126b697e084341185a08b3946df032fbc75f76a66e0John McCall void operator+(const A &, const A &); 127350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian void operator+(const A &, int) __attribute__((deprecated)); // expected-note {{declared here}} 128350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian void operator-(const A &, int) __attribute__((deprecated)); // expected-note {{declared here}} 129b697e084341185a08b3946df032fbc75f76a66e0John McCall 130b697e084341185a08b3946df032fbc75f76a66e0John McCall void test() { 131b697e084341185a08b3946df032fbc75f76a66e0John McCall A a, b; 132b697e084341185a08b3946df032fbc75f76a66e0John McCall a + b; 133b697e084341185a08b3946df032fbc75f76a66e0John McCall a + 1; // expected-warning {{deprecated}} 134b697e084341185a08b3946df032fbc75f76a66e0John McCall a - b; 135b697e084341185a08b3946df032fbc75f76a66e0John McCall a - 1; // expected-warning {{deprecated}} 136b697e084341185a08b3946df032fbc75f76a66e0John McCall a * b; 137b697e084341185a08b3946df032fbc75f76a66e0John McCall a * 1; // expected-warning {{deprecated}} 138b697e084341185a08b3946df032fbc75f76a66e0John McCall } 139b697e084341185a08b3946df032fbc75f76a66e0John McCall} 140b697e084341185a08b3946df032fbc75f76a66e0John McCall 141b697e084341185a08b3946df032fbc75f76a66e0John McCall// Overloaded operator call. 142b697e084341185a08b3946df032fbc75f76a66e0John McCallnamespace test4 { 143b697e084341185a08b3946df032fbc75f76a66e0John McCall struct A { 144b697e084341185a08b3946df032fbc75f76a66e0John McCall typedef void (*intfn)(int); 145b697e084341185a08b3946df032fbc75f76a66e0John McCall typedef void (*unintfn)(unsigned); 146350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian operator intfn() __attribute__((deprecated)); // expected-note {{declared here}} 147b697e084341185a08b3946df032fbc75f76a66e0John McCall operator unintfn(); 148350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian void operator ()(A &) __attribute__((deprecated)); // expected-note {{declared here}} 149b697e084341185a08b3946df032fbc75f76a66e0John McCall void operator ()(const A &); 150b697e084341185a08b3946df032fbc75f76a66e0John McCall }; 151b697e084341185a08b3946df032fbc75f76a66e0John McCall 152b697e084341185a08b3946df032fbc75f76a66e0John McCall void test() { 153b697e084341185a08b3946df032fbc75f76a66e0John McCall A a; 154b697e084341185a08b3946df032fbc75f76a66e0John McCall a(1); // expected-warning {{deprecated}} 155b697e084341185a08b3946df032fbc75f76a66e0John McCall a(1U); 156b697e084341185a08b3946df032fbc75f76a66e0John McCall 157b697e084341185a08b3946df032fbc75f76a66e0John McCall A &b = a; 158b697e084341185a08b3946df032fbc75f76a66e0John McCall const A &c = a; 159b697e084341185a08b3946df032fbc75f76a66e0John McCall a(b); // expected-warning {{deprecated}} 160b697e084341185a08b3946df032fbc75f76a66e0John McCall a(c); 161b697e084341185a08b3946df032fbc75f76a66e0John McCall } 162b697e084341185a08b3946df032fbc75f76a66e0John McCall} 163b697e084341185a08b3946df032fbc75f76a66e0John McCall 164b697e084341185a08b3946df032fbc75f76a66e0John McCallnamespace test5 { 165b697e084341185a08b3946df032fbc75f76a66e0John McCall struct A { 166c3b2308f66fe8abd2c1a911b500c0b989c295819Eli Friedman operator int() __attribute__((deprecated)); // expected-note 3 {{declared here}} 167b697e084341185a08b3946df032fbc75f76a66e0John McCall operator long(); 168b697e084341185a08b3946df032fbc75f76a66e0John McCall }; 169b697e084341185a08b3946df032fbc75f76a66e0John McCall void test1(A a) { 170b697e084341185a08b3946df032fbc75f76a66e0John McCall int i = a; // expected-warning {{deprecated}} 171b697e084341185a08b3946df032fbc75f76a66e0John McCall long l = a; 172b697e084341185a08b3946df032fbc75f76a66e0John McCall } 173b697e084341185a08b3946df032fbc75f76a66e0John McCall 174b697e084341185a08b3946df032fbc75f76a66e0John McCall void foo(int); 175b697e084341185a08b3946df032fbc75f76a66e0John McCall void foo(void*); 176b697e084341185a08b3946df032fbc75f76a66e0John McCall void bar(long); 177b697e084341185a08b3946df032fbc75f76a66e0John McCall void bar(void*); 178b697e084341185a08b3946df032fbc75f76a66e0John McCall void test2(A a) { 179b697e084341185a08b3946df032fbc75f76a66e0John McCall foo(a); // expected-warning {{deprecated}} 180b697e084341185a08b3946df032fbc75f76a66e0John McCall bar(a); 181b697e084341185a08b3946df032fbc75f76a66e0John McCall } 182b697e084341185a08b3946df032fbc75f76a66e0John McCall 183b697e084341185a08b3946df032fbc75f76a66e0John McCall struct B { 184b697e084341185a08b3946df032fbc75f76a66e0John McCall int myInt; 185b697e084341185a08b3946df032fbc75f76a66e0John McCall long myLong; 186b697e084341185a08b3946df032fbc75f76a66e0John McCall 187b697e084341185a08b3946df032fbc75f76a66e0John McCall B(A &a) : 188b697e084341185a08b3946df032fbc75f76a66e0John McCall myInt(a), // expected-warning {{deprecated}} 189b697e084341185a08b3946df032fbc75f76a66e0John McCall myLong(a) 190b697e084341185a08b3946df032fbc75f76a66e0John McCall {} 191b697e084341185a08b3946df032fbc75f76a66e0John McCall }; 192b697e084341185a08b3946df032fbc75f76a66e0John McCall} 1935b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall 1945b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall// rdar://problem/8518751 1955b629aa86c987f276d00453b6c9ab8424f7903feJohn McCallnamespace test6 { 196350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian enum __attribute__((deprecated)) A { // expected-note {{declared here}} 197350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian a0 // expected-note {{declared here}} 1985b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall }; 1995b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall void testA() { 2005b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall A x; // expected-warning {{'A' is deprecated}} 20139b4fc888d2b9b8fe1a9c982964b5054ba1c3c73Fariborz Jahanian x = a0; // expected-warning {{'a0' is deprecated}} 2025b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall } 2035b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall 2045b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall enum B { 205350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian b0 __attribute__((deprecated)), // expected-note {{declared here}} 2065b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall b1 2075b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall }; 2085b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall void testB() { 2095b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall B x; 2105b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall x = b0; // expected-warning {{'b0' is deprecated}} 2115b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall x = b1; 2125b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall } 2135b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall 2145b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall template <class T> struct C { 215350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian enum __attribute__((deprecated)) Enum { // expected-note {{declared here}} 216350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian c0 // expected-note {{declared here}} 2175b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall }; 2185b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall }; 2195b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall void testC() { 2205b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall C<int>::Enum x; // expected-warning {{'Enum' is deprecated}} 22139b4fc888d2b9b8fe1a9c982964b5054ba1c3c73Fariborz Jahanian x = C<int>::c0; // expected-warning {{'c0' is deprecated}} 2225b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall } 2235b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall 2245b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall template <class T> struct D { 2255b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall enum Enum { 2265b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall d0, 227350e956532d99ce2e804a478df5b6f1f5e096d88Fariborz Jahanian d1 __attribute__((deprecated)), // expected-note {{declared here}} 2285b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall }; 2295b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall }; 2305b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall void testD() { 2315b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall D<int>::Enum x; 2325b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall x = D<int>::d0; 2335b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall x = D<int>::d1; // expected-warning {{'d1' is deprecated}} 2345b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall } 2355b629aa86c987f276d00453b6c9ab8424f7903feJohn McCall} 2363c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky 2373c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewyckynamespace test7 { 2383c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky struct X { 2399efe057ac090ed0d45a64b82e68c74e52c67ed91Nick Lewycky void* operator new(typeof(sizeof(void*))) __attribute__((deprecated)); // expected-note{{'operator new' declared here}} 2403c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky void operator delete(void *) __attribute__((deprecated)); // expected-note{{'operator delete' declared here}} 2413c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky }; 2423c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky 2433c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky void test() { 2443c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky X *x = new X; // expected-warning{{'operator new' is deprecated}} expected-warning{{'operator delete' is deprecated}} 2453c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky } 2463c86a5c2f60d4f68afde96e2138b6933b30d6aa8Nick Lewycky} 247