gophering on
HN Gopher Feed (2017-11-02) - page 1 of 10
How Adversarial Attacks Work
133 points by lainon
aidenn0 - 19 minutes ago
ELI5: Why are adversarial attacks not preventable by adding
unpredictable noise to untrusted inputs?
  Houshalter - moments ago
  The attacks are resistant to noise, or at least can made to be
  so. If every single input is tweaked in exactly the right
  direction, noise won't undo that. Most inputs will still be
  pointing in the adversarial direction. The noise will move some
  inputs back to their original position, but others will be pushed
  even further into adversarial territory.
ChuckMcM - 2 hours ago
This weakness is one that I think will plague self driving cars as
sign recognition will be key and without some ability to insure
that they cannot be dangerously fooled, it will be hard to get them
certified. The canonical example is to make a no left turn sign
recognize as a no right turn sign and have the car go the wrong way
on a one way street.Clearly there is a marketing opportunity for
t-shirts that make you recognize as other things. Who doesn't want
to show up in an image search for toasters on Google Images ?
:-)But my current best guess on how this issue will be addressed
will be with classifier diversity an voting systems. While that
just moves the problem into a harder and harder to synthesize data
set (something that not only is adversarial to one classifier but
gives the same answer on several), I believe it will get us to the
point where we can trust the level of work to defeat them is
sufficiently hard to make it a non-threat.
  projectileboy - 2 hours ago
  One possible mitigation could be the use of geocoded roadway
  metadata. I rented a car in France that had this - it would let
  me know when I was exceeding the speed limit based on my
  position. Not hyper-accurate, and so probably not a replacement
  for all road signs, but certainly good enough for many
    smogcutter - 1 hours ago
    Was thinking of this too, but what happens when the map and
    "ground truth" disagree? The machine would need to be able to
    identify the rare circumstances when it should trust the map
    over its senses. If it's capable of that, this wouldn't be a
    problem in the first place.
