graph TD
A[START] -->|"load()"| B(View: /)
B --> T{logged in?}
T --> |YES| M(View: /queue)
T --> |NO| L(View: /login)
L --> |"login()"| C{has Profile + User?}
C --> |YES| B
C --> |NO| E(View: /survey?p=1)
E --> |NEXT| F(View: /survey?p=2)
F --> G{survey complete?}
G --> |NO| E
G --> |YES| H(POST: /user)
H --> |SAVE| I(POST: /profile)
I --> |GENERATE| J(POST: /profile/score)
J --> |FORWARD| M
AD --> |NO| AF(show Profile)
AF --> Q{YAY or NAY?}
Q --> |YAY| R(POST: /queue/:tid/delete)
Q --> |NAY| S(POST: /queue/:tid/reinsert)
S --> |NEXT| M
R --> |"joinGrouping()"| U{Grouping exists?}
U --> |YES| V(MATCHED)
U --> |NO| W(Create Grouping + Membership)
W --> |FORWARD| M
V --> |"sendNotification()"| X(Alert Both Profiles)
X --> |FORWARD| Z{Check revealed Tags?}
Z --> |"insertHidden()"| N(View: /matched/:id)
Z --> |"hide()"| N(View: /matched/:id)
N --> |"reveal()"| AA(POST: /tag/reveal)
AA --> |"sendNotifications()"| Z
AA --> |"saveTagAssociation()"| AB(POST: /tag)
N --> |"sendMessage()"| AC(PubNub)
AC --> |"getMessages()"| N
M --> AD{on blocked list?}
AD --> |YES| AE(Hide Profile)
AE --> M