sandGorgon - 2 hours ago
Can such methods be used to "fingerprint" proprietary datasets by
tainting them ? For example, i want to make sure that my dataset is
not stolen and used by someone else (Waymo?). So I taint it using
an adversarial method and create a "canary test set" that will
uniquely identify if my dataset has been used in some training.
trott - 4 hours ago
Very recently, it was found that changing a single, carefully
placed, pixel is enough to confuse NN classifiers.
yters - 3 hours ago
Ah, this is why AlphaGo won't release their source code or
models.If all ML algorithms can be fooled so trivially, this shows
the human mind is not an ML algorithm.
  munificent - 3 hours ago
  I think your logic is:1. All ML algorithms can be fooled
  trivially. 2. The human mind cannot be fooled trivially. 3.
  Therefore, the human mind is not an ML algorithm.But claim number
  2 is clearly wrong. Human minds are trivially fooled. Here's
  content/uploads/2012/02/Paralle...This is exactly what an optical
  illusion is.
    YeGoblynQueenne - 2 hours ago
    The problem with optical illusions like that is that they are,
    in their vast majority, made of abstract shapes. Most of them
    play with our perception of distance and depth - and the
    majority again work on two dimensions, only.It's really hard to
    imagine an optical illusion that makes you mistake objects in
    the physical world for something else- say, panda for a lawn
    mower or a car for a pigeon, or something like that.Note that I
    don't agree that this tells us anything about whether the human
    brain (or mind) is "like" a machine learning algorithm. To me
    this question has about as much meaning as asking if the brain
    is "like" quicksort.The physical substrates are so clearly
    different that the only comparison you can make is on the level
    of capabilities (say, both are Turing-equivalent etc) not that
    of actual structures. Like, where's the 1's and 0's in the
      throwaway613834 - 1 hours ago
      > It's really hard to imagine an optical illusion that makes
      you mistake objects in the physical world for something else-
      say, panda for a lawn mower or a car for a pigeon, or
      something like that.Sure but people do, for example, mistake
      each others' faces or voices. You don't need to mistake your
      friend for a lawnmower for it to be dangerous.Also, for
      example, I often mishear my own name when someone else is
      speaking. Might not happen with every name but it does with
        YeGoblynQueenne - 2 minutes ago
        Well, people misidentify others when viewing conditions are
        poor or when they dont' know the other person well. For
        instance, say my mother was standing in front of me in
        broad daylight and I was given half a second to look at her
        face; I really don't see how I'd fail to identify here,
        unless her face had changed drastically for some reason.So,
        to be fair, this too is a different thing than what we're
        talking about.
      jpttsn - 1 hours ago
        YeGoblynQueenne - 12 minutes ago
        Again, this is an optical illusion that fools depth
        perception. It doesn't make you see the T-Rex as a tea-pot,
        say.Different things.
      munificent - 1 hours ago
      > It's really hard to imagine an optical illusion that makes
      you mistake objects in the physical world for something else-
      say, panda for a lawn mower or a car for a pigeon, or
      something like that.Here's a physical object that makes you
      mistake an insect for a
        romaniv - 51 minutes ago
        Problem is, mimicry involves copying essential properties
        of the target object: color, texture, shape, movement
        dynamics and so on. It relies on true ambiguity.
        Adversarial examples against neural networks (the
        interesting ones, anyway) involve a combination of
        insignificant, seemingly random permutations that only work
        in their totality. That's a very important difference.
        YeGoblynQueenne - 11 minutes ago
        What romaniv said- it's a different thing.
    schoen - 3 hours ago
    Yes, when I read "Humans have no problem correctly interpreting
    adversarial examples, so there must be a way to do it
    automatically" in the article I thought "aren't optical
    illusions adversarial examples for human perception?" and also
    "maybe we just haven't found the other kinds of adversarial
    examples that work against human perception because we can't
    show humans sufficiently large numbers of examples and measure
    the humans' responses accurately enough".But the optical
    illusion example seems very strong because if you say that
    human perception includes abilities to classify things, there
    are many examples just like your link that show cases where the
    classification routinely goes wrong.It seems possible to me
    that there are as-yet undiscovered adversarial examples in
    human perception that we simply don't have any feasible way to
    search for, and may never be able to construct practical
    examples of. (It would probably be extremely unnerving to
    experience one in real life.)
      yters - 2 hours ago
      Optical illusions are reverse adversarial examples to those
      who think the human mind is a deep neural network.
    romaniv - 35 minutes ago
    The comparison in disingenuous. This illusion has nothing to do
    with image classification and heavily relies on adding
    misleading context to the object to alter the perception of one
    of its properties. Most optical illusions are like that. That
    is not what is being done with adversarial examples.
    danharaj - 3 hours ago
    Cool illusion; I figured it out and so will most humans. I
    don't think the claim that these sorts of illusions are of the
    same nature as, say, single pixel attacks against neural
    networks is justified. On the other hand, it is also true that
    it's not clear whether such attacks on our current crop of
    primitive neural networks will work on more advanced autonomous
    systems that regulate themselves.
      yters - 2 hours ago
      In theory it seems that with sufficient understanding of any
      ML system, regardless of sophistication, such examples can be
      constructed.  It is essentially the brain in the vat problem.
      Computers have no access to objective reality, whereas we
      cannot say the same regarding the human mind without making
      strong assumptions about the nature of the human mind.To put
      this in comp sci language, we can think of DNNs as proofs
      that certain inputs belong to certain classes.  Since no
      proof system can be both complete and consistent, something
      outside the proof system can always either provide unprovable
      examples or adversarial examples.
        danharaj - 2 hours ago
        I think the proper test is how stable the learning system
        is in the face of adversarial examples. I have no
        indications either way that we could, using current ideas,
        create a system that learns and is autonomous like a human
        brain while regulating itself from going too far off the
        rails. An optical illusion won't lead to you thinking
        you're the king of France, nor do there seem to be
        basilisks that will actually crash a brain.It remains to be
        seen if the same holds for artificial learning systems. Of
        course! The gap between current learning systems and even
        the brain of a rodent is vast and we have yet no idea how
        to get there.
          yters - 1 hours ago
          The incompleteness/inconsistency theorem I mention seems
          to indicate no such ML system is possible. It will either
          encounter examples it cannot deal with, or it will be
          deceived.  ML can only be guaranteed to work within very
          limited domains.
          munificent - 1 hours ago
          > An optical illusion won't lead to you thinking you're
          the king of FranceI'm not sure what you're getting at
          here. By definition, optical illusions are perceptual
          mistakes limited to the optical system.It is certainly
          possible for an optical illusion to trick someone into
          doing something they don't intend to do because they are
          fooled into believing the illusion. Imagine painting a
          set of stairs with a disorienting pattern of shading that
          makes them appear off, leading you to trip and fall down
          them.I don't think it's necessarily for a perceptual
          illusion to hijack your entire belief system in order to
          be considered an effective adversarial attack.
          yters - 1 hours ago
          The whole point of these examples is the DNN gives
          erroneous classifications with near complete certainty.
          This looks to me like hijacking a belief system.
    yters - 3 hours ago
    In order for optical illusions to be a counter example, I must
    believe those lines are not parallel with near certainty. While
    I perceive them as such, I don't believe they are.  The fact
    that I can know my perception does not match reality is what
    gives optical illusions their novelty.  Thus, the very nature
    of optical illusions makes them not a counter example.A true
    counter example must be similar to making me believe a car is a
    toaster by manipulating a single cone cell in my eye.  Such a
    possibility is absurd, which leads me to conclude the human
    mind is not ML.
  j2kun - 3 hours ago
  Take care, the original authors were being overly broad when they
  implied "all ML algorithms" can be fooled in this way.Not that I
  disagree with your conclusion. Just the hypothesis.
    yters - 2 hours ago
    All ML algorithms are either inconsistent or incomplete, which
    we know a priori.  Insofar as ML tries to be complete, it will
    be inconsistent, as we see with adversarial examples.
  maltalex - 3 hours ago
  > this shows the human mind is not an ML algorithm.not
  necessarily.Humans have a lot more knowledge about contextual
  information that today's ML often misses. For every "image" you
  classify you use a LOT of side data. That side data has also been
  acquired through learning.Even if your actually saw a 1,000,000$
  check or a 200 km/h speed limit, you'd know it's probably
  nonsense. Based on your life experience so far, you know that
  there's no way that mom just gave you a 1,000,000$ check, or that
  the city decided to turn that small residential street into a
  racing track. An image classification ML algorithm doesn't know
  any of that.
    no_flags - 2 hours ago
    What about the Sylvester Stallone/Keanu Reeves example? It was
    just a zoomed in head shot. That seems like an example where
    humans do a lot better without help from any additional
drudru11 - 1 hours ago
ATMs using neural nets - lol - nope. That is a stretch.
  genericpseudo - 38 minutes ago
  Effective counterexample: the
neptvn - 3 hours ago
> Apart from the fact that nobody wants to risk having false
positives, there?s a simple argument as old as machine learning
itself: whatever a human can do, a machine can be taught to do.
Humans have no problem correctly interpreting adversarial examples,
so there must be a way to do it automatically.So by all means, the
authors (and a vast majority of researchers) seem to be confident
that ML/DL is the road to AGI, hence can "solve" human intelligence
(given it is computational)? For how long are we gonna drag the
adage that mimicking a human (Turing test) is equal to reaching
human levels of intelligence?
  zardo - 2 hours ago
  >Humans have no problem correctly interpreting adversarial
  examples, so there must be a way to do it automatically.Not true,
  we just have different priors and are fooled in different ways.
  See stage magic, optical illusions, etc...
    throwaway613834 - 2 hours ago
    > Not true, we just have different priors and are fooled in
    different ways. See stage magic, optical illusions, etc...But
    we can often recognize them as such, which is important.
    Actually, on that note, is there work on making machines being
    able to recognize magic tricks?
  moxious - 3 hours ago
  It is not true that whatever a human can do, a machine can be
  taught to do.  The human must have insight into HOW they do it in
  order to teach it, or otherwise come up with some new algorithm.
  There are a large class of things humans do that they don't
  understand the mechanics behind, and for which there also aren't
  algorithms.I'm not talking empathy or philosophy.  How about just
  folding laundry.  Not just one type, not in a controlled
  environment, but folding any laundry anywhere.
joe_the_user - 3 hours ago
"Recent studies by Google Brain have shown that any machine
learning classifier can be tricked to give incorrect predictions"--
That has to be an overly broad statement (edit: it might true if
you say "neural nets" or something specific instead). I would
assume they mean any standard deep learning system and maybe any
system that is more or less "generalized regression" but that
couldn't be "any machine learning system", I mean one could imagine
a deterministic model that couldn't be "tricked".Plus a link would
be good (it's not around the quote, I don't know if it's elsewhere
in the article).
  obastani - 3 hours ago
  I think they might be referring [1], which shows that adversarial
  examples transfer to models such as decision trees and SVMs.[1]
  alexbeloi - 3 hours ago
  >I mean one could imagine a deterministic model that couldn't be
  "tricked".The models in reference are deterministic, most models
  for classification/regression are deterministic.Adversarial
  attacks are showing that the models are chaotic (in the dynamical
  systems sense), they're very sensitive to their inputs.edit: Not
  all models have this issue, it's been shown that all the typical
  image based convolutional neural networks are susceptible to this
  issue. My guess is that it's a more general problem of high
  dimensional inputs.
    xapata - 2 hours ago
    We've known for decades that NNs are prone to overfit. This is
    just another example of it. With great variance comes great ...
    uh ... susceptibility to unusual future inputs?
    joe_the_user - 3 hours ago
    Yeah, my complaint is that they're using the generic phrase
    "machine learning" for specific deep learning and other neural
    net methods. Certainly, a wide class of "black box" algorithms
    can be fooled, mostly because they extrapolate in surprising
    and paradoxical ways.
  anishathalye - 3 hours ago
  It's probably referencing Szegedy et al. 2013
  zitterbewegung - 3 hours ago
  No system is 100% secure. What they mean is you can train an
  adversarial input that would work with a deep learning system and
  this can fool other machine learning systems. Or that you can
  create a deep learning system that would fool another (you use a
  GAN to make forgeries to fool your target ).
    joe_the_user - 3 hours ago
    "Machine learning" is a broader category than "deep learning",
    just saying.
    j2kun - 3 hours ago
    > No [machine learning] system is 100% secure.That is what's
    being claimed without proof, when they meant "existing neural
    network systems are known to be insecure"
      LolWolf - 1 hours ago
      Sure, you can't claim that every machine learning system is
      susceptible to this attack (here's one that isn't, a model
      that always returns the same class on all inputs).But (apart
      from obvious trivialities) I suspect this is a more general
      problem with interesting properties?the claim the GP is
      making boils down to something like: a non-trivial[0] machine
      learning model with large parameter space is, with vanishing
      probability (as the number of distinct training samples
      increases), robust to classes of eps-bounded attacks.[1] This
      seems like a provable claim that is well-defined and (in a
      weird, handwavy 'intuitive' kind of way) likely to be true...
      there are just way too many parameters and too much
      uncertainty in the local minima that we reach when training
      from such classes of examples to have 'robustness'.Perhaps
      I'm totally wrong, though, and someone will come up with a
      regularizer that prevents all of this from happening, but
      this seems highly not obvious to me, at first glance.---[0]
      Non-trivial means that, say, it has non-vanishing curvature
      (Fisher information, assuming the model returns a vector of
      probabilities) almost everywhere. I hate to be so nitpicky,
      but I suspect someone would soon comment asking for
      definitions of all of these things and that the problem isn't
      'well-defined.'[1] Given a (large enough) set of inputs, the
      max-norm difference between at least one input and the
      adversarial example must be ?eps. In other words, if we want
      the model to misclassify 'turtle' with 'dog', we don't just
      give a dog picture---the adversarial picture must look like a
      turtle in a mathematical sense.
  bertil - 3 hours ago
  It could be this:
  fool-neural-nets...It is impressive, but that came out a couple
  of days ago and is not reviewed yet, as far as I can tell.It?s
  not obvious from the URL but two of the authors were interns at
  Google, which could explain why they describe some aspects of
  InceptionV3 as white-box (because it's not clear if they have re-
  trained it themselves).
d--b - 35 minutes ago
Research is needed in that area, but surely adding some noise /
blurring to sample during training and during recognition should
help reduce the feasibility of the attack. Isn't that the
case?Adversarial attacks seem to point to overtraining in some
eroccatlun - 3 hours ago
Does the adversarial attack require access to the model making the
predictions?It seems like the attack relies on `doping` the input
with features present in a different target, or by masking features
of the existing target.Could you so specifically attack a target
without knowledge of its features?
dontreact - 3 hours ago
I don?t buy any of the attacks listed here or see how the examples
being imperceptible is actually a factor.If you have the ability to
modify the check why not make it actually look like it?s for a
1000000 dollars (ie even to a human).If you are going to go out and
replace speed limit signs to fool self driving cars, it?s probably
equally dangerous whether or not the change is obvious, because if
it?s way out of bounds a car won?t do it but if it isn?t then it
would also fool humans.Anyone have some more realistic attacks that
are specifically possible due to the imperceptible nature of the
changes in the input? Most of the harm I?ve heard in examples
simply comes from the fact that if you are controlling the input to
an ml system, out can get it to do whatever you want even without
using any of these techniques: just actually change the class of
the input.
  squeaky-clean - 3 hours ago
  > If you have the ability to modify the check why not make it
  actually look like it?s for a 1000000 dollars (ie even to a
  human).Plausible deniability? "I don't know why it took $1
  million for a $100 check, look the check clearly says $100 on it,
  I didn't edit it. Must be a bank glitch."
    rtkwe - 2 hours ago
    All the deposit systems I've used recently still require you to
    enter the deposit amount so if you're entering 1000000 for a
    check that 'clearly' says 100 you lose all plausible
    deniability because you're actively lying to the bank at that
      throwaway613834 - 2 hours ago
      Huh, I'd always wondered why they ask you to enter the
      number. Thanks for pointing this out!
  maltalex - 3 hours ago
  > If you have the ability to modify the check why not make it
  actually look like it?s for a 1000000 dollars (ie even to a
  human).Humans are harder to fool. But some bank apps allow you to
  deposit a check by photographing it. Such apps would be fairly
  easy to attack.If you limit yourself to making 100$ checks become
  1000$ checks and not 1,000,000$ checks, you might even get away
  with it.
    c22 - 2 hours ago
    A few years back a friend of mine was depositing a $300.00
    check at Chase. When the teller asked him how she could help he
    said "Oh, just depositing this three thousand dollars." She
    punched in the deposit for $3000.00 and gave him a receipt. It
    was corrected within 24 hours but the receipt and printout of
    his bank statement was a great conversation piece. I doubt they
    would have let him just walk away with the money, nevermind
    multiple times.
pdeburen - 1 hours ago
While it's true that these attacks work well on state-of-the-art
models, there are defence strategies such as including adversial
examples during training. Advanced defence strategies such as are robust to a wide array of
attacks and achieve very competitive error rates.I'm not saying
it's not a problem but there are successful defence strategies
already in place for many attacks.
  LolWolf - 1 hours ago
  > Although our models are more vulnerable to white-box FGSM
  samples compared to the v3adv model, ensemble adversarial
  training significantly increases robustness to black-box attacks
  that transfer FGSM samples crafted on the holdout Inception
  v4.So, I just train my new adversary on the "new" model that was
  trained on the previous adversarial examples. And now we're back
  to square one.I suspect the problem of adversarial attacks is a
  problem of high-dimensional spaces, not of training on particular
    pdeburen - 50 minutes ago
    I'm not sure how the quote supports your argument. Adversial
    examples generalize well accross many different
    classifiers.Shallow NN's can be fooled just as well, it seems
    to be more of a problem of linear models in general. Apparently
    Geoff Hintons Capsule Networks are more robust due to being
    "less linear" (Ian Goodfellow mentioned this in a recent talk,
    don't have the references now to back it up)
naveen99 - 2 hours ago
Don't you need access to the classifier internals to train the
adversarial network ?  Nobody is going to publish the network
weights for a check reading machine...
  Winterflow3r - 2 hours ago
  No, this paper by Papernot et al shows how to do blackbox attacks
  without knowledge of model internals.
    naveen99 - 28 minutes ago
    Thanks.  But they still need to be able to use the black box a
    brute force number of times on shady inputs and get detailed
    outputs during their gradient descent.  Not going to be allowed
    on a check reader or anything sensitive.
matt4077 - 3 hours ago
> Lately, safety concerns about AI were revolving around ethics ?
today we are going to talk about more pressuring[sic] and real
issues.Nice how this casually demeans peoples' worries. Of course,
the (demonstrated) idea that ML algorithm would pick up on, and
amplify, discrimination (among other things) isn't "real" to these
guys.Risk-scoring of loan applications actually happens to be one
of the few uses of ML in the non-tec sector, and it's incredibly
likely that some of them are already denying people's application
because they happen to be named "La David" and not "Emil". But
maybe the authors just don't consider "ethics" to ever be a "real"
problem?But "change a single pixel and the ATM gives you
$1,000,000" is, apparently, a "real" and "pressing" problem.
lazugod - 3 hours ago
Adversarial attacks sound useful. How can we make it illegal to
prevent them?
  matt4077 - 2 hours ago
  I may not completely understand the question, but I'm pretty sure
  "Intentionally fooling an algorithm for nefarious purposes is
  illegal" is both the answer, and the status quo.
mLuby - 3 hours ago
Am I the only one who thinks "adversarial attack" is both a
redundant and unhelpful name?- Redundant: Anyone who attacks you is
by definition your adversary.- Unhelpful: According to the article,
"designing an input in a specific way to get the wrong result from
the model is called an adversarial attack." That sounds much closer
to spoofing attack ("a situation in which one person or program
successfully masquerades as another by falsifying data"
-Wikipedia). For example, a turtle masquerades as a gun by spoofing
the machine learning system by changing irrelevant visual details.
  tlb - 3 hours ago
  Adversarial means something specific in the ML community.
scrooched_moose - 3 hours ago
Is there any reason to think this would work at all in the real
world? All of these "attacks" require complete control of the image
being fed to the classifier.In the ATM example you don't directly
load an image of the check to the computer inside the machine. You
design a check in photoshop, add the noise, print it out, feed it
to the machine, which takes a picture of the check. Mobile bank
apps still require you to take a picture of the check so you don't
have enough control there either.Similarly in the road sign
example; the lighting, angle between car and sign, dirt on the
sign, etc all mean the car sees a much different image than you
designed.I'd think all of these steps mean the classifier gets a
dramatically different image than you intend and the attack fails.
There's maybe a vanishingly small probability it works when the
stars align, but that could be easily mitigated by taking multiple
consecutive images and looking for an odd results.
  anishathalye - 3 hours ago
  Goodfellow et al. demonstrate that adversarial misclassification
  works in the physical world: --
  a printed image is consistently misclassified (demo here: work by me and
  some friends demonstrates that physical-world adversarial
  examples can actually be made quite robust, and you can
  synthesize 3D adversarial objects as well, and make them
  consistently classify as a desired target class:
    scrooched_moose - 2 hours ago
    Thanks for the links and great work! I hadn't seen any research
    on it making the jump to the real world yet.
    mikepurvis - 2 hours ago
    I wouldn't have believed but for those videos. Fascinating
  ronald_raygun - 2 hours ago
  Another example where they 3d printed a turtle to fool classifier
    not_that_noob - 2 hours ago
    Slick! 84% success rate in the real world, and a simple clever
    technique. Basically use another DNN to reverse-engineer the
    target, find weaknesses using the substitute and then use those
    examples to make attack vectors. Without a robust mathematical
    framework to understand why a DNN behaves as it does, this is
    almost impossible to guard against.From the abstract:  "Machine
    learning (ML) models, e.g., deep neural networks (DNNs), are
    vulnerable to adversarial examples: malicious inputs modified
    to yield erroneous model outputs, while appearing unmodified to
    human observers. Potential attacks include having malicious
    content like malware identified as legitimate or controlling
    vehicle behavior. Yet, all existing adversarial example attacks
    require knowledge of either the model internals or its training
    data. We introduce the first practical demonstration of an
    attacker controlling a remotely hosted DNN with no such
    knowledge. Indeed, the only capability of our black-box
    adversary is to observe labels given by the DNN to chosen
    inputs. Our attack strategy consists in training a local model
    to substitute for the target DNN, using inputs synthetically
    generated by an adversary and labeled by the target DNN. We use
    the local substitute to craft adversarial examples, and find
    that they are misclassified by the targeted DNN. To perform a
    real-world and properly-blinded evaluation, we attack a DNN
    hosted by MetaMind, an online deep learning API. We find that
    their DNN misclassifies 84.24% of the adversarial examples
    crafted with our substitute. We demonstrate the general
    applicability of our strategy to many ML techniques by
    conducting the same attack against models hosted by Amazon and
    Google, using logistic regression substitutes. They yield
    adversarial examples misclassified by Amazon and Google at
    rates of 96.19% and 88.94%. We also find that this black-box
    attack strategy is capable of evading defense strategies
    previously found to make adversarial example crafting harder."
    fenwick67 - 1 hours ago
    Wow this is incredible