diff --git a/Rechnungseingang/src/main/resources/DMN_HoeheRechnungssumme.dmn b/Rechnungseingang/src/main/resources/DMN_HoeheRechnungssumme.dmn new file mode 100644 index 0000000..9dcdbc9 --- /dev/null +++ b/Rechnungseingang/src/main/resources/DMN_HoeheRechnungssumme.dmn @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + >= 10000 + + + false + + + + + < 10000 + + + true + + + + + diff --git a/Rechnungseingang/src/main/resources/DMN_Zahlungsziel.dmn b/Rechnungseingang/src/main/resources/DMN_Zahlungsziel.dmn new file mode 100644 index 0000000..1d75243 --- /dev/null +++ b/Rechnungseingang/src/main/resources/DMN_Zahlungsziel.dmn @@ -0,0 +1,29 @@ + + + + + + + + + + + + + DayDiff(FormField_date_Zahlungsziel, Today()) <= 1 + + + true + + + + + DayDiff(FormField_date_Zahlungsziel, Today()) > 1 + + + false + + + + + diff --git a/Rechnungseingang/src/main/resources/process.bpmn b/Rechnungseingang/src/main/resources/process.bpmn index 404475f..457ba93 100644 --- a/Rechnungseingang/src/main/resources/process.bpmn +++ b/Rechnungseingang/src/main/resources/process.bpmn @@ -1,5 +1,5 @@ - + @@ -11,49 +11,54 @@ - - Activity_1nxd2jr - Event_1mwritv - Gateway_07mt2sj + + Gateway_Lieferscheinpruefen + Activity_1b029kn + Event_0p7ms1x + Activity_0snbir8 - - Gateway_12i5die - Activity_0vq3ho7 - Activity_0jdjg2h - Gateway_0lfg2b2 - Event_1czv0yh - Activity_1x7zph6 - Gateway_1y79rn0 - Gateway_01r6r9e - Activity_108exu6 + + Activity_1ovc6n5 + Event_1350hwr Activity_1uloahn Gateway_1m9g2lh Activity_14ny5c3 Activity_060riuq - Gateway_0slfj8c + Gateway_Zahlungsziel Activity_0pq4lxv Event_1wc0kk6 - Gateway_0ufclm7 + Gateway_Formalpruefen - - Activity_1ovc6n5 - Event_1350hwr + + Gateway_HoeheRechnungssumme + Activity_0vq3ho7 + Activity_0jdjg2h + Gateway_0lfg2b2 + Event_1czv0yh + Gateway_1y79rn0 + Gateway_01r6r9e + Activity_108exu6 + Activity_1x7zph6 - - Gateway_14wptg0 - Activity_1b029kn - Event_0p7ms1x - Activity_0snbir8 + + Activity_1nxd2jr + Event_1mwritv + Gateway_Vorgangfreigeben - + Flow_17ny5uv Flow_1aijtcn Flow_1kjf7y9 + + + + + Flow_0bvc46v Flow_17ny5uv @@ -85,6 +90,12 @@ + + + + + + Flow_1kjf7y9 Flow_11zwlrd @@ -112,12 +123,17 @@ DataObjectReference_0plzlak - + Flow_0uk4now Flow_0fpeqn8 Flow_1wh7ll1 + + + + + Flow_11zwlrd Flow_1dqx4w4 @@ -130,7 +146,7 @@ Flow_1r20qxv - + Flow_1dqx4w4 Flow_1a5ycoj Flow_1r20qxv @@ -139,16 +155,16 @@ - + Flow_1hogzdg Flow_1sjj2gm Flow_06iwtj7 - + Flow_1fwe2w7 Flow_0uk4now - + Flow_1mj7tm1 Flow_1hogzdg @@ -158,6 +174,11 @@ Flow_1mj7tm1 + + + + + Flow_1sjj2gm Flow_0ivc5ab @@ -165,7 +186,7 @@ Flow_0dub3tg - + Flow_0ivc5ab Flow_0dub3tg Flow_0a59c48 @@ -173,15 +194,6 @@ Flow_0vok3bx - - Flow_0p94qch - Flow_0vok3bx - - - DataObjectReference_08ly05s - Property_00cbv43 - - Flow_00dngjn Flow_1jt6q3y @@ -194,15 +206,6 @@ - - Flow_0zftkwh - Flow_0p94qch - - - DataObjectReference_0fpian9 - Property_0u4bllb - - @@ -213,7 +216,7 @@ - + Flow_145gpqj Flow_0bvc46v @@ -232,34 +235,72 @@ Flow_145gpqj - - - - - - - - - - - - - - - - - - - - - - - - - - - + + Flow_0zftkwh + Flow_0p94qch + + + DataObjectReference_0fpian9 + Property_1froj4a + + + + Flow_0p94qch + Flow_0vok3bx + + + DataObjectReference_08ly05s + Property_1lqg73b + + + + #{FormField_Bool_Lieferscheinpruefen} + + + + #{not FormField_Bool_Lieferscheinpruefen} + + + + + + #{not FormField_Boolean_HoeheRechnungssumme} + + + + + + #{FormField_bool_Zahlungsziel} + + + #{not FormField_bool_Zahlungsziel} + + + + + #{not FormField_bool_Formalpruefen} + + + #{FormField_bool_Formalpruefen} + + + + #{FormField_Boolean_HoeheRechnungssumme} + + + + + + #{not FormField_bool_Vorgangpruefen} + + + #{FormField_bool_Vorgangpruefen} + + + + + Nachricht an den Einkauf @@ -279,13 +320,13 @@ eingegangen - + Flow_0kd9ypk - + Flow_0kd9ypk @@ -296,8 +337,8 @@ eingegangen Flow_05nfk8a - + @@ -312,477 +353,476 @@ eingegangen Flow_02liz1g - + + - + - + - + - + - + - - - - - - - - - - - - - - - - + - - + + - - + + - - + + - - + + - - - + + + - + - - + + - + - - + + - - - + + + - - - + + + - - - + + + - + - - + + - - - + + + - + - - + + - + - - + + - - - - + + + + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - - - + + + - - - + + + - + - - + + - - + + - - + + - - + + - + - - + + - - + + - + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - - + + - - - - + - + - + - + - + - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - - - - - - + + - - + + + + + + + - + - - + + - - + + - + - + - + - + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Rechnungseingang/src/main/webapp/forms/RechnungScannen.html b/Rechnungseingang/src/main/webapp/forms/RechnungScannen.html new file mode 100644 index 0000000..68f6071 --- /dev/null +++ b/Rechnungseingang/src/main/webapp/forms/RechnungScannen.html @@ -0,0 +1,6 @@ +
+ +
diff --git a/Rechnungseingang/target/Rechnungseingang.war b/Rechnungseingang/target/Rechnungseingang.war new file mode 100644 index 0000000..41e9397 Binary files /dev/null and b/Rechnungseingang/target/Rechnungseingang.war differ diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_HoeheRechnungssumme.dmn b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_HoeheRechnungssumme.dmn new file mode 100644 index 0000000..9dcdbc9 --- /dev/null +++ b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_HoeheRechnungssumme.dmn @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + >= 10000 + + + false + + + + + < 10000 + + + true + + + + + diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_Zahlungsziel.dmn b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_Zahlungsziel.dmn new file mode 100644 index 0000000..1d75243 --- /dev/null +++ b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_Zahlungsziel.dmn @@ -0,0 +1,29 @@ + + + + + + + + + + + + + DayDiff(FormField_date_Zahlungsziel, Today()) <= 1 + + + true + + + + + DayDiff(FormField_date_Zahlungsziel, Today()) > 1 + + + false + + + + + diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/META-INF/processes.xml b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/META-INF/processes.xml new file mode 100644 index 0000000..417f437 --- /dev/null +++ b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/META-INF/processes.xml @@ -0,0 +1,14 @@ + + + + + default + + false + true + + + + diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/CamundaBpmProcessApplication.class b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/CamundaBpmProcessApplication.class new file mode 100644 index 0000000..da208fb Binary files /dev/null and b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/CamundaBpmProcessApplication.class differ diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/LoggerDelegate.class b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/LoggerDelegate.class new file mode 100644 index 0000000..5d5eb26 Binary files /dev/null and b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/LoggerDelegate.class differ diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/process.bpmn b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/process.bpmn new file mode 100644 index 0000000..457ba93 --- /dev/null +++ b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/process.bpmn @@ -0,0 +1,829 @@ + + + + + + + + + + + + + + + Gateway_Lieferscheinpruefen + Activity_1b029kn + Event_0p7ms1x + Activity_0snbir8 + + + Activity_1ovc6n5 + Event_1350hwr + + + Activity_1uloahn + Gateway_1m9g2lh + Activity_14ny5c3 + Activity_060riuq + Gateway_Zahlungsziel + Activity_0pq4lxv + Event_1wc0kk6 + Gateway_Formalpruefen + + + Gateway_HoeheRechnungssumme + Activity_0vq3ho7 + Activity_0jdjg2h + Gateway_0lfg2b2 + Event_1czv0yh + Gateway_1y79rn0 + Gateway_01r6r9e + Activity_108exu6 + Activity_1x7zph6 + + + Activity_1nxd2jr + Event_1mwritv + Gateway_Vorgangfreigeben + + + + Flow_17ny5uv + Flow_1aijtcn + Flow_1kjf7y9 + + + + + + + + Flow_0bvc46v + Flow_17ny5uv + + + DataObjectReference_1anpq9i + Property_09aqjdw + + + DataObjectReference_1xniyui + Property_09aqjdw + + + + Flow_1kx09zm + + + + Flow_1aijtcn + Flow_1kx09zm + + + DataObjectReference_07vv3e8 + Property_0v9359q + + + DataObjectReference_1at71qu + + + + + + + + + + + + Flow_1kjf7y9 + Flow_11zwlrd + + + DataObjectReference_1dwjb3m + Property_1963d32 + + + + Flow_1g8ipne + Flow_1h6imqg + Flow_1jt6q3y + + + Flow_1wh7ll1 + Flow_1h6imqg + + DataObjectReference_0plzlak + + + + Flow_0fpeqn8 + Flow_1g8ipne + + DataObjectReference_0plzlak + + + + Flow_0uk4now + Flow_0fpeqn8 + Flow_1wh7ll1 + + + + + + + + Flow_11zwlrd + Flow_1dqx4w4 + + + DataObjectReference_10dir96 + Property_16649me + + + + Flow_1r20qxv + + + + Flow_1dqx4w4 + Flow_1a5ycoj + Flow_1r20qxv + + + + + + + Flow_1hogzdg + Flow_1sjj2gm + Flow_06iwtj7 + + + Flow_1fwe2w7 + Flow_0uk4now + + + Flow_1mj7tm1 + Flow_1hogzdg + + + Flow_1a5ycoj + Flow_1fwe2w7 + Flow_1mj7tm1 + + + + + + + + Flow_1sjj2gm + Flow_0ivc5ab + + + Flow_0dub3tg + + + + Flow_0ivc5ab + Flow_0dub3tg + Flow_0a59c48 + + + Flow_0vok3bx + + + Flow_00dngjn + Flow_1jt6q3y + Flow_0zftkwh + + + Flow_0a59c48 + Flow_06iwtj7 + Flow_00dngjn + + + + + + + + + + + + + + + Flow_145gpqj + Flow_0bvc46v + + + DataObjectReference_0aikf8k + Property_19sm0wk + + + DataObjectReference_0tpk221 + + + + + + + + Flow_145gpqj + + + Flow_0zftkwh + Flow_0p94qch + + + DataObjectReference_0fpian9 + Property_1froj4a + + + + Flow_0p94qch + Flow_0vok3bx + + + DataObjectReference_08ly05s + Property_1lqg73b + + + + + #{FormField_Bool_Lieferscheinpruefen} + + + + #{not FormField_Bool_Lieferscheinpruefen} + + + + + + #{not FormField_Boolean_HoeheRechnungssumme} + + + + + + #{FormField_bool_Zahlungsziel} + + + #{not FormField_bool_Zahlungsziel} + + + + + #{not FormField_bool_Formalpruefen} + + + #{FormField_bool_Formalpruefen} + + + + #{FormField_Boolean_HoeheRechnungssumme} + + + + + + #{not FormField_bool_Vorgangpruefen} + + + #{FormField_bool_Vorgangpruefen} + + + + + + + Nachricht an den Einkauf + + + Rechnung  +eingegangen + + + Nachricht an Einkauf + + + Nachricht an den Einkauf + + + Vorgang automatisch freigegeben + + + + + + + + + + Flow_0kd9ypk + + + + Flow_0kd9ypk + Flow_05nfk8a + + + + Flow_05nfk8a + + + + + + + + Flow_1lvm3gr + + + + Flow_1lvm3gr + Flow_02liz1g + + + Flow_02liz1g + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Rechnungseingang/target/Rechnungseingang/forms/RechnungScannen.html b/Rechnungseingang/target/Rechnungseingang/forms/RechnungScannen.html new file mode 100644 index 0000000..68f6071 --- /dev/null +++ b/Rechnungseingang/target/Rechnungseingang/forms/RechnungScannen.html @@ -0,0 +1,6 @@ +
+ +
diff --git a/Rechnungseingang/target/Rechnungseingang/forms/start-form.html b/Rechnungseingang/target/Rechnungseingang/forms/start-form.html new file mode 100644 index 0000000..ef755f0 --- /dev/null +++ b/Rechnungseingang/target/Rechnungseingang/forms/start-form.html @@ -0,0 +1,24 @@ +Here you would put the actual form to start the process + +

+ You can use this form through Camunda Tasklist + by setting the formKey of a BPMN Start Event to: + embedded:app:forms/start-form.html +

+ +
+
+ +
+ +
+
+ + +
\ No newline at end of file diff --git a/Rechnungseingang/target/Rechnungseingang/forms/task-form.html b/Rechnungseingang/target/Rechnungseingang/forms/task-form.html new file mode 100644 index 0000000..2977392 --- /dev/null +++ b/Rechnungseingang/target/Rechnungseingang/forms/task-form.html @@ -0,0 +1,33 @@ +Here you would put the actual form to work on the task + +

+ You can use this form through Camunda Tasklist + by setting the formKey of a BPMN User Task to: + embedded:app:forms/task-form.html +

+ +
+
+ +
+ +
+
+
+ +
+ +
+
+ + +
\ No newline at end of file diff --git a/Rechnungseingang/target/classes/DMN_HoeheRechnungssumme.dmn b/Rechnungseingang/target/classes/DMN_HoeheRechnungssumme.dmn new file mode 100644 index 0000000..9dcdbc9 --- /dev/null +++ b/Rechnungseingang/target/classes/DMN_HoeheRechnungssumme.dmn @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + >= 10000 + + + false + + + + + < 10000 + + + true + + + + + diff --git a/Rechnungseingang/target/classes/DMN_Zahlungsziel.dmn b/Rechnungseingang/target/classes/DMN_Zahlungsziel.dmn new file mode 100644 index 0000000..1d75243 --- /dev/null +++ b/Rechnungseingang/target/classes/DMN_Zahlungsziel.dmn @@ -0,0 +1,29 @@ + + + + + + + + + + + + + DayDiff(FormField_date_Zahlungsziel, Today()) <= 1 + + + true + + + + + DayDiff(FormField_date_Zahlungsziel, Today()) > 1 + + + false + + + + + diff --git a/Rechnungseingang/target/classes/process.bpmn b/Rechnungseingang/target/classes/process.bpmn index 404475f..457ba93 100644 --- a/Rechnungseingang/target/classes/process.bpmn +++ b/Rechnungseingang/target/classes/process.bpmn @@ -1,5 +1,5 @@ - + @@ -11,49 +11,54 @@ - - Activity_1nxd2jr - Event_1mwritv - Gateway_07mt2sj + + Gateway_Lieferscheinpruefen + Activity_1b029kn + Event_0p7ms1x + Activity_0snbir8 - - Gateway_12i5die - Activity_0vq3ho7 - Activity_0jdjg2h - Gateway_0lfg2b2 - Event_1czv0yh - Activity_1x7zph6 - Gateway_1y79rn0 - Gateway_01r6r9e - Activity_108exu6 + + Activity_1ovc6n5 + Event_1350hwr Activity_1uloahn Gateway_1m9g2lh Activity_14ny5c3 Activity_060riuq - Gateway_0slfj8c + Gateway_Zahlungsziel Activity_0pq4lxv Event_1wc0kk6 - Gateway_0ufclm7 + Gateway_Formalpruefen - - Activity_1ovc6n5 - Event_1350hwr + + Gateway_HoeheRechnungssumme + Activity_0vq3ho7 + Activity_0jdjg2h + Gateway_0lfg2b2 + Event_1czv0yh + Gateway_1y79rn0 + Gateway_01r6r9e + Activity_108exu6 + Activity_1x7zph6 - - Gateway_14wptg0 - Activity_1b029kn - Event_0p7ms1x - Activity_0snbir8 + + Activity_1nxd2jr + Event_1mwritv + Gateway_Vorgangfreigeben - + Flow_17ny5uv Flow_1aijtcn Flow_1kjf7y9 + + + + + Flow_0bvc46v Flow_17ny5uv @@ -85,6 +90,12 @@ + + + + + + Flow_1kjf7y9 Flow_11zwlrd @@ -112,12 +123,17 @@ DataObjectReference_0plzlak - + Flow_0uk4now Flow_0fpeqn8 Flow_1wh7ll1 + + + + + Flow_11zwlrd Flow_1dqx4w4 @@ -130,7 +146,7 @@ Flow_1r20qxv - + Flow_1dqx4w4 Flow_1a5ycoj Flow_1r20qxv @@ -139,16 +155,16 @@ - + Flow_1hogzdg Flow_1sjj2gm Flow_06iwtj7 - + Flow_1fwe2w7 Flow_0uk4now - + Flow_1mj7tm1 Flow_1hogzdg @@ -158,6 +174,11 @@ Flow_1mj7tm1 + + + + + Flow_1sjj2gm Flow_0ivc5ab @@ -165,7 +186,7 @@ Flow_0dub3tg - + Flow_0ivc5ab Flow_0dub3tg Flow_0a59c48 @@ -173,15 +194,6 @@ Flow_0vok3bx - - Flow_0p94qch - Flow_0vok3bx - - - DataObjectReference_08ly05s - Property_00cbv43 - - Flow_00dngjn Flow_1jt6q3y @@ -194,15 +206,6 @@ - - Flow_0zftkwh - Flow_0p94qch - - - DataObjectReference_0fpian9 - Property_0u4bllb - - @@ -213,7 +216,7 @@ - + Flow_145gpqj Flow_0bvc46v @@ -232,34 +235,72 @@ Flow_145gpqj - - - - - - - - - - - - - - - - - - - - - - - - - - - + + Flow_0zftkwh + Flow_0p94qch + + + DataObjectReference_0fpian9 + Property_1froj4a + + + + Flow_0p94qch + Flow_0vok3bx + + + DataObjectReference_08ly05s + Property_1lqg73b + + + + #{FormField_Bool_Lieferscheinpruefen} + + + + #{not FormField_Bool_Lieferscheinpruefen} + + + + + + #{not FormField_Boolean_HoeheRechnungssumme} + + + + + + #{FormField_bool_Zahlungsziel} + + + #{not FormField_bool_Zahlungsziel} + + + + + #{not FormField_bool_Formalpruefen} + + + #{FormField_bool_Formalpruefen} + + + + #{FormField_Boolean_HoeheRechnungssumme} + + + + + + #{not FormField_bool_Vorgangpruefen} + + + #{FormField_bool_Vorgangpruefen} + + + + + Nachricht an den Einkauf @@ -279,13 +320,13 @@ eingegangen - + Flow_0kd9ypk - + Flow_0kd9ypk @@ -296,8 +337,8 @@ eingegangen Flow_05nfk8a - + @@ -312,477 +353,476 @@ eingegangen Flow_02liz1g - + + - + - + - + - + - + - - - - - - - - - - - - - - - - + - - + + - - + + - - + + - - + + - - - + + + - + - - + + - + - - + + - - - + + + - - - + + + - - - + + + - + - - + + - - - + + + - + - - + + - + - - + + - - - - + + + + - - - + + + - + - - - + + + - + - - - + + + - + - - - + + + - - - + + + - - - + + + - + - - + + - - + + - - + + - - + + - + - - + + - - + + - + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - + - + - + - + - - + + - + - + - + - + - + - - + + - - - - + - + - + - + - + - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - - - - - - + + - - + + + + + + + - + - - + + - - + + - + - + - + - + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Rechnungseingang/target/maven-archiver/pom.properties b/Rechnungseingang/target/maven-archiver/pom.properties new file mode 100644 index 0000000..a842057 --- /dev/null +++ b/Rechnungseingang/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed May 27 17:29:04 CEST 2020 +version=0.0.1-SNAPSHOT +groupId=com.bpmn +artifactId=Rechnungseingang diff --git a/Rechnungseingang/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/Rechnungseingang/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/Rechnungseingang/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/Rechnungseingang/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..c23db67 --- /dev/null +++ b/Rechnungseingang/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,2 @@ +C:\Users\Philipp\Documents\GitHub\BPMN_Projekt\Rechnungseingang\src\main\java\com\bpmn\Rechnungseingang\CamundaBpmProcessApplication.java +C:\Users\Philipp\Documents\GitHub\BPMN_Projekt\Rechnungseingang\src\main\java\com\bpmn\Rechnungseingang\LoggerDelegate.java diff --git a/Rechnungseingang/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/Rechnungseingang/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/Rechnungseingang/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/Rechnungseingang/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..2befc62 --- /dev/null +++ b/Rechnungseingang/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +C:\Users\Philipp\Documents\GitHub\BPMN_Projekt\Rechnungseingang\src\test\java\com\bpmn\Rechnungseingang\ProcessUnitTest.java diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/.bower.json b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/.bower.json new file mode 100644 index 0000000..1bfbec0 --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/.bower.json @@ -0,0 +1,29 @@ +{ + "name": "bpmn-js", + "version": "0.14.1", + "authors": [ + "bpmn.io" + ], + "description": "A BPMN 2.0 renderer and web modeler", + "main": "dist/bpmn-viewer.js", + "keywords": [ + "models", + "diagram", + "renderer", + "modeler", + "bpmn" + ], + "ignore": [ + "test/*" + ], + "homepage": "http://bpmn.io", + "_release": "0.14.1", + "_resolution": { + "type": "version", + "tag": "v0.14.1", + "commit": "d28fbecf41b4f87507ef1a680f07dddd64e0e7bf" + }, + "_source": "https://github.com/bpmn-io/bower-bpmn-js.git", + "_target": "0.14.1", + "_originalSource": "bpmn-js" +} \ No newline at end of file diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/LICENSE b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/LICENSE new file mode 100644 index 0000000..38500c2 --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2014 camunda services GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +The source code responsible for displaying the bpmn.io logo (two green cogwheels in +a box) that links back to http://bpmn.io as part of rendered diagrams MUST NOT be +removed or changed. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/README.md b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/README.md new file mode 100644 index 0000000..92fbe2d --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/README.md @@ -0,0 +1,46 @@ +# bpmn-js (pre-packaged version) + +This is a packaged version of [bpmn-js](https://github.com/bpmn-io/bpmn-js) for standalone usage or via [bower](http://bower.io). + + +## Usage + +Download individual files from the [dist folder](https://github.com/bpmn-io/bower-bpmn-js/tree/master/dist) or +fetch them with dependencies via `bower install bpmn-js`. + +Include the file(s) into your project + +```html + + + + + + + + + +``` + + +Checkout the [examples repository](https://github.com/bpmn-io/bpmn-js-examples) for a complete example of [how to use bpmn-js with bower](https://github.com/bpmn-io/bpmn-js-examples/tree/master/simple-bower). + + +## License + +Use under the terms of the [bpmn-js license](http://bpmn.io/license). diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/bower.json b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/bower.json new file mode 100644 index 0000000..a05a1da --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/bower.json @@ -0,0 +1,20 @@ +{ + "name": "bpmn-js", + "version": "0.14.1", + "authors": [ + "bpmn.io" + ], + "description": "A BPMN 2.0 renderer and web modeler", + "main": "dist/bpmn-viewer.js", + "keywords": [ + "models", + "diagram", + "renderer", + "modeler", + "bpmn" + ], + "ignore": [ + "test/*" + ], + "homepage": "http://bpmn.io" +} diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css new file mode 100644 index 0000000..8aab7ee --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css @@ -0,0 +1,160 @@ +@font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.eot?43681877'); + src: url('../font/bpmn.eot?43681877#iefix') format('embedded-opentype'), + url('../font/bpmn.svg?43681877#bpmn') format('svg'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'bpmn'; + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,AAEAAAAKAIAAAwAgT1MvMj4LSgwAAAEoAAAAVmNtYXDo4+qQAAADLAAAAVJnbHlmlzEUPgAABVgAAJCsaGVhZAh4y4EAAADQAAAANmhoZWEHggO+AAAArAAAACRobXR4ofgAAAAAAYAAAAGsbG9jYT74YEgAAASAAAAA2G1heHABlQRuAAABCAAAACBuYW1lejh1lQAAlgQAAAI9cG9zdEHqC1sAAJhEAAAKHwABAAADUv9qAFoD6AAAAAAD1AABAAAAAAAAAAAAAAAAAAAAawABAAAAAQAAzA35H18PPPUACwPoAAAAANLCw/kAAAAA0sLD+QAA/4cD1AMjAAAACAACAAAAAAAAAAEAAABrBGIAIAAAAAAAAgAAAAoACgAAAP8AAAAAAAAAAQPoAZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6ADoxANS/2oAWgMjAHkAAAABAAAAAAAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAD6AAAA+gAAAPoAAAAAAADAAAAAwAAABwAAQAAAAAATAADAAEAAAAcAAQAMAAAAAgACAACAAAAAOho6MT//wAAAADoAOjE//8AABgBF6YAAQAAAAAAAAAAAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAKQA1AD+AWQCBgciB3YKnArkCv4LqBDyEXgR+hJkEoQS3hNyGJYY6BwwHEodEh04HV4dtB4IHoAfBB9KH54f6iAkIGog7iGeIfQiPiKcI24jjCPGJDQkiCTwJW4ltiXmJmwnCidKJ3YnyigWKFYokCjUKR4pYCnkKlgqqisiLBYsLi0MLVwt9i4yLqgvKDCKMPw0LDRONOA1KDXmNrg3MjiQOeY6XDssO2Q8cjysPO49uj4qQ1hDckSWRN5FBkU+RVRFlEXcRjZGcEaiRspH6khWAAIAAP/8A7oCwAASABoAAAEiDgIUHgIzPgE3Byc/AS4BCQEGFhcBLgEC9CpLOyAgO0sqRmoWlXQ+nR5O/t3+MwkzJgHDGyQCwCA7S1RLOyABT0IoTXwqICP+6v7EIksFATYXPgAFAAD/wAM5AugAEgAjACgANwBEAAABIgYdAQcGFBchNjQvATU2JisBBSIGFRMeATMhMjY3EzYmIyEFKQEDIRMiIw4BFxMeAT4BJwMuASUiBgcDBh4BNjcTNiYBrSodrA8PAnAODqgCGy5H/uILDTIBDQoByQoNAkABDQz+4v79AQMBAzv+YksBAgwPAiwCERgMAiwCDQEOCg8CLAINFxECLAIPAucILAk4BRcCARgFNwosCMwPC/3VCQ0MCgIqDA8x/gcBsAESDP7ADA0DEgwBPwoNAQ0L/sEMEgMNDAFADBIAAAACAAD/2AOPAu0AFAAYAAABBgQHFhcOAQ8CPwI+ATcWFzY3AQ8BNwOPDf7Zey4sXRtP0Sn3Ax9QG14tLUBK/igboBoC7QeVOisuXh5RIvcoD8JSHl4sLn+O/nOgG6EAAAABAAD/3wOPAu0AFwAAAQYEBxYXBgcjFTMHFhc3MzUjNjcWFzY3A48N/tl7LiyJiqZ8fhEQnK+Fe3otLUBKAu0HlTorLouMK34QD50rfXssLn+OAAADAAD/mgO4AyIAEAAUAEIAAAEiBwEGFBcBFjI3ATY0JwEmBwkCJTAjDwMVIw8DFR8DMxUfAzM/AzUzPwM1LwMjNS8DAfQODP5hCgoBnwseCwGfCwv+YQsPAYb+ev56AXsCAgQDAcIEBAMBAQMEBMIBAwQEFgQEAwHCBAQDAQEDBATCAQMEBAMiC/5hCx4L/mEKCgGfCx4LAZ8LPv56/noBhuUBAwQEwgEDBAQVBQQDAcIEBAMBAQMEBMIBAwQEFgQEAwHCBAQDAQAAAAAGAAD/jQPNAyIADgAdACwAOwBQAGAAAAEGBAcGFhcWJDYSAiYnJgc2FhcWBgcGJCcmEjc+ARciBgcGFhcWNjc2JicuAQceARcOAQcGJicmNjc+AQcGBxcGBxYXNxc2NyYnNjcmJwYHJicWFzcXBxcHJwYHJzY3JicB86r/ABYQhoF8ARHOR1rVhxEXnekRDJCCgf78T00HWDmfYZDSBwSfgHjdODUsXDF6Q3+2AgGZdm++Ix9LXiRRRisscDg2KixucSstOTg4NiosNzc4OTk4bjRvcTVxNjg0ODc4OQMiAuGpj/1BPCK4AQgBAqUKAjEB0JuK6jAtT29xARBpRE4ryJCDzx0XaG1t8FErMDABtH92sw8MdmtozTcVFm8tK3E2OCwqbnAsKzk4NzcsKjY4OBY4OW80bnE1cTc4NDg2OTgAAAARAAD/owO4AyIAAwAGAAsATgCmAPwBPwGUAfECPAJ+AsIDBQNcA6kD9QQ/AAABESERBTMHNxUhNRcRMSMHIwcjFSMHIw8HFR8EMzczNzM3MzczNzMXMxczFzMXMxczPwU1LwUjJyM1IycjJxcjDwUfGT8ENS8DIyc1JzUnIy8BIy8BNScjJzUvASMvATUnNScjNScjJyMvATUvASMnNScjLwEFIw8CFQcjDwEVDwIVBxUHFQ8BIw8BFQ8CFQ8BIw8BIw8BFQcVDwEjDwIVHwUzPxk1LwQhMSMVIw8DFR8EMzczNzMXMxczFzMXMxczHwYzPwU1LwIjLwkjJyMnIycjNQcjDwIjDwEVByMPASMHFQcjByMHIwcVDwMjFQ8BFQ8CIw8BHwUzPx0zPwMvAwUPBR8WFR8EMz8ENSc1Lwg1JzUvBCMnIyc1LwEjJzUnNS8BNSMvATUnIyc1LwI1LwMFIw8FFSMVBxUHFSMVBxUXFTMVFxUXFRcVHwkzPwQ1LwI1JzUnNSc1JzUnNTc1NzU3NTc1NzUvBAUjDwMVBxcVBxUHFQcVBxUPCBUfAzM/BjU3NT8HNTc1MzU3NTc1JzUvAwUjDwMVFxUXFRcVFxUfBxUXFR8CMxUfAzM/BDUvCzUnNSc1JzUnNS8EBSMPBRUHFQ8PFR8FPwI1PwE1NzM3NT8CMz8KNTcvBAUPBR8CFRcVFzMXMx8CMx8BMxUXFRcVFzMfATMXMxcVFxUfARUfAhUfAjM/BTUvHAUjDwgjByMHIwcjByMHIw8EFR8FMzczNzM3MzczPwszNzM/ATU/ATU3NT8ENS8EBQ8FFR8FMx8BFRczFzMfARUfATMXFR8EMxczHwYzPwU1LxYhIw8XFR8GMz8IMz8ENTczNzM3NT8BNT8BMz8ENS8EAScBmv7B5HKc/sicCwYLBQwFBQYmBgoIBAIDAQECBgQJBCsFCQUFBQUKBR4FCgUFBQUKBBgJBQQDBAQBAQQDBAcmBQYFCwYLBvQFBAUDBAQCAggCDAcIBwQDBAMEAwcGBw8CCQIDEQQDBAkJBAQDBAECAwIBAgMCAQISAQkEBgEDBAMBAwgEAwEDAQMBCAQEBAEECAEECv3xBQQIBQQBBAQEDAQEBAgDAQMEAwQDBAkBDwIBAgMDBQIBBAMDAQIDAwgECQUHBQUQBgIGAg8HBgcDBAMEAwQHCAQEBwIBAgIDBAgBBBINCgUHBgICAwgIBAEIBCYECAMEBAQHBAgDGgMIBwcDCQUEBAQDBAEEAwcBAwUEBAQEBAkEJgQJBQQEBQ2tBAgGBwEDCAMBFQMBAwMBCQEMAQkJAwMCAQIDAwgEAQQCAgIDAwgEBQQJAwgDAgQDAgMCAwIDAgMDAwIDAwMDAwMDAwYDIwIDBAQCAgUECAGEBQgEAwMDAQYDAwIDAgMCAwIDBxYBBAEEAQYDAgIEBAMEBQkEBAQDBAECAgIBAgECAQICAgEBAQgBAQECAgQBAgcDAgECAwIBAgYDCQMDAwT9wwUECAMDAgIBAgEBAQEBAQIBCAIBAQEDAwQEBAUJBAMDBAECBQMCAQEBAQEBAgEBAgMDCQLuBQQIBgIBAQEBAQIIAgECAgQBFgEBBAMMBQkEBgUEAwoCCAECAQICAgcBAQEBAQQDBAj8pwUICAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFAvAEBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECP2tBAgEAwICAgUGDAYBDAEGBwMBAwMBBwcDAQcHAQMBAwQIBAQMBAQEBAkEBAQFAgEBBAQDFQMECgcZAwoCAwMDAwMDAwIGAwIDAgMCCAGcBQQEAQcKHAsHEgQLBAcEBAcECAQQCAQDAgIBBAQDBAUMBQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAX+RAQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0CEgUEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIAfr+yAE4MVo+urp9AfIBAQEBBwICBAMEBAQJBAUGAwIJAgEBAQEBAQIFAQIDAwgEBQQJAwMDBwEBAQFTAQICBAcJCQoBCQcGBwMEAwQDBAcIBxQEDQQEIAMDAgICAgMDCAkFBgUFBAEEAQQFHA0EAQgEAQQEBAgBAwEDAQMECAMBAwQDAQYEBwgBBAQBAwQDAQMMAwEDAQMBCAQEBAEEBAQBBA0XBQUEAQQBCQUKBQwEBQQEAwQBAgUHDB4IBAkEFAcIBwQDBAMEAwcGBAMHBQQECQQEAwQBAgIFDAUJBAMGAgEBAQEBAgIHAgIDAgICAQIDAwgFCQgDBQIBAgECAQICAgkCAQEBJwIDBQIEAQIPAwIBAgkMCQEJBAMDAQMDAQMLBwcJCQQDBAQBAQQDDAMEBgMDAgMDAwMDAwIDAwIDAgMCAwIDBAMWAwMICQkHAwQ7AQIDAwQNBQsCAwMDAwMDAgMDCiMDBwMHBA4LAwcDCAMDAgEBAwIECAkEAgQJBAQEBAQFAwEDAQMEAQMQBAMBAwgDAQoBAwMBAwMBAwMBBgQJAQMCAwOpAQQEAwQIBAQJBQQJDQQbBQ0JBAQJ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CAQmBAgDBAQEBwQIAxoDCAcHAwkFBAQEAwQBBAMHAQMFBAQEBAQJBCYECQUEBAUNsQUDBgcBAwgDARUDAQMDAQkBDAEJCQMDAgECAwMIBAEEAgICAwMIBAUECQMIAwIEAwIDAgMCAwIDAwMCAwMDAwMDAwMGAyMCAwQEAgIFBAgFAYQEBAQDAwMBBgMDAgMCAwIDAgMHFgEEAQQBBgMCAgQEAwQFCQQEBAMEAQICAgECAQIBAgICAQEBCAEBAQICBAECBwMCAQIDAgECBgMJAwMDBAn9xwQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJBAKNBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECAX9rgQEBAMCAgIFBgwGAQwBBgcDAQMDAQcHAwEHBwEDAQMECAQEDAQEBAQJBAQEBQIBAQQEAxUDBAoHGQMKAgMDAwMDAwMCBgMCAwIDAggOAaUEBAEHChwLBxIECwQHBAQHBAgEEAgEAwICAQQEAwQFEQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAUEpwUGBgsFDAUFBiYGCggEAgMBAQIGBAkEKwUJBQUFBQoFHgUKBQUFBQoEGAkFBAMEBAEBBAMEByYFBgULBgsG7wQFAwQEAgIIAgwHCAcEAwQDBAMHBgcPAgkCAxEEAwQJCQQEAwQBAgMCAQIDAgECEgEJBAYBAwQDAQMIBAMBAwEDAQgEBAQBBAgBBAoI/fQECAUEAQQEBAwEBAQIAwEDBAMEAwQJAQ8CAQIDAwUCAQQDAwECAwMIBAkFBwUFEAYCBgIPBwYHAwQDBAMEBwgEBAcCAQICAwQIBAKvBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECAT8pgQECAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFBJQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0NAhoEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIBAI0SXd8Wx4VFmqCbRwVJ0lybB4fDld7NCUrMTU2AxoHBQkZMzMG7wECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAQEDBQIEAQIPAwIBAgkMCQEJBAMDAQMDAQMLBwcJCQQDBAQBAQQDDAMEBgMDAgMDAwMDAwIDAwIDAgMCAwIDBAMWAwMICQkHAwQ8AQEDAwQNBQsCAwMDAwMDAgMDCiMDBwMHBA4LAwcDCAMDAgEBAwIECAkEAgQJBAQEBAQFAwEDAQMEAQMQBAMBAwgDAQoBAwMBAwMBAwMBBgQJAQMCAwMCqwEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBAF3AQIDAwgHBAcEGgMLCwcGBAMHFA8DBwEIBQQFCAMDAgICAgcBAxUBAwsBBxAEBAwEBAQEBAQJBCYFBQgEBAMEoQICAwMECQkJBgEMAQYMBgUDAwIBBAEEAQIFBAICAQEBBAEBAQYBAQECAQECAwcFBAUECAMDCQIBBgMQAwYDAgMCAwIDAgMGAgMDAwMDBwNNAQIBAwYMAwMFAwIBAQEEAwMECQUECAMDAgEBAQECCQICAgECAQIBAQECAgIBAQEEAQEBBQQDBQQFCAgDAgECzgEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHAgoBBAQBAwQDAQMMAwEDAQMBCAQEBAEEBAQBBA0XBQUEAQQBCQUKBQwEBQQEAwQBAgUHDB4IBAkEFAcIBwQDBAMEAwcGBAMHBQQECQQEAwT+xQEECAQEBAQeBQoFBQUFCQUnBQQFCQoEMgQFBAgEBgICBggKBRkBBAEUBgUFBQsGJgUGBQsGCwYWBgkIAwMEEAEBBggICQYRBQYFBgsFIQYLBQUKBg8BBAEZBQoBBAYCAQEDAgQICQgBKQQFBQQFBQkFIgUJBQUFBQoF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AQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUC8AQFBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQI/a0ECAQDAgICBQYMBgEMAQYHAwEDAwEHBwMBBwcBAwEDBAgEBAwEBAQECQQEBAUCAQEEBAMVAwQKBxkDCgIDAwMDAwMDAgYDAgMCAwIIAZwFBAQBBwocCwcSBAsEBwQEBwQIBBAIBAMCAgEEBAMEBQwFDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBf5EBAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQISBQQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgCIX2MfX2MfRd9Xn1+XQGVAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQDBAMHBgQDBwUEBAkEBAMEAQICBQwFCQQDBgIBAQEBAQICBwICAwICAgECAwMIBQkIAwUCAQIBAgECAgIJAgEBAScCAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEOwECAwMEDQULAgMDAwMDAwIDAwojAwcDBwQOCwMHAwgDAwIBAQMCBAgJBAIECQQEBAQEBQMBAwEDBAEDEAQDAQMIAwEKAQMDAQMDAQMDAQYECQEDAgMDqQEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBC0BBAgEBAQEHgUKBQUFBQkF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CgUGAwkECQQEAwQCBAYBBAMCAwIDAgECCAEFAwQCBAICBQIHAgIBAgkBAgIDBwMCAwIBAgMCBgIKBf3zBQcBAgMCAwIDAgMCAwQBAgIDAgQBBAQBAgICAgICAQICAgQCAgQBAQECAwICCgECAgIBBAECAQIBAgECAgEEBAMOBAgEAwEBAgMBAgICAQIBAgECAQICAwIBAggCAQICAgEEAgQBBgIKAgYDCgMGAwUDAgEEBggFArIEBQMGAgEBAQEBAQEBAgEDBQMFAwQDAgYDAQIDBgQJCQQEAwIBAQMCAQIDAwIBBQEMAwECAQEBAQEBAQEEAwQECPymBAUDBAQBAQMCAQMCAQQBCgEEAwIDAgECAwECBAcJCQQEAwQCBAIDAgcEAQYBAgECCAEBAQEFCAgCsQQECQQFCgQPBQULDwYFCwUhBgsQCAQFAgIEAwQNCQYGFAUBEgYHBQEFAQUBBQEcAQsFAQUFAQULDwEEAQMDAgEEAwQECP3eBAQEAwICAQIDBA0CAQIDAgECAwMLAgEIAwMFAQIBAgECAQIDAwECAQIBAgQDBgMNAx0CAw0EAw0JBQgFAgEEAwQEAwQIAxQCEQMJBRECBgUDBQUFAgEPAgUCAgEEAwQRBAQFAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLQECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0GHw0FAQUBBQEFAQUBBQEBBAQEAgICAwMJ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CAMBFQMBAwMBCQEMAQkJAwMCAQIDAwgEAQQCAgIDAwgEBQQJAwgDAgQDAgMCAwIDAgMDAwIDAwMDAwMDAwYDIwIDBAQCAgUECAGEBQgEAwMDAQYDAwIDAgMCAwIDBxYBBAEEAQYDAgIEBAMEBQkEBAQDBAECAgIBAgECAQICAgEBAQgBAQECAgQBAgcDAgECAwIBAgYDCQMDAwT9wwUECAMDAgIBAgEBAQEBAQIBCAIBAQEDAwQEBAUJBAMDBAECBQMCAQEBAQEBAgEBAgMDCQLuBQQIBgIBAQEBAQIIAgECAgQBFgEBBAMMBQkEBgUEAwoCCAECAQICAgcBAQEBAQQDBAj8pwUICAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFAvAEBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECP2tBAgEAwICAgUGDAYBDAEGBwMBAwMBBwcDAQcHAQMBAwQIBAQMBAQEBAkEBAQFAgEBBAQDFQMECgcZAwoCAwMDAwMDAwIGAwIDAgMCCAGcBQQEAQcKHAsHEgQLBAcEBAcECAQQCAQDAgIBBAQDBAUMBQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAX+RAQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0CEgUEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLwEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHCAEEBAEDBAMBAwwDAQMBAwEIBAQEAQQEBAEEDRcFBQQBBAEJBQoFDAQFBAQDBAECBQcMHggECQQUBwgHBAMEAwQDBwYEAwcFBAQJBAQDBAECAgUM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bHRpcGxlJWludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1jb21wZW5zYXRpb24LZ2F0ZXdheS14b3IKY29ubmVjdGlvbhBlbmQtZXZlbnQtY2FuY2VsImludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1jb25kaXRpb247aW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctcGFyYWxsZWwtbXVsdGlwbGUVc3RhcnQtZXZlbnQtY29uZGl0aW9uInN0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctdGltZXIUc2VxdWVudGlhbC1taS1tYXJrZXIJdXNlci10YXNrDWJ1c2luZXNzLXJ1bGUSc3ViLXByb2Nlc3MtbWFya2VyHXN0YXJ0LWV2ZW50LXBhcmFsbGVsLW11bHRpcGxlEXN0YXJ0LWV2ZW50LWVycm9yH2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1zaWduYWweaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWVycm9yFmVuZC1ldmVudC1jb21wZW5zYXRpb24Uc3VicHJvY2Vzcy1jb2xsYXBzZWQTc3VicHJvY2Vzcy1leHBhbmRlZAR0YXNrD2VuZC1ldmVudC1lcnJvciNpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtZXNjYWxhdGlvbh5pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtdGltZXIWc3RhcnQtZXZlbnQtZXNjYWxhdGlvbhJzdGFydC1ldmVudC1zaWduYWwSYnVzaW5lc3MtcnVsZS10YXNrBm1hbnVhbAdyZWNlaXZlDWNhbGwtYWN0aXZpdHkRc3RhcnQtZXZlbnQtdGltZXITc3RhcnQtZXZlbnQtbWVzc2FnZRdpbnRlcm1lZGlhdGUtZXZlbnQtbm9uZR1pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbGluaxRlbmQtZXZlbnQtZXNjYWxhdGlvbg90ZXh0LWFubm90YXRpb24HYnBtbi1pbw9nYXRld2F5LWNvbXBsZXgSZ2F0ZXdheS1ldmVudGJhc2VkDGdhdGV3YXktbm9uZQpnYXRld2F5LW9yE2VuZC1ldmVudC10ZXJtaW5hdGUQZW5kLWV2ZW50LXNpZ25hbA5lbmQtZXZlbnQtbm9uZRJlbmQtZXZlbnQtbXVsdGlwbGURZW5kLWV2ZW50LW1lc3NhZ2UOZW5kLWV2ZW50LWxpbmsgaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW1lc3NhZ2UlaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWNvbXBlbnNhdGlvbhRzdGFydC1ldmVudC1tdWx0aXBsZQZzY3JpcHQLbWFudWFsLXRhc2sEc2VuZAdzZXJ2aWNlDHJlY2VpdmUtdGFzawR1c2VyEHN0YXJ0LWV2ZW50LW5vbmUjaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWVzY2FsYXRpb24haW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW11bHRpcGxlNGludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLWVzY2FsYXRpb24daW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWxpbmsmc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1jb25kaXRpb24LZGF0YS1vYmplY3QLc2NyaXB0LXRhc2sJc2VuZC10YXNrCmRhdGEtc3RvcmUnc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1lc2NhbGF0aW9uIGludGVybWVkaWF0ZS1ldmVudC10aHJvdy1tZXNzYWdlMmludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLW11bHRpcGxlMGludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLXNpZ25hbCFpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctbXVsdGlwbGUkc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1tZXNzYWdlDWFkLWhvYy1tYXJrZXIMc2VydmljZS10YXNrCXRhc2stbm9uZRNjb21wZW5zYXRpb24tbWFya2VyJXN0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctbXVsdGlwbGUfaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LXNpZ25hbDNpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1jb25kaXRpb24LcGFydGljaXBhbnQZZXZlbnQtc3VicHJvY2Vzcy1leHBhbmRlZBFsYW5lLWluc2VydC1iZWxvdwpzcGFjZS10b29sEGNvbm5lY3Rpb24tbXVsdGkEbGFuZQpsYXNzby10b29sEWxhbmUtaW5zZXJ0LWFib3ZlEWxhbmUtZGl2aWRlLXRocmVlD2xhbmUtZGl2aWRlLXR3bwpkYXRhLWlucHV0C2RhdGEtb3V0cHV0CWhhbmQtdG9vbAt0cmFuc2FjdGlvbgAAAA==') format('truetype'); +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.svg?43681877#bpmn') format('svg'); + } +} +*/ + + [class^="bpmn-icon-"]:before, [class*=" bpmn-icon-"]:before { + font-family: "bpmn"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} +.bpmn-icon-screw-wrench:before { content: '\e800'; } /* '' */ +.bpmn-icon-trash:before { content: '\e801'; } /* '' */ +.bpmn-icon-conditional-flow:before { content: '\e802'; } /* '' */ +.bpmn-icon-default-flow:before { content: '\e803'; } /* '' */ +.bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */ +.bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */ +.bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */ +.bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */ +.bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */ +.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */ +.bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */ +.bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */ +.bpmn-icon-connection:before { content: '\e810'; } /* '' */ +.bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */ +.bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */ +.bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */ +.bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */ +.bpmn-icon-user-task:before { content: '\e817'; } /* '' */ +.bpmn-icon-business-rule:before { content: '\e818'; } /* '' */ +.bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */ +.bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */ +.bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */ +.bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */ +.bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */ +.bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */ +.bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */ +.bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */ +.bpmn-icon-task:before { content: '\e821'; } /* '' */ +.bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */ +.bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */ +.bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */ +.bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */ +.bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */ +.bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */ +.bpmn-icon-manual:before { content: '\e828'; } /* '' */ +.bpmn-icon-receive:before { content: '\e829'; } /* '' */ +.bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */ +.bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */ +.bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */ +.bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */ +.bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */ +.bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */ +.bpmn-icon-text-annotation:before { content: '\e830'; } /* '' */ +.bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */ +.bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */ +.bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */ +.bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */ +.bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */ +.bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */ +.bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */ +.bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */ +.bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */ +.bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */ +.bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */ +.bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */ +.bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */ +.bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */ +.bpmn-icon-script:before { content: '\e83f'; } /* '' */ +.bpmn-icon-manual-task:before { content: '\e840'; } /* '' */ +.bpmn-icon-send:before { content: '\e841'; } /* '' */ +.bpmn-icon-service:before { content: '\e842'; } /* '' */ +.bpmn-icon-receive-task:before { content: '\e843'; } /* '' */ +.bpmn-icon-user:before { content: '\e844'; } /* '' */ +.bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */ +.bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */ +.bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */ +.bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */ +.bpmn-icon-data-object:before { content: '\e84b'; } /* '' */ +.bpmn-icon-script-task:before { content: '\e84c'; } /* '' */ +.bpmn-icon-send-task:before { content: '\e84d'; } /* '' */ +.bpmn-icon-data-store:before { content: '\e84e'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */ +.bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */ +.bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */ +.bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */ +.bpmn-icon-service-task:before { content: '\e856'; } /* '' */ +.bpmn-icon-task-none:before { content: '\e857'; } /* '' */ +.bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */ +.bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */ +.bpmn-icon-participant:before { content: '\e85c'; } /* '' */ +.bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */ +.bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */ +.bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */ +.bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */ +.bpmn-icon-lane:before { content: '\e861'; } /* '' */ +.bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */ +.bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */ +.bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */ +.bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */ +.bpmn-icon-data-input:before { content: '\e866'; } /* '' */ +.bpmn-icon-data-output:before { content: '\e867'; } /* '' */ +.bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */ +.bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */ \ No newline at end of file diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css new file mode 100644 index 0000000..a8b7725 --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css @@ -0,0 +1,162 @@ +@font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.eot?70672887'); + src: url('../font/bpmn.eot?70672887#iefix') format('embedded-opentype'), + url('../font/bpmn.woff?70672887') format('woff'), + url('../font/bpmn.ttf?70672887') format('truetype'), + url('../font/bpmn.svg?70672887#bpmn') format('svg'); + font-weight: normal; + font-style: normal; +} +/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ +/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ +/* +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: 'bpmn'; + src: url('../font/bpmn.svg?70672887#bpmn') format('svg'); + } +} +*/ + + [class^="bpmn-icon-"]:before, [class*=" bpmn-icon-"]:before { + font-family: "bpmn"; + font-style: normal; + font-weight: normal; + speak: none; + + display: inline-block; + text-decoration: inherit; + width: 1em; + margin-right: .2em; + text-align: center; + /* opacity: .8; */ + + /* For safety - reset parent styles, that can break glyph codes*/ + font-variant: normal; + text-transform: none; + + /* fix buttons height, for twitter bootstrap */ + line-height: 1em; + + /* Animation center compensation - margins should be symmetric */ + /* remove if not needed */ + margin-left: .2em; + + /* you can be more comfortable with increased icons size */ + /* font-size: 120%; */ + + /* Font smoothing. That was taken from TWBS */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + /* Uncomment for 3D effect */ + /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ +} + +.bpmn-icon-screw-wrench:before { content: '\e800'; } /* '' */ +.bpmn-icon-trash:before { content: '\e801'; } /* '' */ +.bpmn-icon-conditional-flow:before { content: '\e802'; } /* '' */ +.bpmn-icon-default-flow:before { content: '\e803'; } /* '' */ +.bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */ +.bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */ +.bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */ +.bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */ +.bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */ +.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */ +.bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */ +.bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */ +.bpmn-icon-connection:before { content: '\e810'; } /* '' */ +.bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */ +.bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */ +.bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */ +.bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */ +.bpmn-icon-user-task:before { content: '\e817'; } /* '' */ +.bpmn-icon-business-rule:before { content: '\e818'; } /* '' */ +.bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */ +.bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */ +.bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */ +.bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */ +.bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */ +.bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */ +.bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */ +.bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */ +.bpmn-icon-task:before { content: '\e821'; } /* '' */ +.bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */ +.bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */ +.bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */ +.bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */ +.bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */ +.bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */ +.bpmn-icon-manual:before { content: '\e828'; } /* '' */ +.bpmn-icon-receive:before { content: '\e829'; } /* '' */ +.bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */ +.bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */ +.bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */ +.bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */ +.bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */ +.bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */ +.bpmn-icon-text-annotation:before { content: '\e830'; } /* '' */ +.bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */ +.bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */ +.bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */ +.bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */ +.bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */ +.bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */ +.bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */ +.bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */ +.bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */ +.bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */ +.bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */ +.bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */ +.bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */ +.bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */ +.bpmn-icon-script:before { content: '\e83f'; } /* '' */ +.bpmn-icon-manual-task:before { content: '\e840'; } /* '' */ +.bpmn-icon-send:before { content: '\e841'; } /* '' */ +.bpmn-icon-service:before { content: '\e842'; } /* '' */ +.bpmn-icon-receive-task:before { content: '\e843'; } /* '' */ +.bpmn-icon-user:before { content: '\e844'; } /* '' */ +.bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */ +.bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */ +.bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */ +.bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */ +.bpmn-icon-data-object:before { content: '\e84b'; } /* '' */ +.bpmn-icon-script-task:before { content: '\e84c'; } /* '' */ +.bpmn-icon-send-task:before { content: '\e84d'; } /* '' */ +.bpmn-icon-data-store:before { content: '\e84e'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */ +.bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */ +.bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */ +.bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */ +.bpmn-icon-service-task:before { content: '\e856'; } /* '' */ +.bpmn-icon-task-none:before { content: '\e857'; } /* '' */ +.bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */ +.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */ +.bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */ +.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */ +.bpmn-icon-participant:before { content: '\e85c'; } /* '' */ +.bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */ +.bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */ +.bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */ +.bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */ +.bpmn-icon-lane:before { content: '\e861'; } /* '' */ +.bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */ +.bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */ +.bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */ +.bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */ +.bpmn-icon-data-input:before { content: '\e866'; } /* '' */ +.bpmn-icon-data-output:before { content: '\e867'; } /* '' */ +.bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */ +.bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */ \ No newline at end of file diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot new file mode 100644 index 0000000..f7900ea Binary files /dev/null and b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot differ diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg new file mode 100644 index 0000000..5c7316e --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg @@ -0,0 +1,117 @@ + + + +camunda Services GmbH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf new file mode 100644 index 0000000..aa4c957 Binary files /dev/null and b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf differ diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff new file mode 100644 index 0000000..8f240aa Binary files /dev/null and b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff differ diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/diagram-js.css b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/diagram-js.css new file mode 100644 index 0000000..623153b --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/diagram-js.css @@ -0,0 +1,561 @@ +/** + * outline styles + */ + +.djs-outline { + fill: none; + visibility: hidden; +} + +.djs-element.hover .djs-outline, +.djs-element.selected .djs-outline { + visibility: visible; + shape-rendering: crispEdges; + stroke-dasharray: 3,3; +} + +.djs-element.selected .djs-outline { + stroke: #8888FF; + stroke-width: 1px; +} + +.djs-element.hover .djs-outline { + stroke: #FF8888; + stroke-width: 1px; +} + +.djs-shape.connect-ok .djs-visual > :nth-child(1) { + fill: #DCFECC /* light-green */ !important; +} + +.djs-shape.connect-not-ok .djs-visual > :nth-child(1), +.djs-shape.drop-not-ok .djs-visual > :nth-child(1) { + fill: #f9dee5 /* light-red */ !important; +} + +.djs-shape.new-parent .djs-visual > :nth-child(1) { + fill: #F7F9FF !important; +} + +svg.drop-not-ok { + background: #f9dee5 /* light-red */ !important; +} + +svg.new-parent { + background: #F7F9FF /* light-blue */ !important; +} + +.djs-connection.connect-ok .djs-visual > :nth-child(1), +.djs-connection.drop-ok .djs-visual > :nth-child(1) { + stroke: #90DD5F /* light-green */ !important; +} + +.djs-connection.connect-not-ok .djs-visual > :nth-child(1), +.djs-connection.drop-not-ok .djs-visual > :nth-child(1) { + stroke: #E56283 /* light-red */ !important; +} + +.drop-not-ok, +.connect-not-ok { + cursor: not-allowed; +} + +.djs-element.attach-ok .djs-visual > :nth-child(1) { + stroke-width: 5px !important; + stroke: rgba(255, 116, 0, 0.7); +} + + +/** +* Selection box style +* +*/ +.djs-lasso-overlay { + fill: rgb(255, 116, 0); + fill-opacity: 0.1; + + stroke-dasharray: 5 1 3 1; + stroke: rgb(255, 116, 0); + + shape-rendering: crispEdges; + pointer-events: none; +} + +/** + * Resize styles + */ +.djs-resize-overlay { + fill: white; + fill-opacity: 0.8; + + stroke-dasharray: 5 1 3 1; + stroke: rgb(255, 116, 0); + + pointer-events: none; +} + +.djs-resizer-hit { + fill: none; + pointer-events: all; +} + +.djs-resizer-visual { + fill: white; + stroke-width: 1px; + stroke: black; + shape-rendering: crispEdges; + stroke-opacity: 0.2; +} + +.djs-cursor-resize-nwse, +.djs-resizer-nw, +.djs-resizer-se { + cursor: nwse-resize; +} + +.djs-cursor-resize-nesw, +.djs-resizer-ne, +.djs-resizer-sw { + cursor: nesw-resize; +} + +.djs-shape.djs-resizing > .djs-outline { + visibility: hidden !important; +} + +.djs-shape.djs-resizing > .djs-resizer { + visibility: hidden; +} + +.djs-dragger > .djs-resizer { + visibility: hidden; +} + +/** + * drag styles + */ +.djs-dragger { + fill: white; + fill-opacity: 0.6; + stroke: #333; +} + +.djs-dragger .djs-visual > :first-child { + stroke: rgb(255, 116, 0) !important; +} + +.djs-dragging { + opacity: 0.3; +} + +.djs-dragging, +.djs-dragging > * { + pointer-events: none !important; +} + +.djs-dragging .djs-context-pad, +.djs-dragging .djs-outline { + display: none !important; +} + +/** + * no pointer events for visual + */ +.djs-visual, +.djs-outline { + pointer-events: none; +} + +/** + * all pointer events for hit shape + */ +.djs-shape .djs-hit { + pointer-events: all; +} + +.djs-connection .djs-hit { + pointer-events: stroke; +} + +/** + * shape / connection basic styles + */ +.djs-connection .djs-visual { + stroke-width: 2px; + fill: none; +} + +.djs-cursor-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; +} + +.djs-cursor-grabbing { + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; +} + +.djs-cursor-crosshair { + cursor: crosshair; +} + +.djs-cursor-move { + cursor: move; +} + +.djs-cursor-resize-ns { + cursor: ns-resize; +} + +.djs-cursor-resize-ew { + cursor: ew-resize; +} + + +/** + * snapping + */ +.djs-snap-line { + stroke: rgb(255, 195, 66); + stroke: rgba(255, 195, 66, 0.50); + stroke-linecap: round; + stroke-width: 2px; + pointer-events: none; +} + +/** + * snapping + */ +.djs-crosshair { + stroke: #555; + stroke-linecap: round; + stroke-width: 1px; + pointer-events: none; + shape-rendering: crispEdges; + stroke-dasharray: 5, 5; +} + +/** + * palette + */ + +.djs-palette { + position: absolute; + left: 20px; + top: 20px; +} + +.djs-palette:not(.open) { + overflow: hidden; +} + +.djs-palette .entry, +.djs-palette .djs-palette-toggle { + width: 46px; + height: 46px; + line-height: 46px; + cursor: default; +} + +.djs-palette .separator { + margin: 3px 5px 5px 5px; + border: none; + border-top: solid 1px #DDD; +}; + +.djs-palette .entry:before { + vertical-align: middle; +} + +.djs-palette .djs-palette-toggle { + cursor: pointer; +} + +.djs-palette .entry, +.djs-palette .djs-palette-toggle { + color: #333; + font-size: 30px; + + text-align: center; +} + +.djs-palette .entry img { + max-width: 100%; +} + +.djs-palette.open .djs-palette-toggle { + height: 10px; +} + +.djs-palette:not(.open) .djs-palette-entries { + display: none; +} + +.djs-palette .djs-palette-toggle:hover { + background: #666; +} + +.djs-palette .entry:hover { + color: rgb(255, 116, 0); +} + +.highlighted-entry { + color: rgb(255, 116, 0) !important; +} + +/** + * context-pad + */ +.djs-overlay-context-pad { + width: 72px; +} + +.djs-context-pad { + position: absolute; + display: none; + pointer-events: none; +} + +.djs-context-pad .entry { + width: 22px; + height: 22px; + text-align: center; + display: inline-block; + font-size: 22px; + margin: 0 2px 2px 0; + + border-radius: 3px; + + cursor: default; + + background-color: #FEFEFE; + box-shadow: 0 0 2px 1px #FEFEFE; + + pointer-events: all; +} + +.djs-context-pad .entry:before { + vertical-align: top; +} + +.djs-context-pad .entry:hover { + background: rgb(255, 252, 176); +} + +.djs-context-pad.open { + display: block; +} + +/** + * popup styles + */ +.djs-popup .entry { + line-height: 20px; + white-space: nowrap; + border: solid 1px transparent; + cursor: default; +} + +/* larger font for prefixed icons */ +.djs-popup .entry:before { + vertical-align: middle; + font-size: 20px; +} + +.djs-popup .entry > span { + vertical-align: middle; + font-size: 14px; +} + +.djs-popup .entry:hover, +.djs-popup .entry.active:hover { + background: rgb(255, 252, 176); +} + +.djs-popup .entry.disabled { + background: inherit; +} + +.djs-popup .entry.active { + color: rgb(255, 116, 0); + border: solid 1px rgb(255, 116, 0); + border-radius: 3px; + background-color: #F6F6F6; +} + +.djs-popup-body .entry { + padding: 2px 10px 2px 5px; +} + +.djs-popup-header .entry { + display: inline-block; + padding: 2px 3px 2px 3px; +} + +.djs-popup-body .entry > span { + margin-left: 5px; +} + +.djs-popup-body { + background-color: #FEFEFE; +} + +.djs-popup-header { + border-bottom: 1px solid #DDD; +} + +.djs-popup-header .entry { + margin: 1px; + margin-left: 3px; +} + +.djs-popup-header .entry:last-child { + margin-right: 3px; +} + +/** + * popup / palette styles + */ +.djs-popup, .djs-palette { + background: #FAFAFA; + border: solid 1px #CCC; + border-radius: 2px; + box-shadow: 0 1px 2px rgba(0,0,0,0.3); +} + +/** + * touch + */ + +.djs-shape, +.djs-connection { + touch-action: none; +} + +.djs-segment-dragger, +.djs-bendpoint { + display: none; +} + +/** + * bendpoints + */ +.djs-segment-dragger .djs-visual { + fill: rgba(255, 255, 121, 0.2); + stroke-width: 1px; + stroke-opacity: 1; + stroke: rgba(255, 255, 121, 0.3); +} + +.djs-bendpoint .djs-visual { + fill: rgba(255, 255, 121, 0.8); + stroke-width: 1px; + stroke-opacity: 0.5; + stroke: black; +} + +.djs-segment-dragger:hover, +.djs-bendpoints.hover .djs-segment-dragger, +.djs-bendpoints.selected .djs-segment-dragger, +.djs-bendpoint:hover, +.djs-bendpoints.hover .djs-bendpoint, +.djs-bendpoints.selected .djs-bendpoint { + display: block; +} + +.djs-drag-active .djs-bendpoints * { + display: none; +} + +.djs-bendpoints:not(.hover) .floating { + display: none; +} + +.djs-segment-dragger:hover .djs-visual, +.djs-segment-dragger.djs-dragging .djs-visual, +.djs-bendpoint:hover .djs-visual, +.djs-bendpoint.floating .djs-visual { + fill: yellow; + stroke-opacity: 0.5; + stroke: black; +} + +.djs-bendpoint.floating .djs-hit { + pointer-events: none; +} + +.djs-segment-dragger .djs-hit, +.djs-bendpoint .djs-hit { + pointer-events: all; + fill: none; +} + +.djs-segment-dragger.horizontal .djs-hit { + cursor: ns-resize; +} + +.djs-segment-dragger.vertical .djs-hit { + cursor: ew-resize; +} + +.djs-segment-dragger.djs-dragging .djs-hit { + pointer-events: none; +} + +.djs-updating, +.djs-updating > * { + pointer-events: none !important; +} + +.djs-updating .djs-context-pad, +.djs-updating .djs-outline, +.djs-updating .djs-bendpoint, +.connect-ok .djs-bendpoint, +.connect-not-ok .djs-bendpoint, +.drop-ok .djs-bendpoint, +.drop-not-ok .djs-bendpoint { + display: none !important; +} + +.djs-segment-dragger.djs-dragging, +.djs-bendpoint.djs-dragging { + display: block; + opacity: 1.0; +} + +.djs-segment-dragger.djs-dragging .djs-visual, +.djs-bendpoint.djs-dragging .djs-visual { + fill: yellow; + stroke-opacity: 0.5; +} + + +/** + * tooltips + */ +.djs-tooltip-error { + font-size: 11px; + line-height: 18px; + text-align: left; + + padding: 5px; + + opacity: 0.7; +} + +.djs-tooltip-error > * { + width: 160px; + + background: rgb(252, 236, 240); + color: rgb(158, 76, 76); + padding: 3px 7px; + box-shadow: 0 1px 2px rgba(0,0,0, 0.2); + border-radius: 5px; + border-left: solid 5px rgb(174, 73, 73); +} + +.djs-tooltip-error:hover { + opacity: 1; +} diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/bpmn-modeler.js b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/bpmn-modeler.js new file mode 100644 index 0000000..04a7060 --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/bpmn-modeler.js @@ -0,0 +1,52125 @@ +/*! + * bpmn-js - bpmn-modeler v0.14.1 + + * Copyright 2014, 2015 camunda Services GmbH and other contributors + * + * Released under the bpmn.io license + * http://bpmn.io/license + * + * Source Code: https://github.com/bpmn-io/bpmn-js + * + * Date: 2016-03-23 + */ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.BpmnJS = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + ''; + + +/** + * A modeler for BPMN 2.0 diagrams. + * + * + * ## Extending the Modeler + * + * In order to extend the viewer pass extension modules to bootstrap via the + * `additionalModules` option. An extension module is an object that exposes + * named services. + * + * The following example depicts the integration of a simple + * logging component that integrates with interaction events: + * + * + * ```javascript + * + * // logging component + * function InteractionLogger(eventBus) { + * eventBus.on('element.hover', function(event) { + * console.log() + * }) + * } + * + * InteractionLogger.$inject = [ 'eventBus' ]; // minification save + * + * // extension module + * var extensionModule = { + * __init__: [ 'interactionLogger' ], + * interactionLogger: [ 'type', InteractionLogger ] + * }; + * + * // extend the viewer + * var bpmnModeler = new Modeler({ additionalModules: [ extensionModule ] }); + * bpmnModeler.importXML(...); + * ``` + * + * + * ## Customizing / Replacing Components + * + * You can replace individual diagram components by redefining them in override modules. + * This works for all components, including those defined in the core. + * + * Pass in override modules via the `options.additionalModules` flag like this: + * + * ```javascript + * function CustomContextPadProvider(contextPad) { + * + * contextPad.registerProvider(this); + * + * this.getContextPadEntries = function(element) { + * // no entries, effectively disable the context pad + * return {}; + * }; + * } + * + * CustomContextPadProvider.$inject = [ 'contextPad' ]; + * + * var overrideModule = { + * contextPadProvider: [ 'type', CustomContextPadProvider ] + * }; + * + * var bpmnModeler = new Modeler({ additionalModules: [ overrideModule ]}); + * ``` + * + * @param {Object} [options] configuration options to pass to the viewer + * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body. + * @param {String|Number} [options.width] the width of the viewer + * @param {String|Number} [options.height] the height of the viewer + * @param {Object} [options.moddleExtensions] extension packages to provide + * @param {Array} [options.modules] a list of modules to override the default modules + * @param {Array} [options.additionalModules] a list of modules to use with the default modules + */ +function Modeler(options) { + Viewer.call(this, options); + + // hook ID collection into the modeler + this.on('import.parse.complete', function(event) { + if (!event.error) { + this._collectIds(event.definitions, event.context); + } + }, this); + + this.on('diagram.destroy', function() { + this.moddle.ids.clear(); + }, this); +} + +inherits(Modeler, Viewer); + +module.exports = Modeler; + +/** + * Create a new diagram to start modeling. + * + * @param {Function} [done] + */ +Modeler.prototype.createDiagram = function(done) { + return this.importXML(initialDiagram, done); +}; + +/** + * Create a moddle instance, attaching ids to it. + * + * @param {Object} options + */ +Modeler.prototype._createModdle = function(options) { + var moddle = Viewer.prototype._createModdle.call(this, options); + + // attach ids to moddle to be able to track + // and validated ids in the BPMN 2.0 XML document + // tree + moddle.ids = new Ids([ 32, 36, 1 ]); + + return moddle; +}; + +/** + * Collect ids processed during parsing of the + * definitions object. + * + * @param {ModdleElement} definitions + * @param {Context} context + */ +Modeler.prototype._collectIds = function(definitions, context) { + + var moddle = definitions.$model, + ids = moddle.ids, + id; + + // remove references from previous import + ids.clear(); + + for (id in context.elementsById) { + ids.claim(id, context.elementsById[id]); + } +}; + + +Modeler.prototype._interactionModules = [ + // non-modeling components + _dereq_(16), + _dereq_(8), + _dereq_(216), + _dereq_(212), + _dereq_(213) +]; + +Modeler.prototype._modelingModules = [ + // modeling components + _dereq_(166), + _dereq_(118), + _dereq_(182), + _dereq_(196), + _dereq_(141), + _dereq_(133), + _dereq_(12), + _dereq_(62), + _dereq_(43), + _dereq_(10), + _dereq_(49), + _dereq_(54) +]; + + +// modules the modeler is composed of +// +// - viewer modules +// - interaction modules +// - modeling modules + +Modeler.prototype._modules = [].concat( + Modeler.prototype._modules, + Modeler.prototype._interactionModules, + Modeler.prototype._modelingModules); +},{"10":10,"118":118,"12":12,"133":133,"141":141,"16":16,"166":166,"182":182,"196":196,"2":2,"212":212,"213":213,"216":216,"241":241,"243":243,"43":43,"49":49,"54":54,"62":62,"8":8}],2:[function(_dereq_,module,exports){ +/** + * The code in the area + * must not be changed. + * + * @see http://bpmn.io/license for more information. + */ +'use strict'; + +var assign = _dereq_(377), + omit = _dereq_(381), + isString = _dereq_(374), + isNumber = _dereq_(371); + +var domify = _dereq_(394), + domQuery = _dereq_(397), + domRemove = _dereq_(398); + +var Diagram = _dereq_(96), + BpmnModdle = _dereq_(72); + + +var inherits = _dereq_(243); + +var Importer = _dereq_(65); + + +function checkValidationError(err) { + + // check if we can help the user by indicating wrong BPMN 2.0 xml + // (in case he or the exporting tool did not get that right) + + var pattern = /unparsable content <([^>]+)> detected([\s\S]*)$/; + var match = pattern.exec(err.message); + + if (match) { + err.message = + 'unparsable content <' + match[1] + '> detected; ' + + 'this may indicate an invalid BPMN 2.0 diagram file' + match[2]; + } + + return err; +} + +var DEFAULT_OPTIONS = { + width: '100%', + height: '100%', + position: 'relative', + container: 'body' +}; + + +/** + * Ensure the passed argument is a proper unit (defaulting to px) + */ +function ensureUnit(val) { + return val + (isNumber(val) ? 'px' : ''); +} + +/** + * A viewer for BPMN 2.0 diagrams. + * + * Have a look at {@link NavigatedViewer} or {@link Modeler} for bundles that include + * additional features. + * + * + * ## Extending the Viewer + * + * In order to extend the viewer pass extension modules to bootstrap via the + * `additionalModules` option. An extension module is an object that exposes + * named services. + * + * The following example depicts the integration of a simple + * logging component that integrates with interaction events: + * + * + * ```javascript + * + * // logging component + * function InteractionLogger(eventBus) { + * eventBus.on('element.hover', function(event) { + * console.log() + * }) + * } + * + * InteractionLogger.$inject = [ 'eventBus' ]; // minification save + * + * // extension module + * var extensionModule = { + * __init__: [ 'interactionLogger' ], + * interactionLogger: [ 'type', InteractionLogger ] + * }; + * + * // extend the viewer + * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] }); + * bpmnViewer.importXML(...); + * ``` + * + * @param {Object} [options] configuration options to pass to the viewer + * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body. + * @param {String|Number} [options.width] the width of the viewer + * @param {String|Number} [options.height] the height of the viewer + * @param {Object} [options.moddleExtensions] extension packages to provide + * @param {Array} [options.modules] a list of modules to override the default modules + * @param {Array} [options.additionalModules] a list of modules to use with the default modules + */ +function Viewer(options) { + + options = assign({}, DEFAULT_OPTIONS, options); + + this.moddle = this._createModdle(options); + + this.container = this._createContainer(options); + + /* */ + + addProjectLogo(this.container); + + /* */ + + this._init(this.container, this.moddle, options); +} + +inherits(Viewer, Diagram); + +module.exports = Viewer; + + +/** + * Parse and render a BPMN 2.0 diagram. + * + * Once finished the viewer reports back the result to the + * provided callback function with (err, warnings). + * + * ## Life-Cycle Events + * + * During import the viewer will fire life-cycle events: + * + * * import.parse.start (about to read model from xml) + * * import.parse.complete (model read; may have worked or not) + * * import.render.start (graphical import start) + * * import.render.complete (graphical import finished) + * * import.done (everything done) + * + * You can use these events to hook into the life-cycle. + * + * @param {String} xml the BPMN 2.0 xml + * @param {Function} [done] invoked with (err, warnings=[]) + */ +Viewer.prototype.importXML = function(xml, done) { + + // done is optional + done = done || function() {}; + + var self = this; + + // hook in pre-parse listeners + + // allow xml manipulation + xml = this._emit('import.parse.start', { xml: xml }) || xml; + + this.moddle.fromXML(xml, 'bpmn:Definitions', function(err, definitions, context) { + + // hook in post parse listeners + + // allow definitions manipulation + definitions = self._emit('import.parse.complete', { + error: err, + definitions: definitions, + context: context + }) || definitions; + + if (err) { + err = checkValidationError(err); + + self._emit('import.done', { error: err }); + + return done(err); + } + + var parseWarnings = context.warnings; + + self.importDefinitions(definitions, function(err, importWarnings) { + var allWarnings = [].concat(parseWarnings, importWarnings || []); + + self._emit('import.done', { error: err, warnings: allWarnings }); + + done(err, allWarnings); + }); + }); +}; + +/** + * Export the currently displayed BPMN 2.0 diagram as + * a BPMN 2.0 XML document. + * + * @param {Object} [options] export options + * @param {Boolean} [options.format=false] output formated XML + * @param {Boolean} [options.preamble=true] output preamble + * + * @param {Function} done invoked with (err, xml) + */ +Viewer.prototype.saveXML = function(options, done) { + + if (!done) { + done = options; + options = {}; + } + + var definitions = this.definitions; + + if (!definitions) { + return done(new Error('no definitions loaded')); + } + + this.moddle.toXML(definitions, options, done); +}; + +/** + * Export the currently displayed BPMN 2.0 diagram as + * an SVG image. + * + * @param {Object} [options] + * @param {Function} done invoked with (err, svgStr) + */ +Viewer.prototype.saveSVG = function(options, done) { + + if (!done) { + done = options; + options = {}; + } + + var canvas = this.get('canvas'); + + var contentNode = canvas.getDefaultLayer(), + defsNode = canvas._svg.select('defs'); + + var contents = contentNode.innerSVG(), + defs = (defsNode && defsNode.outerSVG()) || ''; + + var bbox = contentNode.getBBox(); + + var svg = + '\n' + + '\n' + + '\n' + + '' + + defs + contents + + ''; + + done(null, svg); +}; + +/** + * Get a named diagram service. + * + * @example + * + * var elementRegistry = viewer.get('elementRegistry'); + * var startEventShape = elementRegistry.get('StartEvent_1'); + * + * @param {String} name + * + * @return {Object} diagram service instance + * + * @method Viewer#get + */ + +/** + * Invoke a function in the context of this viewer. + * + * @example + * + * viewer.invoke(function(elementRegistry) { + * var startEventShape = elementRegistry.get('StartEvent_1'); + * }); + * + * @param {Function} fn to be invoked + * + * @return {Object} the functions return value + * + * @method Viewer#invoke + */ + +/** + * Remove all drawn elements from the viewer. + * + * After calling this method the viewer can still + * be reused for opening another diagram. + * + * @method Viewer#clear + */ + +Viewer.prototype.importDefinitions = function(definitions, done) { + + // use try/catch to not swallow synchronous exceptions + // that may be raised during model parsing + try { + + if (this.definitions) { + // clear existing rendered diagram + this.clear(); + } + + // update definitions + this.definitions = definitions; + + // perform graphical import + Importer.importBpmnDiagram(this, definitions, done); + } catch (e) { + + // handle synchronous errors + done(e); + } +}; + +Viewer.prototype.getModules = function() { + return this._modules; +}; + +/** + * Destroy the viewer instance and remove all its + * remainders from the document tree. + */ +Viewer.prototype.destroy = function() { + + // diagram destroy + Diagram.prototype.destroy.call(this); + + // dom detach + domRemove(this.container); +}; + +/** + * Register an event listener + * + * Remove a previously added listener via {@link #off(event, callback)}. + * + * @param {String} event + * @param {Number} [priority] + * @param {Function} callback + * @param {Object} [that] + */ +Viewer.prototype.on = function(event, priority, callback, target) { + return this.get('eventBus').on(event, priority, callback, target); +}; + +/** + * De-register an event listener + * + * @param {String} event + * @param {Function} callback + */ +Viewer.prototype.off = function(event, callback) { + this.get('eventBus').off(event, callback); +}; + + +Viewer.prototype._init = function(container, moddle, options) { + + var baseModules = options.modules || this.getModules(), + additionalModules = options.additionalModules || [], + staticModules = [ + { + bpmnjs: [ 'value', this ], + moddle: [ 'value', moddle ] + } + ]; + + var diagramModules = [].concat(staticModules, baseModules, additionalModules); + + var diagramOptions = assign(omit(options, 'additionalModules'), { + canvas: assign({}, options.canvas, { container: container }), + modules: diagramModules + }); + + // invoke diagram constructor + Diagram.call(this, diagramOptions); +}; + +/** + * Emit an event on the underlying {@link EventBus} + * + * @param {String} type + * @param {Object} event + * + * @return {Object} event processing result (if any) + */ +Viewer.prototype._emit = function(type, event) { + return this.get('eventBus').fire(type, event); +}; + +Viewer.prototype._createContainer = function(options) { + + var parent = options.container, + container; + + // support jquery element + // unwrap it if passed + if (parent.get) { + parent = parent.get(0); + } + + // support selector + if (isString(parent)) { + parent = domQuery(parent); + } + + container = domify('
'); + + assign(container.style, { + width: ensureUnit(options.width), + height: ensureUnit(options.height), + position: options.position + }); + + parent.appendChild(container); + + return container; +}; + +Viewer.prototype._createModdle = function(options) { + var moddleOptions = assign({}, this._moddleExtensions, options.moddleExtensions); + + return new BpmnModdle(moddleOptions); +}; + + +// modules the viewer is composed of +Viewer.prototype._modules = [ + _dereq_(3), + _dereq_(204), + _dereq_(189), + _dereq_(171) +]; + +// default moddle extensions the viewer is composed of +Viewer.prototype._moddleExtensions = {}; + +/* */ + +var PoweredBy = _dereq_(71), + domEvent = _dereq_(395); + +/** + * Adds the project logo to the diagram container as + * required by the bpmn.io license. + * + * @see http://bpmn.io/license + * + * @param {Element} container + */ +function addProjectLogo(container) { + var logoData = PoweredBy.BPMNIO_LOGO; + + var linkMarkup = + '' + + '' + + ''; + + var linkElement = domify(linkMarkup); + + container.appendChild(linkElement); + + domEvent.bind(linkElement, 'click', function(event) { + PoweredBy.open(); + + event.preventDefault(); + }); +} + +/* */ +},{"171":171,"189":189,"204":204,"243":243,"3":3,"371":371,"374":374,"377":377,"381":381,"394":394,"395":395,"397":397,"398":398,"65":65,"71":71,"72":72,"96":96}],3:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(6), + _dereq_(67) + ] +}; +},{"6":6,"67":67}],4:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243), + isObject = _dereq_(372), + assign = _dereq_(377), + forEach = _dereq_(255), + every = _dereq_(252), + includes = _dereq_(257), + some = _dereq_(261); + +var BaseRenderer = _dereq_(107), + TextUtil = _dereq_(232), + DiUtil = _dereq_(68); + +var is = _dereq_(70).is; + +var RenderUtil = _dereq_(231); + +var componentsToPath = RenderUtil.componentsToPath, + createLine = RenderUtil.createLine; + + +var TASK_BORDER_RADIUS = 10; +var INNER_OUTER_DIST = 3; + +var LABEL_STYLE = { + fontFamily: 'Arial, sans-serif', + fontSize: '12px' +}; + + +function BpmnRenderer(eventBus, styles, pathMap, priority) { + + BaseRenderer.call(this, eventBus, priority); + + var textUtil = new TextUtil({ + style: LABEL_STYLE, + size: { width: 100 } + }); + + var markers = {}; + + var computeStyle = styles.computeStyle; + + function addMarker(id, element) { + markers[id] = element; + } + + function marker(id) { + return markers[id]; + } + + function initMarkers(svg) { + + function createMarker(id, options) { + var attrs = assign({ + fill: 'black', + strokeWidth: 1, + strokeLinecap: 'round', + strokeDasharray: 'none' + }, options.attrs); + + var ref = options.ref || { x: 0, y: 0 }; + + var scale = options.scale || 1; + + // fix for safari / chrome / firefox bug not correctly + // resetting stroke dash array + if (attrs.strokeDasharray === 'none') { + attrs.strokeDasharray = [10000, 1]; + } + + var marker = options.element + .attr(attrs) + .marker(0, 0, 20, 20, ref.x, ref.y) + .attr({ + markerWidth: 20 * scale, + markerHeight: 20 * scale + }); + + return addMarker(id, marker); + } + + + createMarker('sequenceflow-end', { + element: svg.path('M 1 5 L 11 10 L 1 15 Z'), + ref: { x: 11, y: 10 }, + scale: 0.5 + }); + + createMarker('messageflow-start', { + element: svg.circle(6, 6, 3.5), + attrs: { + fill: 'white', + stroke: 'black' + }, + ref: { x: 6, y: 6 } + }); + + createMarker('messageflow-end', { + element: svg.path('m 1 5 l 0 -3 l 7 3 l -7 3 z'), + attrs: { + fill: 'white', + stroke: 'black', + strokeLinecap: 'butt' + }, + ref: { x: 8.5, y: 5 } + }); + + createMarker('association-start', { + element: svg.path('M 11 5 L 1 10 L 11 15'), + attrs: { + fill: 'none', + stroke: 'black', + strokeWidth: 1.5 + }, + ref: { x: 1, y: 10 }, + scale: 0.5 + }); + + createMarker('association-end', { + element: svg.path('M 1 5 L 11 10 L 1 15'), + attrs: { + fill: 'none', + stroke: 'black', + strokeWidth: 1.5 + }, + ref: { x: 12, y: 10 }, + scale: 0.5 + }); + + createMarker('conditional-flow-marker', { + element: svg.path('M 0 10 L 8 6 L 16 10 L 8 14 Z'), + attrs: { + fill: 'white', + stroke: 'black' + }, + ref: { x: -1, y: 10 }, + scale: 0.5 + }); + + createMarker('conditional-default-flow-marker', { + element: svg.path('M 1 4 L 5 16'), + attrs: { + stroke: 'black' + }, + ref: { x: -5, y: 10 }, + scale: 0.5 + }); + } + + function drawCircle(p, width, height, offset, attrs) { + + if (isObject(offset)) { + attrs = offset; + offset = 0; + } + + offset = offset || 0; + + attrs = computeStyle(attrs, { + stroke: 'black', + strokeWidth: 2, + fill: 'white' + }); + + var cx = width / 2, + cy = height / 2; + + return p.circle(cx, cy, Math.round((width + height) / 4 - offset)).attr(attrs); + } + + function drawRect(p, width, height, r, offset, attrs) { + + if (isObject(offset)) { + attrs = offset; + offset = 0; + } + + offset = offset || 0; + + attrs = computeStyle(attrs, { + stroke: 'black', + strokeWidth: 2, + fill: 'white' + }); + + return p.rect(offset, offset, width - offset * 2, height - offset * 2, r).attr(attrs); + } + + function drawDiamond(p, width, height, attrs) { + + var x_2 = width / 2; + var y_2 = height / 2; + + var points = [x_2, 0, width, y_2, x_2, height, 0, y_2 ]; + + attrs = computeStyle(attrs, { + stroke: 'black', + strokeWidth: 2, + fill: 'white' + }); + + return p.polygon(points).attr(attrs); + } + + function drawLine(p, waypoints, attrs) { + attrs = computeStyle(attrs, [ 'no-fill' ], { + stroke: 'black', + strokeWidth: 2, + fill: 'none' + }); + + return createLine(waypoints, attrs).appendTo(p); + } + + function drawPath(p, d, attrs) { + + attrs = computeStyle(attrs, [ 'no-fill' ], { + strokeWidth: 2, + stroke: 'black' + }); + + return p.path(d).attr(attrs); + } + + function drawMarker(type, p, path, attrs) { + return drawPath(p, path, assign({ 'data-marker': type }, attrs)); + } + + function as(type) { + return function(p, element) { + return handlers[type](p, element); + }; + } + + function renderer(type) { + return handlers[type]; + } + + function renderEventContent(element, p) { + + var event = getSemantic(element); + var isThrowing = isThrowEvent(event); + + if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) { + return renderer('bpmn:MessageEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) { + return renderer('bpmn:TimerEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) { + return renderer('bpmn:ConditionalEventDefinition')(p, element); + } + + if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) { + return renderer('bpmn:SignalEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CancelEventDefinition') && + isTypedEvent(event, 'bpmn:TerminateEventDefinition', { parallelMultiple: false })) { + return renderer('bpmn:MultipleEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CancelEventDefinition') && + isTypedEvent(event, 'bpmn:TerminateEventDefinition', { parallelMultiple: true })) { + return renderer('bpmn:ParallelMultipleEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) { + return renderer('bpmn:EscalationEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) { + return renderer('bpmn:LinkEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) { + return renderer('bpmn:ErrorEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) { + return renderer('bpmn:CancelEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) { + return renderer('bpmn:CompensateEventDefinition')(p, element, isThrowing); + } + + if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) { + return renderer('bpmn:TerminateEventDefinition')(p, element, isThrowing); + } + + return null; + } + + function renderLabel(p, label, options) { + return textUtil.createText(p, label || '', options).addClass('djs-label'); + } + + function renderEmbeddedLabel(p, element, align) { + var semantic = getSemantic(element); + return renderLabel(p, semantic.name, { box: element, align: align, padding: 5 }); + } + + function renderExternalLabel(p, element, align) { + var semantic = getSemantic(element); + return renderLabel(p, semantic.name, { box: element, align: align, style: { fontSize: '11px' } }); + } + + function renderLaneLabel(p, text, element) { + var textBox = renderLabel(p, text, { + box: { height: 30, width: element.height }, + align: 'center-middle' + }); + + var top = -1 * element.height; + textBox.transform( + 'rotate(270) ' + + 'translate(' + top + ',' + 0 + ')' + ); + } + + function createPathFromConnection(connection) { + var waypoints = connection.waypoints; + + var pathData = 'm ' + waypoints[0].x + ',' + waypoints[0].y; + for (var i = 1; i < waypoints.length; i++) { + pathData += 'L' + waypoints[i].x + ',' + waypoints[i].y + ' '; + } + return pathData; + } + + var handlers = this.handlers = { + 'bpmn:Event': function(p, element, attrs) { + return drawCircle(p, element.width, element.height, attrs); + }, + 'bpmn:StartEvent': function(p, element) { + var attrs = {}; + var semantic = getSemantic(element); + + if (!semantic.isInterrupting) { + attrs = { + strokeDasharray: '6', + strokeLinecap: 'round' + }; + } + + var circle = renderer('bpmn:Event')(p, element, attrs); + + renderEventContent(element, p); + + return circle; + }, + 'bpmn:MessageEventDefinition': function(p, element, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_MESSAGE', { + xScaleFactor: 0.9, + yScaleFactor: 0.9, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.235, + my: 0.315 + } + }); + + var fill = isThrowing ? 'black' : 'white'; + var stroke = isThrowing ? 'white' : 'black'; + + var messagePath = drawPath(p, pathData, { + strokeWidth: 1, + fill: fill, + stroke: stroke + }); + + return messagePath; + }, + 'bpmn:TimerEventDefinition': function(p, element) { + + var circle = drawCircle(p, element.width, element.height, 0.2 * element.height, { + strokeWidth: 2 + }); + + var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', { + xScaleFactor: 0.75, + yScaleFactor: 0.75, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.5, + my: 0.5 + } + }); + + drawPath(p, pathData, { + strokeWidth: 2, + strokeLinecap: 'square' + }); + + for(var i = 0;i < 12;i++) { + + var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', { + xScaleFactor: 0.75, + yScaleFactor: 0.75, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.5, + my: 0.5 + } + }); + + var width = element.width / 2; + var height = element.height / 2; + + drawPath(p, linePathData, { + strokeWidth: 1, + strokeLinecap: 'square', + transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')' + }); + } + + return circle; + }, + 'bpmn:EscalationEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_ESCALATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.5, + my: 0.555 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:ConditionalEventDefinition': function(p, event) { + var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.5, + my: 0.222 + } + }); + + return drawPath(p, pathData, { + strokeWidth: 1 + }); + }, + 'bpmn:LinkEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_LINK', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.57, + my: 0.263 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:ErrorEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_ERROR', { + xScaleFactor: 1.1, + yScaleFactor: 1.1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.2, + my: 0.722 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:CancelEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', { + xScaleFactor: 1.0, + yScaleFactor: 1.0, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.638, + my: -0.055 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }).transform('rotate(45)'); + }, + 'bpmn:CompensateEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.22, + my: 0.5 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:SignalEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_SIGNAL', { + xScaleFactor: 0.9, + yScaleFactor: 0.9, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.5, + my: 0.2 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:MultipleEventDefinition': function(p, event, isThrowing) { + var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', { + xScaleFactor: 1.1, + yScaleFactor: 1.1, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.222, + my: 0.36 + } + }); + + var fill = isThrowing ? 'black' : 'none'; + + return drawPath(p, pathData, { + strokeWidth: 1, + fill: fill + }); + }, + 'bpmn:ParallelMultipleEventDefinition': function(p, event) { + var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', { + xScaleFactor: 1.2, + yScaleFactor: 1.2, + containerWidth: event.width, + containerHeight: event.height, + position: { + mx: 0.458, + my: 0.194 + } + }); + + return drawPath(p, pathData, { + strokeWidth: 1 + }); + }, + 'bpmn:EndEvent': function(p, element) { + var circle = renderer('bpmn:Event')(p, element, { + strokeWidth: 4 + }); + + renderEventContent(element, p, true); + + return circle; + }, + 'bpmn:TerminateEventDefinition': function(p, element) { + var circle = drawCircle(p, element.width, element.height, 8, { + strokeWidth: 4, + fill: 'black' + }); + + return circle; + }, + 'bpmn:IntermediateEvent': function(p, element) { + var outer = renderer('bpmn:Event')(p, element, { strokeWidth: 1 }); + /* inner */ drawCircle(p, element.width, element.height, INNER_OUTER_DIST, { strokeWidth: 1, fill: 'none' }); + + renderEventContent(element, p); + + return outer; + }, + 'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'), + 'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'), + + 'bpmn:Activity': function(p, element, attrs) { + return drawRect(p, element.width, element.height, TASK_BORDER_RADIUS, attrs); + }, + + 'bpmn:Task': function(p, element, attrs) { + var rect = renderer('bpmn:Activity')(p, element, attrs); + renderEmbeddedLabel(p, element, 'center-middle'); + attachTaskMarkers(p, element); + return rect; + }, + 'bpmn:ServiceTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', { + abspos: { + x: 12, + y: 18 + } + }); + + /* service bg */ drawPath(p, pathDataBG, { + strokeWidth: 1, + fill: 'none' + }); + + var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', { + abspos: { + x: 17.2, + y: 18 + } + }); + + /* service fill */ drawPath(p, fillPathData, { + strokeWidth: 0, + stroke: 'none', + fill: 'white' + }); + + var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', { + abspos: { + x: 17, + y: 22 + } + }); + + /* service */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'white' + }); + + return task; + }, + 'bpmn:UserTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var x = 15; + var y = 12; + + var pathData = pathMap.getScaledPath('TASK_TYPE_USER_1', { + abspos: { + x: x, + y: y + } + }); + + /* user path */ drawPath(p, pathData, { + strokeWidth: 0.5, + fill: 'none' + }); + + var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', { + abspos: { + x: x, + y: y + } + }); + + /* user2 path */ drawPath(p, pathData2, { + strokeWidth: 0.5, + fill: 'none' + }); + + var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', { + abspos: { + x: x, + y: y + } + }); + + /* user3 path */ drawPath(p, pathData3, { + strokeWidth: 0.5, + fill: 'black' + }); + + return task; + }, + 'bpmn:ManualTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', { + abspos: { + x: 17, + y: 15 + } + }); + + /* manual path */ drawPath(p, pathData, { + strokeWidth: 0.25, + fill: 'white', + stroke: 'black' + }); + + return task; + }, + 'bpmn:SendTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: 21, + containerHeight: 14, + position: { + mx: 0.285, + my: 0.357 + } + }); + + /* send path */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black', + stroke: 'white' + }); + + return task; + }, + 'bpmn:ReceiveTask' : function(p, element) { + var semantic = getSemantic(element); + + var task = renderer('bpmn:Task')(p, element); + var pathData; + + if (semantic.instantiate) { + drawCircle(p, 28, 28, 20 * 0.22, { strokeWidth: 1 }); + + pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', { + abspos: { + x: 7.77, + y: 9.52 + } + }); + } else { + + pathData = pathMap.getScaledPath('TASK_TYPE_SEND', { + xScaleFactor: 0.9, + yScaleFactor: 0.9, + containerWidth: 21, + containerHeight: 14, + position: { + mx: 0.3, + my: 0.4 + } + }); + } + + /* receive path */ drawPath(p, pathData, { + strokeWidth: 1 + }); + + return task; + }, + 'bpmn:ScriptTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', { + abspos: { + x: 15, + y: 20 + } + }); + + /* script path */ drawPath(p, pathData, { + strokeWidth: 1 + }); + + return task; + }, + 'bpmn:BusinessRuleTask': function(p, element) { + var task = renderer('bpmn:Task')(p, element); + + var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', { + abspos: { + x: 8, + y: 8 + } + }); + + var businessHeaderPath = drawPath(p, headerPathData); + businessHeaderPath.attr({ + strokeWidth: 1, + fill: 'AAA' + }); + + var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', { + abspos: { + x: 8, + y: 8 + } + }); + + var businessPath = drawPath(p, headerData); + businessPath.attr({ + strokeWidth: 1 + }); + + return task; + }, + 'bpmn:SubProcess': function(p, element, attrs) { + + attrs = assign({ fillOpacity: 0.95 }, attrs); + + var rect = renderer('bpmn:Activity')(p, element, attrs); + + var expanded = DiUtil.isExpanded(element); + + var isEventSubProcess = DiUtil.isEventSubProcess(element); + + if (isEventSubProcess) { + rect.attr({ + strokeDasharray: '1,2' + }); + } + + renderEmbeddedLabel(p, element, expanded ? 'center-top' : 'center-middle'); + + if (expanded) { + attachTaskMarkers(p, element); + } else { + attachTaskMarkers(p, element, ['SubProcessMarker']); + } + + return rect; + }, + 'bpmn:AdHocSubProcess': function(p, element) { + return renderer('bpmn:SubProcess')(p, element); + }, + 'bpmn:Transaction': function(p, element) { + var outer = renderer('bpmn:SubProcess')(p, element); + + var innerAttrs = styles.style([ 'no-fill', 'no-events' ]); + + /* inner path */ drawRect(p, element.width, element.height, TASK_BORDER_RADIUS - 2, INNER_OUTER_DIST, innerAttrs); + + return outer; + }, + 'bpmn:CallActivity': function(p, element) { + return renderer('bpmn:SubProcess')(p, element, { + strokeWidth: 5 + }); + }, + 'bpmn:Participant': function(p, element) { + + var lane = renderer('bpmn:Lane')(p, element, { + fillOpacity: 0.95, + fill: 'White' + }); + + var expandedPool = DiUtil.isExpanded(element); + + if (expandedPool) { + drawLine(p, [ + { x: 30, y: 0 }, + { x: 30, y: element.height } + ]); + var text = getSemantic(element).name; + renderLaneLabel(p, text, element); + } else { + // Collapsed pool draw text inline + var text2 = getSemantic(element).name; + renderLabel(p, text2, { box: element, align: 'center-middle' }); + } + + var participantMultiplicity = !!(getSemantic(element).participantMultiplicity); + + if (participantMultiplicity) { + renderer('ParticipantMultiplicityMarker')(p, element); + } + + return lane; + }, + 'bpmn:Lane': function(p, element, attrs) { + var rect = drawRect(p, element.width, element.height, 0, attrs || { + fill: 'none' + }); + + var semantic = getSemantic(element); + + if (semantic.$type === 'bpmn:Lane') { + var text = semantic.name; + renderLaneLabel(p, text, element); + } + + return rect; + }, + 'bpmn:InclusiveGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + /* circle path */ + drawCircle(p, element.width, element.height, element.height * 0.24, { + strokeWidth: 2.5, + fill: 'none' + }); + + return diamond; + }, + 'bpmn:ExclusiveGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', { + xScaleFactor: 0.4, + yScaleFactor: 0.4, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.32, + my: 0.3 + } + }); + + if (!!(getDi(element).isMarkerVisible)) { + drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black' + }); + } + + return diamond; + }, + 'bpmn:ComplexGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', { + xScaleFactor: 0.5, + yScaleFactor:0.5, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.46, + my: 0.26 + } + }); + + /* complex path */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black' + }); + + return diamond; + }, + 'bpmn:ParallelGateway': function(p, element) { + var diamond = drawDiamond(p, element.width, element.height); + + var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', { + xScaleFactor: 0.6, + yScaleFactor:0.6, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.46, + my: 0.2 + } + }); + + /* parallel path */ drawPath(p, pathData, { + strokeWidth: 1, + fill: 'black' + }); + + return diamond; + }, + 'bpmn:EventBasedGateway': function(p, element) { + + var semantic = getSemantic(element); + + var diamond = drawDiamond(p, element.width, element.height); + + /* outer circle path */ drawCircle(p, element.width, element.height, element.height * 0.20, { + strokeWidth: 1, + fill: 'none' + }); + + var type = semantic.eventGatewayType; + var instantiate = !!semantic.instantiate; + + function drawEvent() { + + var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', { + xScaleFactor: 0.18, + yScaleFactor: 0.18, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.36, + my: 0.44 + } + }); + + /* event path */ drawPath(p, pathData, { + strokeWidth: 2, + fill: 'none' + }); + } + + if (type === 'Parallel') { + + var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', { + xScaleFactor: 0.4, + yScaleFactor:0.4, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.474, + my: 0.296 + } + }); + + var parallelPath = drawPath(p, pathData); + parallelPath.attr({ + strokeWidth: 1, + fill: 'none' + }); + } else if (type === 'Exclusive') { + + if (!instantiate) { + var innerCircle = drawCircle(p, element.width, element.height, element.height * 0.26); + innerCircle.attr({ + strokeWidth: 1, + fill: 'none' + }); + } + + drawEvent(); + } + + + return diamond; + }, + 'bpmn:Gateway': function(p, element) { + return drawDiamond(p, element.width, element.height); + }, + 'bpmn:SequenceFlow': function(p, element) { + var pathData = createPathFromConnection(element); + var path = drawPath(p, pathData, { + strokeLinejoin: 'round', + markerEnd: marker('sequenceflow-end') + }); + + var sequenceFlow = getSemantic(element); + var source = element.source.businessObject; + + // conditional flow marker + if (sequenceFlow.conditionExpression && source.$instanceOf('bpmn:Activity')) { + path.attr({ + markerStart: marker('conditional-flow-marker') + }); + } + + // default marker + if (source.default && (source.$instanceOf('bpmn:Gateway') || source.$instanceOf('bpmn:Activity')) && + source.default === sequenceFlow) { + path.attr({ + markerStart: marker('conditional-default-flow-marker') + }); + } + + return path; + }, + 'bpmn:Association': function(p, element, attrs) { + + var semantic = getSemantic(element); + + attrs = assign({ + strokeDasharray: '0.5, 5', + strokeLinecap: 'round', + strokeLinejoin: 'round' + }, attrs || {}); + + if (semantic.associationDirection === 'One' || + semantic.associationDirection === 'Both') { + attrs.markerEnd = marker('association-end'); + } + + if (semantic.associationDirection === 'Both') { + attrs.markerStart = marker('association-start'); + } + + return drawLine(p, element.waypoints, attrs); + }, + 'bpmn:DataInputAssociation': function(p, element) { + return renderer('bpmn:Association')(p, element, { + markerEnd: marker('association-end') + }); + }, + 'bpmn:DataOutputAssociation': function(p, element) { + return renderer('bpmn:Association')(p, element, { + markerEnd: marker('association-end') + }); + }, + 'bpmn:MessageFlow': function(p, element) { + + var semantic = getSemantic(element), + di = getDi(element); + + var pathData = createPathFromConnection(element); + var path = drawPath(p, pathData, { + markerEnd: marker('messageflow-end'), + markerStart: marker('messageflow-start'), + strokeDasharray: '10, 12', + strokeLinecap: 'round', + strokeLinejoin: 'round', + strokeWidth: '1.5px' + }); + + if (semantic.messageRef) { + var midPoint = path.getPointAtLength(path.getTotalLength() / 2); + + var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', { + abspos: { + x: midPoint.x, + y: midPoint.y + } + }); + + var messageAttrs = { strokeWidth: 1 }; + + if (di.messageVisibleKind === 'initiating') { + messageAttrs.fill = 'white'; + messageAttrs.stroke = 'black'; + } else { + messageAttrs.fill = '#888'; + messageAttrs.stroke = 'white'; + } + + drawPath(p, markerPathData, messageAttrs); + } + + return path; + }, + 'bpmn:DataObject': function(p, element) { + var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.474, + my: 0.296 + } + }); + + var elementObject = drawPath(p, pathData, { fill: 'white' }); + + var semantic = getSemantic(element); + + if (isCollection(semantic)) { + renderDataItemCollection(p, element); + } + + return elementObject; + }, + 'bpmn:DataObjectReference': as('bpmn:DataObject'), + 'bpmn:DataInput': function(p, element) { + + var arrowPathData = pathMap.getRawPath('DATA_ARROW'); + + // page + var elementObject = renderer('bpmn:DataObject')(p, element); + + /* input arrow path */ drawPath(p, arrowPathData, { strokeWidth: 1 }); + + return elementObject; + }, + 'bpmn:DataOutput': function(p, element) { + var arrowPathData = pathMap.getRawPath('DATA_ARROW'); + + // page + var elementObject = renderer('bpmn:DataObject')(p, element); + + /* output arrow path */ drawPath(p, arrowPathData, { + strokeWidth: 1, + fill: 'black' + }); + + return elementObject; + }, + 'bpmn:DataStoreReference': function(p, element) { + var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0, + my: 0.133 + } + }); + + var elementStore = drawPath(p, DATA_STORE_PATH, { + strokeWidth: 2, + fill: 'white' + }); + + return elementStore; + }, + 'bpmn:BoundaryEvent': function(p, element) { + + var semantic = getSemantic(element), + cancel = semantic.cancelActivity; + + var attrs = { + strokeWidth: 1 + }; + + if (!cancel) { + attrs.strokeDasharray = '6'; + attrs.strokeLinecap = 'round'; + } + + var outer = renderer('bpmn:Event')(p, element, attrs); + /* inner path */ drawCircle(p, element.width, element.height, INNER_OUTER_DIST, assign(attrs, { fill: 'none' })); + + renderEventContent(element, p); + + return outer; + }, + 'bpmn:Group': function(p, element) { + return drawRect(p, element.width, element.height, TASK_BORDER_RADIUS, { + strokeWidth: 1, + strokeDasharray: '8,3,1,3', + fill: 'none', + pointerEvents: 'none' + }); + }, + 'label': function(p, element) { + return renderExternalLabel(p, element, ''); + }, + 'bpmn:TextAnnotation': function(p, element) { + var style = { + 'fill': 'none', + 'stroke': 'none' + }; + var textElement = drawRect(p, element.width, element.height, 0, 0, style); + var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.0, + my: 0.0 + } + }); + drawPath(p, textPathData); + + var text = getSemantic(element).text || ''; + renderLabel(p, text, { box: element, align: 'left-middle', padding: 5 }); + + return textElement; + }, + 'ParticipantMultiplicityMarker': function(p, element) { + var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2) / element.width), + my: (element.height - 15) / element.height + } + }); + + drawMarker('participant-multiplicity', p, markerPath); + }, + 'SubProcessMarker': function(p, element) { + var markerRect = drawRect(p, 14, 14, 0, { + strokeWidth: 1 + }); + + // Process marker is placed in the middle of the box + // therefore fixed values can be used here + markerRect.transform('translate(' + (element.width / 2 - 7.5) + ',' + (element.height - 20) + ')'); + + var markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', { + xScaleFactor: 1.5, + yScaleFactor: 1.5, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: (element.width / 2 - 7.5) / element.width, + my: (element.height - 20) / element.height + } + }); + + drawMarker('sub-process', p, markerPath); + }, + 'ParallelMarker': function(p, element, position) { + var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.parallel) / element.width), + my: (element.height - 20) / element.height + } + }); + + drawMarker('parallel', p, markerPath); + }, + 'SequentialMarker': function(p, element, position) { + var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.seq) / element.width), + my: (element.height - 19) / element.height + } + }); + + drawMarker('sequential', p, markerPath); + }, + 'CompensationMarker': function(p, element, position) { + var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.compensation) / element.width), + my: (element.height - 13) / element.height + } + }); + + drawMarker('compensation', p, markerMath, { strokeWidth: 1 }); + }, + 'LoopMarker': function(p, element, position) { + var markerPath = pathMap.getScaledPath('MARKER_LOOP', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.loop) / element.width), + my: (element.height - 7) / element.height + } + }); + + drawMarker('loop', p, markerPath, { + strokeWidth: 1, + fill: 'none', + strokeLinecap: 'round', + strokeMiterlimit: 0.5 + }); + }, + 'AdhocMarker': function(p, element, position) { + var markerPath = pathMap.getScaledPath('MARKER_ADHOC', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: ((element.width / 2 + position.adhoc) / element.width), + my: (element.height - 15) / element.height + } + }); + + drawMarker('adhoc', p, markerPath, { + strokeWidth: 1, + fill: 'black' + }); + } + }; + + function attachTaskMarkers(p, element, taskMarkers) { + var obj = getSemantic(element); + + var subprocess = includes(taskMarkers, 'SubProcessMarker'); + var position; + + if (subprocess) { + position = { + seq: -21, + parallel: -22, + compensation: -42, + loop: -18, + adhoc: 10 + }; + } else { + position = { + seq: -3, + parallel: -6, + compensation: -27, + loop: 0, + adhoc: 10 + }; + } + + forEach(taskMarkers, function(marker) { + renderer(marker)(p, element, position); + }); + + if (obj.isForCompensation) { + renderer('CompensationMarker')(p, element, position); + } + + if (obj.$type === 'bpmn:AdHocSubProcess') { + renderer('AdhocMarker')(p, element, position); + } + + var loopCharacteristics = obj.loopCharacteristics, + isSequential = loopCharacteristics && loopCharacteristics.isSequential; + + if (loopCharacteristics) { + + if (isSequential === undefined) { + renderer('LoopMarker')(p, element, position); + } + + if (isSequential === false) { + renderer('ParallelMarker')(p, element, position); + } + + if (isSequential === true) { + renderer('SequentialMarker')(p, element, position); + } + } + } + + function renderDataItemCollection(p, element) { + + var yPosition = (element.height - 16) / element.height; + + var pathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', { + xScaleFactor: 1, + yScaleFactor: 1, + containerWidth: element.width, + containerHeight: element.height, + position: { + mx: 0.451, + my: yPosition + } + }); + + /* collection path */ drawPath(p, pathData, { + strokeWidth: 2 + }); + } + + // hook onto canvas init event to initialize + // connection start/end markers on svg + eventBus.on('canvas.init', function(event) { + initMarkers(event.svg); + }); +} + + +inherits(BpmnRenderer, BaseRenderer); + +BpmnRenderer.$inject = [ 'eventBus', 'styles', 'pathMap' ]; + +module.exports = BpmnRenderer; + + +BpmnRenderer.prototype.canRender = function(element) { + return is(element, 'bpmn:BaseElement'); +}; + +BpmnRenderer.prototype.drawShape = function(visuals, element) { + var type = element.type; + var h = this.handlers[type]; + + /* jshint -W040 */ + return h(visuals, element); +}; + +BpmnRenderer.prototype.drawConnection = function(visuals, element) { + var type = element.type; + var h = this.handlers[type]; + + /* jshint -W040 */ + return h(visuals, element); +}; + +BpmnRenderer.prototype.getShapePath = function(element) { + + if (is(element, 'bpmn:Event')) { + return getCirclePath(element); + } + + if (is(element, 'bpmn:Activity')) { + return getRoundRectPath(element, TASK_BORDER_RADIUS); + } + + if (is(element, 'bpmn:Gateway')) { + return getDiamondPath(element); + } + + return getRectPath(element); +}; + + +///////// helper functions ///////////////////////////// + +/** + * Checks if eventDefinition of the given element matches with semantic type. + * + * @return {boolean} true if element is of the given semantic type + */ +function isTypedEvent(event, eventDefinitionType, filter) { + + function matches(definition, filter) { + return every(filter, function(val, key) { + + // we want a == conversion here, to be able to catch + // undefined == false and friends + /* jshint -W116 */ + return definition[key] == val; + }); + } + + return some(event.eventDefinitions, function(definition) { + return definition.$type === eventDefinitionType && matches(event, filter); + }); +} + +function isThrowEvent(event) { + return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent'); +} + +function isCollection(element) { + return element.isCollection || + (element.elementObjectRef && element.elementObjectRef.isCollection); +} + +function getDi(element) { + return element.businessObject.di; +} + +function getSemantic(element) { + return element.businessObject; +} + + + +/////// cropping path customizations ///////////////////////// + +function getCirclePath(shape) { + + var cx = shape.x + shape.width / 2, + cy = shape.y + shape.height / 2, + radius = shape.width / 2; + + var circlePath = [ + ['M', cx, cy], + ['m', 0, -radius], + ['a', radius, radius, 0, 1, 1, 0, 2 * radius], + ['a', radius, radius, 0, 1, 1, 0, -2 * radius], + ['z'] + ]; + + return componentsToPath(circlePath); +} + +function getRoundRectPath(shape, borderRadius) { + + var x = shape.x, + y = shape.y, + width = shape.width, + height = shape.height; + + var roundRectPath = [ + ['M', x + borderRadius, y], + ['l', width - borderRadius * 2, 0], + ['a', borderRadius, borderRadius, 0, 0, 1, borderRadius, borderRadius], + ['l', 0, height - borderRadius * 2], + ['a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, borderRadius], + ['l', borderRadius * 2 - width, 0], + ['a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, -borderRadius], + ['l', 0, borderRadius * 2 - height], + ['a', borderRadius, borderRadius, 0, 0, 1, borderRadius, -borderRadius], + ['z'] + ]; + + return componentsToPath(roundRectPath); +} + +function getDiamondPath(shape) { + + var width = shape.width, + height = shape.height, + x = shape.x, + y = shape.y, + halfWidth = width / 2, + halfHeight = height / 2; + + var diamondPath = [ + ['M', x + halfWidth, y], + ['l', halfWidth, halfHeight], + ['l', -halfWidth, halfHeight], + ['l', -halfWidth, -halfHeight], + ['z'] + ]; + + return componentsToPath(diamondPath); +} + +function getRectPath(shape) { + var x = shape.x, + y = shape.y, + width = shape.width, + height = shape.height; + + var rectPath = [ + ['M', x, y], + ['l', width, 0], + ['l', 0, height], + ['l', -width, 0], + ['z'] + ]; + + return componentsToPath(rectPath); +} + +},{"107":107,"231":231,"232":232,"243":243,"252":252,"255":255,"257":257,"261":261,"372":372,"377":377,"68":68,"70":70}],5:[function(_dereq_,module,exports){ +'use strict'; + +var Snap = _dereq_(240); + +/** + * Map containing SVG paths needed by BpmnRenderer. + */ + +function PathMap() { + + /** + * Contains a map of path elements + * + *

Path definition

+ * A parameterized path is defined like this: + *
+   * 'GATEWAY_PARALLEL': {
+   *   d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +
+          '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',
+   *   height: 17.5,
+   *   width:  17.5,
+   *   heightElements: [2.5, 7.5],
+   *   widthElements: [2.5, 7.5]
+   * }
+   * 
+ *

It's important to specify a correct height and width for the path as the scaling + * is based on the ratio between the specified height and width in this object and the + * height and width that is set as scale target (Note x,y coordinates will be scaled with + * individual ratios).

+ *

The 'heightElements' and 'widthElements' array must contain the values that will be scaled. + * The scaling is based on the computed ratios. + * Coordinates on the y axis should be in the heightElement's array, they will be scaled using + * the computed ratio coefficient. + * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets. + *

    + *
  • The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....
  • + *
  • The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....
  • + *
+ * The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index. + *

+ */ + this.pathMap = { + 'EVENT_MESSAGE': { + d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}', + height: 36, + width: 36, + heightElements: [6, 14], + widthElements: [10.5, 21] + }, + 'EVENT_SIGNAL': { + d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z', + height: 36, + width: 36, + heightElements: [18], + widthElements: [10, 20] + }, + 'EVENT_ESCALATION': { + d: 'm {mx},{my} c -{e.x1},{e.y0} -{e.x3},{e.y1} -{e.x5},{e.y4} {e.x1},-{e.y3} {e.x3},-{e.y5} {e.x5},-{e.y6} ' + + '{e.x0},{e.y3} {e.x2},{e.y5} {e.x4},{e.y6} -{e.x0},-{e.y0} -{e.x2},-{e.y1} -{e.x4},-{e.y4} z', + height: 36, + width: 36, + heightElements: [2.382, 4.764, 4.926, 6.589333, 7.146, 13.178667, 19.768], + widthElements: [2.463, 2.808, 4.926, 5.616, 7.389, 8.424] + }, + 'EVENT_CONDITIONAL': { + d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' + + 'M {e.x2},{e.y3} l {e.x0},0 ' + + 'M {e.x2},{e.y4} l {e.x0},0 ' + + 'M {e.x2},{e.y5} l {e.x0},0 ' + + 'M {e.x2},{e.y6} l {e.x0},0 ' + + 'M {e.x2},{e.y7} l {e.x0},0 ' + + 'M {e.x2},{e.y8} l {e.x0},0 ', + height: 36, + width: 36, + heightElements: [8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5], + widthElements: [10.5, 14.5, 12.5] + }, + 'EVENT_LINK': { + d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z', + height: 36, + width: 36, + heightElements: [4.4375, 6.75, 7.8125], + widthElements: [9.84375, 13.5] + }, + 'EVENT_ERROR': { + d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z', + height: 36, + width: 36, + heightElements: [0.023, 8.737, 8.151, 16.564, 10.591, 8.714], + widthElements: [0.085, 6.672, 6.97, 4.273, 5.337, 6.636] + }, + 'EVENT_CANCEL_45': { + d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' + + '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z', + height: 36, + width: 36, + heightElements: [4.75, 8.5], + widthElements: [4.75, 8.5] + }, + 'EVENT_COMPENSATION': { + d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z', + height: 36, + width: 36, + heightElements: [6.5, 13, 0.4, 6.1], + widthElements: [9, 9.3, 8.7] + }, + 'EVENT_TIMER_WH': { + d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ', + height: 36, + width: 36, + heightElements: [10, 2], + widthElements: [3, 7] + }, + 'EVENT_TIMER_LINE': { + d: 'M {mx},{my} ' + + 'm {e.x0},{e.y0} l -{e.x1},{e.y1} ', + height: 36, + width: 36, + heightElements: [10, 3], + widthElements: [0, 0] + }, + 'EVENT_MULTIPLE': { + d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z', + height: 36, + width: 36, + heightElements: [6.28099, 12.56199], + widthElements: [3.1405, 9.42149, 12.56198] + }, + 'EVENT_PARALLEL_MULTIPLE': { + d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' + + '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z', + height: 36, + width: 36, + heightElements: [2.56228, 7.68683], + widthElements: [2.56228, 7.68683] + }, + 'GATEWAY_EXCLUSIVE': { + d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' + + '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' + + '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z', + height: 17.5, + width: 17.5, + heightElements: [8.5, 6.5312, -6.5312, -8.5], + widthElements: [6.5, -6.5, 3, -3, 5, -5] + }, + 'GATEWAY_PARALLEL': { + d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' + + '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z', + height: 30, + width: 30, + heightElements: [5, 12.5], + widthElements: [5, 12.5] + }, + 'GATEWAY_EVENT_BASED': { + d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z', + height: 11, + width: 11, + heightElements: [-6, 6, 12, -12], + widthElements: [9, -3, -12] + }, + 'GATEWAY_COMPLEX': { + d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' + + '{e.x2},0 -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' + + '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' + + '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z', + height: 17.125, + width: 17.125, + heightElements: [4.875, 3.4375, 2.125, 3], + widthElements: [3.4375, 2.125, 4.875, 3] + }, + 'DATA_OBJECT_PATH': { + d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0', + height: 61, + width: 51, + heightElements: [10, 50, 60], + widthElements: [10, 40, 50, 60] + }, + 'DATA_OBJECT_COLLECTION_PATH': { + d:'m {mx}, {my} ' + + 'm 0 15 l 0 -15 ' + + 'm 4 15 l 0 -15 ' + + 'm 4 15 l 0 -15 ', + height: 61, + width: 51, + heightElements: [12], + widthElements: [1, 6, 12, 15] + }, + 'DATA_ARROW': { + d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z', + height: 61, + width: 51, + heightElements: [], + widthElements: [] + }, + 'DATA_STORE': { + d:'m {mx},{my} ' + + 'l 0,{e.y2} ' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0 ' + + 'l 0,-{e.y2} ' + + 'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0 ' + + 'm -{e.x2},{e.y0}' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' + + 'm -{e.x2},{e.y0}' + + 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0', + height: 61, + width: 61, + heightElements: [7, 10, 45], + widthElements: [2, 58, 60] + }, + 'TEXT_ANNOTATION': { + d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0', + height: 30, + width: 10, + heightElements: [30], + widthElements: [10] + }, + 'MARKER_SUB_PROCESS': { + d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0', + height: 10, + width: 10, + heightElements: [], + widthElements: [] + }, + 'MARKER_PARALLEL': { + d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10', + height: 10, + width: 10, + heightElements: [], + widthElements: [] + }, + 'MARKER_SEQUENTIAL': { + d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0', + height: 10, + width: 10, + heightElements: [], + widthElements: [] + }, + 'MARKER_COMPENSATION': { + d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z', + height: 10, + width: 21, + heightElements: [], + widthElements: [] + }, + 'MARKER_LOOP': { + d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' + + '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' + + '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' + + 'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902', + height: 13.9, + width: 13.7, + heightElements: [], + widthElements: [] + }, + 'MARKER_ADHOC': { + d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' + + '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' + + '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' + + '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' + + '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z', + height: 4, + width: 15, + heightElements: [], + widthElements: [] + }, + 'TASK_TYPE_SEND': { + d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}', + height: 14, + width: 21, + heightElements: [6, 14], + widthElements: [10.5, 21] + }, + 'TASK_TYPE_SCRIPT': { + d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' + + 'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' + + 'm -7,-12 l 5,0 ' + + 'm -4.5,3 l 4.5,0 ' + + 'm -3,3 l 5,0' + + 'm -4,3 l 5,0', + height: 15, + width: 12.6, + heightElements: [6, 14], + widthElements: [10.5, 21] + }, + 'TASK_TYPE_USER_1': { + d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' + + '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' + + '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' + + 'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' + + 'm -8,6 l 0,5.5 m 11,0 l 0,-5' + }, + 'TASK_TYPE_USER_2': { + d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' + + '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 ' + }, + 'TASK_TYPE_USER_3': { + d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' + + '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' + + '-4.20799998,3.36699999 -4.20699998,4.34799999 z' + }, + 'TASK_TYPE_MANUAL': { + d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' + + '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' + + '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' + + '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' + + '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' + + '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' + + '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' + + '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' + + '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' + + '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' + + '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' + + '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z' + }, + 'TASK_TYPE_INSTANTIATING_SEND': { + d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6' + }, + 'TASK_TYPE_SERVICE': { + d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' + + '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' + + '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' + + 'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' + + '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' + + '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' + + 'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' + + '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' + + 'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' + + 'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' + + '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' + + 'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' + + 'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' + + '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' + + '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z' + }, + 'TASK_TYPE_SERVICE_FILL': { + d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' + + '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' + + '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z' + }, + 'TASK_TYPE_BUSINESS_RULE_HEADER': { + d: 'm {mx},{my} 0,4 20,0 0,-4 z' + }, + 'TASK_TYPE_BUSINESS_RULE_MAIN': { + d: 'm {mx},{my} 0,12 20,0 0,-12 z' + + 'm 0,8 l 20,0 ' + + 'm -13,-4 l 0,8' + }, + 'MESSAGE_FLOW_MARKER': { + d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6' + } + }; + + this.getRawPath = function getRawPath(pathId) { + return this.pathMap[pathId].d; + }; + + /** + * Scales the path to the given height and width. + *

Use case

+ *

Use case is to scale the content of elements (event, gateways) based + * on the element bounding box's size. + *

+ *

Why not transform

+ *

Scaling a path with transform() will also scale the stroke and IE does not support + * the option 'non-scaling-stroke' to prevent this. + * Also there are use cases where only some parts of a path should be + * scaled.

+ * + * @param {String} pathId The ID of the path. + * @param {Object} param

+ * Example param object scales the path to 60% size of the container (data.width, data.height). + *

+   *   {
+   *     xScaleFactor: 0.6,
+   *     yScaleFactor:0.6,
+   *     containerWidth: data.width,
+   *     containerHeight: data.height,
+   *     position: {
+   *       mx: 0.46,
+   *       my: 0.2,
+   *     }
+   *   }
+   *   
+ *
    + *
  • targetpathwidth = xScaleFactor * containerWidth
  • + *
  • targetpathheight = yScaleFactor * containerHeight
  • + *
  • Position is used to set the starting coordinate of the path. M is computed: + *
      + *
    • position.x * containerWidth
    • + *
    • position.y * containerHeight
    • + *
    + * Center of the container
     position: {
    +   *       mx: 0.5,
    +   *       my: 0.5,
    +   *     }
    + * Upper left corner of the container + *
     position: {
    +   *       mx: 0.0,
    +   *       my: 0.0,
    +   *     }
    + *
  • + *
+ *

+ * + */ + this.getScaledPath = function getScaledPath(pathId, param) { + var rawPath = this.pathMap[pathId]; + + // positioning + // compute the start point of the path + var mx, my; + + if(!!param.abspos) { + mx = param.abspos.x; + my = param.abspos.y; + } else { + mx = param.containerWidth * param.position.mx; + my = param.containerHeight * param.position.my; + } + + var coordinates = {}; //map for the scaled coordinates + if(param.position) { + + // path + var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor; + var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor; + + + //Apply height ratio + for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) { + coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio; + } + + //Apply width ratio + for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) { + coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio; + } + } + + //Apply value to raw path + var path = Snap.format( + rawPath.d, { + mx: mx, + my: my, + e: coordinates + } + ); + return path; + }; +} + +module.exports = PathMap; + +},{"240":240}],6:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ 'bpmnRenderer' ], + bpmnRenderer: [ 'type', _dereq_(4) ], + pathMap: [ 'type', _dereq_(5) ] +}; + +},{"4":4,"5":5}],7:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var is = _dereq_(70).is, + getBoundingBox = _dereq_(221).getBBox; + +var pick = _dereq_(383), + assign = _dereq_(377), + forEach = _dereq_(255), + values = _dereq_(385), + flatten = _dereq_(245), + groupBy = _dereq_(256); + +var CommandInterceptor = _dereq_(98); + +var OFFSET = { top: 60, bottom: 60, left: 100, right: 100 }; +var PADDING = { top: 2, bottom: 2, left: 15, right: 15 }; + +/** + * An auto resize component that takes care of expanding parent participants + * and lanes if elements are modeled close to an edge of the parent element. + */ +function AutoResize(eventBus, canvas, modeling, elementRegistry){ + + CommandInterceptor.call(this, eventBus); + + this.postExecuted([ 'shape.create' ], function(event) { + var context = event.context, + shape = context.shape, + parent = context.parent || context.newParent; + + expand([ shape ], parent); + }); + + this.postExecuted([ 'elements.move' ], function(event) { + + var context = event.context, + elements = flatten(values(context.closure.topLevel)); + + var expandings = groupBy(elements, function(element){ + return element.parent.id; + }); + + forEach(expandings, function(elements, parentId) { + expand(elements, parentId); + }); + }); + + /** + * Returns an object which indicates near which bounding edge(s) + * of a target a bounding box is located. + * + * @param {Object} bbox bounding box object with x, y, width and height properties + * @param {Shape} target + * @param {Number} padding + * + * @return {Object} {top, bottom, left, right} + * + * @example + * + * // If the bounding box is near the bottom left corner of a target the return object is: + * { top: false, bottom: true, left: true, right: false } + * + */ + function isInbounds(bbox, target, padding) { + return { + top: bbox.y < target.y + padding.top, + bottom: bbox.y + bbox.height > target.y + target.height - padding.bottom, + left: bbox.x < target.x + padding.left, + right: bbox.x + bbox.width > target.x + target.width - padding.right, + }; + } + + /** + * Expand the target shape if the bounding box of the moved elements is near or on an edge, + * considering the position of the bounding box in relation to the parent's edge plus padding. + * The amount to expand can be defined for each edge in the OFFSET object. + * + * @param {Array} elements + * @param {Shape|String} target|targetId + */ + function expand(elements, target) { + + if (typeof target === 'string') { + target = elementRegistry.get(target); + } + + var bbox = getBoundingBox(elements), + canExpand = true; + + if (!is(target, 'bpmn:Participant') && !is(target, 'bpmn:Lane') && !(is(target, 'bpmn:SubProcess'))) { + return; + } + + forEach(elements, function(element) { + + if (is(element, 'bpmn:Lane') || element.labelTarget) { + canExpand = false; + return; + } + }); + + if (!canExpand) { + return; + } + + var inbounds = isInbounds(bbox, target, PADDING); + + var newBounds = pick(target, [ 'x', 'y', 'width', 'height' ]); + + if (inbounds.top) { + var topPosition = bbox.y - OFFSET.top; + assign(newBounds, { y: topPosition, height: newBounds.height + newBounds.y - topPosition }); + } + + if (inbounds.bottom) { + assign(newBounds, { height: bbox.y + bbox.height + OFFSET.bottom - newBounds.y }); + } + + if (inbounds.left) { + var leftPosition = bbox.x - OFFSET.left; + assign(newBounds, { x: leftPosition, width: newBounds.width + newBounds.x - leftPosition }); + } + + if (inbounds.right) { + assign(newBounds, { width: bbox.x + bbox.width + OFFSET.right - newBounds.x }); + } + + if (is(target, 'bpmn:Participant')) { + modeling.resizeLane(target, newBounds); + } else { + modeling.resizeShape(target, newBounds); + } + + var parent = target.parent; + + // recursively expand parent elements + if (parent) { + expand([ target ], parent); + } + } +} + +AutoResize.$inject = [ 'eventBus', 'canvas', 'modeling', 'elementRegistry' ]; + +inherits(AutoResize, CommandInterceptor); + +module.exports = AutoResize; + +},{"221":221,"243":243,"245":245,"255":255,"256":256,"377":377,"383":383,"385":385,"70":70,"98":98}],8:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ 'autoResize' ], + autoResize: [ 'type', _dereq_(7) ] +}; + +},{"7":7}],9:[function(_dereq_,module,exports){ +'use strict'; + + +var assign = _dereq_(377), + forEach = _dereq_(255), + isArray = _dereq_(368), + is = _dereq_(70).is, + isExpanded = _dereq_(68).isExpanded, + isAny = _dereq_(45).isAny, + getChildLanes = _dereq_(44).getChildLanes, + isEventSubProcess = _dereq_(68).isEventSubProcess; + + +/** + * A provider for BPMN 2.0 elements context pad + */ +function ContextPadProvider(contextPad, modeling, elementFactory, + connect, create, popupMenu, + canvas, rules, translate) { + + contextPad.registerProvider(this); + + this._contextPad = contextPad; + + this._modeling = modeling; + + this._elementFactory = elementFactory; + this._connect = connect; + this._create = create; + this._popupMenu = popupMenu; + this._canvas = canvas; + this._rules = rules; + this._translate = translate; +} + +ContextPadProvider.$inject = [ + 'contextPad', + 'modeling', + 'elementFactory', + 'connect', + 'create', + 'popupMenu', + 'canvas', + 'rules', + 'translate' +]; + +module.exports = ContextPadProvider; + + +ContextPadProvider.prototype.getContextPadEntries = function(element) { + + var contextPad = this._contextPad, + modeling = this._modeling, + + elementFactory = this._elementFactory, + connect = this._connect, + create = this._create, + popupMenu = this._popupMenu, + canvas = this._canvas, + rules = this._rules, + + translate = this._translate; + + var actions = {}; + + if (element.type === 'label') { + return actions; + } + + var businessObject = element.businessObject; + + function startConnect(event, element, autoActivate) { + connect.start(event, element, autoActivate); + } + + function removeElement(e) { + modeling.removeElements([ element ]); + } + + function getReplaceMenuPosition(element) { + + var Y_OFFSET = 5; + + var diagramContainer = canvas.getContainer(), + pad = contextPad.getPad(element).html; + + var diagramRect = diagramContainer.getBoundingClientRect(), + padRect = pad.getBoundingClientRect(); + + var top = padRect.top - diagramRect.top; + var left = padRect.left - diagramRect.left; + + var pos = { + x: left, + y: top + padRect.height + Y_OFFSET + }; + + return pos; + } + + + /** + * Create an append action + * + * @param {String} type + * @param {String} className + * @param {String} [title] + * @param {Object} [options] + * + * @return {Object} descriptor + */ + function appendAction(type, className, title, options) { + + if (typeof title !== 'string') { + options = title; + title = translate('Append {type}', { type: type.replace(/^bpmn\:/, '') }); + } + + function appendListener(event, element) { + + var shape = elementFactory.createShape(assign({ type: type }, options)); + create.start(event, shape, element); + } + + return { + group: 'model', + className: className, + title: title, + action: { + dragstart: appendListener, + click: appendListener + } + }; + } + + function splitLaneHandler(count) { + + return function(event, element) { + // actual split + modeling.splitLane(element, count); + + // refresh context pad after split to + // get rid of split icons + contextPad.open(element, true); + }; + } + + + if (isAny(businessObject, [ 'bpmn:Lane', 'bpmn:Participant' ]) && isExpanded(businessObject)) { + + var childLanes = getChildLanes(element); + + assign(actions, { + 'lane-insert-above': { + group: 'lane-insert-above', + className: 'bpmn-icon-lane-insert-above', + title: translate('Add Lane above'), + action: { + click: function(event, element) { + modeling.addLane(element, 'top'); + } + } + } + }); + + if (childLanes.length < 2) { + + if (element.height >= 120) { + assign(actions, { + 'lane-divide-two': { + group: 'lane-divide', + className: 'bpmn-icon-lane-divide-two', + title: translate('Divide into two Lanes'), + action: { + click: splitLaneHandler(2) + } + } + }); + } + + if (element.height >= 180) { + assign(actions, { + 'lane-divide-three': { + group: 'lane-divide', + className: 'bpmn-icon-lane-divide-three', + title: translate('Divide into three Lanes'), + action: { + click: splitLaneHandler(3) + } + } + }); + } + } + + assign(actions, { + 'lane-insert-below': { + group: 'lane-insert-below', + className: 'bpmn-icon-lane-insert-below', + title: translate('Add Lane below'), + action: { + click: function(event, element) { + modeling.addLane(element, 'bottom'); + } + } + } + }); + + } + + if (is(businessObject, 'bpmn:FlowNode')) { + + if (is(businessObject, 'bpmn:EventBasedGateway')) { + + assign(actions, { + 'append.receive-task': appendAction('bpmn:ReceiveTask', 'bpmn-icon-receive-task'), + 'append.message-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'bpmn-icon-intermediate-event-catch-message', + { eventDefinitionType: 'bpmn:MessageEventDefinition'}), + 'append.timer-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'bpmn-icon-intermediate-event-catch-timer', + { eventDefinitionType: 'bpmn:TimerEventDefinition'}), + 'append.condtion-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'bpmn-icon-intermediate-event-catch-condition', + { eventDefinitionType: 'bpmn:ConditionalEventDefinition'}), + 'append.signal-intermediate-event': appendAction('bpmn:IntermediateCatchEvent', + 'bpmn-icon-intermediate-event-catch-signal', + { eventDefinitionType: 'bpmn:SignalEventDefinition'}) + }); + } else + + if (isEventType(businessObject, 'bpmn:BoundaryEvent', 'bpmn:CompensateEventDefinition')) { + + assign(actions, { + 'append.compensation-activity': + appendAction('bpmn:Task', 'bpmn-icon-task', translate('Append compensation activity'), { + isForCompensation: true + }) + }); + } else + + if (!is(businessObject, 'bpmn:EndEvent') && + !businessObject.isForCompensation && + !isEventType(businessObject, 'bpmn:IntermediateThrowEvent', 'bpmn:LinkEventDefinition') && + !isEventSubProcess(businessObject)) { + + assign(actions, { + 'append.end-event': appendAction('bpmn:EndEvent', 'bpmn-icon-end-event-none'), + 'append.gateway': appendAction('bpmn:ExclusiveGateway', 'bpmn-icon-gateway-xor'), + 'append.append-task': appendAction('bpmn:Task', 'bpmn-icon-task'), + 'append.intermediate-event': appendAction('bpmn:IntermediateThrowEvent', + 'bpmn-icon-intermediate-event-none') + }); + } + } + + var replaceMenu; + + if (popupMenu._providers['bpmn-replace']) { + replaceMenu = popupMenu.create('bpmn-replace', element); + } + + if (replaceMenu && !replaceMenu.isEmpty()) { + + // Replace menu entry + assign(actions, { + 'replace': { + group: 'edit', + className: 'bpmn-icon-screw-wrench', + title: translate('Change type'), + action: { + click: function(event, element) { + replaceMenu.open(assign(getReplaceMenuPosition(element), { + cursor: { x: event.x, y: event.y } + }), element); + } + } + } + }); + } + + if (isAny(businessObject, [ 'bpmn:FlowNode', 'bpmn:InteractionNode' ]) ) { + + assign(actions, { + 'append.text-annotation': appendAction('bpmn:TextAnnotation', 'bpmn-icon-text-annotation'), + + 'connect': { + group: 'connect', + className: 'bpmn-icon-connection-multi', + title: translate('Connect using ' + + (businessObject.isForCompensation ? '' : 'Sequence/MessageFlow or ') + + 'Association'), + action: { + click: startConnect, + dragstart: startConnect + } + } + }); + } + + if (isAny(businessObject, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ])) { + assign(actions, { + 'connect': { + group: 'connect', + className: 'bpmn-icon-connection-multi', + title: translate('Connect using DataInputAssociation'), + action: { + click: startConnect, + dragstart: startConnect + } + } + }); + } + + // delete element entry, only show if allowed by rules + var deleteAllowed = rules.allowed('elements.delete', { elements: [ element ]}); + + if (isArray(deleteAllowed)) { + // was the element returned as a deletion candidate? + deleteAllowed = deleteAllowed[0] === element; + } + + if (deleteAllowed) { + assign(actions, { + 'delete': { + group: 'edit', + className: 'bpmn-icon-trash', + title: translate('Remove'), + action: { + click: removeElement, + dragstart: removeElement + } + } + }); + } + + return actions; +}; + +function isEventType(eventBo, type, definition) { + + var isType = eventBo.$instanceOf(type); + var isDefinition = false; + + var definitions = eventBo.eventDefinitions || []; + forEach(definitions, function(def) { + if (def.$type === definition) { + isDefinition = true; + } + }); + + return isType && isDefinition; +} + +},{"255":255,"368":368,"377":377,"44":44,"45":45,"68":68,"70":70}],10:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(93), + _dereq_(124), + _dereq_(189), + _dereq_(122), + _dereq_(126), + _dereq_(51) + ], + __init__: [ 'contextPadProvider' ], + contextPadProvider: [ 'type', _dereq_(9) ] +}; +},{"122":122,"124":124,"126":126,"189":189,"51":51,"9":9,"93":93}],11:[function(_dereq_,module,exports){ +'use strict'; + +function BpmnKeyBindings(keyboard, spaceTool, lassoTool, handTool, directEditing, + selection, canvas, elementRegistry, editorActions) { + + var actions = { + selectElements: function() { + // select all elements except for the invisible + // root element + var rootElement = canvas.getRootElement(); + + var elements = elementRegistry.filter(function(element) { + return element != rootElement; + }); + + selection.select(elements); + }, + spaceTool: function() { + spaceTool.toggle(); + }, + lassoTool: function() { + lassoTool.toggle(); + }, + handTool: function() { + handTool.toggle(); + }, + directEditing: function() { + var currentSelection = selection.get(); + + if (currentSelection.length) { + directEditing.activate(currentSelection[0]); + } + } + }; + + editorActions.register(actions); + + keyboard.addListener(function(key, modifiers) { + + // ctrl + a -> select all elements + if (key === 65 && keyboard.isCmd(modifiers)) { + editorActions.trigger('selectElements'); + + return true; + } + + if (keyboard.hasModifier(modifiers)) { + return; + } + + // s -> activate space tool + if (key === 83) { + editorActions.trigger('spaceTool'); + + return true; + } + + // l -> activate lasso tool + if (key === 76) { + editorActions.trigger('lassoTool'); + + return true; + } + + // h -> activate hand tool + if (key === 72) { + editorActions.trigger('handTool'); + + return true; + } + + // e -> activate direct editing + if (key === 69) { + editorActions.trigger('directEditing'); + + return true; + } + }); +} + +BpmnKeyBindings.$inject = [ + 'keyboard', + 'spaceTool', + 'lassoTool', + 'handTool', + 'directEditing', + 'selection', + 'canvas', + 'elementRegistry', + 'editorActions' +]; + +module.exports = BpmnKeyBindings; + +},{}],12:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(137) + ], + __init__: [ 'bpmnKeyBindings' ], + bpmnKeyBindings: [ 'type', _dereq_(11) ] +}; +},{"11":11,"137":137}],13:[function(_dereq_,module,exports){ +'use strict'; + +var UpdateLabelHandler = _dereq_(15); + +var LabelUtil = _dereq_(14); + +var is = _dereq_(70).is, + isExpanded = _dereq_(68).isExpanded; + + +var MIN_BOUNDS = { + width: 150, + height: 50 +}; + + +function LabelEditingProvider(eventBus, canvas, directEditing, commandStack) { + + directEditing.registerProvider(this); + commandStack.registerHandler('element.updateLabel', UpdateLabelHandler); + + // listen to dblclick on non-root elements + eventBus.on('element.dblclick', function(event) { + directEditing.activate(event.element); + }); + + // complete on followup canvas operation + eventBus.on([ 'element.mousedown', 'drag.init', 'canvas.viewbox.changed' ], function(event) { + directEditing.complete(); + }); + + // cancel on command stack changes + eventBus.on([ 'commandStack.changed' ], function() { + directEditing.cancel(); + }); + + + // activate direct editing for activities and text annotations + + + if ('ontouchstart' in document.documentElement) { + // we deactivate automatic label editing on mobile devices + // as it breaks the user interaction workflow + + // TODO(nre): we should temporarily focus the edited element here + // and release the focused viewport after the direct edit operation is finished + } else { + eventBus.on('create.end', 500, function(e) { + + var element = e.shape, + canExecute = e.context.canExecute; + + if (!canExecute) { + return; + } + + if (is(element, 'bpmn:Task') || is(element, 'bpmn:TextAnnotation') || + (is(element, 'bpmn:SubProcess') && !isExpanded(element))) { + + directEditing.activate(element); + } + }); + } + + this._canvas = canvas; + this._commandStack = commandStack; +} + +LabelEditingProvider.$inject = [ 'eventBus', 'canvas', 'directEditing', 'commandStack' ]; + +module.exports = LabelEditingProvider; + + +LabelEditingProvider.prototype.activate = function(element) { + + var text = LabelUtil.getLabel(element); + + if (text === undefined) { + return; + } + + var bbox = this.getEditingBBox(element); + + // adjust for expanded pools AND lanes + if ((is(element, 'bpmn:Participant') && isExpanded(element)) || is(element, 'bpmn:Lane')) { + + bbox.width = MIN_BOUNDS.width; + bbox.height = MIN_BOUNDS.height; + + bbox.x = bbox.x + 10 - bbox.width / 2; + bbox.y = bbox.mid.y - bbox.height / 2; + } + + // ajust minumum size for task and activities + if ((is(element, 'bpmn:Task') || is(element, 'bpmn:Activity') )) { + + if (bbox.width < 100) { + bbox.width = 100; + bbox.x = bbox.mid.x - bbox.width / 2; + } + + if (bbox.height < 80) { + bbox.height = 80; + bbox.y = bbox.mid.y - bbox.height / 2; + } + } + + // adjust for expanded sub processes and collapsed pools + if ((is(element, 'bpmn:SubProcess') && isExpanded(element)) || + (is(element, 'bpmn:Participant') && !isExpanded(element))) { + + bbox.width = element.width; + bbox.height = MIN_BOUNDS.height; + + bbox.x = bbox.mid.x - element.width / 2; + } + + return { bounds: bbox, text: text }; +}; + + +LabelEditingProvider.prototype.getEditingBBox = function(element, maxBounds) { + + var target = element.label || element; + + var bbox = this._canvas.getAbsoluteBBox(target); + + var mid = { + x: bbox.x + bbox.width / 2, + y: bbox.y + bbox.height / 2 + }; + + // external label + if (target.labelTarget) { + bbox.width = Math.max(bbox.width, MIN_BOUNDS.width); + bbox.height = Math.max(bbox.height, MIN_BOUNDS.height); + + bbox.x = mid.x - bbox.width / 2; + } + + bbox.mid = mid; + + return bbox; +}; + + +LabelEditingProvider.prototype.update = function(element, newLabel) { + this._commandStack.execute('element.updateLabel', { + element: element, + newLabel: newLabel + }); +}; + +},{"14":14,"15":15,"68":68,"70":70}],14:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(70).is; + +function getLabelAttr(semantic) { + if (is(semantic, 'bpmn:FlowElement') || + is(semantic, 'bpmn:Participant') || + is(semantic, 'bpmn:Lane') || + is(semantic, 'bpmn:SequenceFlow') || + is(semantic, 'bpmn:MessageFlow')) { + + return 'name'; + } + + if (is(semantic, 'bpmn:TextAnnotation')) { + return 'text'; + } +} + +module.exports.getLabel = function(element) { + var semantic = element.businessObject, + attr = getLabelAttr(semantic); + + if (attr) { + return semantic[attr] || ''; + } +}; + + +module.exports.setLabel = function(element, text, isExternal) { + var semantic = element.businessObject, + attr = getLabelAttr(semantic); + + if (attr) { + semantic[attr] = text; + } + + // show external label if not empty + if (isExternal) { + element.hidden = !text; + } + + return element; +}; +},{"70":70}],15:[function(_dereq_,module,exports){ +'use strict'; + +var LabelUtil = _dereq_(14); + + +/** + * A handler that updates the text of a BPMN element. + */ +function UpdateLabelHandler() { + + /** + * Set the label and return the changed elements. + * + * Element parameter can be label itself or connection (i.e. sequence flow). + * + * @param {djs.model.Base} element + * @param {String} text + */ + function setText(element, text) { + + // external label if present + var label = element.label || element; + + var labelTarget = element.labelTarget || element; + + LabelUtil.setLabel(label, text, labelTarget !== label); + + return [ label, labelTarget ]; + } + + function execute(ctx) { + ctx.oldLabel = LabelUtil.getLabel(ctx.element); + return setText(ctx.element, ctx.newLabel); + } + + function revert(ctx) { + return setText(ctx.element, ctx.oldLabel); + } + + // API + + this.execute = execute; + this.revert = revert; +} + +module.exports = UpdateLabelHandler; +},{"14":14}],16:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(100), + _dereq_(120), + _dereq_(93) + ], + __init__: [ 'labelEditingProvider' ], + labelEditingProvider: [ 'type', _dereq_(13) ] +}; +},{"100":100,"120":120,"13":13,"93":93}],17:[function(_dereq_,module,exports){ +'use strict'; + +var map = _dereq_(258), + assign = _dereq_(377), + pick = _dereq_(383); + + +function BpmnFactory(moddle) { + this._model = moddle; +} + +BpmnFactory.$inject = [ 'moddle' ]; + + +BpmnFactory.prototype._needsId = function(element) { + return element.$instanceOf('bpmn:RootElement') || + element.$instanceOf('bpmn:FlowElement') || + element.$instanceOf('bpmn:MessageFlow') || + element.$instanceOf('bpmn:DataAssociation') || + element.$instanceOf('bpmn:Artifact') || + element.$instanceOf('bpmn:Participant') || + element.$instanceOf('bpmn:Lane') || + element.$instanceOf('bpmn:Process') || + element.$instanceOf('bpmn:Collaboration') || + element.$instanceOf('bpmndi:BPMNShape') || + element.$instanceOf('bpmndi:BPMNEdge') || + element.$instanceOf('bpmndi:BPMNDiagram') || + element.$instanceOf('bpmndi:BPMNPlane') || + element.$instanceOf('bpmn:Property'); +}; + +BpmnFactory.prototype._ensureId = function(element) { + + // generate semantic ids for elements + // bpmn:SequenceFlow -> SequenceFlow_ID + var prefix = (element.$type || '').replace(/^[^:]*:/g, '') + '_'; + + if (!element.id && this._needsId(element)) { + element.id = this._model.ids.nextPrefixed(prefix, element); + } +}; + + +BpmnFactory.prototype.create = function(type, attrs) { + var element = this._model.create(type, attrs || {}); + + this._ensureId(element); + + return element; +}; + + +BpmnFactory.prototype.createDiLabel = function() { + return this.create('bpmndi:BPMNLabel', { + bounds: this.createDiBounds() + }); +}; + + +BpmnFactory.prototype.createDiShape = function(semantic, bounds, attrs) { + + return this.create('bpmndi:BPMNShape', assign({ + bpmnElement: semantic, + bounds: this.createDiBounds(bounds) + }, attrs)); +}; + + +BpmnFactory.prototype.createDiBounds = function(bounds) { + return this.create('dc:Bounds', bounds); +}; + + +BpmnFactory.prototype.createDiWaypoints = function(waypoints) { + return map(waypoints, function(pos) { + return this.createDiWaypoint(pos); + }, this); +}; + +BpmnFactory.prototype.createDiWaypoint = function(point) { + return this.create('dc:Point', pick(point, [ 'x', 'y' ])); +}; + + +BpmnFactory.prototype.createDiEdge = function(semantic, waypoints, attrs) { + return this.create('bpmndi:BPMNEdge', assign({ + bpmnElement: semantic + }, attrs)); +}; + +BpmnFactory.prototype.createDiPlane = function(semantic) { + return this.create('bpmndi:BPMNPlane', { + bpmnElement: semantic + }); +}; + +module.exports = BpmnFactory; + +},{"258":258,"377":377,"383":383}],18:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var assign = _dereq_(377); + +var BaseLayouter = _dereq_(206), + ManhattanLayout = _dereq_(209); + +var LayoutUtil = _dereq_(208); + +var getMid = LayoutUtil.getMid, + getOrientation = LayoutUtil.getOrientation; + +var is = _dereq_(70).is; + + +function BpmnLayouter() {} + +inherits(BpmnLayouter, BaseLayouter); + +module.exports = BpmnLayouter; + + +BpmnLayouter.prototype.layoutConnection = function(connection, layoutHints) { + var source = connection.source, + target = connection.target, + waypoints = connection.waypoints, + start, + end; + + var manhattanOptions, + updatedWaypoints; + + start = getConnectionDocking(waypoints, 0, source); + end = getConnectionDocking(waypoints, waypoints && waypoints.length - 1, target); + + // TODO (nre): support vertical modeling + // and invert preferredLayouts accordingly + + if (is(connection, 'bpmn:Association') || + is(connection, 'bpmn:DataAssociation')) { + + if (waypoints && !isCompensationAssociation(connection)) { + return waypoints; + } + } + + // manhattan layout sequence / message flows + if (is(connection, 'bpmn:MessageFlow')) { + manhattanOptions = { + preferredLayouts: [ 'straight', 'v:v' ] + }; + + if (is(target, 'bpmn:Event')) { + manhattanOptions = { + preferredLayouts: [ 'v:v' ] + }; + } + } else + + + // layout all connection between flow elements h:h, + // + // except for + // + // (1) outgoing of BoundaryEvents -> layout h:v or v:h based on attach orientation + // (2) incoming / outgoing of Gateway -> v:h (outgoing), h:v (incoming) + // + if (is(connection, 'bpmn:SequenceFlow') || + isCompensationAssociation(connection)) { + + // make sure boundary event connections do + // not look ugly =:> + if (is(source, 'bpmn:BoundaryEvent')) { + + var orientation = getAttachOrientation(source); + + if (/left|right/.test(orientation)) { + manhattanOptions = { + preferredLayouts: [ 'h:v' ] + }; + } else + + if (/top|bottom/.test(orientation)) { + manhattanOptions = { + preferredLayouts: [ 'v:h' ] + }; + } + } else + + if (is(source, 'bpmn:Gateway')) { + + manhattanOptions = { + preferredLayouts: [ 'v:h' ] + }; + } else + + if (is(target, 'bpmn:Gateway')) { + + manhattanOptions = { + preferredLayouts: [ 'h:v' ] + }; + } + + // apply horizontal love <3 + else { + manhattanOptions = { + preferredLayouts: [ 'h:h' ] + }; + } + } + + if (manhattanOptions) { + + manhattanOptions = assign(manhattanOptions, layoutHints); + + updatedWaypoints = + ManhattanLayout.repairConnection( + source, target, + start, end, + waypoints, + manhattanOptions); + } + + return updatedWaypoints || [ start, end ]; +}; + + +function getAttachOrientation(attachedElement) { + + var hostElement = attachedElement.host, + padding = -10; + + return getOrientation(getMid(attachedElement), hostElement, padding); +} + + +function getConnectionDocking(waypoints, idx, shape) { + var point = waypoints && waypoints[idx]; + + return point ? (point.original || point) : getMid(shape); +} + +function isCompensationAssociation(connection) { + + var source = connection.source, + target = connection.target; + + return is(target, 'bpmn:Activity') && + is(source, 'bpmn:BoundaryEvent') && + target.businessObject.isForCompensation; +} +},{"206":206,"208":208,"209":209,"243":243,"377":377,"70":70}],19:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(377), + forEach = _dereq_(255), + inherits = _dereq_(243); + +var Collections = _dereq_(219), + Model = _dereq_(210); + +var getBusinessObject = _dereq_(70).getBusinessObject, + is = _dereq_(70).is; + +var CommandInterceptor = _dereq_(98); + + +/** + * A handler responsible for updating the underlying BPMN 2.0 XML + DI + * once changes on the diagram happen + */ +function BpmnUpdater(eventBus, bpmnFactory, connectionDocking, translate) { + + CommandInterceptor.call(this, eventBus); + + this._bpmnFactory = bpmnFactory; + this._translate = translate; + + var self = this; + + + + ////// connection cropping ///////////////////////// + + // crop connection ends during create/update + function cropConnection(e) { + var context = e.context, + connection; + + if (!context.cropped) { + connection = context.connection; + connection.waypoints = connectionDocking.getCroppedWaypoints(connection); + context.cropped = true; + } + } + + this.executed([ + 'connection.layout', + 'connection.create', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], cropConnection); + + this.reverted([ 'connection.layout' ], function(e) { + delete e.context.cropped; + }); + + + + ////// BPMN + DI update ///////////////////////// + + + // update parent + function updateParent(e) { + var context = e.context; + + self.updateParent(context.shape || context.connection, context.oldParent); + } + + function reverseUpdateParent(e) { + var context = e.context; + + var element = context.shape || context.connection, + // oldParent is the (old) new parent, because we are undoing + oldParent = context.parent || context.newParent; + + self.updateParent(element, oldParent); + } + + this.executed([ 'shape.move', + 'shape.create', + 'shape.delete', + 'connection.create', + 'connection.move', + 'connection.delete' ], ifBpmn(updateParent)); + + this.reverted([ 'shape.move', + 'shape.create', + 'shape.delete', + 'connection.create', + 'connection.move', + 'connection.delete' ], ifBpmn(reverseUpdateParent)); + + /* + * ## Updating Parent + * + * When morphing a Process into a Collaboration or vice-versa, + * make sure that both the *semantic* and *di* parent of each element + * is updated. + * + */ + function updateRoot(event) { + var context = event.context, + oldRoot = context.oldRoot, + children = oldRoot.children; + + forEach(children, function(child) { + self.updateParent(child); + }); + } + + this.executed([ 'canvas.updateRoot' ], updateRoot); + this.reverted([ 'canvas.updateRoot' ], updateRoot); + + + // update bounds + function updateBounds(e) { + var shape = e.context.shape; + + if (!is(shape, 'bpmn:BaseElement')) { + return; + } + + self.updateBounds(shape); + } + + this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(updateBounds)); + this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(updateBounds)); + + + // attach / detach connection + function updateConnection(e) { + self.updateConnection(e.context); + } + + this.executed([ + 'connection.create', + 'connection.move', + 'connection.delete', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], ifBpmn(updateConnection)); + + this.reverted([ + 'connection.create', + 'connection.move', + 'connection.delete', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], ifBpmn(updateConnection)); + + + // update waypoints + function updateConnectionWaypoints(e) { + self.updateConnectionWaypoints(e.context.connection); + } + + this.executed([ + 'connection.layout', + 'connection.move', + 'connection.updateWaypoints', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], ifBpmn(updateConnectionWaypoints)); + + this.reverted([ + 'connection.layout', + 'connection.move', + 'connection.updateWaypoints', + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], ifBpmn(updateConnectionWaypoints)); + + + // update Default & Conditional flows + this.executed([ + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], ifBpmn(function(e) { + var context = e.context, + connection = context.connection, + businessObject = getBusinessObject(connection), + oldSource = getBusinessObject(context.oldSource), + oldTarget = getBusinessObject(context.oldTarget), + newSource = getBusinessObject(connection.source), + newTarget = getBusinessObject(connection.target); + + if (oldSource === newSource || oldTarget === newTarget) { + return; + } + + // on reconnectStart -> default flow + if (oldSource && oldSource.default) { + context.default = oldSource.default; + oldSource.default = undefined; + } + + // on reconnectEnd -> default flow + if ((businessObject.sourceRef && businessObject.sourceRef.default) && !is(newTarget, 'bpmn:Activity')) { + context.default = businessObject.sourceRef.default; + businessObject.sourceRef.default = undefined; + } + + // on reconnectStart -> condtional flow + if ((businessObject.conditionExpression) && is(oldSource, 'bpmn:Activity')) { + context.conditionExpression = businessObject.conditionExpression; + businessObject.conditionExpression = undefined; + } + + // on reconnectEnd -> condtional flow + if ((businessObject.conditionExpression) && !is(newTarget, 'bpmn:Activity')) { + context.conditionExpression = businessObject.conditionExpression; + businessObject.conditionExpression = undefined; + } + })); + + this.reverted([ + 'connection.reconnectEnd', + 'connection.reconnectStart' + ], ifBpmn(function(e) { + var context = e.context, + connection = context.connection, + businessObject = getBusinessObject(connection), + newSource = getBusinessObject(connection.source); + + // default flow + if (context.default) { + if (is(newSource, 'bpmn:ExclusiveGateway') || is(newSource, 'bpmn:InclusiveGateway') || + is(newSource, 'bpmn:Activity')) { + newSource.default = context.default; + } + } + + // conditional flow + if (context.conditionExpression && is(newSource, 'bpmn:Activity')) { + businessObject.conditionExpression = context.conditionExpression; + } + })); + + // update attachments + function updateAttachment(e) { + self.updateAttachment(e.context); + } + + this.executed([ 'element.updateAttachment' ], ifBpmn(updateAttachment)); + this.reverted([ 'element.updateAttachment' ], ifBpmn(updateAttachment)); +} + +inherits(BpmnUpdater, CommandInterceptor); + +module.exports = BpmnUpdater; + +BpmnUpdater.$inject = [ 'eventBus', 'bpmnFactory', 'connectionDocking', 'translate' ]; + + +/////// implementation ////////////////////////////////// + +BpmnUpdater.prototype.updateAttachment = function(context) { + + var shape = context.shape, + businessObject = shape.businessObject, + host = shape.host; + + businessObject.attachedToRef = host && host.businessObject; +}; + +BpmnUpdater.prototype.updateParent = function(element, oldParent) { + // do not update BPMN 2.0 label parent + if (element instanceof Model.Label) { + return; + } + + var parentShape = element.parent; + + var businessObject = element.businessObject, + parentBusinessObject = parentShape && parentShape.businessObject, + parentDi = parentBusinessObject && parentBusinessObject.di; + + if (is(element, 'bpmn:FlowNode')) { + this.updateFlowNodeRefs(businessObject, parentBusinessObject, oldParent && oldParent.businessObject); + } + + if (is(element, 'bpmn:DataOutputAssociation')) { + if (element.source) { + parentBusinessObject = element.source.businessObject; + } else { + parentBusinessObject = null; + } + } + + if (is(element, 'bpmn:DataInputAssociation')) { + if (element.target) { + parentBusinessObject = element.target.businessObject; + } else { + parentBusinessObject = null; + } + } + + this.updateSemanticParent(businessObject, parentBusinessObject); + + if (is(element, 'bpmn:DataObjectReference') && businessObject.dataObjectRef) { + this.updateSemanticParent(businessObject.dataObjectRef, parentBusinessObject); + } + + this.updateDiParent(businessObject.di, parentDi); +}; + + +BpmnUpdater.prototype.updateBounds = function(shape) { + + var di = shape.businessObject.di; + + var bounds = (shape instanceof Model.Label) ? this._getLabel(di).bounds : di.bounds; + + assign(bounds, { + x: shape.x, + y: shape.y, + width: shape.width, + height: shape.height + }); +}; + +BpmnUpdater.prototype.updateFlowNodeRefs = function(businessObject, newContainment, oldContainment) { + + if (oldContainment === newContainment) { + return; + } + + var oldRefs, newRefs; + + if (is (oldContainment, 'bpmn:Lane')) { + oldRefs = oldContainment.get('flowNodeRef'); + Collections.remove(oldRefs, businessObject); + } + + if (is(newContainment, 'bpmn:Lane')) { + newRefs = newContainment.get('flowNodeRef'); + Collections.add(newRefs, businessObject); + } +}; + +BpmnUpdater.prototype.updateDiParent = function(di, parentDi) { + + if (parentDi && !is(parentDi, 'bpmndi:BPMNPlane')) { + parentDi = parentDi.$parent; + } + + if (di.$parent === parentDi) { + return; + } + + var planeElements = (parentDi || di.$parent).get('planeElement'); + + if (parentDi) { + planeElements.push(di); + di.$parent = parentDi; + } else { + Collections.remove(planeElements, di); + di.$parent = null; + } +}; + +function getDefinitions(element) { + while (element && !is(element, 'bpmn:Definitions')) { + element = element.$parent; + } + + return element; +} + +BpmnUpdater.prototype.getLaneSet = function(container) { + + var laneSet, laneSets; + + // bpmn:Lane + if (is(container, 'bpmn:Lane')) { + laneSet = container.childLaneSet; + + if (!laneSet) { + laneSet = this._bpmnFactory.create('bpmn:LaneSet'); + container.childLaneSet = laneSet; + laneSet.$parent = container; + } + + return laneSet; + } + + // bpmn:Participant + if (is(container, 'bpmn:Participant')) { + container = container.processRef; + } + + // bpmn:FlowElementsContainer + laneSets = container.get('laneSets'); + laneSet = laneSets[0]; + + if (!laneSet) { + laneSet = this._bpmnFactory.create('bpmn:LaneSet'); + laneSet.$parent = container; + laneSets.push(laneSet); + } + + return laneSet; +}; + +BpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent) { + + var containment, + translate = this._translate; + + if (businessObject.$parent === newParent) { + return; + } + + if (is(businessObject, 'bpmn:Lane')) { + + if (newParent) { + newParent = this.getLaneSet(newParent); + } + + containment = 'lanes'; + } else + + if (is(businessObject, 'bpmn:FlowElement')) { + + if (newParent) { + + if (is(newParent, 'bpmn:Participant')) { + newParent = newParent.processRef; + } else + + if (is(newParent, 'bpmn:Lane')) { + do { + // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer) + newParent = newParent.$parent.$parent; + } while(is(newParent, 'bpmn:Lane')); + + } + } + + containment = 'flowElements'; + + } else + + if (is(businessObject, 'bpmn:Artifact')) { + + while (newParent && + !is(newParent, 'bpmn:Process') && + !is(newParent, 'bpmn:SubProcess') && + !is(newParent, 'bpmn:Collaboration')) { + + if (is(newParent, 'bpmn:Participant')) { + newParent = newParent.processRef; + break; + } else { + newParent = newParent.$parent; + } + } + + containment = 'artifacts'; + } else + + if (is(businessObject, 'bpmn:MessageFlow')) { + containment = 'messageFlows'; + + } else + + if (is(businessObject, 'bpmn:Participant')) { + containment = 'participants'; + + // make sure the participants process is properly attached / detached + // from the XML document + + var process = businessObject.processRef, + definitions; + + if (process) { + definitions = getDefinitions(businessObject.$parent || newParent); + + if (businessObject.$parent) { + Collections.remove(definitions.get('rootElements'), process); + process.$parent = null; + } + + if (newParent) { + Collections.add(definitions.get('rootElements'), process); + process.$parent = definitions; + } + } + } else + + if (is(businessObject, 'bpmn:DataOutputAssociation')) { + containment = 'dataOutputAssociations'; + } else + + if (is(businessObject, 'bpmn:DataInputAssociation')) { + containment = 'dataInputAssociations'; + } + + if (!containment) { + throw new Error(translate( + 'no parent for {element} in {parent}', + { + element: businessObject.id, + parent: newParent.id + } + )); + } + + var children; + + if (businessObject.$parent) { + // remove from old parent + children = businessObject.$parent.get(containment); + Collections.remove(children, businessObject); + } + + if (!newParent) { + businessObject.$parent = null; + } else { + // add to new parent + children = newParent.get(containment); + children.push(businessObject); + businessObject.$parent = newParent; + } +}; + + +BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) { + connection.businessObject.di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints)); +}; + + +BpmnUpdater.prototype.updateConnection = function(context) { + + var connection = context.connection, + businessObject = getBusinessObject(connection), + newSource = getBusinessObject(connection.source), + newTarget = getBusinessObject(connection.target); + + if (!is(businessObject, 'bpmn:DataAssociation')) { + + var inverseSet = is(businessObject, 'bpmn:SequenceFlow'); + + if (businessObject.sourceRef !== newSource) { + if (inverseSet) { + Collections.remove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject); + + if (newSource && newSource.get('outgoing')) { + newSource.get('outgoing').push(businessObject); + } + } + + businessObject.sourceRef = newSource; + } + + if (businessObject.targetRef !== newTarget) { + if (inverseSet) { + Collections.remove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject); + + if (newTarget && newTarget.get('incoming')) { + newTarget.get('incoming').push(businessObject); + } + } + + businessObject.targetRef = newTarget; + } + } else + + if (is(businessObject, 'bpmn:DataInputAssociation')) { + // handle obnoxious isMany sourceRef + businessObject.get('sourceRef')[0] = newSource; + + // targetRef = new parent + this.updateSemanticParent(businessObject, newTarget); + } else + + if (is(businessObject, 'bpmn:DataOutputAssociation')) { + // sourceRef = new parent + this.updateSemanticParent(businessObject, newSource); + + // targetRef = new target + businessObject.targetRef = newTarget; + } + + this.updateConnectionWaypoints(connection); +}; + + +/////// helpers ///////////////////////////////////////// + +BpmnUpdater.prototype._getLabel = function(di) { + if (!di.label) { + di.label = this._bpmnFactory.createDiLabel(); + } + + return di.label; +}; + + +/** + * Make sure the event listener is only called + * if the touched element is a BPMN element. + * + * @param {Function} fn + * @return {Function} guarded function + */ +function ifBpmn(fn) { + + return function(event) { + + var context = event.context, + element = context.shape || context.connection; + + if (is(element, 'bpmn:BaseElement')) { + fn(event); + } + }; +} + +},{"210":210,"219":219,"243":243,"255":255,"377":377,"70":70,"98":98}],20:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(377), + inherits = _dereq_(243); + +var is = _dereq_(70).is; + +var isExpanded = _dereq_(68).isExpanded; + +var BaseElementFactory = _dereq_(102), + LabelUtil = _dereq_(69); + +/** + * A bpmn-aware factory for diagram-js shapes + */ +function ElementFactory(bpmnFactory, moddle, translate) { + BaseElementFactory.call(this); + + this._bpmnFactory = bpmnFactory; + this._moddle = moddle; + this._translate = translate; +} + +inherits(ElementFactory, BaseElementFactory); + + +ElementFactory.$inject = [ 'bpmnFactory', 'moddle', 'translate' ]; + +module.exports = ElementFactory; + +ElementFactory.prototype.baseCreate = BaseElementFactory.prototype.create; + +ElementFactory.prototype.create = function(elementType, attrs) { + // no special magic for labels, + // we assume their businessObjects have already been created + // and wired via attrs + if (elementType === 'label') { + return this.baseCreate(elementType, assign({ type: 'label' }, LabelUtil.DEFAULT_LABEL_SIZE, attrs)); + } + + return this.createBpmnElement(elementType, attrs); +}; + +ElementFactory.prototype.createBpmnElement = function(elementType, attrs) { + var size, + translate = this._translate; + + attrs = attrs || {}; + + var businessObject = attrs.businessObject; + + if (!businessObject) { + if (!attrs.type) { + throw new Error(translate('no shape type specified')); + } + + businessObject = this._bpmnFactory.create(attrs.type); + } + + if (!businessObject.di) { + if (elementType === 'root') { + businessObject.di = this._bpmnFactory.createDiPlane(businessObject, [], { + id: businessObject.id + '_di' + }); + } else + if (elementType === 'connection') { + businessObject.di = this._bpmnFactory.createDiEdge(businessObject, [], { + id: businessObject.id + '_di' + }); + } else { + businessObject.di = this._bpmnFactory.createDiShape(businessObject, {}, { + id: businessObject.id + '_di' + }); + } + } + + if (attrs.processRef) { + businessObject.processRef = attrs.processRef; + } + + if (attrs.isExpanded) { + businessObject.di.isExpanded = attrs.isExpanded; + } + + if (is(businessObject, 'bpmn:ExclusiveGateway')) { + businessObject.di.isMarkerVisible = true; + } + + if (attrs.isInterrupting === false) { + businessObject.isInterrupting = false; + } + + if (attrs.associationDirection) { + businessObject.associationDirection = attrs.associationDirection; + } + + var eventDefinitions, + newEventDefinition; + + if (attrs.eventDefinitionType) { + eventDefinitions = businessObject.get('eventDefinitions') || []; + newEventDefinition = this._moddle.create(attrs.eventDefinitionType); + + eventDefinitions.push(newEventDefinition); + + newEventDefinition.$parent = businessObject; + businessObject.eventDefinitions = eventDefinitions; + } + + if (attrs.isForCompensation) { + businessObject.isForCompensation = true; + } + + size = this._getDefaultSize(businessObject); + + attrs = assign({ + businessObject: businessObject, + id: businessObject.id + }, size, attrs); + + return this.baseCreate(elementType, attrs); +}; + + +ElementFactory.prototype._getDefaultSize = function(semantic) { + + if (is(semantic, 'bpmn:SubProcess')) { + + if (isExpanded(semantic)) { + return { width: 350, height: 200 }; + } else { + return { width: 100, height: 80 }; + } + } + + if (is(semantic, 'bpmn:Task')) { + return { width: 100, height: 80 }; + } + + if (is(semantic, 'bpmn:Gateway')) { + return { width: 50, height: 50 }; + } + + if (is(semantic, 'bpmn:Event')) { + return { width: 36, height: 36 }; + } + + if (is(semantic, 'bpmn:Participant')) { + if (!isExpanded(semantic)) { + return { width: 400, height: 100 }; + } else { + return { width: 600, height: 250 }; + } + } + + if (is(semantic, 'bpmn:Lane')) { + return { width: 400, height: 100 }; + } + + if (is(semantic, 'bpmn:DataObjectReference')) { + return { width: 36, height: 50 }; + } + + if (is(semantic, 'bpmn:DataStoreReference')) { + return { width: 50, height: 50 }; + } + + if (is(semantic, 'bpmn:TextAnnotation')) { + return { width: 100, height: 30 }; + } + + return { width: 100, height: 80 }; +}; + + +ElementFactory.prototype.createParticipantShape = function(collapsed) { + + var attrs = { type: 'bpmn:Participant' }; + + if (!collapsed) { + attrs.processRef = this._bpmnFactory.create('bpmn:Process'); + } + + return this.createShape(attrs); +}; + +},{"102":102,"243":243,"377":377,"68":68,"69":69,"70":70}],21:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var BaseModeling = _dereq_(142); + +var UpdatePropertiesHandler = _dereq_(42), + UpdateCanvasRootHandler = _dereq_(40), + AddLaneHandler = _dereq_(37), + SplitLaneHandler = _dereq_(39), + ResizeLaneHandler = _dereq_(38), + UpdateFlowNodeRefsHandler = _dereq_(41); + + +/** + * BPMN 2.0 modeling features activator + * + * @param {EventBus} eventBus + * @param {ElementFactory} elementFactory + * @param {CommandStack} commandStack + * @param {BpmnRules} bpmnRules + */ +function Modeling(eventBus, elementFactory, commandStack, bpmnRules) { + BaseModeling.call(this, eventBus, elementFactory, commandStack); + + this._bpmnRules = bpmnRules; +} + +inherits(Modeling, BaseModeling); + +Modeling.$inject = [ 'eventBus', 'elementFactory', 'commandStack', 'bpmnRules' ]; + +module.exports = Modeling; + + +Modeling.prototype.getHandlers = function() { + var handlers = BaseModeling.prototype.getHandlers.call(this); + + handlers['element.updateProperties'] = UpdatePropertiesHandler; + handlers['canvas.updateRoot'] = UpdateCanvasRootHandler; + handlers['lane.add'] = AddLaneHandler; + handlers['lane.resize'] = ResizeLaneHandler; + handlers['lane.split'] = SplitLaneHandler; + handlers['lane.updateRefs'] = UpdateFlowNodeRefsHandler; + + return handlers; +}; + + +Modeling.prototype.updateLabel = function(element, newLabel) { + this._commandStack.execute('element.updateLabel', { + element: element, + newLabel: newLabel + }); +}; + + +Modeling.prototype.connect = function(source, target, attrs) { + + var bpmnRules = this._bpmnRules; + + if (!attrs) { + attrs = bpmnRules.canConnect(source, target) || { type: 'bpmn:Association' }; + } + + return this.createConnection(source, target, attrs, source.parent); +}; + + +Modeling.prototype.updateProperties = function(element, properties) { + this._commandStack.execute('element.updateProperties', { + element: element, + properties: properties + }); +}; + +Modeling.prototype.resizeLane = function(laneShape, newBounds, balanced) { + this._commandStack.execute('lane.resize', { + shape: laneShape, + newBounds: newBounds, + balanced: balanced + }); +}; + +Modeling.prototype.addLane = function(targetLaneShape, location) { + var context = { + shape: targetLaneShape, + location: location + }; + + this._commandStack.execute('lane.add', context); + + return context.newLane; +}; + +Modeling.prototype.splitLane = function(targetLane, count) { + this._commandStack.execute('lane.split', { + shape: targetLane, + count: count + }); +}; + +/** + * Transform the current diagram into a collaboration. + * + * @return {djs.model.Root} the new root element + */ +Modeling.prototype.makeCollaboration = function() { + + var collaborationElement = this._create('root', { + type: 'bpmn:Collaboration' + }); + + var context = { + newRoot: collaborationElement + }; + + this._commandStack.execute('canvas.updateRoot', context); + + return collaborationElement; +}; + +Modeling.prototype.updateLaneRefs = function(flowNodeShapes, laneShapes) { + + this._commandStack.execute('lane.updateRefs', { + flowNodeShapes: flowNodeShapes, + laneShapes: laneShapes + }); +}; + +/** + * Transform the current diagram into a process. + * + * @return {djs.model.Root} the new root element + */ +Modeling.prototype.makeProcess = function() { + + var processElement = this._create('root', { + type: 'bpmn:Process' + }); + + var context = { + newRoot: processElement + }; + + this._commandStack.execute('canvas.updateRoot', context); +}; + +},{"142":142,"243":243,"37":37,"38":38,"39":39,"40":40,"41":41,"42":42}],22:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var is = _dereq_(70).is; + +var CommandInterceptor = _dereq_(98); + + +function AppendBehavior(eventBus, elementFactory, bpmnRules) { + + CommandInterceptor.call(this, eventBus); + + // assign correct shape position unless already set + + this.preExecute('shape.append', function(context) { + + var source = context.source, + shape = context.shape; + + if (!context.position) { + + if (is(shape, 'bpmn:TextAnnotation')) { + context.position = { + x: source.x + source.width / 2 + 75, + y: source.y - (50) - shape.height / 2 + }; + } else { + context.position = { + x: source.x + source.width + 80 + shape.width / 2, + y: source.y + source.height / 2 + }; + } + } + }, true); +} + + +AppendBehavior.$inject = [ 'eventBus', 'elementFactory', 'bpmnRules' ]; + +inherits(AppendBehavior, CommandInterceptor); + +module.exports = AppendBehavior; +},{"243":243,"70":70,"98":98}],23:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var CommandInterceptor = _dereq_(98); + +var is = _dereq_(70).is; + + +/** + * BPMN specific create boundary event behavior + */ +function CreateBoundaryEventBehavior(eventBus, modeling, elementFactory, bpmnFactory) { + + CommandInterceptor.call(this, eventBus); + + /** + * replace intermediate event with boundary event when + * attaching it to a shape + */ + + this.preExecute('shape.create', function(context) { + var shape = context.shape, + host = context.host, + businessObject, + boundaryEvent; + + var attrs = { + cancelActivity: true + }; + + if (host && is(shape, 'bpmn:IntermediateThrowEvent')) { + attrs.attachedToRef = host.businessObject; + + businessObject = bpmnFactory.create('bpmn:BoundaryEvent', attrs); + + boundaryEvent = { + type: 'bpmn:BoundaryEvent', + businessObject: businessObject + }; + + context.shape = elementFactory.createShape(boundaryEvent); + } + }, true); +} + +CreateBoundaryEventBehavior.$inject = [ 'eventBus', 'modeling', 'elementFactory', 'bpmnFactory' ]; + +inherits(CreateBoundaryEventBehavior, CommandInterceptor); + +module.exports = CreateBoundaryEventBehavior; + +},{"243":243,"70":70,"98":98}],24:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var CommandInterceptor = _dereq_(98); + +var is = _dereq_(70).is; + +/** + * BPMN specific create data object behavior + */ +function CreateDataObjectBehavior(eventBus, bpmnFactory, moddle) { + + CommandInterceptor.call(this, eventBus); + + this.preExecute('shape.create', function(event) { + + var context = event.context, + shape = context.shape; + + if (is(shape, 'bpmn:DataObjectReference') && shape.type !== 'label') { + + // create a DataObject every time a DataObjectReference is created + var dataObject = bpmnFactory.create('bpmn:DataObject'); + + // set the reference to the DataObject + shape.businessObject.dataObjectRef = dataObject; + } + }); + +} + +CreateDataObjectBehavior.$inject = [ 'eventBus', 'bpmnFactory', 'moddle' ]; + +inherits(CreateDataObjectBehavior, CommandInterceptor); + +module.exports = CreateDataObjectBehavior; + +},{"243":243,"70":70,"98":98}],25:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var assign = _dereq_(377); + +var CommandInterceptor = _dereq_(98); + +var getApproxIntersection = _dereq_(226).getApproxIntersection; + + +function copy(obj) { + return assign({}, obj); +} + +function CreateOnFlowBehavior(eventBus, bpmnRules, modeling) { + + CommandInterceptor.call(this, eventBus); + + /** + * Reconnect start / end of a connection after + * dropping an element on a flow. + */ + + this.preExecute('shape.create', function(context) { + + var parent = context.parent, + shape = context.shape; + + if (bpmnRules.canInsert(shape, parent)) { + context.targetFlow = parent; + context.parent = parent.parent; + } + }, true); + + + this.postExecute('shape.create', function(context) { + + var shape = context.shape, + targetFlow = context.targetFlow, + position = context.position, + source, + target, + reconnected, + intersection, + waypoints, + waypointsBefore, + waypointsAfter, + dockingPoint; + + if (targetFlow) { + + waypoints = targetFlow.waypoints; + + + intersection = getApproxIntersection(waypoints, position); + + if (intersection) { + waypointsBefore = waypoints.slice(0, intersection.index); + waypointsAfter = waypoints.slice(intersection.index + (intersection.bendpoint ? 1 : 0)); + + dockingPoint = intersection.bendpoint ? waypoints[intersection.index] : position; + + waypointsBefore.push(copy(dockingPoint)); + waypointsAfter.unshift(copy(dockingPoint)); + } + + source = targetFlow.source; + target = targetFlow.target; + + if (bpmnRules.canConnect(source, shape, targetFlow)) { + // reconnect source -> inserted shape + modeling.reconnectEnd(targetFlow, shape, waypointsBefore || copy(position)); + + reconnected = true; + } + + if (bpmnRules.canConnect(shape, target, targetFlow)) { + + if (!reconnected) { + // reconnect inserted shape -> end + modeling.reconnectStart(targetFlow, shape, waypointsAfter || copy(position)); + } else { + modeling.connect(shape, target, { type: targetFlow.type, waypoints: waypointsAfter }); + } + } + } + }, true); +} + +inherits(CreateOnFlowBehavior, CommandInterceptor); + +CreateOnFlowBehavior.$inject = [ 'eventBus', 'bpmnRules', 'modeling' ]; + +module.exports = CreateOnFlowBehavior; + +},{"226":226,"243":243,"377":377,"98":98}],26:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var CommandInterceptor = _dereq_(98); + +var is = _dereq_(70).is; + +/** + * BPMN specific create participant behavior + */ +function CreateParticipantBehavior(eventBus, modeling, elementFactory, bpmnFactory) { + + CommandInterceptor.call(this, eventBus); + + /** + * morph process into collaboration before adding + * participant onto collaboration + */ + + this.preExecute('shape.create', function(context) { + + var parent = context.parent, + shape = context.shape, + position = context.position; + + if (is(parent, 'bpmn:Process') && is(shape, 'bpmn:Participant')) { + + // this is going to detach the process root + // and set the returned collaboration element + // as the new root element + var collaborationElement = modeling.makeCollaboration(); + + // monkey patch the create context + // so that the participant is being dropped + // onto the new collaboration root instead + context.position = position; + context.parent = collaborationElement; + + context.processRoot = parent; + } + }, true); + + + this.execute('shape.create', function(context) { + + var processRoot = context.processRoot, + shape = context.shape; + + if (processRoot) { + context.oldProcessRef = shape.businessObject.processRef; + + // assign the participant processRef + shape.businessObject.processRef = processRoot.businessObject; + } + }, true); + + + this.revert('shape.create', function(context) { + var processRoot = context.processRoot, + shape = context.shape; + + if (processRoot) { + // assign the participant processRef + shape.businessObject.processRef = context.oldProcessRef; + } + }, true); + + + this.postExecute('shape.create', function(context) { + + var processRoot = context.processRoot, + shape = context.shape; + + if (processRoot) { + // process root is already detached at this point + var processChildren = processRoot.children.slice(); + modeling.moveElements(processChildren, { x: 0, y: 0 }, shape); + } + + }, true); + +} + +CreateParticipantBehavior.$inject = [ 'eventBus', 'modeling', 'elementFactory', 'bpmnFactory' ]; + +inherits(CreateParticipantBehavior, CommandInterceptor); + +module.exports = CreateParticipantBehavior; + +},{"243":243,"70":70,"98":98}],27:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var CommandInterceptor = _dereq_(98); + +var Collections = _dereq_(219); + +var find = _dereq_(254); + +var is = _dereq_(70).is; + +var TARGET_REF_PLACEHOLDER_NAME = '__targetRef_placeholder'; + + +/** + * This behavior makes sure we always set a fake + * DataInputAssociation#targetRef as demanded by the BPMN 2.0 + * XSD schema. + * + * The reference is set to a bpmn:Property{ name: '__targetRef_placeholder' } + * which is created on the fly and cleaned up afterwards if not needed + * anymore. + * + * @param {EventBus} eventBus + * @param {BpmnFactory} bpmnFactory + */ +function DataInputAssociationBehavior(eventBus, bpmnFactory) { + + CommandInterceptor.call(this, eventBus); + + + this.executed([ + 'connection.create', + 'connection.delete', + 'connection.move', + 'connection.reconnectEnd' + ], ifDataInputAssociation(fixTargetRef)); + + this.reverted([ + 'connection.create', + 'connection.delete', + 'connection.move', + 'connection.reconnectEnd' + ], ifDataInputAssociation(fixTargetRef)); + + + function usesTargetRef(element, targetRef, removedConnection) { + + var inputAssociations = element.get('dataInputAssociations'); + + return find(inputAssociations, function(association) { + return association !== removedConnection && + association.targetRef === targetRef; + }); + } + + function getTargetRef(element, create) { + + var properties = element.get('properties'); + + var targetRefProp = find(properties, function(p) { + return p.name === TARGET_REF_PLACEHOLDER_NAME; + }); + + if (!targetRefProp && create) { + targetRefProp = bpmnFactory.create('bpmn:Property', { + name: TARGET_REF_PLACEHOLDER_NAME + }); + + Collections.add(properties, targetRefProp); + } + + return targetRefProp; + } + + function cleanupTargetRef(element, connection) { + + var targetRefProp = getTargetRef(element); + + if (!targetRefProp) { + return; + } + + if (!usesTargetRef(element, targetRefProp, connection)) { + Collections.remove(element.get('properties'), targetRefProp); + } + } + + /** + * Make sure targetRef is set to a valid property or + * `null` if the connection is detached. + * + * @param {Event} event + */ + function fixTargetRef(event) { + + var context = event.context, + connection = context.connection, + connectionBo = connection.businessObject, + target = connection.target, + targetBo = target && target.businessObject, + newTarget = context.newTarget, + newTargetBo = newTarget && newTarget.businessObject, + oldTarget = context.oldTarget || context.target, + oldTargetBo = oldTarget && oldTarget.businessObject; + + var dataAssociation = connection.businessObject, + targetRefProp; + + if (oldTargetBo && oldTargetBo !== targetBo) { + cleanupTargetRef(oldTargetBo, connectionBo); + } + + if (newTargetBo && newTargetBo !== targetBo) { + cleanupTargetRef(newTargetBo, connectionBo); + } + + if (targetBo) { + targetRefProp = getTargetRef(targetBo, true); + dataAssociation.targetRef = targetRefProp; + } else { + dataAssociation.targetRef = null; + } + } +} + +DataInputAssociationBehavior.$inject = [ 'eventBus', 'bpmnFactory' ]; + +inherits(DataInputAssociationBehavior, CommandInterceptor); + +module.exports = DataInputAssociationBehavior; + + +/** + * Only call the given function when the event + * touches a bpmn:DataInputAssociation. + * + * @param {Function} fn + * @return {Function} + */ +function ifDataInputAssociation(fn) { + + return function(event) { + var context = event.context, + connection = context.connection; + + if (is(connection, 'bpmn:DataInputAssociation')) { + return fn(event); + } + }; +} +},{"219":219,"243":243,"254":254,"70":70,"98":98}],28:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var CommandInterceptor = _dereq_(98); + +var is = _dereq_(70).is; + +var getChildLanes = _dereq_(44).getChildLanes; + +var eachElement = _dereq_(221).eachElement; + + +var LOW_PRIORITY = 500; + + +/** + * BPMN specific delete lane behavior + */ +function DeleteLaneBehavior(eventBus, modeling, spaceTool) { + + CommandInterceptor.call(this, eventBus); + + + function compensateLaneDelete(shape, oldParent) { + + var siblings = getChildLanes(oldParent); + + var topAffected = []; + var bottomAffected = []; + + eachElement(siblings, function(element) { + + if (element.y > shape.y) { + bottomAffected.push(element); + } else { + topAffected.push(element); + } + + return element.children; + }); + + if (!siblings.length) { + return; + } + + var offset; + + if (bottomAffected.length && topAffected.length) { + offset = shape.height / 2; + } else { + offset = shape.height; + } + + var topAdjustments, + bottomAdjustments; + + if (topAffected.length) { + topAdjustments = spaceTool.calculateAdjustments( + topAffected, 'y', offset, shape.y - 10); + + spaceTool.makeSpace( + topAdjustments.movingShapes, + topAdjustments.resizingShapes, + { x: 0, y: offset }, 's'); + } + + if (bottomAffected.length) { + bottomAdjustments = spaceTool.calculateAdjustments( + bottomAffected, 'y', -offset, shape.y + shape.height + 10); + + spaceTool.makeSpace( + bottomAdjustments.movingShapes, + bottomAdjustments.resizingShapes, + { x: 0, y: -offset }, 'n'); + } + } + + + /** + * Adjust sizes of other lanes after lane deletion + */ + this.postExecuted('shape.delete', LOW_PRIORITY, function(event) { + + var context = event.context, + hints = context.hints, + shape = context.shape, + oldParent = context.oldParent; + + // only compensate lane deletes + if (!is(shape, 'bpmn:Lane')) { + return; + } + + // compensate root deletes only + if (hints && hints.nested) { + return; + } + + compensateLaneDelete(shape, oldParent); + }); +} + +DeleteLaneBehavior.$inject = [ 'eventBus', 'modeling', 'spaceTool' ]; + +inherits(DeleteLaneBehavior, CommandInterceptor); + +module.exports = DeleteLaneBehavior; +},{"221":221,"243":243,"44":44,"70":70,"98":98}],29:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(377), + inherits = _dereq_(243); + +var LabelUtil = _dereq_(69), + is = _dereq_(70).is; + +var hasExternalLabel = LabelUtil.hasExternalLabel, + getExternalLabelMid = LabelUtil.getExternalLabelMid; + +var CommandInterceptor = _dereq_(98); + + +/** + * A component that makes sure that external labels are added + * together with respective elements and properly updated (DI wise) + * during move. + * + * @param {EventBus} eventBus + * @param {Modeling} modeling + * @param {BpmnFactory} bpmnFactory + */ +function LabelSupport(eventBus, modeling, bpmnFactory) { + + CommandInterceptor.call(this, eventBus); + + // create external labels on shape creation + + this.postExecute([ 'shape.create', 'connection.create' ], function(e) { + var context = e.context; + + var element = context.shape || context.connection, + businessObject = element.businessObject; + + var position; + + if (hasExternalLabel(businessObject)) { + position = getExternalLabelMid(element); + + modeling.createLabel(element, position, { + id: businessObject.id + '_label', + hidden: !businessObject.name, + businessObject: businessObject + }); + } + }); + + // update di information on label creation + this.executed([ 'label.create' ], function(e) { + + var element = e.context.shape, + businessObject, + di; + + // we want to trigger on real labels only + if (!element.labelTarget) { + return; + } + + // we want to trigger on BPMN elements only + if (!is(element.labelTarget || element, 'bpmn:BaseElement')) { + return; + } + + businessObject = element.businessObject, + di = businessObject.di; + + + if (!di.label) { + di.label = bpmnFactory.create('bpmndi:BPMNLabel', { + bounds: bpmnFactory.create('dc:Bounds') + }); + } + + assign(di.label.bounds, { + x: element.x, + y: element.y, + width: element.width, + height: element.height + }); + }); +} + +inherits(LabelSupport, CommandInterceptor); + +LabelSupport.$inject = [ 'eventBus', 'modeling', 'bpmnFactory' ]; + +module.exports = LabelSupport; + +},{"243":243,"377":377,"69":69,"70":70,"98":98}],30:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(70).is; + + +function ModelingFeedback(eventBus, tooltips, translate) { + + function showError(position, message) { + tooltips.add({ + position: { + x: position.x + 5, + y: position.y + 5 + }, + type: 'error', + timeout: 2000, + html: '
' + message + '
' + }); + } + + eventBus.on([ 'shape.move.rejected', 'create.rejected' ], function(event) { + + var context = event.context, + shape = context.shape, + target = context.target; + + if (is(target, 'bpmn:Collaboration') && is(shape, 'bpmn:FlowNode')) { + showError(event, translate('flow elements must be children of pools/participants')); + } + }); + +} + + +ModelingFeedback.$inject = [ 'eventBus', 'tooltips', 'translate' ]; + +module.exports = ModelingFeedback; +},{"70":70}],31:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var CommandInterceptor = _dereq_(98); + +var is = _dereq_(70).is; + + +/** + * BPMN specific remove behavior + */ +function RemoveParticipantBehavior(eventBus, modeling) { + + CommandInterceptor.call(this, eventBus); + + + /** + * morph collaboration diagram into process diagram + * after the last participant has been removed + */ + + this.preExecute('shape.delete', function(context) { + + var shape = context.shape, + parent = shape.parent; + + // activate the behavior if the shape to be removed + // is a participant + if (is(shape, 'bpmn:Participant')) { + context.collaborationRoot = parent; + } + }, true); + + this.postExecute('shape.delete', function(context) { + + var collaborationRoot = context.collaborationRoot; + + if (collaborationRoot && !collaborationRoot.businessObject.participants.length) { + // replace empty collaboration with process diagram + modeling.makeProcess(); + } + }, true); + +} + +RemoveParticipantBehavior.$inject = [ 'eventBus', 'modeling' ]; + +inherits(RemoveParticipantBehavior, CommandInterceptor); + +module.exports = RemoveParticipantBehavior; +},{"243":243,"70":70,"98":98}],32:[function(_dereq_,module,exports){ +'use strict'; + +var forEach = _dereq_(255), + find = _dereq_(254), + inherits = _dereq_(243); + +var CommandInterceptor = _dereq_(98); + +var is = _dereq_(70).is; + +function ReplaceConnectionBehavior(eventBus, modeling, bpmnRules) { + + CommandInterceptor.call(this, eventBus); + + function fixConnection(connection) { + + var source = connection.source, + target = connection.target, + parent = connection.parent; + + // do not do anything if connection + // is already deleted (may happen due to other + // behaviors plugged-in before) + if (!parent) { + return; + } + + var replacementType, + remove; + + /** + * Check if incoming or outgoing connections + * can stay or could be substituted with an + * appropriate replacement. + * + * This holds true for SequenceFlow <> MessageFlow. + */ + + if (is(connection, 'bpmn:SequenceFlow')) { + if (!bpmnRules.canConnectSequenceFlow(source, target)) { + remove = true; + } + + if (bpmnRules.canConnectMessageFlow(source, target)) { + replacementType = 'bpmn:MessageFlow'; + } + } + + // transform message flows into sequence flows, if possible + + if (is(connection, 'bpmn:MessageFlow')) { + + if (!bpmnRules.canConnectMessageFlow(source, target)) { + remove = true; + } + + if (bpmnRules.canConnectSequenceFlow(source, target)) { + replacementType = 'bpmn:SequenceFlow'; + } + } + + if (is(connection, 'bpmn:Association') && !bpmnRules.canConnectAssociation(source, target)) { + remove = true; + } + + + // remove invalid connection, + // unless it has been removed already + if (remove) { + modeling.removeConnection(connection); + } + + // replace SequenceFlow <> MessageFlow + + if (replacementType) { + modeling.connect(source, target, { + type: replacementType, + waypoints: connection.waypoints.slice() + }); + } + } + + this.postExecuted('elements.move', function(context) { + + var closure = context.closure, + allConnections = closure.allConnections; + + forEach(allConnections, fixConnection); + }, true); + + this.postExecuted([ + 'connection.reconnectStart', + 'connection.reconnectEnd' + ], function(event){ + + var connection = event.context.connection; + + fixConnection(connection); + }); + + this.postExecuted('element.updateProperties', function(event) { + var context = event.context, + properties = context.properties, + element = context.element, + businessObject = element.businessObject, + connection; + + // remove condition expression when morphing to default flow + if (properties.default) { + connection = find(element.outgoing, { id: element.businessObject.default.id }); + + if (connection) { + modeling.updateProperties(connection, { conditionExpression: undefined }); + } + } + + // remove default property from source when morphing to conditional flow + if (properties.conditionExpression && businessObject.sourceRef.default === businessObject) { + modeling.updateProperties(element.source, { default: undefined }); + } + }); +} + +inherits(ReplaceConnectionBehavior, CommandInterceptor); + +ReplaceConnectionBehavior.$inject = [ 'eventBus', 'modeling', 'bpmnRules' ]; + +module.exports = ReplaceConnectionBehavior; + +},{"243":243,"254":254,"255":255,"70":70,"98":98}],33:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var CommandInterceptor = _dereq_(98); + +var forEach = _dereq_(255); + +var isEventSubProcess = _dereq_(68).isEventSubProcess; +var is = _dereq_(70).is; + +/** + * Defines the behaviour of what happens to the elements inside a container + * that morphs into another BPMN element + */ +function ReplaceElementBehaviour(eventBus, bpmnReplace, bpmnRules, elementRegistry, selection, modeling) { + CommandInterceptor.call(this, eventBus); + + this._bpmnReplace = bpmnReplace; + this._elementRegistry = elementRegistry; + this._selection = selection; + this._modeling = modeling; + + this.postExecuted([ 'elements.move' ], 500, function(event) { + + var context = event.context, + target = context.newParent, + newHost = context.newHost, + elements = []; + + forEach(context.closure.topLevel, function(topLevelElements) { + if (isEventSubProcess(topLevelElements)) { + elements = elements.concat(topLevelElements.children); + } else { + elements = elements.concat(topLevelElements); + } + }); + + // Change target to host when the moving element is a `bpmn:BoundaryEvent` + if (elements.length === 1 && newHost) { + target = newHost; + } + + var canReplace = bpmnRules.canReplace(elements, target); + + if (canReplace) { + this.replaceElements(elements, canReplace.replacements, newHost); + } + }, this); + + // update attachments if the host is replaced + this.postExecute([ 'shape.replace' ], 1500, function(e) { + + var context = e.context, + oldShape = context.oldShape, + newShape = context.newShape, + attachers = oldShape.attachers, + canReplace; + + if (attachers && attachers.length) { + canReplace = bpmnRules.canReplace(attachers, newShape); + + this.replaceElements(attachers, canReplace.replacements); + } + + }, this); +} + +inherits(ReplaceElementBehaviour, CommandInterceptor); + + +ReplaceElementBehaviour.prototype.replaceElements = function(elements, newElements, newHost) { + var elementRegistry = this._elementRegistry, + bpmnReplace = this._bpmnReplace, + selection = this._selection, + modeling = this._modeling; + + forEach(newElements, function(replacement) { + + var newElement = { + type: replacement.newElementType + }; + + var oldElement = elementRegistry.get(replacement.oldElementId); + + if (newHost && is(oldElement, 'bpmn:BoundaryEvent')) { + modeling.updateAttachment(oldElement, null); + } + + var idx = elements.indexOf(oldElement); + + elements[idx] = bpmnReplace.replaceElement(oldElement, newElement, { select: false }); + + if (newHost && is(elements[idx], 'bpmn:BoundaryEvent')) { + modeling.updateAttachment(elements[idx], newHost); + } + }); + + if (newElements) { + selection.select(elements); + } +}; + +ReplaceElementBehaviour.$inject = [ 'eventBus', 'bpmnReplace', 'bpmnRules', 'elementRegistry', + 'selection', 'modeling' ]; + +module.exports = ReplaceElementBehaviour; + +},{"243":243,"255":255,"68":68,"70":70,"98":98}],34:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(70).is; + +var roundBounds = _dereq_(208).roundBounds; + +var hasPrimaryModifier = _dereq_(228).hasPrimaryModifier; + +var SLIGHTLY_HIGHER_PRIORITY = 1001; + + +/** + * Invoke {@link Modeling#resizeLane} instead of + * {@link Modeling#resizeShape} when resizing a Lane + * or Participant shape. + */ +function ResizeLaneBehavior(eventBus, modeling) { + + eventBus.on('resize.start', SLIGHTLY_HIGHER_PRIORITY + 500, function(event) { + var context = event.context, + shape = context.shape; + + if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) { + + // should we resize the opposite lane(s) in + // order to compensate for the resize operation? + context.balanced = !hasPrimaryModifier(event); + } + }); + + /** + * Intercept resize end and call resize lane function instead. + */ + eventBus.on('resize.end', SLIGHTLY_HIGHER_PRIORITY, function(event) { + var context = event.context, + shape = context.shape, + canExecute = context.canExecute, + newBounds = context.newBounds; + + if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) { + + if (canExecute) { + // ensure we have actual pixel values for new bounds + // (important when zoom level was > 1 during move) + newBounds = roundBounds(newBounds); + + // perform the actual resize + modeling.resizeLane(shape, newBounds, context.balanced); + } + + // stop propagation + return false; + } + }); +} + +ResizeLaneBehavior.$inject = [ 'eventBus', 'modeling' ]; + +module.exports = ResizeLaneBehavior; + +},{"208":208,"228":228,"70":70}],35:[function(_dereq_,module,exports){ +'use strict'; + + +var inherits = _dereq_(243); + +var CommandInterceptor = _dereq_(98); + +var is = _dereq_(70).is; + +var LOW_PRIORITY = 500, + HIGH_PRIORITY = 5000; + + +/** + * BPMN specific delete lane behavior + */ +function UpdateFlowNodeRefsBehavior(eventBus, modeling, translate) { + + CommandInterceptor.call(this, eventBus); + + /** + * Ok, this is it: + * + * We have to update the Lane#flowNodeRefs _and_ + * FlowNode#lanes with every FlowNode move/resize and + * Lane move/resize. + * + * We want to group that stuff to recompute containments + * as efficient as possible. + * + * Yea! + */ + + // the update context + var context; + + + function initContext() { + context = context || new UpdateContext(); + context.enter(); + + return context; + } + + function getContext() { + if (!context) { + throw new Error(translate('out of bounds release')); + } + + return context; + } + + function releaseContext() { + + if (!context) { + throw new Error(translate('out of bounds release')); + } + + var triggerUpdate = context.leave(); + + if (triggerUpdate) { + modeling.updateLaneRefs(context.flowNodes, context.lanes); + + context = null; + } + + return triggerUpdate; + } + + + var laneRefUpdateEvents = [ + 'spaceTool', + 'lane.add', + 'lane.resize', + 'lane.split', + 'elements.move', + 'elements.delete', + 'shape.create', + 'shape.delete', + 'shape.move', + 'shape.resize' + ]; + + + // listen to a lot of stuff to group lane updates + + this.preExecute(laneRefUpdateEvents, HIGH_PRIORITY, function(event) { + initContext(); + }); + + this.postExecuted(laneRefUpdateEvents, LOW_PRIORITY, function(event) { + releaseContext(); + }); + + + // Mark flow nodes + lanes that need an update + + this.preExecute([ + 'shape.create', + 'shape.move', + 'shape.delete', + 'shape.resize' + ], function(event) { + + var context = event.context, + shape = context.shape; + + var updateContext = getContext(); + + // no need to update labels + if (shape.labelTarget) { + return; + } + + if (is(shape, 'bpmn:Lane')) { + updateContext.addLane(shape); + } + + if (is(shape, 'bpmn:FlowNode')) { + updateContext.addFlowNode(shape); + } + }); +} + +UpdateFlowNodeRefsBehavior.$inject = [ 'eventBus', 'modeling' , 'translate']; + +inherits(UpdateFlowNodeRefsBehavior, CommandInterceptor); + +module.exports = UpdateFlowNodeRefsBehavior; + + + +function UpdateContext() { + + this.flowNodes = []; + this.lanes = []; + + this.counter = 0; + + this.addLane = function(lane) { + this.lanes.push(lane); + }; + + this.addFlowNode = function(flowNode) { + this.flowNodes.push(flowNode); + }; + + this.enter = function() { + this.counter++; + }; + + this.leave = function() { + this.counter--; + + return !this.counter; + }; +} +},{"243":243,"70":70,"98":98}],36:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ + 'appendBehavior', + 'createBoundaryEventBehavior', + 'createDataObjectBehavior', + 'createOnFlowBehavior', + 'createParticipantBehavior', + 'dataInputAssociationBehavior', + 'deleteLaneBehavior', + 'labelBehavior', + 'modelingFeedback', + 'removeParticipantBehavior', + 'replaceConnectionBehavior', + 'replaceElementBehaviour', + 'resizeLaneBehavior', + 'updateFlowNodeRefsBehavior' + ], + appendBehavior: [ 'type', _dereq_(22) ], + createBoundaryEventBehavior: [ 'type', _dereq_(23) ], + createDataObjectBehavior: [ 'type', _dereq_(24) ], + createOnFlowBehavior: [ 'type', _dereq_(25) ], + createParticipantBehavior: [ 'type', _dereq_(26) ], + dataInputAssociationBehavior: [ 'type', _dereq_(27) ], + deleteLaneBehavior: [ 'type', _dereq_(28) ], + labelBehavior: [ 'type', _dereq_(29) ], + modelingFeedback: [ 'type', _dereq_(30) ], + removeParticipantBehavior: [ 'type', _dereq_(31) ], + replaceConnectionBehavior: [ 'type', _dereq_(32) ], + replaceElementBehaviour: [ 'type', _dereq_(33) ], + resizeLaneBehavior: [ 'type', _dereq_(34) ], + updateFlowNodeRefsBehavior: [ 'type', _dereq_(35) ] +}; + +},{"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"34":34,"35":35}],37:[function(_dereq_,module,exports){ +'use strict'; + +var filter = _dereq_(253); + +var Elements = _dereq_(221); + +var getLanesRoot = _dereq_(44).getLanesRoot, + getChildLanes = _dereq_(44).getChildLanes, + LANE_INDENTATION = _dereq_(44).LANE_INDENTATION; + +/** + * A handler that allows us to add a new lane + * above or below an existing one. + * + * @param {Modeling} modeling + */ +function AddLaneHandler(modeling, spaceTool) { + this._modeling = modeling; + this._spaceTool = spaceTool; +} + +AddLaneHandler.$inject = [ 'modeling', 'spaceTool' ]; + +module.exports = AddLaneHandler; + + +AddLaneHandler.prototype.preExecute = function(context) { + + var spaceTool = this._spaceTool, + modeling = this._modeling; + + var shape = context.shape, + location = context.location; + + var lanesRoot = getLanesRoot(shape); + + var isRoot = lanesRoot === shape, + laneParent = isRoot ? shape : shape.parent; + + var existingChildLanes = getChildLanes(laneParent); + + // (0) add a lane if we currently got none and are adding to root + if (!existingChildLanes.length) { + modeling.createShape({ type: 'bpmn:Lane' }, { + x: shape.x + LANE_INDENTATION, + y: shape.y, + width: shape.width - LANE_INDENTATION, + height: shape.height + }, laneParent); + } + + // (1) collect affected elements to create necessary space + var allAffected = []; + + Elements.eachElement(lanesRoot, function(element) { + allAffected.push(element); + + if (element === shape) { + return []; + } + + return filter(element.children, function(c) { + return c !== shape; + }); + }); + + var offset = location === 'top' ? -120 : 120, + lanePosition = location === 'top' ? shape.y : shape.y + shape.height, + spacePos = lanePosition + (location === 'top' ? 10 : -10), + direction = location === 'top' ? 'n' : 's'; + + var adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos); + + spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: 0, y: offset }, direction); + + // (2) create new lane at open space + context.newLane = modeling.createShape({ type: 'bpmn:Lane' }, { + x: shape.x + (isRoot ? LANE_INDENTATION : 0), + y: lanePosition - (location === 'top' ? 120 : 0), + width: shape.width - (isRoot ? LANE_INDENTATION : 0), + height: 120 + }, laneParent); +}; + +},{"221":221,"253":253,"44":44}],38:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(70).is; + +var getLanesRoot = _dereq_(44).getLanesRoot, + computeLanesResize = _dereq_(44).computeLanesResize; + +var eachElement = _dereq_(221).eachElement; + +var asTRBL = _dereq_(208).asTRBL, + substractTRBL = _dereq_(180).substractTRBL; + + +/** + * A handler that resizes a lane. + * + * @param {Modeling} modeling + */ +function ResizeLaneHandler(modeling, spaceTool) { + this._modeling = modeling; + this._spaceTool = spaceTool; +} + +ResizeLaneHandler.$inject = [ 'modeling', 'spaceTool' ]; + +module.exports = ResizeLaneHandler; + + +ResizeLaneHandler.prototype.preExecute = function(context) { + + var shape = context.shape, + newBounds = context.newBounds, + balanced = context.balanced; + + if (balanced !== false) { + this.resizeBalanced(shape, newBounds); + } else { + this.resizeSpace(shape, newBounds); + } +}; + + +/** + * Resize balanced, adjusting next / previous lane sizes. + * + * @param {djs.model.Shape} shape + * @param {Bounds} newBounds + */ +ResizeLaneHandler.prototype.resizeBalanced = function(shape, newBounds) { + + var modeling = this._modeling; + + var resizeNeeded = computeLanesResize(shape, newBounds); + + // resize the lane + modeling.resizeShape(shape, newBounds); + + // resize other lanes as needed + resizeNeeded.forEach(function(r) { + modeling.resizeShape(r.shape, r.newBounds); + }); +}; + + +/** + * Resize, making actual space and moving below / above elements. + * + * @param {djs.model.Shape} shape + * @param {Bounds} newBounds + */ +ResizeLaneHandler.prototype.resizeSpace = function(shape, newBounds) { + var spaceTool = this._spaceTool; + + var shapeTrbl = asTRBL(shape), + newTrbl = asTRBL(newBounds); + + var trblDiff = substractTRBL(newTrbl, shapeTrbl); + + var lanesRoot = getLanesRoot(shape); + + var allAffected = [], + allLanes = []; + + eachElement(lanesRoot, function(element) { + allAffected.push(element); + + if (is(element, 'bpmn:Lane') || is(element, 'bpmn:Participant')) { + allLanes.push(element); + } + + return element.children; + }); + + var change, + spacePos, + direction, + offset, + adjustments; + + if (trblDiff.bottom || trblDiff.top) { + + change = trblDiff.bottom || trblDiff.top; + spacePos = shape.y + (trblDiff.bottom ? shape.height : 0) + (trblDiff.bottom ? -10 : 10); + direction = trblDiff.bottom ? 's' : 'n'; + + offset = trblDiff.top > 0 || trblDiff.bottom < 0 ? -change : change; + + adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos); + + spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: 0, y: change }, direction); + } + + + if (trblDiff.left || trblDiff.right) { + + change = trblDiff.right || trblDiff.left; + spacePos = shape.x + (trblDiff.right ? shape.width : 0) + (trblDiff.right ? -10 : 100); + direction = trblDiff.right ? 'e' : 'w'; + + offset = trblDiff.left > 0 || trblDiff.right < 0 ? -change : change; + + adjustments = spaceTool.calculateAdjustments(allLanes, 'x', offset, spacePos); + + spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: change, y: 0 }, direction); + } +}; +},{"180":180,"208":208,"221":221,"44":44,"70":70}],39:[function(_dereq_,module,exports){ +'use strict'; + +var getChildLanes = _dereq_(44).getChildLanes; + +var LANE_INDENTATION = _dereq_(44).LANE_INDENTATION; + +/** + * A handler that splits a lane into a number of sub-lanes, + * creating new sub lanes, if neccessary. + * + * @param {Modeling} modeling + */ +function SplitLaneHandler(modeling, translate) { + this._modeling = modeling; + this._translate = translate; +} + +SplitLaneHandler.$inject = [ 'modeling', 'translate']; + +module.exports = SplitLaneHandler; + + +SplitLaneHandler.prototype.preExecute = function(context) { + + var modeling = this._modeling, + translate = this._translate; + + var shape = context.shape, + newLanesCount = context.count; + + var childLanes = getChildLanes(shape), + existingLanesCount = childLanes.length; + + if (existingLanesCount > newLanesCount) { + throw new Error(translate('more than {count} child lanes', { count: newLanesCount })); + } + + var newLanesHeight = Math.round(shape.height / newLanesCount); + + // Iterate from top to bottom in child lane order, + // resizing existing lanes and creating new ones + // so that they split the parent proportionally. + // + // Due to rounding related errors, the bottom lane + // needs to take up all the remaining space. + var laneY, + laneHeight, + laneBounds, + newLaneAttrs, + idx; + + for (idx = 0; idx < newLanesCount; idx++) { + + laneY = shape.y + idx * newLanesHeight; + + // if bottom lane + if (idx === newLanesCount - 1) { + laneHeight = shape.height - (newLanesHeight * idx); + } else { + laneHeight = newLanesHeight; + } + + laneBounds = { + x: shape.x + LANE_INDENTATION, + y: laneY, + width: shape.width - LANE_INDENTATION, + height: laneHeight + }; + + if (idx < existingLanesCount) { + // resize existing lane + modeling.resizeShape(childLanes[idx], laneBounds); + } else { + // create a new lane at position + newLaneAttrs = { + type: 'bpmn:Lane' + }; + + modeling.createShape(newLaneAttrs, laneBounds, shape); + } + } +}; + +},{"44":44}],40:[function(_dereq_,module,exports){ +'use strict'; + +var Collections = _dereq_(219); + + +function UpdateCanvasRootHandler(canvas, modeling) { + this._canvas = canvas; + this._modeling = modeling; +} + +UpdateCanvasRootHandler.$inject = [ 'canvas', 'modeling' ]; + +module.exports = UpdateCanvasRootHandler; + + +UpdateCanvasRootHandler.prototype.execute = function(context) { + + var canvas = this._canvas; + + var newRoot = context.newRoot, + newRootBusinessObject = newRoot.businessObject, + oldRoot = canvas.getRootElement(), + oldRootBusinessObject = oldRoot.businessObject, + bpmnDefinitions = oldRootBusinessObject.$parent, + diPlane = oldRootBusinessObject.di; + + // (1) replace process old <> new root + canvas.setRootElement(newRoot, true); + + // (2) update root elements + Collections.add(bpmnDefinitions.rootElements, newRootBusinessObject); + newRootBusinessObject.$parent = bpmnDefinitions; + + Collections.remove(bpmnDefinitions.rootElements, oldRootBusinessObject); + oldRootBusinessObject.$parent = null; + + // (3) wire di + oldRootBusinessObject.di = null; + + diPlane.bpmnElement = newRootBusinessObject; + newRootBusinessObject.di = diPlane; + + context.oldRoot = oldRoot; + + // TODO(nikku): return changed elements? + // return [ newRoot, oldRoot ]; +}; + + +UpdateCanvasRootHandler.prototype.revert = function(context) { + + var canvas = this._canvas; + + var newRoot = context.newRoot, + newRootBusinessObject = newRoot.businessObject, + oldRoot = context.oldRoot, + oldRootBusinessObject = oldRoot.businessObject, + bpmnDefinitions = newRootBusinessObject.$parent, + diPlane = newRootBusinessObject.di; + + // (1) replace process old <> new root + canvas.setRootElement(oldRoot, true); + + // (2) update root elements + Collections.remove(bpmnDefinitions.rootElements, newRootBusinessObject); + newRootBusinessObject.$parent = null; + + Collections.add(bpmnDefinitions.rootElements, oldRootBusinessObject); + oldRootBusinessObject.$parent = bpmnDefinitions; + + // (3) wire di + newRootBusinessObject.di = null; + + diPlane.bpmnElement = oldRootBusinessObject; + oldRootBusinessObject.di = diPlane; + + // TODO(nikku): return changed elements? + // return [ newRoot, oldRoot ]; +}; +},{"219":219}],41:[function(_dereq_,module,exports){ +'use strict'; + +var collectLanes = _dereq_(44).collectLanes; + +var getLanesRoot = _dereq_(44).getLanesRoot; + +var is = _dereq_(70).is; + +var Collections = _dereq_(219); + +var asTRBL = _dereq_(208).asTRBL; + +var FLOW_NODE_REFS_ATTR = 'flowNodeRef', + LANES_ATTR = 'lanes'; + +/** + * A handler that updates lane refs on changed elements + */ +function UpdateFlowNodeRefsHandler(elementRegistry) { + this._elementRegistry = elementRegistry; +} + +UpdateFlowNodeRefsHandler.$inject = [ 'elementRegistry' ]; + +module.exports = UpdateFlowNodeRefsHandler; + + +UpdateFlowNodeRefsHandler.prototype.computeUpdates = function(flowNodeShapes, laneShapes) { + + var handledNodes = {}; + + var updates = []; + + var participantCache = {}; + + var allFlowNodeShapes = []; + + function isInLaneShape(element, laneShape) { + + var laneTrbl = asTRBL(laneShape); + + var elementMid = { + x: element.x + element.width / 2, + y: element.y + element.height / 2 + }; + + return elementMid.x > laneTrbl.left && + elementMid.x < laneTrbl.right && + elementMid.y > laneTrbl.top && + elementMid.y < laneTrbl.bottom; + } + + function addFlowNodeShape(flowNodeShape) { + if (!handledNodes[flowNodeShape.id]) { + allFlowNodeShapes.push(flowNodeShape); + handledNodes[flowNodeShape.id] = flowNodeShape; + } + } + + function getAllLaneShapes(flowNodeShape) { + + var root = getLanesRoot(flowNodeShape); + + if (!participantCache[root.id]) { + participantCache[root.id] = collectLanes(root); + } + + return participantCache[root.id]; + } + + function getNewLanes(flowNodeShape) { + if (!flowNodeShape.parent) { + return []; + } + + var allLaneShapes = getAllLaneShapes(flowNodeShape); + + return allLaneShapes.filter(function(l) { + return isInLaneShape(flowNodeShape, l); + }).map(function(shape) { + return shape.businessObject; + }); + } + + laneShapes.forEach(function(laneShape) { + var root = getLanesRoot(laneShape); + + if (!root || handledNodes[root.id]) { + return; + } + + var children = root.children.filter(function(c) { + return is(c, 'bpmn:FlowNode'); + }); + + children.forEach(addFlowNodeShape); + + handledNodes[root.id] = root; + }); + + flowNodeShapes.forEach(addFlowNodeShape); + + + allFlowNodeShapes.forEach(function(flowNodeShape) { + + var flowNode = flowNodeShape.businessObject; + + var lanes = flowNode.get(LANES_ATTR), + remove = lanes.slice(), + add = getNewLanes(flowNodeShape); + + updates.push({ flowNode: flowNode, remove: remove, add: add }); + }); + + laneShapes.forEach(function(laneShape) { + + var lane = laneShape.businessObject; + + // lane got removed XX-) + if (!laneShape.parent) { + lane.get(FLOW_NODE_REFS_ATTR).forEach(function(flowNode) { + updates.push({ flowNode: flowNode, remove: [ lane ], add: [] }); + }); + } + }); + + return updates; +}; + +UpdateFlowNodeRefsHandler.prototype.execute = function(context) { + + var updates = context.updates; + + if (!updates) { + updates = context.updates = this.computeUpdates(context.flowNodeShapes, context.laneShapes); + } + + + updates.forEach(function(update) { + + var flowNode = update.flowNode, + lanes = flowNode.get(LANES_ATTR); + + // unwire old + update.remove.forEach(function(oldLane) { + Collections.remove(lanes, oldLane); + Collections.remove(oldLane.get(FLOW_NODE_REFS_ATTR), flowNode); + }); + + // wire new + update.add.forEach(function(newLane) { + Collections.add(lanes, newLane); + Collections.add(newLane.get(FLOW_NODE_REFS_ATTR), flowNode); + }); + }); + + // TODO(nikku): return changed elements + // return [ ... ]; +}; + + +UpdateFlowNodeRefsHandler.prototype.revert = function(context) { + + var updates = context.updates; + + updates.forEach(function(update) { + + var flowNode = update.flowNode, + lanes = flowNode.get(LANES_ATTR); + + // unwire new + update.add.forEach(function(newLane) { + Collections.remove(lanes, newLane); + Collections.remove(newLane.get(FLOW_NODE_REFS_ATTR), flowNode); + }); + + // wire old + update.remove.forEach(function(oldLane) { + Collections.add(lanes, oldLane); + Collections.add(oldLane.get(FLOW_NODE_REFS_ATTR), flowNode); + }); + }); + + // TODO(nikku): return changed elements + // return [ ... ]; +}; +},{"208":208,"219":219,"44":44,"70":70}],42:[function(_dereq_,module,exports){ +'use strict'; + +var reduce = _dereq_(384), + keys = _dereq_(378), + forEach = _dereq_(255), + assign = _dereq_(377); + +var getBusinessObject = _dereq_(70).getBusinessObject; + +var DEFAULT_FLOW = 'default', + NAME = 'name', + ID = 'id'; + + +/** + * A handler that implements a BPMN 2.0 property update. + * + * This should be used to set simple properties on elements with + * an underlying BPMN business object. + * + * Use respective diagram-js provided handlers if you would + * like to perform automated modeling. + */ +function UpdatePropertiesHandler(elementRegistry, moddle, translate) { + this._elementRegistry = elementRegistry; + this._moddle = moddle; + this._translate = translate; +} + +UpdatePropertiesHandler.$inject = [ 'elementRegistry', 'moddle', 'translate' ]; + +module.exports = UpdatePropertiesHandler; + + +////// api ///////////////////////////////////////////// + +/** + * Updates a BPMN element with a list of new properties + * + * @param {Object} context + * @param {djs.model.Base} context.element the element to update + * @param {Object} context.properties a list of properties to set on the element's + * businessObject (the BPMN model element) + * + * @return {Array} the updated element + */ +UpdatePropertiesHandler.prototype.execute = function(context) { + + var element = context.element, + changed = [ element], + translate = this._translate; + + if (!element) { + throw new Error(translate('element required')); + } + + var elementRegistry = this._elementRegistry, + ids = this._moddle.ids; + + var businessObject = element.businessObject, + properties = unwrapBusinessObjects(context.properties), + oldProperties = context.oldProperties || getProperties(businessObject, keys(properties)); + + if (isIdChange(properties, businessObject)) { + ids.unclaim(businessObject[ID]); + + elementRegistry.updateId(element, properties[ID]); + } + + // correctly indicate visual changes on default flow updates + if (DEFAULT_FLOW in properties) { + + if (properties[DEFAULT_FLOW]) { + changed.push(elementRegistry.get(properties[DEFAULT_FLOW].id)); + } + + if (businessObject[DEFAULT_FLOW]) { + changed.push(elementRegistry.get(businessObject[DEFAULT_FLOW].id)); + } + } + + if (NAME in properties && element.label) { + changed.push(element.label); + + // show the label + element.label.hidden = !properties[NAME]; + } + + // update properties + setProperties(businessObject, properties); + + // store old values + context.oldProperties = oldProperties; + context.changed = changed; + + // indicate changed on objects affected by the update + return changed; +}; + +/** + * Reverts the update on a BPMN elements properties. + * + * @param {Object} context + * + * @return {djs.mode.Base} the updated element + */ +UpdatePropertiesHandler.prototype.revert = function(context) { + + var element = context.element, + properties = context.properties, + oldProperties = context.oldProperties, + businessObject = element.businessObject, + elementRegistry = this._elementRegistry, + ids = this._moddle.ids; + + // update properties + setProperties(businessObject, oldProperties); + + if (isIdChange(properties, businessObject)) { + ids.unclaim(properties[ID]); + + elementRegistry.updateId(element, oldProperties[ID]); + } + + return context.changed; +}; + + +function isIdChange(properties, businessObject) { + return ID in properties && properties[ID] !== businessObject[ID]; +} + + +function getProperties(businessObject, propertyNames) { + return reduce(propertyNames, function(result, key) { + result[key] = businessObject.get(key); + return result; + }, {}); +} + + +function setProperties(businessObject, properties) { + forEach(properties, function(value, key) { + businessObject.set(key, value); + }); +} + + +var referencePropertyNames = [ 'default' ]; + +/** + * Make sure we unwrap the actual business object + * behind diagram element that may have been + * passed as arguments. + * + * @param {Object} properties + * + * @return {Object} unwrappedProps + */ +function unwrapBusinessObjects(properties) { + + var unwrappedProps = assign({}, properties); + + referencePropertyNames.forEach(function(name) { + if (name in properties) { + unwrappedProps[name] = getBusinessObject(unwrappedProps[name]); + } + }); + + return unwrappedProps; +} +},{"255":255,"377":377,"378":378,"384":384,"70":70}],43:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ 'modeling', 'bpmnUpdater' ], + __depends__: [ + _dereq_(36), + _dereq_(16), + _dereq_(59), + _dereq_(47), + _dereq_(57), + _dereq_(100), + _dereq_(200), + _dereq_(139), + _dereq_(112), + _dereq_(189), + _dereq_(120), + _dereq_(196) + ], + bpmnFactory: [ 'type', _dereq_(17) ], + bpmnUpdater: [ 'type', _dereq_(19) ], + elementFactory: [ 'type', _dereq_(20) ], + modeling: [ 'type', _dereq_(21) ], + layouter: [ 'type', _dereq_(18) ], + connectionDocking: [ 'type', _dereq_(207) ] +}; + +},{"100":100,"112":112,"120":120,"139":139,"16":16,"17":17,"18":18,"189":189,"19":19,"196":196,"20":20,"200":200,"207":207,"21":21,"36":36,"47":47,"57":57,"59":59}],44:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(70).is; + +var getParent = _dereq_(45).getParent; + +var asTRBL = _dereq_(208).asTRBL, + substractTRBL = _dereq_(180).substractTRBL, + resizeTRBL = _dereq_(180).resizeTRBL; + +var abs = Math.abs; + + +function getTRBLResize(oldBounds, newBounds) { + return substractTRBL(asTRBL(newBounds), asTRBL(oldBounds)); +} + + +var LANE_PARENTS = [ + 'bpmn:Participant', + 'bpmn:Process', + 'bpmn:SubProcess' +]; + +var LANE_INDENTATION = 30; + +module.exports.LANE_INDENTATION = LANE_INDENTATION; + + +/** + * Collect all lane shapes in the given paren + * + * @param {djs.model.Shape} shape + * @param {Array} [collectedShapes] + * + * @return {Array} + */ +function collectLanes(shape, collectedShapes) { + + collectedShapes = collectedShapes || []; + + shape.children.filter(function(s) { + if (is(s, 'bpmn:Lane')) { + collectLanes(s, collectedShapes); + + collectedShapes.push(s); + } + }); + + return collectedShapes; +} + +module.exports.collectLanes = collectLanes; + +/** + * Return the lane children of the given element. + * + * @param {djs.model.Shape} shape + * + * @return {Array} + */ +function getChildLanes(shape) { + return shape.children.filter(function(c) { + return is(c, 'bpmn:Lane'); + }); +} + +module.exports.getChildLanes = getChildLanes; + +/** + * Return the root element containing the given lane shape + * + * @param {djs.model.Shape} shape + * + * @return {djs.model.Shape} + */ +function getLanesRoot(shape) { + return getParent(shape, LANE_PARENTS) || shape; +} + +module.exports.getLanesRoot = getLanesRoot; + + +/** + * Compute the required resize operations for lanes + * adjacent to the given shape, assuming it will be + * resized to the given new bounds. + * + * @param {djs.model.Shape} shape + * @param {Bounds} newBounds + * + * @return {Array} + */ +function computeLanesResize(shape, newBounds) { + + var rootElement = getLanesRoot(shape); + + var initialShapes = is(rootElement, 'bpmn:Process') ? [] : [ rootElement ]; + + var allLanes = collectLanes(rootElement, initialShapes), + shapeTrbl = asTRBL(shape), + shapeNewTrbl = asTRBL(newBounds), + trblResize = getTRBLResize(shape, newBounds), + resizeNeeded = []; + + allLanes.forEach(function(other) { + + if (other === shape) { + return; + } + + var topResize = 0, + rightResize = trblResize.right, + bottomResize = 0, + leftResize = trblResize.left; + + var otherTrbl = asTRBL(other); + + if (trblResize.top) { + if (abs(otherTrbl.bottom - shapeTrbl.top) < 10) { + bottomResize = shapeNewTrbl.top - otherTrbl.bottom; + } + + if (abs(otherTrbl.top - shapeTrbl.top) < 5) { + topResize = shapeNewTrbl.top - otherTrbl.top; + } + } + + if (trblResize.bottom) { + if (abs(otherTrbl.top - shapeTrbl.bottom) < 10) { + topResize = shapeNewTrbl.bottom - otherTrbl.top; + } + + if (abs(otherTrbl.bottom - shapeTrbl.bottom) < 5) { + bottomResize = shapeNewTrbl.bottom - otherTrbl.bottom; + } + } + + if (topResize || rightResize || bottomResize || leftResize) { + + resizeNeeded.push({ + shape: other, + newBounds: resizeTRBL(other, { + top: topResize, + right: rightResize, + bottom: bottomResize, + left: leftResize + }) + }); + } + + }); + + return resizeNeeded; +} + +module.exports.computeLanesResize = computeLanesResize; + +},{"180":180,"208":208,"45":45,"70":70}],45:[function(_dereq_,module,exports){ +'use strict'; + +var any = _dereq_(251); + +var is = _dereq_(70).is; + + +function getParents(element) { + + var parents = []; + + while (element) { + element = element.parent; + + if (element) { + parents.push(element); + } + } + + return parents; +} + +module.exports.getParents = getParents; + + +/** + * Return true if element has any of the given types. + * + * @param {djs.model.Base} element + * @param {Array} types + * + * @return {Boolean} + */ +function isAny(element, types) { + return any(types, function(t) { + return is(element, t); + }); +} + +module.exports.isAny = isAny; + + +/** + * Return the parent of the element with any of the given types. + * + * @param {djs.model.Base} element + * @param {String|Array} anyType + * + * @return {djs.model.Base} + */ +function getParent(element, anyType) { + + if (typeof anyType === 'string') { + anyType = [ anyType ]; + } + + while ((element = element.parent)) { + if (isAny(element, anyType)) { + return element; + } + } + + return null; +} + +module.exports.getParent = getParent; +},{"251":251,"70":70}],46:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var OrderingProvider = _dereq_(167); + +var isAny = _dereq_(45).isAny; + +var findIndex = _dereq_(244); + +var find = _dereq_(254); + + +/** + * a simple ordering provider that makes sure: + * + * (1) elements are ordered by a {level} property + * (2) elements with {alwaysOnTop} are always added to the root + */ +function BpmnOrderingProvider(eventBus, translate) { + + OrderingProvider.call(this, eventBus); + + var orders = [ + { type: 'label', order: { level: 10 } }, + { type: 'bpmn:SubProcess', order: { level: 6 } }, + { + type: 'bpmn:SequenceFlow', + order: { + level: 5, + containers: [ + 'bpmn:Participant', + 'bpmn:FlowElementsContainer' + ] + } + }, + { + type: 'bpmn:Association', + order: { + level: 6, + containers: [ + 'bpmn:Participant', + 'bpmn:FlowElementsContainer', + 'bpmn:Collaboration' + ] + } + }, + { type: 'bpmn:MessageFlow', order: { level: 9, containers: [ 'bpmn:Collaboration' ] } }, + { type: 'bpmn:BoundaryEvent', order: { level: 8 } }, + { type: 'bpmn:Participant', order: { level: -2 } }, + { type: 'bpmn:Lane', order: { level: -1 } } + ]; + + function computeOrder(element) { + var entry = find(orders, function(o) { + return isAny(element, [ o.type ]); + }); + + return entry && entry.order || { level: 1 }; + } + + function getOrder(element) { + + var order = element.order; + + if (!order) { + element.order = order = computeOrder(element); + } + + return order; + } + + function findActualParent(element, newParent, containers) { + + var actualParent = newParent; + + while (actualParent) { + + if (isAny(actualParent, containers)) { + break; + } + + actualParent = actualParent.parent; + } + + if (!actualParent) { + throw new Error(translate('no parent for {element} in {parent}', { + element: element.id, + parent: newParent.id + })); + } + + return actualParent; + } + + this.getOrdering = function(element, newParent) { + + var elementOrder = getOrder(element); + + + if (elementOrder.containers) { + newParent = findActualParent(element, newParent, elementOrder.containers); + } + + + var currentIndex = newParent.children.indexOf(element); + + var insertIndex = findIndex(newParent.children, function(child) { + + // do not compare with labels, they are created + // in the wrong order (right after elements) during import and + // mess up the positioning. + if (!element.labelTarget && child.labelTarget) { + return false; + } + + return elementOrder.level < getOrder(child).level; + }); + + + // if the element is already in the child list at + // a smaller index, we need to adjust the inser index. + // this takes into account that the element is being removed + // before being re-inserted + if (insertIndex !== -1) { + if (currentIndex !== -1 && currentIndex < insertIndex) { + insertIndex -= 1; + } + } + + return { + index: insertIndex, + parent: newParent + }; + }; +} + +BpmnOrderingProvider.$inject = [ 'eventBus', 'translate' ]; + +inherits(BpmnOrderingProvider, OrderingProvider); + +module.exports = BpmnOrderingProvider; + +},{"167":167,"243":243,"244":244,"254":254,"45":45}],47:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ 'bpmnOrderingProvider' ], + __depends__: [ + _dereq_(204) + ], + bpmnOrderingProvider: [ 'type', _dereq_(46) ] +}; +},{"204":204,"46":46}],48:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(377); + +/** + * A palette provider for BPMN 2.0 elements. + */ +function PaletteProvider(palette, create, elementFactory, spaceTool, lassoTool, handTool, translate) { + + this._palette = palette; + this._create = create; + this._elementFactory = elementFactory; + this._spaceTool = spaceTool; + this._lassoTool = lassoTool; + this._handTool = handTool; + this._translate = translate; + + palette.registerProvider(this); +} + +module.exports = PaletteProvider; + +PaletteProvider.$inject = [ + 'palette', + 'create', + 'elementFactory', + 'spaceTool', + 'lassoTool', + 'handTool', + 'translate', + 'eventBus' +]; + + +PaletteProvider.prototype.getPaletteEntries = function(element) { + + var actions = {}, + create = this._create, + elementFactory = this._elementFactory, + spaceTool = this._spaceTool, + lassoTool = this._lassoTool, + handTool = this._handTool, + translate = this._translate; + + function createAction(type, group, className, title, options) { + + function createListener(event) { + var shape = elementFactory.createShape(assign({ type: type }, options)); + + if (options) { + shape.businessObject.di.isExpanded = options.isExpanded; + } + + create.start(event, shape); + } + + var shortType = type.replace(/^bpmn\:/, ''); + + return { + group: group, + className: className, + title: title || translate('Create {type}', { type: shortType }), + action: { + dragstart: createListener, + click: createListener + } + }; + } + + function createParticipant(event, collapsed) { + create.start(event, elementFactory.createParticipantShape(collapsed)); + } + + assign(actions, { + 'hand-tool': { + group: 'tools', + className: 'bpmn-icon-hand-tool', + title: translate('Activate the hand tool'), + action: { + click: function(event) { + handTool.activateHand(event); + } + } + }, + 'lasso-tool': { + group: 'tools', + className: 'bpmn-icon-lasso-tool', + title: translate('Activate the lasso tool'), + action: { + click: function(event) { + lassoTool.activateSelection(event); + } + } + }, + 'space-tool': { + group: 'tools', + className: 'bpmn-icon-space-tool', + title: translate('Activate the create/remove space tool'), + action: { + click: function(event) { + spaceTool.activateSelection(event); + } + } + }, + 'tool-separator': { + group: 'tools', + separator: true + }, + 'create.start-event': createAction( + 'bpmn:StartEvent', 'event', 'bpmn-icon-start-event-none' + ), + 'create.intermediate-event': createAction( + 'bpmn:IntermediateThrowEvent', 'event', 'bpmn-icon-intermediate-event-none' + ), + 'create.end-event': createAction( + 'bpmn:EndEvent', 'event', 'bpmn-icon-end-event-none' + ), + 'create.exclusive-gateway': createAction( + 'bpmn:ExclusiveGateway', 'gateway', 'bpmn-icon-gateway-xor' + ), + 'create.task': createAction( + 'bpmn:Task', 'activity', 'bpmn-icon-task' + ), + 'create.data-object': createAction( + 'bpmn:DataObjectReference', 'data-object', 'bpmn-icon-data-object' + ), + 'create.data-store': createAction( + 'bpmn:DataStoreReference', 'data-store', 'bpmn-icon-data-store' + ), + 'create.subprocess-expanded': createAction( + 'bpmn:SubProcess', 'activity', 'bpmn-icon-subprocess-expanded', translate('Create expanded SubProcess'), + { isExpanded: true } + ), + 'create.participant-expanded': { + group: 'collaboration', + className: 'bpmn-icon-participant', + title: translate('Create Pool/Participant'), + action: { + dragstart: createParticipant, + click: createParticipant + } + } + }); + + return actions; +}; + +},{"377":377}],49:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(173), + _dereq_(126), + _dereq_(196), + _dereq_(141), + _dereq_(133), + _dereq_(204) + ], + __init__: [ 'paletteProvider' ], + paletteProvider: [ 'type', _dereq_(48) ] +}; + +},{"126":126,"133":133,"141":141,"173":173,"196":196,"204":204,"48":48}],50:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(70).is, + isEventSubProcess = _dereq_(68).isEventSubProcess, + getBusinessObject = _dereq_(70).getBusinessObject, + isExpanded = _dereq_(68).isExpanded, + isDifferentType = _dereq_(52).isDifferentType; + +var forEach = _dereq_(255), + filter = _dereq_(253); + +var replaceOptions = _dereq_(56); + + +/** + * This module is an element agnostic replace menu provider for the popup menu. + */ +function ReplaceMenuProvider(popupMenu, modeling, moddle, bpmnReplace, rules, translate) { + + this._popupMenu = popupMenu; + this._modeling = modeling; + this._moddle = moddle; + this._bpmnReplace = bpmnReplace; + this._rules = rules; + this._translate = translate; + + this.register(); +} + +ReplaceMenuProvider.$inject = [ 'popupMenu', 'modeling', 'moddle', 'bpmnReplace', 'rules', 'translate' ]; + + +/** + * Register replace menu provider in the popup menu + */ +ReplaceMenuProvider.prototype.register = function() { + this._popupMenu.registerProvider('bpmn-replace', this); +}; + + +/** + * Get all entries from replaceOptions for the given element and apply filters + * on them. Get for example only elements, which are different from the current one. + * + * @param {djs.model.Base} element + * + * @return {Array} a list of menu entry items + */ +ReplaceMenuProvider.prototype.getEntries = function(element) { + + var businessObject = element.businessObject; + + var rules = this._rules; + + var entries; + + if (!rules.allowed('shape.replace', { element: element })) { + return []; + } + + var differentType = isDifferentType(element); + + // start events outside event sub processes + if (is(businessObject, 'bpmn:StartEvent') && !isEventSubProcess(businessObject.$parent)) { + + entries = filter(replaceOptions.START_EVENT, differentType); + + return this._createEntries(element, entries); + } + + // expanded/collapsed pools + if (is(businessObject, 'bpmn:Participant')) { + + entries = filter(replaceOptions.PARTICIPANT, function(entry) { + return isExpanded(businessObject) !== entry.target.isExpanded; + }); + + return this._createEntries(element, entries); + } + + // start events inside event sub processes + if (is(businessObject, 'bpmn:StartEvent') && isEventSubProcess(businessObject.$parent)) { + + entries = filter(replaceOptions.EVENT_SUB_PROCESS_START_EVENT, function(entry) { + + var target = entry.target; + + var isInterrupting = target.isInterrupting !== false; + + var isInterruptingEqual = getBusinessObject(element).isInterrupting === isInterrupting; + + // filters elements which types and event definition are equal but have have different interrupting types + return differentType(entry) || !differentType(entry) && !isInterruptingEqual; + + }); + + return this._createEntries(element, entries); + } + + // end events + if (is(businessObject, 'bpmn:EndEvent')) { + + entries = filter(replaceOptions.END_EVENT, function(entry) { + var target = entry.target; + + // hide cancel end events outside transactions + if (target.eventDefinition == 'bpmn:CancelEventDefinition' && !is(businessObject.$parent, 'bpmn:Transaction')) { + return false; + } + return differentType(entry); + }); + + return this._createEntries(element, entries); + } + + // boundary events + if (is(businessObject, 'bpmn:BoundaryEvent')) { + + entries = filter(replaceOptions.BOUNDARY_EVENT, function(entry) { + + var target = entry.target; + + if (target.eventDefinition == 'bpmn:CancelEventDefinition' && + !is(businessObject.attachedToRef, 'bpmn:Transaction')) { + return false; + } + var cancelActivity = target.cancelActivity !== false; + + var isCancelActivityEqual = businessObject.cancelActivity == cancelActivity; + + return differentType(entry) || !differentType(entry) && !isCancelActivityEqual; + }); + + return this._createEntries(element, entries); + } + + // intermediate events + if (is(businessObject, 'bpmn:IntermediateCatchEvent') || + is(businessObject, 'bpmn:IntermediateThrowEvent')) { + + entries = filter(replaceOptions.INTERMEDIATE_EVENT, differentType); + + return this._createEntries(element, entries); + } + + // gateways + if (is(businessObject, 'bpmn:Gateway')) { + + entries = filter(replaceOptions.GATEWAY, differentType); + + return this._createEntries(element, entries); + } + + // transactions + if (is(businessObject, 'bpmn:Transaction')) { + + entries = filter(replaceOptions.TRANSACTION, differentType); + + return this._createEntries(element, entries); + } + + // expanded event sub processes + if (isEventSubProcess(businessObject) && isExpanded(businessObject)) { + + entries = filter(replaceOptions.EVENT_SUB_PROCESS, differentType); + + return this._createEntries(element, entries); + } + + // expanded sub processes + if (is(businessObject, 'bpmn:SubProcess') && isExpanded(businessObject)) { + + entries = filter(replaceOptions.SUBPROCESS_EXPANDED, differentType); + + return this._createEntries(element, entries); + } + + // collapsed ad hoc sub processes + if (is(businessObject, 'bpmn:AdHocSubProcess') && !isExpanded(businessObject)) { + + entries = filter(replaceOptions.TASK, function(entry) { + + var target = entry.target; + + var isTargetSubProcess = target.type === 'bpmn:SubProcess'; + + return isDifferentType(element, target) && !isTargetSubProcess; + }); + + return this._createEntries(element, entries); + } + + // sequence flows + if (is(businessObject, 'bpmn:SequenceFlow')) { + return this._createSequenceFlowEntries(element, replaceOptions.SEQUENCE_FLOW); + } + + // flow nodes + if (is(businessObject, 'bpmn:FlowNode')) { + entries = filter(replaceOptions.TASK, differentType); + + if (businessObject.isForCompensation) { + + // can only replace to compensation activities + entries = filter(entries, function(entry) { + return !/CallActivity/.test(entry.target.type); + }); + } + + return this._createEntries(element, entries); + } + + return []; +}; + + +/** + * Get a list of header items for the given element. This includes buttons + * for multi instance markers and for the ad hoc marker. + * + * @param {djs.model.Base} element + * + * @return {Array} a list of menu entry items + */ +ReplaceMenuProvider.prototype.getHeaderEntries = function(element) { + + var headerEntries = []; + + if (is(element, 'bpmn:Activity') && !isEventSubProcess(element)) { + headerEntries = headerEntries.concat(this._getLoopEntries(element)); + } + + if (is(element, 'bpmn:SubProcess') && + !is(element, 'bpmn:Transaction') && + !isEventSubProcess(element)) { + headerEntries.push(this._getAdHocEntry(element)); + } + + return headerEntries; +}; + + +/** + * Creates an array of menu entry objects for a given element and filters the replaceOptions + * according to a filter function. + * + * @param {djs.model.Base} element + * @param {Object} replaceOptions + * + * @return {Array} a list of menu items + */ +ReplaceMenuProvider.prototype._createEntries = function(element, replaceOptions) { + var menuEntries = []; + + var self = this; + + forEach(replaceOptions, function(definition) { + var entry = self._createMenuEntry(definition, element); + + menuEntries.push(entry); + }); + + return menuEntries; +}; + +/** + * Creates an array of menu entry objects for a given sequence flow. + * + * @param {djs.model.Base} element + * @param {Object} replaceOptions + + * @return {Array} a list of menu items + */ +ReplaceMenuProvider.prototype._createSequenceFlowEntries = function (element, replaceOptions) { + + var businessObject = getBusinessObject(element); + + var menuEntries = []; + + var modeling = this._modeling, + moddle = this._moddle; + + var self = this; + + forEach(replaceOptions, function(entry) { + + switch (entry.actionName) { + case 'replace-with-default-flow': + if (businessObject.sourceRef.default !== businessObject && + (is(businessObject.sourceRef, 'bpmn:ExclusiveGateway') || + is(businessObject.sourceRef, 'bpmn:InclusiveGateway') || + is(businessObject.sourceRef, 'bpmn:Activity'))) { + + menuEntries.push(self._createMenuEntry(entry, element, function() { + modeling.updateProperties(element.source, { default: businessObject }); + })); + } + break; + case 'replace-with-conditional-flow': + if (!businessObject.conditionExpression && is(businessObject.sourceRef, 'bpmn:Activity')) { + + menuEntries.push(self._createMenuEntry(entry, element, function() { + var conditionExpression = moddle.create('bpmn:FormalExpression', { body: '' }); + + modeling.updateProperties(element, { conditionExpression: conditionExpression }); + })); + } + break; + default: + // default flows + if (is(businessObject.sourceRef, 'bpmn:Activity') && businessObject.conditionExpression) { + return menuEntries.push(self._createMenuEntry(entry, element, function() { + modeling.updateProperties(element, { conditionExpression: undefined }); + })); + } + // conditional flows + if ((is(businessObject.sourceRef, 'bpmn:ExclusiveGateway') || + is(businessObject.sourceRef, 'bpmn:InclusiveGateway') || + is(businessObject.sourceRef, 'bpmn:Activity')) && + businessObject.sourceRef.default === businessObject) { + + return menuEntries.push(self._createMenuEntry(entry, element, function() { + modeling.updateProperties(element.source, { default: undefined }); + })); + } + } + }); + + return menuEntries; +}; + + +/** + * Creates and returns a single menu entry item. + * + * @param {Object} definition a single replace options definition object + * @param {djs.model.Base} element + * @param {Function} [action] an action callback function which gets called when + * the menu entry is being triggered. + * + * @return {Object} menu entry item + */ +ReplaceMenuProvider.prototype._createMenuEntry = function(definition, element, action) { + var translate = this._translate; + var replaceElement = this._bpmnReplace.replaceElement; + + var replaceAction = function() { + return replaceElement(element, definition.target); + }; + + action = action || replaceAction; + + var menuEntry = { + label: translate(definition.label), + className: definition.className, + id: definition.actionName, + action: action + }; + + return menuEntry; +}; + +/** + * Get a list of menu items containing buttons for multi instance markers + * + * @param {djs.model.Base} element + * + * @return {Array} a list of menu items + */ +ReplaceMenuProvider.prototype._getLoopEntries = function(element) { + + var self = this; + var translate = this._translate; + + function toggleLoopEntry(event, entry) { + var loopCharacteristics; + + if (entry.active) { + loopCharacteristics = undefined; + } else { + loopCharacteristics = self._moddle.create(entry.options.loopCharacteristics); + + if (entry.options.isSequential) { + loopCharacteristics.isSequential = entry.options.isSequential; + } + } + self._modeling.updateProperties(element, { loopCharacteristics: loopCharacteristics }); + } + + var businessObject = getBusinessObject(element), + loopCharacteristics = businessObject.loopCharacteristics; + + var isSequential, + isLoop, + isParallel; + + if (loopCharacteristics) { + isSequential = loopCharacteristics.isSequential; + isLoop = loopCharacteristics.isSequential === undefined; + isParallel = loopCharacteristics.isSequential !== undefined && !loopCharacteristics.isSequential; + } + + + var loopEntries = [ + { + id: 'toggle-parallel-mi', + className: 'bpmn-icon-parallel-mi-marker', + title: translate('Parallel Multi Instance'), + active: isParallel, + action: toggleLoopEntry, + options: { + loopCharacteristics: 'bpmn:MultiInstanceLoopCharacteristics', + isSequential: false + } + }, + { + id: 'toggle-sequential-mi', + className: 'bpmn-icon-sequential-mi-marker', + title: translate('Sequential Multi Instance'), + active: isSequential, + action: toggleLoopEntry, + options: { + loopCharacteristics: 'bpmn:MultiInstanceLoopCharacteristics', + isSequential: true + } + }, + { + id: 'toggle-loop', + className: 'bpmn-icon-loop-marker', + title: translate('Loop'), + active: isLoop, + action: toggleLoopEntry, + options: { + loopCharacteristics: 'bpmn:StandardLoopCharacteristics' + } + } + ]; + return loopEntries; +}; + + +/** + * Get the menu items containing a button for the ad hoc marker + * + * @param {djs.model.Base} element + * + * @return {Object} a menu item + */ +ReplaceMenuProvider.prototype._getAdHocEntry = function(element) { + var translate = this._translate; + var businessObject = getBusinessObject(element); + + var isAdHoc = is(businessObject, 'bpmn:AdHocSubProcess'); + + var replaceElement = this._bpmnReplace.replaceElement; + + var adHocEntry = { + id: 'toggle-adhoc', + className: 'bpmn-icon-ad-hoc-marker', + title: translate('Ad-hoc'), + active: isAdHoc, + action: function(event, entry) { + if (isAdHoc) { + return replaceElement(element, { type: 'bpmn:SubProcess' }); + } else { + return replaceElement(element, { type: 'bpmn:AdHocSubProcess' }); + } + } + }; + + return adHocEntry; +}; + +module.exports = ReplaceMenuProvider; + +},{"253":253,"255":255,"52":52,"56":56,"68":68,"70":70}],51:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(175), + _dereq_(57) + ], + __init__: [ 'replaceMenuProvider' ], + replaceMenuProvider: [ 'type', _dereq_(50) ] +}; +},{"175":175,"50":50,"57":57}],52:[function(_dereq_,module,exports){ +'use strict'; + +var getBusinessObject = _dereq_(70).getBusinessObject; + +/** + * Returns true, if an element is from a different type + * than a target definition. Takes into account the type, + * event definition type and triggeredByEvent property. + * + * @param {djs.model.Base} element + * + * @return {Boolean} + */ +function isDifferentType(element) { + + return function(entry) { + var target = entry.target; + + var businessObject = getBusinessObject(element), + eventDefinition = businessObject.eventDefinitions && businessObject.eventDefinitions[0]; + + var isEventDefinitionEqual = (eventDefinition && eventDefinition.$type) === target.eventDefinitionType, + isTypeEqual = businessObject.$type === target.type, + isTriggeredByEventEqual = businessObject.triggeredByEvent == target.triggeredByEvent; + + return !isTypeEqual || !isEventDefinitionEqual || !isTriggeredByEventEqual; + }; +} + +module.exports.isDifferentType = isDifferentType; +},{"70":70}],53:[function(_dereq_,module,exports){ +'use strict'; + +var CommandInterceptor = _dereq_(98); + +var inherits = _dereq_(243); + +var assign = _dereq_(377), + forEach = _dereq_(255); + +var LOW_PRIORITY = 250; + +function BpmnReplacePreview(eventBus, elementRegistry, elementFactory, canvas, moveVisuals) { + + CommandInterceptor.call(this, eventBus); + + /** + * Replace the visuals of all elements in the context which can be replaced + * + * @param {Object} context + */ + function replaceVisual(context) { + + var replacements = context.canExecute.replacements; + + forEach(replacements, function(replacement) { + + var id = replacement.oldElementId; + + var newElement = { + type: replacement.newElementType + }; + + // if the visual of the element is already replaced + if (context.visualReplacements[id]) { + return; + } + + var element = elementRegistry.get(id); + + assign(newElement, { x: element.x, y: element.y }); + + // create a temporary shape + var tempShape = elementFactory.createShape(newElement); + + canvas.addShape(tempShape, element.parent); + + // select the original SVG element related to the element and hide it + var gfx = context.dragGroup.select('[data-element-id=' + element.id + ']'); + + if (gfx) { + gfx.attr({ display: 'none' }); + } + + // clone the gfx of the temporary shape and add it to the drag group + var dragger = moveVisuals.addDragger(context, tempShape); + + context.visualReplacements[id] = dragger; + + canvas.removeShape(tempShape); + }); + } + + /** + * Restore the original visuals of the previously replaced elements + * + * @param {Object} context + */ + function restoreVisual(context) { + + var visualReplacements = context.visualReplacements; + + forEach(visualReplacements, function(dragger, id) { + + var originalGfx = context.dragGroup.select('[data-element-id=' + id + ']'); + + if (originalGfx) { + originalGfx.attr({ display: 'inline' }); + } + + dragger.remove(); + + if (visualReplacements[id]) { + delete visualReplacements[id]; + } + }); + } + + eventBus.on('shape.move.move', LOW_PRIORITY, function(event) { + + var context = event.context, + canExecute = context.canExecute; + + if (!context.visualReplacements) { + context.visualReplacements = {}; + } + + if (canExecute.replacements) { + replaceVisual(context); + } else { + restoreVisual(context); + } + }); +} + +BpmnReplacePreview.$inject = [ 'eventBus', 'elementRegistry', 'elementFactory', 'canvas', 'moveVisuals' ]; + +inherits(BpmnReplacePreview, CommandInterceptor); + +module.exports = BpmnReplacePreview; + +},{"243":243,"255":255,"377":377,"98":98}],54:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ _dereq_(166) ], + __init__: ['bpmnReplacePreview'], + bpmnReplacePreview: [ 'type', _dereq_(53) ] +}; + +},{"166":166,"53":53}],55:[function(_dereq_,module,exports){ +'use strict'; + +var pick = _dereq_(383), + assign = _dereq_(377); + +var is = _dereq_(70).is, + isExpanded = _dereq_(68).isExpanded, + isEventSubProcess = _dereq_(68).isEventSubProcess; + +var CUSTOM_PROPERTIES = [ + 'cancelActivity', + 'instantiate', + 'eventGatewayType', + 'triggeredByEvent', + 'isInterrupting' +]; + + +/** + * This module takes care of replacing BPMN elements + */ +function BpmnReplace(bpmnFactory, replace, selection, modeling) { + + /** + * Prepares a new business object for the replacement element + * and triggers the replace operation. + * + * @param {djs.model.Base} element + * @param {Object} target + * @param {Object} [hints] + * + * @return {djs.model.Base} the newly created element + */ + function replaceElement(element, target, hints) { + + hints = hints || {}; + + var type = target.type, + oldBusinessObject = element.businessObject, + newBusinessObject = bpmnFactory.create(type); + + var newElement = { + type: type, + businessObject: newBusinessObject + }; + + // initialize custom BPMN extensions + if (target.eventDefinitionType) { + newElement.eventDefinitionType = target.eventDefinitionType; + } + + // initialize special properties defined in target definition + assign(newBusinessObject, pick(target, CUSTOM_PROPERTIES)); + + // copy size (for activities only) + if (is(oldBusinessObject, 'bpmn:Activity')) { + + // TODO: need also to respect min/max Size + + newElement.width = element.width; + newElement.height = element.height; + } + + if (is(oldBusinessObject, 'bpmn:SubProcess')) { + newElement.isExpanded = isExpanded(oldBusinessObject); + } + + // transform collapsed/expanded pools + if (is(oldBusinessObject, 'bpmn:Participant')) { + + // create expanded pool + if (target.isExpanded === true) { + newBusinessObject.processRef = bpmnFactory.create('bpmn:Process'); + } else { + // remove children when transforming to collapsed pool + hints.moveChildren = false; + } + + // apply same size + newElement.width = element.width; + newElement.height = element.height; + } + + newBusinessObject.name = oldBusinessObject.name; + + // retain loop characteristics if the target element is not an event sub process + if (!isEventSubProcess(newBusinessObject)) { + newBusinessObject.loopCharacteristics = oldBusinessObject.loopCharacteristics; + } + + // retain default flow's reference between inclusive <-> exclusive gateways and activities + if ((is(oldBusinessObject, 'bpmn:ExclusiveGateway') || is(oldBusinessObject, 'bpmn:InclusiveGateway') || + is(oldBusinessObject, 'bpmn:Activity')) && + (is(newBusinessObject, 'bpmn:ExclusiveGateway') || is(newBusinessObject, 'bpmn:InclusiveGateway') || + is(newBusinessObject, 'bpmn:Activity'))) + { + newBusinessObject.default = oldBusinessObject.default; + } + + if (oldBusinessObject.isForCompensation) { + newBusinessObject.isForCompensation = true; + } + + newElement = replace.replaceElement(element, newElement, hints); + + if (hints.select !== false) { + selection.select(newElement); + } + + return newElement; + } + + this.replaceElement = replaceElement; +} + +BpmnReplace.$inject = [ 'bpmnFactory', 'replace', 'selection', 'modeling' ]; + +module.exports = BpmnReplace; + +},{"377":377,"383":383,"68":68,"70":70}],56:[function(_dereq_,module,exports){ +'use strict'; + +module.exports.START_EVENT = [ + { + label: 'Start Event', + actionName: 'replace-with-none-start', + className: 'bpmn-icon-start-event-none', + target: { + type: 'bpmn:StartEvent' + } + }, + { + label: 'Intermediate Throw Event', + actionName: 'replace-with-none-intermediate-throwing', + className: 'bpmn-icon-intermediate-event-none', + target: { + type: 'bpmn:IntermediateThrowEvent' + } + }, + { + label: 'End Event', + actionName: 'replace-with-none-end', + className: 'bpmn-icon-end-event-none', + target: { + type: 'bpmn:EndEvent' + } + }, + { + label: 'Message Start Event', + actionName: 'replace-with-message-start', + className: 'bpmn-icon-start-event-message', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Timer Start Event', + actionName: 'replace-with-timer-start', + className: 'bpmn-icon-start-event-timer', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:TimerEventDefinition' + } + }, + { + label: 'Conditional Start Event', + actionName: 'replace-with-conditional-start', + className: 'bpmn-icon-start-event-condition', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:ConditionalEventDefinition' + } + }, + { + label: 'Signal Start Event', + actionName: 'replace-with-signal-start', + className: 'bpmn-icon-start-event-signal', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:SignalEventDefinition' + } + } +]; + +module.exports.INTERMEDIATE_EVENT = [ + { + label: 'Start Event', + actionName: 'replace-with-none-start', + className: 'bpmn-icon-start-event-none', + target: { + type: 'bpmn:StartEvent' + } + }, + { + label: 'Intermediate Throw Event', + actionName: 'replace-with-none-intermediate-throw', + className: 'bpmn-icon-intermediate-event-none', + target: { + type: 'bpmn:IntermediateThrowEvent' + } + }, + { + label: 'End Event', + actionName: 'replace-with-none-end', + className: 'bpmn-icon-end-event-none', + target: { + type: 'bpmn:EndEvent' + } + }, + { + label: 'Message Intermediate Catch Event', + actionName: 'replace-with-message-intermediate-catch', + className: 'bpmn-icon-intermediate-event-catch-message', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinitionType: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Message Intermediate Throw Event', + actionName: 'replace-with-message-intermediate-throw', + className: 'bpmn-icon-intermediate-event-throw-message', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinitionType: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Timer Intermediate Catch Event', + actionName: 'replace-with-timer-intermediate-catch', + className: 'bpmn-icon-intermediate-event-catch-timer', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinitionType: 'bpmn:TimerEventDefinition' + } + }, + { + label: 'Escalation Intermediate Throw Event', + actionName: 'replace-with-escalation-intermediate-throw', + className: 'bpmn-icon-intermediate-event-throw-escalation', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinitionType: 'bpmn:EscalationEventDefinition' + } + }, + { + label: 'Conditional Intermediate Catch Event', + actionName: 'replace-with-conditional-intermediate-catch', + className: 'bpmn-icon-intermediate-event-catch-condition', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinitionType: 'bpmn:ConditionalEventDefinition' + } + }, + { + label: 'Link Intermediate Catch Event', + actionName: 'replace-with-link-intermediate-catch', + className: 'bpmn-icon-intermediate-event-catch-link', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinitionType: 'bpmn:LinkEventDefinition' + } + }, + { + label: 'Link Intermediate Throw Event', + actionName: 'replace-with-link-intermediate-throw', + className: 'bpmn-icon-intermediate-event-throw-link', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinitionType: 'bpmn:LinkEventDefinition' + } + }, + { + label: 'Compensation Intermediate Throw Event', + actionName: 'replace-with-compensation-intermediate-throw', + className: 'bpmn-icon-intermediate-event-throw-compensation', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinitionType: 'bpmn:CompensateEventDefinition' + } + }, + { + label: 'Signal Intermediate Catch Event', + actionName: 'replace-with-signal-intermediate-catch', + className: 'bpmn-icon-intermediate-event-catch-signal', + target: { + type: 'bpmn:IntermediateCatchEvent', + eventDefinitionType: 'bpmn:SignalEventDefinition' + } + }, + { + label: 'Signal Intermediate Throw Event', + actionName: 'replace-with-signal-intermediate-throw', + className: 'bpmn-icon-intermediate-event-throw-signal', + target: { + type: 'bpmn:IntermediateThrowEvent', + eventDefinitionType: 'bpmn:SignalEventDefinition' + } + } +]; + +module.exports.END_EVENT = [ + { + label: 'Start Event', + actionName: 'replace-with-none-start', + className: 'bpmn-icon-start-event-none', + target: { + type: 'bpmn:StartEvent' + } + }, + { + label: 'Intermediate Throw Event', + actionName: 'replace-with-none-intermediate-throw', + className: 'bpmn-icon-intermediate-event-none', + target: { + type: 'bpmn:IntermediateThrowEvent' + } + }, + { + label: 'End Event', + actionName: 'replace-with-none-end', + className: 'bpmn-icon-end-event-none', + target: { + type: 'bpmn:EndEvent' + } + }, + { + label: 'Message End Event', + actionName: 'replace-with-message-end', + className: 'bpmn-icon-end-event-message', + target: { + type: 'bpmn:EndEvent', + eventDefinitionType: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Escalation End Event', + actionName: 'replace-with-escalation-end', + className: 'bpmn-icon-end-event-escalation', + target: { + type: 'bpmn:EndEvent', + eventDefinitionType: 'bpmn:EscalationEventDefinition' + } + }, + { + label: 'Error End Event', + actionName: 'replace-with-error-end', + className: 'bpmn-icon-end-event-error', + target: { + type: 'bpmn:EndEvent', + eventDefinitionType: 'bpmn:ErrorEventDefinition' + } + }, + { + label: 'Cancel End Event', + actionName: 'replace-with-cancel-end', + className: 'bpmn-icon-end-event-cancel', + target: { + type: 'bpmn:EndEvent', + eventDefinitionType: 'bpmn:CancelEventDefinition' + } + }, + { + label: 'Compensation End Event', + actionName: 'replace-with-compensation-end', + className: 'bpmn-icon-end-event-compensation', + target: { + type: 'bpmn:EndEvent', + eventDefinitionType: 'bpmn:CompensateEventDefinition' + } + }, + { + label: 'Signal End Event', + actionName: 'replace-with-signal-end', + className: 'bpmn-icon-end-event-signal', + target: { + type: 'bpmn:EndEvent', + eventDefinitionType: 'bpmn:SignalEventDefinition' + } + }, + { + label: 'Terminate End Event', + actionName: 'replace-with-terminate-end', + className: 'bpmn-icon-end-event-terminate', + target: { + type: 'bpmn:EndEvent', + eventDefinitionType: 'bpmn:TerminateEventDefinition' + } + } +]; + +module.exports.GATEWAY = [ + { + label: 'Exclusive Gateway', + actionName: 'replace-with-exclusive-gateway', + className: 'bpmn-icon-gateway-xor', + target: { + type: 'bpmn:ExclusiveGateway' + } + }, + { + label: 'Parallel Gateway', + actionName: 'replace-with-parallel-gateway', + className: 'bpmn-icon-gateway-parallel', + target: { + type: 'bpmn:ParallelGateway' + } + }, + { + label: 'Inclusive Gateway', + actionName: 'replace-with-inclusive-gateway', + className: 'bpmn-icon-gateway-or', + target: { + type: 'bpmn:InclusiveGateway' + } + }, + { + label: 'Complex Gateway', + actionName: 'replace-with-complex-gateway', + className: 'bpmn-icon-gateway-complex', + target: { + type: 'bpmn:ComplexGateway' + } + }, + { + label: 'Event based Gateway', + actionName: 'replace-with-event-based-gateway', + className: 'bpmn-icon-gateway-eventbased', + target: { + type: 'bpmn:EventBasedGateway', + instantiate: false, + eventGatewayType: 'Exclusive' + } + } + // Gateways deactivated until https://github.com/bpmn-io/bpmn-js/issues/194 + // { + // label: 'Event based instantiating Gateway', + // actionName: 'replace-with-exclusive-event-based-gateway', + // className: 'bpmn-icon-exclusive-event-based', + // target: { + // type: 'bpmn:EventBasedGateway' + // }, + // options: { + // businessObject: { instantiate: true, eventGatewayType: 'Exclusive' } + // } + // }, + // { + // label: 'Parallel Event based instantiating Gateway', + // actionName: 'replace-with-parallel-event-based-instantiate-gateway', + // className: 'bpmn-icon-parallel-event-based-instantiate-gateway', + // target: { + // type: 'bpmn:EventBasedGateway' + // }, + // options: { + // businessObject: { instantiate: true, eventGatewayType: 'Parallel' } + // } + // } +]; + +module.exports.SUBPROCESS_EXPANDED = [ + { + label: 'Transaction', + actionName: 'replace-with-transaction', + className: 'bpmn-icon-transaction', + target: { + type: 'bpmn:Transaction', + isExpanded: true + } + }, + { + label: 'Event Sub Process', + actionName: 'replace-with-event-subprocess', + className: 'bpmn-icon-event-subprocess-expanded', + target: { + type: 'bpmn:SubProcess', + triggeredByEvent: true, + isExpanded: true + } + } +]; + +module.exports.TRANSACTION = [ + { + label: 'Sub Process', + actionName: 'replace-with-subprocess', + className: 'bpmn-icon-subprocess-expanded', + target: { + type: 'bpmn:SubProcess', + isExpanded: true + } + }, + { + label: 'Event Sub Process', + actionName: 'replace-with-event-subprocess', + className: 'bpmn-icon-event-subprocess-expanded', + target: { + type: 'bpmn:SubProcess', + triggeredByEvent: true, + isExpanded: true + } + } +]; + +module.exports.EVENT_SUB_PROCESS = [ + { + label: 'Sub Process', + actionName: 'replace-with-subprocess', + className: 'bpmn-icon-subprocess-expanded', + target: { + type: 'bpmn:SubProcess', + isExpanded: true + } + }, + { + label: 'Transaction', + actionName: 'replace-with-transaction', + className: 'bpmn-icon-transaction', + target: { + type: 'bpmn:Transaction', + isExpanded: true + } + }, +]; + +module.exports.TASK = [ + { + label: 'Task', + actionName: 'replace-with-task', + className: 'bpmn-icon-task', + target: { + type: 'bpmn:Task' + } + }, + { + label: 'Send Task', + actionName: 'replace-with-send-task', + className: 'bpmn-icon-send', + target: { + type: 'bpmn:SendTask' + } + }, + { + label: 'Receive Task', + actionName: 'replace-with-receive-task', + className: 'bpmn-icon-receive', + target: { + type: 'bpmn:ReceiveTask' + } + }, + { + label: 'User Task', + actionName: 'replace-with-user-task', + className: 'bpmn-icon-user', + target: { + type: 'bpmn:UserTask' + } + }, + { + label: 'Manual Task', + actionName: 'replace-with-manual-task', + className: 'bpmn-icon-manual', + target: { + type: 'bpmn:ManualTask' + } + }, + { + label: 'Business Rule Task', + actionName: 'replace-with-rule-task', + className: 'bpmn-icon-business-rule', + target: { + type: 'bpmn:BusinessRuleTask' + } + }, + { + label: 'Service Task', + actionName: 'replace-with-service-task', + className: 'bpmn-icon-service', + target: { + type: 'bpmn:ServiceTask' + } + }, + { + label: 'Script Task', + actionName: 'replace-with-script-task', + className: 'bpmn-icon-script', + target: { + type: 'bpmn:ScriptTask' + } + }, + { + label: 'Call Activity', + actionName: 'replace-with-call-activity', + className: 'bpmn-icon-call-activity', + target: { + type: 'bpmn:CallActivity' + } + }, + { + label: 'Sub Process (collapsed)', + actionName: 'replace-with-collapsed-subprocess', + className: 'bpmn-icon-subprocess-collapsed', + target: { + type: 'bpmn:SubProcess', + isExpanded: false + } + } +]; + +module.exports.BOUNDARY_EVENT = [ + { + label: 'Message Boundary Event', + actionName: 'replace-with-message-boundary', + className: 'bpmn-icon-intermediate-event-catch-message', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Timer Boundary Event', + actionName: 'replace-with-timer-boundary', + className: 'bpmn-icon-intermediate-event-catch-timer', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:TimerEventDefinition' + } + }, + { + label: 'Escalation Boundary Event', + actionName: 'replace-with-escalation-boundary', + className: 'bpmn-icon-intermediate-event-catch-escalation', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:EscalationEventDefinition' + } + }, + { + label: 'Conditional Boundary Event', + actionName: 'replace-with-conditional-boundary', + className: 'bpmn-icon-intermediate-event-catch-condition', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:ConditionalEventDefinition' + } + }, + { + label: 'Error Boundary Event', + actionName: 'replace-with-error-boundary', + className: 'bpmn-icon-intermediate-event-catch-error', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:ErrorEventDefinition' + } + }, + { + label: 'Cancel Boundary Event', + actionName: 'replace-with-cancel-boundary', + className: 'bpmn-icon-intermediate-event-catch-cancel', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:CancelEventDefinition' + } + }, + { + label: 'Signal Boundary Event', + actionName: 'replace-with-signal-boundary', + className: 'bpmn-icon-intermediate-event-catch-signal', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:SignalEventDefinition' + } + }, + { + label: 'Compensation Boundary Event', + actionName: 'replace-with-compensation-boundary', + className: 'bpmn-icon-intermediate-event-catch-compensation', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:CompensateEventDefinition' + } + }, + { + label: 'Message Boundary Event (non-interrupting)', + actionName: 'replace-with-non-interrupting-message-boundary', + className: 'bpmn-icon-intermediate-event-catch-non-interrupting-message', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:MessageEventDefinition', + cancelActivity: false + } + }, + { + label: 'Timer Boundary Event (non-interrupting)', + actionName: 'replace-with-non-interrupting-timer-boundary', + className: 'bpmn-icon-intermediate-event-catch-non-interrupting-timer', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:TimerEventDefinition', + cancelActivity: false + } + }, + { + label: 'Escalation Boundary Event (non-interrupting)', + actionName: 'replace-with-non-interrupting-escalation-boundary', + className: 'bpmn-icon-intermediate-event-catch-non-interrupting-escalation', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:EscalationEventDefinition', + cancelActivity: false + } + }, + { + label: 'Conditional Boundary Event (non-interrupting)', + actionName: 'replace-with-non-interrupting-conditional-boundary', + className: 'bpmn-icon-intermediate-event-catch-non-interrupting-condition', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:ConditionalEventDefinition', + cancelActivity: false + } + }, + { + label: 'Signal Boundary Event (non-interrupting)', + actionName: 'replace-with-non-interrupting-signal-boundary', + className: 'bpmn-icon-intermediate-event-catch-non-interrupting-signal', + target: { + type: 'bpmn:BoundaryEvent', + eventDefinitionType: 'bpmn:SignalEventDefinition', + cancelActivity: false + } + }, +]; + +module.exports.EVENT_SUB_PROCESS_START_EVENT = [ + { + label: 'Message Start Event', + actionName: 'replace-with-message-start', + className: 'bpmn-icon-start-event-message', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:MessageEventDefinition' + } + }, + { + label: 'Timer Start Event', + actionName: 'replace-with-timer-start', + className: 'bpmn-icon-start-event-timer', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:TimerEventDefinition' + } + }, + { + label: 'Conditional Start Event', + actionName: 'replace-with-conditional-start', + className: 'bpmn-icon-start-event-condition', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:ConditionalEventDefinition' + } + }, + { + label: 'Signal Start Event', + actionName: 'replace-with-signal-start', + className: 'bpmn-icon-start-event-signal', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:SignalEventDefinition' + } + }, + { + label: 'Error Start Event', + actionName: 'replace-with-error-start', + className: 'bpmn-icon-start-event-error', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:ErrorEventDefinition' + } + }, + { + label: 'Escalation Start Event', + actionName: 'replace-with-escalation-start', + className: 'bpmn-icon-start-event-escalation', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:EscalationEventDefinition' + } + }, + { + label: 'Compensation Start Event', + actionName: 'replace-with-compensation-start', + className: 'bpmn-icon-start-event-compensation', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:CompensateEventDefinition' + } + }, + { + label: 'Message Start Event (non-interrupting)', + actionName: 'replace-with-non-interrupting-message-start', + className: 'bpmn-icon-start-event-non-interrupting-message', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:MessageEventDefinition', + isInterrupting: false + } + }, + { + label: 'Timer Start Event (non-interrupting)', + actionName: 'replace-with-non-interrupting-timer-start', + className: 'bpmn-icon-start-event-non-interrupting-timer', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:TimerEventDefinition', + isInterrupting: false + } + }, + { + label: 'Conditional Start Event (non-interrupting)', + actionName: 'replace-with-non-interrupting-conditional-start', + className: 'bpmn-icon-start-event-non-interrupting-condition', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:ConditionalEventDefinition', + isInterrupting: false + } + }, + { + label: 'Signal Start Event (non-interrupting)', + actionName: 'replace-with-non-interrupting-signal-start', + className: 'bpmn-icon-start-event-non-interrupting-signal', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:SignalEventDefinition', + isInterrupting: false + } + }, + { + label: 'Escalation Start Event (non-interrupting)', + actionName: 'replace-with-non-interrupting-escalation-start', + className: 'bpmn-icon-start-event-non-interrupting-escalation', + target: { + type: 'bpmn:StartEvent', + eventDefinitionType: 'bpmn:EscalationEventDefinition', + isInterrupting: false + } + }, +]; + +module.exports.SEQUENCE_FLOW = [ + { + label: 'Sequence Flow', + actionName: 'replace-with-sequence-flow', + className: 'bpmn-icon-connection' + }, + { + label: 'Default Flow', + actionName: 'replace-with-default-flow', + className: 'bpmn-icon-default-flow' + }, + { + label: 'Conditional Flow', + actionName: 'replace-with-conditional-flow', + className: 'bpmn-icon-conditional-flow' + } +]; + +module.exports.PARTICIPANT = [ + { + label: 'Expanded Pool', + actionName: 'replace-with-expanded-pool', + className: 'bpmn-icon-participant', + target: { + type: 'bpmn:Participant', + isExpanded: true + } + }, + { + label: 'Collapsed Pool', + actionName: 'replace-with-collapsed-pool', + // TODO(@janstuemmel): maybe design new icon + className: 'bpmn-icon-lane', + target: { + type: 'bpmn:Participant', + isExpanded: false + } + } +]; + +},{}],57:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(177), + _dereq_(189) + ], + bpmnReplace: [ 'type', _dereq_(55) ] +}; +},{"177":177,"189":189,"55":55}],58:[function(_dereq_,module,exports){ +'use strict'; + +var find = _dereq_(254), + any = _dereq_(251), + filter = _dereq_(253), + forEach = _dereq_(255), + inherits = _dereq_(243); + +var getParents = _dereq_(45).getParents, + is = _dereq_(70).is, + isAny = _dereq_(45).isAny, + getBusinessObject = _dereq_(70).getBusinessObject, + isExpanded = _dereq_(68).isExpanded, + isEventSubProcess = _dereq_(68).isEventSubProcess, + isInterrupting = _dereq_(68).isInterrupting; + + +var RuleProvider = _dereq_(183); + +var isBoundaryAttachment = _dereq_(61).getBoundaryAttachment; + +/** + * BPMN specific modeling rule + */ +function BpmnRules(eventBus) { + RuleProvider.call(this, eventBus); +} + +inherits(BpmnRules, RuleProvider); + +BpmnRules.$inject = [ 'eventBus' ]; + +module.exports = BpmnRules; + +BpmnRules.prototype.init = function() { + + this.addRule('connection.create', function(context) { + var source = context.source, + target = context.target; + + return canConnect(source, target); + }); + + this.addRule('connection.reconnectStart', function(context) { + + var connection = context.connection, + source = context.hover || context.source, + target = connection.target; + + return canConnect(source, target, connection); + }); + + this.addRule('connection.reconnectEnd', function(context) { + + var connection = context.connection, + source = connection.source, + target = context.hover || context.target; + + return canConnect(source, target, connection); + }); + + this.addRule('connection.updateWaypoints', function(context) { + // OK! but visually ignore + return null; + }); + + this.addRule('shape.resize', function(context) { + + var shape = context.shape, + newBounds = context.newBounds; + + return canResize(shape, newBounds); + }); + + this.addRule('elements.move', function(context) { + + var target = context.target, + shapes = context.shapes, + position = context.position; + + return canAttach(shapes, target, null, position) || + canReplace(shapes, target, position) || + canMove(shapes, target, position); + }); + + this.addRule([ 'shape.create', 'shape.append' ], function(context) { + var target = context.target, + shape = context.shape, + source = context.source, + position = context.position; + + return canAttach([ shape ], target, source, position) || canCreate(shape, target, source, position); + }); + + this.addRule([ 'elements.delete' ], function(context) { + + // do not allow deletion of labels + return filter(context.elements, function(e) { + return !isLabel(e); + }); + }); +}; + +BpmnRules.prototype.canConnectMessageFlow = canConnectMessageFlow; + +BpmnRules.prototype.canConnectSequenceFlow = canConnectSequenceFlow; + +BpmnRules.prototype.canConnectDataAssociation = canConnectDataAssociation; + +BpmnRules.prototype.canConnectAssociation = canConnectAssociation; + +BpmnRules.prototype.canMove = canMove; + +BpmnRules.prototype.canAttach = canAttach; + +BpmnRules.prototype.canReplace = canReplace; + +BpmnRules.prototype.canDrop = canDrop; + +BpmnRules.prototype.canInsert = canInsert; + +BpmnRules.prototype.canCreate = canCreate; + +BpmnRules.prototype.canConnect = canConnect; + +BpmnRules.prototype.canResize = canResize; + +/** + * Utility functions for rule checking + */ + +function nonExistantOrLabel(element) { + return !element || isLabel(element); +} + +function isSame(a, b) { + return a === b; +} + +function getOrganizationalParent(element) { + + var bo = getBusinessObject(element); + + while (bo && !is(bo, 'bpmn:Process')) { + if (is(bo, 'bpmn:Participant')) { + return bo.processRef || bo; + } + + bo = bo.$parent; + } + + return bo; +} + +function isTextAnnotation(element) { + return is(element, 'bpmn:TextAnnotation'); +} + +function isCompensationBoundary(element) { + return is(element, 'bpmn:BoundaryEvent') && + hasEventDefinition(element, 'bpmn:CompensateEventDefinition'); +} + +function isForCompensation(e) { + return getBusinessObject(e).isForCompensation; +} + +function isSameOrganization(a, b) { + var parentA = getOrganizationalParent(a), + parentB = getOrganizationalParent(b); + + return parentA === parentB; +} + +function isMessageFlowSource(element) { + return is(element, 'bpmn:InteractionNode') && + !isForCompensation(element) && ( + !is(element, 'bpmn:Event') || ( + is(element, 'bpmn:ThrowEvent') && + hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition') + ) + ); +} + +function isMessageFlowTarget(element) { + return is(element, 'bpmn:InteractionNode') && + !isForCompensation(element) && ( + !is(element, 'bpmn:Event') || ( + is(element, 'bpmn:CatchEvent') && + hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition') + ) + ); +} + +function getScopeParent(element) { + + var bo = getBusinessObject(element); + + if (is(bo, 'bpmn:Participant')) { + return null; + } + + while (bo) { + bo = bo.$parent; + + if (is(bo, 'bpmn:FlowElementsContainer')) { + return bo; + } + } + + return bo; +} + +function isSameScope(a, b) { + var scopeParentA = getScopeParent(a), + scopeParentB = getScopeParent(b); + + return scopeParentA && (scopeParentA === scopeParentB); +} + +function hasEventDefinition(element, eventDefinition) { + var bo = getBusinessObject(element); + + return !!find(bo.eventDefinitions || [], function(definition) { + return is(definition, eventDefinition); + }); +} + +function hasEventDefinitionOrNone(element, eventDefinition) { + var bo = getBusinessObject(element); + + return (bo.eventDefinitions || []).every(function(definition) { + return is(definition, eventDefinition); + }); +} + +function isSequenceFlowSource(element) { + return is(element, 'bpmn:FlowNode') && + !is(element, 'bpmn:EndEvent') && + !isEventSubProcess(element) && + !(is(element, 'bpmn:IntermediateThrowEvent') && + hasEventDefinition(element, 'bpmn:LinkEventDefinition') + ) && + !isCompensationBoundary(element) && + !isForCompensation(element); +} + +function isSequenceFlowTarget(element) { + return is(element, 'bpmn:FlowNode') && + !is(element, 'bpmn:StartEvent') && + !is(element, 'bpmn:BoundaryEvent') && + !isEventSubProcess(element) && + !(is(element, 'bpmn:IntermediateCatchEvent') && + hasEventDefinition(element, 'bpmn:LinkEventDefinition') + ) && + !isForCompensation(element); + +} + +function isEventBasedTarget(element) { + return is(element, 'bpmn:ReceiveTask') || ( + is(element, 'bpmn:IntermediateCatchEvent') && ( + hasEventDefinition(element, 'bpmn:MessageEventDefinition') || + hasEventDefinition(element, 'bpmn:TimerEventDefinition') || + hasEventDefinition(element, 'bpmn:ConditionalEventDefinition') || + hasEventDefinition(element, 'bpmn:SignalEventDefinition') + ) + ); +} + +function isLabel(element) { + return element.labelTarget; +} + +function isConnection(element) { + return element.waypoints; +} + +function isParent(possibleParent, element) { + var allParents = getParents(element); + return allParents.indexOf(possibleParent) !== -1; +} + +function canConnect(source, target, connection) { + + if (nonExistantOrLabel(source) || nonExistantOrLabel(target)) { + return null; + } + + // See https://github.com/bpmn-io/bpmn-js/issues/178 + // as a workround we disallow connections with same + // target and source element. + // This rule must be removed if a auto layout for this + // connections is implemented. + if (isSame(source, target)) { + return false; + } + + if (!is(connection, 'bpmn:DataAssociation')) { + + if (canConnectMessageFlow(source, target)) { + return { type: 'bpmn:MessageFlow' }; + } + + if (canConnectSequenceFlow(source, target)) { + return { type: 'bpmn:SequenceFlow' }; + } + } + + var connectDataAssociation = canConnectDataAssociation(source, target); + + if (connectDataAssociation) { + return connectDataAssociation; + } + + if (isCompensationBoundary(source) && isForCompensation(target)) { + return { + type: 'bpmn:Association', + associationDirection: 'One' + }; + } + + if (is(connection, 'bpmn:Association') && canConnectAssociation(source, target)) { + + return { + type: 'bpmn:Association' + }; + } + + if (isTextAnnotation(source) || isTextAnnotation(target)) { + + return { + type: 'bpmn:Association' + }; + } + + return false; +} + +/** + * Can an element be dropped into the target element + * + * @return {Boolean} + */ +function canDrop(element, target, position) { + + // can move labels everywhere + if (isLabel(element) && !isConnection(target)) { + return true; + } + + // disallow to create elements on collapsed pools + if (is(target, 'bpmn:Participant') && !isExpanded(target)) { + return false; + } + + // allow to create new participants on + // on existing collaboration and process diagrams + if (is(element, 'bpmn:Participant')) { + return is(target, 'bpmn:Process') || is(target, 'bpmn:Collaboration'); + } + + // allow creating lanes on participants and other lanes only + if (is(element, 'bpmn:Lane')) { + return is(target, 'bpmn:Participant') || is(target, 'bpmn:Lane'); + } + + if (is(element, 'bpmn:BoundaryEvent')) { + return false; + } + + // drop flow elements onto flow element containers + // and participants + if (is(element, 'bpmn:FlowElement') || is(element, 'bpmn:DataAssociation')) { + if (is(target, 'bpmn:FlowElementsContainer')) { + return isExpanded(target); + } + + return isAny(target, [ 'bpmn:Participant', 'bpmn:Lane' ]); + } + + if (is(element, 'bpmn:Artifact')) { + return isAny(target, [ + 'bpmn:Collaboration', + 'bpmn:Lane', + 'bpmn:Participant', + 'bpmn:Process', + 'bpmn:SubProcess' ]); + } + + if (is(element, 'bpmn:MessageFlow')) { + return is(target, 'bpmn:Collaboration'); + } + + return false; +} + +function isBoundaryEvent(element) { + return !isLabel(element) && is(element, 'bpmn:BoundaryEvent'); +} + +function isLane(element) { + return is(element, 'bpmn:Lane'); +} + +/** + * We treat IntermediateThrowEvents as boundary events during create, + * this must be reflected in the rules. + */ +function isBoundaryCandidate(element) { + return isBoundaryEvent(element) || + (is(element, 'bpmn:IntermediateThrowEvent') && !element.parent); +} + + +function canAttach(elements, target, source, position) { + + if (!Array.isArray(elements)) { + elements = [ elements ]; + } + + // disallow appending as boundary event + if (source) { + return false; + } + + // only (re-)attach one element at a time + if (elements.length !== 1) { + return false; + } + + var element = elements[0]; + + // do not attach labels + if (isLabel(element)) { + return false; + } + + // only handle boundary events + if (!isBoundaryCandidate(element)) { + return false; + } + + // allow default move operation + if (!target) { + return true; + } + + // disallow drop on event sub processes + if (isEventSubProcess(target)) { + return false; + } + + // only allow drop on non compensation activities + if (!is(target, 'bpmn:Activity') || isForCompensation(target)) { + return false; + } + + // only attach to subprocess border + if (position && !isBoundaryAttachment(position, target)) { + return false; + } + + return 'attach'; +} + + +/** + * Defines how to replace elements for a given target. + * + * Returns an array containing all elements which will be replaced. + * + * @example + * + * [{ id: 'IntermediateEvent_2', + * type: 'bpmn:StartEvent' + * }, + * { id: 'IntermediateEvent_5', + * type: 'bpmn:EndEvent' + * }] + * + * @param {Array} elements + * @param {Object} target + * + * @return {Object} an object containing all elements which have to be replaced + */ +function canReplace(elements, target, position) { + + if (!target) { + return false; + } + + var canExecute = { + replacements: [] + }; + + forEach(elements, function(element) { + + // replace a non-interrupting start event by a blank interrupting start event + // when the target is not an event sub process + if (!isEventSubProcess(target)) { + + if (is(element, 'bpmn:StartEvent') && + !isInterrupting(element) && + element.type !== 'label' && + canDrop(element, target)) { + + canExecute.replacements.push({ + oldElementId: element.id, + newElementType: 'bpmn:StartEvent' + }); + } + } + + if (!is(target, 'bpmn:Transaction')) { + if (hasEventDefinition(element, 'bpmn:CancelEventDefinition') && + element.type !== 'label') { + + if (is(element, 'bpmn:EndEvent') && canDrop(element, target)) { + canExecute.replacements.push({ + oldElementId: element.id, + newElementType: 'bpmn:EndEvent' + }); + } + + if (is(element, 'bpmn:BoundaryEvent') && canAttach(element, target, null, position)) { + canExecute.replacements.push({ + oldElementId: element.id, + newElementType: 'bpmn:BoundaryEvent' + }); + } + } + } + }); + + return canExecute.replacements.length ? canExecute : false; +} + +function canMove(elements, target) { + + // do not move selection containing boundary events + if (any(elements, isBoundaryEvent)) { + return false; + } + + // do not move selection containing lanes + if (any(elements, isLane)) { + return false; + } + + // allow default move check to start move operation + if (!target) { + return true; + } + + return elements.every(function(element) { + return canDrop(element, target); + }); +} + +function canCreate(shape, target, source, position) { + + if (!target) { + return false; + } + + if (isLabel(target)) { + return null; + } + + if (isSame(source, target)) { + return false; + } + + // ensure we do not drop the element + // into source + if (source && isParent(source, target)) { + return false; + } + + return canDrop(shape, target, position) || canInsert(shape, target, position); +} + +function canResize(shape, newBounds) { + if (is(shape, 'bpmn:SubProcess')) { + return (!!isExpanded(shape)) && ( + !newBounds || (newBounds.width >= 100 && newBounds.height >= 80) + ); + } + + if (is(shape, 'bpmn:Lane')) { + return !newBounds || (newBounds.width >= 130 && newBounds.height >= 60); + } + + if (is(shape, 'bpmn:Participant')) { + return !newBounds || (newBounds.width >= 250 && newBounds.height >= 50); + } + + if (isTextAnnotation(shape)) { + return true; + } + + return false; +} + +function canConnectAssociation(source, target) { + + // do not connect connections + if (isConnection(source) || isConnection(target)) { + return false; + } + + // connect if different parent + return !isParent(target, source) && + !isParent(source, target); +} + +function canConnectMessageFlow(source, target) { + + return isMessageFlowSource(source) && + isMessageFlowTarget(target) && + !isSameOrganization(source, target); +} + +function canConnectSequenceFlow(source, target) { + + return isSequenceFlowSource(source) && + isSequenceFlowTarget(target) && + isSameScope(source, target) && + !(is(source, 'bpmn:EventBasedGateway') && !isEventBasedTarget(target)); +} + + +function canConnectDataAssociation(source, target) { + + if (isAny(source, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ]) && + isAny(target, [ 'bpmn:Activity', 'bpmn:ThrowEvent' ])) { + return { type: 'bpmn:DataInputAssociation' }; + } + + if (isAny(target, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ]) && + isAny(source, [ 'bpmn:Activity', 'bpmn:CatchEvent' ])) { + return { type: 'bpmn:DataOutputAssociation' }; + } + + return false; +} + +function canInsert(shape, flow, position) { + + // return true if we can drop on the + // underlying flow parent + // + // at this point we are not really able to talk + // about connection rules (yet) + return ( + isAny(flow, [ 'bpmn:SequenceFlow', 'bpmn:MessageFlow' ]) && + is(shape, 'bpmn:FlowNode') && + !is(shape, 'bpmn:BoundaryEvent') && + canDrop(shape, flow.parent, position)); +} + +},{"183":183,"243":243,"251":251,"253":253,"254":254,"255":255,"45":45,"61":61,"68":68,"70":70}],59:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(185) + ], + __init__: [ 'bpmnRules' ], + bpmnRules: [ 'type', _dereq_(58) ] +}; + +},{"185":185,"58":58}],60:[function(_dereq_,module,exports){ +'use strict'; + +var inherits = _dereq_(243); + +var forEach = _dereq_(255); + +var getBoundingBox = _dereq_(221).getBBox; + +var is = _dereq_(70).is, + isAny = _dereq_(45).isAny, + isExpanded = _dereq_(68).isExpanded; + +var Snapping = _dereq_(192), + SnapUtil = _dereq_(191); + +var asTRBL = _dereq_(208).asTRBL; + +var round = Math.round; + +var mid = SnapUtil.mid, + topLeft = SnapUtil.topLeft, + bottomRight = SnapUtil.bottomRight, + isSnapped = SnapUtil.isSnapped, + setSnapped = SnapUtil.setSnapped; + +var getBoundaryAttachment = _dereq_(61).getBoundaryAttachment, + getParticipantSizeConstraints = _dereq_(61).getParticipantSizeConstraints, + getLanesRoot = _dereq_(44).getLanesRoot; + + +/** + * BPMN specific snapping functionality + * + * * snap on process elements if a pool is created inside a + * process diagram + * + * @param {EventBus} eventBus + * @param {Canvas} canvas + */ +function BpmnSnapping(eventBus, canvas, bpmnRules, elementRegistry) { + + // instantiate super + Snapping.call(this, eventBus, canvas); + + + /** + * Drop participant on process <> process elements snapping + */ + eventBus.on('create.start', function(event) { + + var context = event.context, + shape = context.shape, + rootElement = canvas.getRootElement(); + + // snap participant around existing elements (if any) + if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) { + initParticipantSnapping(context, shape, rootElement.children); + } + }); + + eventBus.on([ 'create.move', 'create.end' ], 1500, function(event) { + + var context = event.context, + shape = context.shape, + participantSnapBox = context.participantSnapBox; + + if (!isSnapped(event) && participantSnapBox) { + snapParticipant(participantSnapBox, shape, event); + } + }); + + eventBus.on('shape.move.start', function(event) { + + var context = event.context, + shape = context.shape, + rootElement = canvas.getRootElement(); + + // snap participant around existing elements (if any) + if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) { + initParticipantSnapping(context, shape, rootElement.children); + } + }); + + + function canAttach(shape, target, position) { + return bpmnRules.canAttach([ shape ], target, null, position) === 'attach'; + } + + /** + * Snap boundary events to elements border + */ + eventBus.on([ + 'create.move', + 'create.end', + 'shape.move.move', + 'shape.move.end' + ], 1500, function(event) { + + var context = event.context, + target = context.target, + shape = context.shape; + + if (target && !isSnapped(event) && canAttach(shape, target, event)) { + snapBoundaryEvent(event, shape, target); + } + }); + + /** + * Adjust parent for flowElements to the target participant + * when droping onto lanes. + */ + eventBus.on([ + 'shape.move.hover', + 'shape.move.move', + 'shape.move.end', + 'create.hover', + 'create.move', + 'create.end' + ], 1500, function(event) { + var context = event.context, + shape = context.shape, + hover = event.hover; + + if (is(hover, 'bpmn:Lane') && !isAny(shape, [ 'bpmn:Lane', 'bpmn:Participant' ])) { + event.hover = getLanesRoot(hover); + event.hoverGfx = elementRegistry.getGraphics(event.hover); + } + }); + + + var abs = Math.abs; + + var filter = _dereq_(253), + assign = _dereq_(377); + + + eventBus.on([ + 'create.move', + 'shape.move.move' + ], function(event) { + + var context = event.context, + shape = context.shape, + target = context.target; + + var threshold = 30; + + if (is(shape, 'bpmn:Lane')) { + if (isAny(target, [ 'bpmn:Lane', 'bpmn:Participant' ])) { + + var childLanes = filter(target.children, function(c) { + return is(c, 'bpmn:Lane'); + }); + + var y = event.y, + targetTrbl; + + var insert = childLanes.reduce(function(insert, l) { + + var laneTrbl = asTRBL(l); + + if (abs(laneTrbl.top - y) < threshold) { + insert = assign(insert || {}, { before: { element: l, y: laneTrbl.top } }); + } else + if (abs(laneTrbl.bottom - y) < threshold) { + insert = assign(insert || {}, { after: { element: l, y: laneTrbl.bottom } }); + } else + if (laneTrbl.top < y && laneTrbl.bottom > y) { + if (abs(laneTrbl.top - y) > abs(laneTrbl.bottom - y)) { + insert = assign(insert || {}, { after: { element: l, y: laneTrbl.bottom } }); + } else { + insert = assign(insert || {}, { before: { element: l, y: laneTrbl.top } }); + } + + } + + return insert; + }, false); + + + if (!insert) { + targetTrbl = asTRBL(target); + + if (abs(targetTrbl.top - y) < threshold) { + insert = { before: { element: target, y: targetTrbl.top } }; + } else + if (abs(targetTrbl.bottom - y) < threshold) { + insert = { after: { element: target, y: targetTrbl.bottom } }; + } else { + insert = { into: { element: target, y: (targetTrbl.top + targetTrbl.bottom) / 2 } }; + } + + } + + if (insert.before && insert.after) { + console.log('insert between', insert.before.element.id, 'and', insert.after.element.id); + setSnapped(event, 'x', insert.before.element.x + insert.before.element.width / 2); + setSnapped(event, 'y', insert.before.y); + } else + if (insert.after) { + console.log('insert after', insert.after.element.id); + setSnapped(event, 'x', insert.after.element.x + insert.after.element.width / 2); + setSnapped(event, 'y', insert.after.y); + } else + if (insert.before) { + console.log('insert before', insert.before.element.id); + setSnapped(event, 'x', insert.before.element.x + insert.before.element.width / 2); + setSnapped(event, 'y', insert.before.y); + } else + if (insert.into) { + console.log('insert into', insert.into.element.id); + setSnapped(event, 'x', insert.into.element.x + insert.into.element.width / 2); + setSnapped(event, 'y', insert.into.y); + } + } + } + + }); + + eventBus.on('resize.start', 1500, function(event) { + var context = event.context, + shape = context.shape; + + if (is(shape, 'bpmn:SubProcess') && isExpanded(shape)) { + context.minDimensions = { width: 140, height: 120 }; + } + + if (is(shape, 'bpmn:Participant')) { + context.minDimensions = { width: 300, height: 150 }; + } + + if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) { + context.resizeConstraints = getParticipantSizeConstraints(shape, context.direction, context.balanced); + } + + if (is(shape, 'bpmn:TextAnnotation')) { + context.minDimensions = { width: 50, height: 30 }; + } + }); + +} + +inherits(BpmnSnapping, Snapping); + +BpmnSnapping.$inject = [ 'eventBus', 'canvas', 'bpmnRules', 'elementRegistry' ]; + +module.exports = BpmnSnapping; + + +BpmnSnapping.prototype.initSnap = function(event) { + + var context = event.context, + shape = event.shape, + shapeMid, + shapeBounds, + shapeTopLeft, + shapeBottomRight, + snapContext; + + + snapContext = Snapping.prototype.initSnap.call(this, event); + + if (is(shape, 'bpmn:Participant')) { + // assign higher priority for outer snaps on participants + snapContext.setSnapLocations([ 'top-left', 'bottom-right', 'mid' ]); + } + + + if (shape) { + + shapeMid = mid(shape, event); + + shapeBounds = { + width: shape.width, + height: shape.height, + x: isNaN(shape.x) ? round(shapeMid.x - shape.width / 2) : shape.x, + y: isNaN(shape.y) ? round(shapeMid.y - shape.height / 2) : shape.y, + }; + + shapeTopLeft = topLeft(shapeBounds); + shapeBottomRight = bottomRight(shapeBounds); + + snapContext.setSnapOrigin('top-left', { + x: shapeTopLeft.x - event.x, + y: shapeTopLeft.y - event.y + }); + + snapContext.setSnapOrigin('bottom-right', { + x: shapeBottomRight.x - event.x, + y: shapeBottomRight.y - event.y + }); + + forEach(shape.outgoing, function(c) { + var docking = c.waypoints[0]; + + docking = docking.original || docking; + + snapContext.setSnapOrigin(c.id + '-docking', { + x: docking.x - event.x, + y: docking.y - event.y + }); + }); + + forEach(shape.incoming, function(c) { + var docking = c.waypoints[c.waypoints.length - 1]; + + docking = docking.original || docking; + + snapContext.setSnapOrigin(c.id + '-docking', { + x: docking.x - event.x, + y: docking.y - event.y + }); + }); + + } + + var source = context.source; + + if (source) { + snapContext.addDefaultSnap('mid', mid(source)); + } +}; + + +BpmnSnapping.prototype.addTargetSnaps = function(snapPoints, shape, target) { + + // use target parent as snap target + if (is(shape, 'bpmn:BoundaryEvent') && shape.type !== 'label') { + target = target.parent; + } + + // add sequence flow parents as snap targets + if (is(target, 'bpmn:SequenceFlow')) { + this.addTargetSnaps(snapPoints, shape, target.parent); + } + + var siblings = this.getSiblings(shape, target) || []; + + forEach(siblings, function(s) { + + // do not snap to lanes + if (is(s, 'bpmn:Lane')) { + return; + } + + snapPoints.add('mid', mid(s)); + + if (is(s, 'bpmn:Participant')) { + snapPoints.add('top-left', topLeft(s)); + snapPoints.add('bottom-right', bottomRight(s)); + } + }); + + + forEach(shape.incoming, function(c) { + + if (siblings.indexOf(c.source) === -1) { + snapPoints.add('mid', mid(c.source)); + } + + var docking = c.waypoints[0]; + snapPoints.add(c.id + '-docking', docking.original || docking); + }); + + + forEach(shape.outgoing, function(c) { + + if (siblings.indexOf(c.target) === -1) { + snapPoints.add('mid', mid(c.target)); + } + + var docking = c.waypoints[c.waypoints.length - 1]; + snapPoints.add(c.id + '-docking', docking.original || docking); + }); +}; + + +/////// participant snapping ////////////////// + +function initParticipantSnapping(context, shape, elements) { + + if (!elements.length) { + return; + } + + var snapBox = getBoundingBox(elements.filter(function(e) { + return !e.labelTarget && !e.waypoints; + })); + + snapBox.x -= 50; + snapBox.y -= 20; + snapBox.width += 70; + snapBox.height += 40; + + // adjust shape height to include bounding box + shape.width = Math.max(shape.width, snapBox.width); + shape.height = Math.max(shape.height, snapBox.height); + + context.participantSnapBox = snapBox; +} + +function snapParticipant(snapBox, shape, event, offset) { + offset = offset || 0; + + var shapeHalfWidth = shape.width / 2 - offset, + shapeHalfHeight = shape.height / 2; + + var currentTopLeft = { + x: event.x - shapeHalfWidth - offset, + y: event.y - shapeHalfHeight + }; + + var currentBottomRight = { + x: event.x + shapeHalfWidth + offset, + y: event.y + shapeHalfHeight + }; + + var snapTopLeft = snapBox, + snapBottomRight = bottomRight(snapBox); + + if (currentTopLeft.x >= snapTopLeft.x) { + setSnapped(event, 'x', snapTopLeft.x + offset + shapeHalfWidth); + } else + if (currentBottomRight.x <= snapBottomRight.x) { + setSnapped(event, 'x', snapBottomRight.x - offset - shapeHalfWidth); + } + + if (currentTopLeft.y >= snapTopLeft.y) { + setSnapped(event, 'y', snapTopLeft.y + shapeHalfHeight); + } else + if (currentBottomRight.y <= snapBottomRight.y) { + setSnapped(event, 'y', snapBottomRight.y - shapeHalfHeight); + } +} + + +/////// boundary event snapping ///////////////////////// + + +function snapBoundaryEvent(event, shape, target) { + var targetTRBL = asTRBL(target); + + var direction = getBoundaryAttachment(event, target); + + if (/top/.test(direction)) { + setSnapped(event, 'y', targetTRBL.top); + } else + if (/bottom/.test(direction)) { + setSnapped(event, 'y', targetTRBL.bottom); + } + + if (/left/.test(direction)) { + setSnapped(event, 'x', targetTRBL.left); + } else + if (/right/.test(direction)) { + setSnapped(event, 'x', targetTRBL.right); + } +} + +},{"191":191,"192":192,"208":208,"221":221,"243":243,"253":253,"255":255,"377":377,"44":44,"45":45,"61":61,"68":68,"70":70}],61:[function(_dereq_,module,exports){ +'use strict'; + +var getOrientation = _dereq_(208).getOrientation; + + +function getBoundaryAttachment(position, targetBounds) { + + var orientation = getOrientation(position, targetBounds, -15); + + if (orientation !== 'intersect') { + return orientation; + } else { + return null; + } +} + +module.exports.getBoundaryAttachment = getBoundaryAttachment; + + + +// participant snapping box implementation ///////////////// + +var is = _dereq_(70).is; + +var asTRBL = _dereq_(208).asTRBL; + +var collectLanes = _dereq_(44).collectLanes, + getLanesRoot = _dereq_(44).getLanesRoot; + +var abs = Math.abs, + min = Math.min, + max = Math.max; + + +function addToTrbl(trbl, attr, value, choice) { + + var current = trbl[attr]; + + // make sure to set the value if it does not exist + // or apply the correct value by comparing against + // choice(value, currentValue) + trbl[attr] = current === undefined ? value : choice(value, current); +} + +function addMin(trbl, attr, value) { + return addToTrbl(trbl, attr, value, min); +} + +function addMax(trbl, attr, value) { + return addToTrbl(trbl, attr, value, max); +} + + +var LANE_MIN_HEIGHT = 60, + LANE_MIN_WIDTH = 300, + LANE_RIGHT_PADDING = 20, + LANE_LEFT_PADDING = 50, + LANE_TOP_PADDING = 20, + LANE_BOTTOM_PADDING = 20; + + +function getParticipantSizeConstraints(laneShape, resizeDirection, balanced) { + + var lanesRoot = getLanesRoot(laneShape); + + var isFirst = true, + isLast = true; + + ///// max top/bottom size for lanes + + var allLanes = collectLanes(lanesRoot, [ lanesRoot ]); + + var laneTrbl = asTRBL(laneShape); + + var maxTrbl = {}, + minTrbl = {}; + + if (/e/.test(resizeDirection)) { + minTrbl.right = laneTrbl.left + LANE_MIN_WIDTH; + } else + if (/w/.test(resizeDirection)) { + minTrbl.left = laneTrbl.right - LANE_MIN_WIDTH; + } + + allLanes.forEach(function(other) { + + var otherTrbl = asTRBL(other); + + if (/n/.test(resizeDirection)) { + + if (otherTrbl.top < (laneTrbl.top - 10)) { + isFirst = false; + } + + // max top size (based on next element) + if (balanced && abs(laneTrbl.top - otherTrbl.bottom) < 10) { + addMax(maxTrbl, 'top', otherTrbl.top + LANE_MIN_HEIGHT); + } + + // min top size (based on self or nested element) + if (abs(laneTrbl.top - otherTrbl.top) < 5) { + addMin(minTrbl, 'top', otherTrbl.bottom - LANE_MIN_HEIGHT); + } + } + + if (/s/.test(resizeDirection)) { + + if (otherTrbl.bottom > (laneTrbl.bottom + 10)) { + isLast = false; + } + + // max bottom size (based on previous element) + if (balanced && abs(laneTrbl.bottom - otherTrbl.top) < 10) { + addMin(maxTrbl, 'bottom', otherTrbl.bottom - LANE_MIN_HEIGHT); + } + + // min bottom size (based on self or nested element) + if (abs(laneTrbl.bottom - otherTrbl.bottom) < 5) { + addMax(minTrbl, 'bottom', otherTrbl.top + LANE_MIN_HEIGHT); + } + } + }); + + + ///// max top/bottom/left/right size based on flow nodes + + var flowElements = lanesRoot.children.filter(function(s) { + return !s.hidden && !s.waypoints && (is(s, 'bpmn:FlowElement') || is(s, 'bpmn:Artifact')); + }); + + flowElements.forEach(function(flowElement) { + + var flowElementTrbl = asTRBL(flowElement); + + if (isFirst && /n/.test(resizeDirection)) { + addMin(minTrbl, 'top', flowElementTrbl.top - LANE_TOP_PADDING); + } + + if (/e/.test(resizeDirection)) { + addMax(minTrbl, 'right', flowElementTrbl.right + LANE_RIGHT_PADDING); + } + + if (isLast && /s/.test(resizeDirection)) { + addMax(minTrbl, 'bottom', flowElementTrbl.bottom + LANE_BOTTOM_PADDING); + } + + if (/w/.test(resizeDirection)) { + addMin(minTrbl, 'left', flowElementTrbl.left - LANE_LEFT_PADDING); + } + }); + + + return { + min: minTrbl, + max: maxTrbl + }; +} + + +module.exports.getParticipantSizeConstraints = getParticipantSizeConstraints; +},{"208":208,"44":44,"70":70}],62:[function(_dereq_,module,exports){ +module.exports = { + __init__: [ 'snapping' ], + snapping: [ 'type', _dereq_(60) ] +}; +},{"60":60}],63:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(377), + map = _dereq_(258); + +var LabelUtil = _dereq_(69); + +var is = _dereq_(70).is; + +var hasExternalLabel = LabelUtil.hasExternalLabel, + getExternalLabelBounds = LabelUtil.getExternalLabelBounds, + isExpanded = _dereq_(68).isExpanded, + elementToString = _dereq_(66).elementToString; + + +function elementData(semantic, attrs) { + return assign({ + id: semantic.id, + type: semantic.$type, + businessObject: semantic + }, attrs); +} + +function collectWaypoints(waypoints) { + return map(waypoints, function(p) { + return { x: p.x, y: p.y }; + }); +} + +function notYetDrawn(translate, semantic, refSemantic, property) { + return new Error(translate('element {element} referenced by {referenced}#{property} not yet drawn', { + element: elementToString(refSemantic), + referenced: elementToString(semantic), + property: property + })); +} + +/** + * An importer that adds bpmn elements to the canvas + * + * @param {EventBus} eventBus + * @param {Canvas} canvas + * @param {ElementFactory} elementFactory + * @param {ElementRegistry} elementRegistry + */ +function BpmnImporter(eventBus, canvas, elementFactory, elementRegistry, translate) { + this._eventBus = eventBus; + this._canvas = canvas; + + this._elementFactory = elementFactory; + this._elementRegistry = elementRegistry; + this._translate = translate; +} + +BpmnImporter.$inject = [ 'eventBus', 'canvas', 'elementFactory', 'elementRegistry', 'translate' ]; + +module.exports = BpmnImporter; + + +/** + * Add bpmn element (semantic) to the canvas onto the + * specified parent shape. + */ +BpmnImporter.prototype.add = function(semantic, parentElement) { + + var di = semantic.di, + element, + translate = this._translate; + + // ROOT ELEMENT + // handle the special case that we deal with a + // invisible root element (process or collaboration) + if (is(di, 'bpmndi:BPMNPlane')) { + + // add a virtual element (not being drawn) + element = this._elementFactory.createRoot(elementData(semantic)); + + this._canvas.setRootElement(element); + } + + // SHAPE + else if (is(di, 'bpmndi:BPMNShape')) { + + var collapsed = !isExpanded(semantic); + var hidden = parentElement && (parentElement.hidden || parentElement.collapsed); + + var bounds = semantic.di.bounds; + + element = this._elementFactory.createShape(elementData(semantic, { + collapsed: collapsed, + hidden: hidden, + x: Math.round(bounds.x), + y: Math.round(bounds.y), + width: Math.round(bounds.width), + height: Math.round(bounds.height) + })); + + if (is(semantic, 'bpmn:BoundaryEvent')) { + this._attachBoundary(semantic, element); + } + + this._canvas.addShape(element, parentElement); + } + + // CONNECTION + else if (is(di, 'bpmndi:BPMNEdge')) { + + var source = this._getSource(semantic), + target = this._getTarget(semantic); + + element = this._elementFactory.createConnection(elementData(semantic, { + source: source, + target: target, + waypoints: collectWaypoints(semantic.di.waypoint) + })); + + this._canvas.addConnection(element, parentElement); + } else { + throw new Error(translate('unknown di {di} for element {semantic}', { + di: elementToString(di), + semantic: elementToString(semantic) + })); + } + // (optional) LABEL + if (hasExternalLabel(semantic)) { + this.addLabel(semantic, element); + } + + + this._eventBus.fire('bpmnElement.added', { element: element }); + + return element; +}; + + +/** + * Attach the boundary element to the given host + * + * @param {ModdleElement} boundarySemantic + * @param {djs.model.Base} boundaryElement + */ +BpmnImporter.prototype._attachBoundary = function(boundarySemantic, boundaryElement) { + var translate = this._translate; + var hostSemantic = boundarySemantic.attachedToRef; + + if (!hostSemantic) { + throw new Error(translate('missing {semantic}#attachedToRef', { + semantic: elementToString(boundarySemantic) + })); + } + + var host = this._elementRegistry.get(hostSemantic.id), + attachers = host && host.attachers; + + if (!host) { + throw notYetDrawn(translate, boundarySemantic, hostSemantic, 'attachedToRef'); + } + + // wire element.host <> host.attachers + boundaryElement.host = host; + + if (!attachers) { + host.attachers = attachers = []; + } + + if (attachers.indexOf(boundaryElement) === -1) { + attachers.push(boundaryElement); + } +}; + + +/** + * add label for an element + */ +BpmnImporter.prototype.addLabel = function(semantic, element) { + var bounds = getExternalLabelBounds(semantic, element); + + var label = this._elementFactory.createLabel(elementData(semantic, { + id: semantic.id + '_label', + labelTarget: element, + type: 'label', + hidden: element.hidden || !semantic.name, + x: Math.round(bounds.x), + y: Math.round(bounds.y), + width: Math.round(bounds.width), + height: Math.round(bounds.height) + })); + + return this._canvas.addShape(label, element.parent); +}; + +/** + * Return the drawn connection end based on the given side. + * + * @throws {Error} if the end is not yet drawn + */ +BpmnImporter.prototype._getEnd = function(semantic, side) { + + var element, + refSemantic, + type = semantic.$type, + translate = this._translate; + + refSemantic = semantic[side + 'Ref']; + + // handle mysterious isMany DataAssociation#sourceRef + if (side === 'source' && type === 'bpmn:DataInputAssociation') { + refSemantic = refSemantic && refSemantic[0]; + } + + // fix source / target for DataInputAssociation / DataOutputAssociation + if (side === 'source' && type === 'bpmn:DataOutputAssociation' || + side === 'target' && type === 'bpmn:DataInputAssociation') { + + refSemantic = semantic.$parent; + } + + element = refSemantic && this._getElement(refSemantic); + + if (element) { + return element; + } + + if (refSemantic) { + throw notYetDrawn(translate, semantic, refSemantic, side + 'Ref'); + } else { + throw new Error(translate('{semantic}#{side} Ref not specified', { + semantic: elementToString(semantic), + side: side + })); + } +}; + +BpmnImporter.prototype._getSource = function(semantic) { + return this._getEnd(semantic, 'source'); +}; + +BpmnImporter.prototype._getTarget = function(semantic) { + return this._getEnd(semantic, 'target'); +}; + + +BpmnImporter.prototype._getElement = function(semantic) { + return this._elementRegistry.get(semantic.id); +}; +},{"258":258,"377":377,"66":66,"68":68,"69":69,"70":70}],64:[function(_dereq_,module,exports){ +'use strict'; + +var filter = _dereq_(253), + find = _dereq_(254), + forEach = _dereq_(255); + +var Refs = _dereq_(407); + +var elementToString = _dereq_(66).elementToString; + +var diRefs = new Refs({ name: 'bpmnElement', enumerable: true }, { name: 'di' }); + +/** + * Returns true if an element has the given meta-model type + * + * @param {ModdleElement} element + * @param {String} type + * + * @return {Boolean} + */ +function is(element, type) { + return element.$instanceOf(type); +} + + +/** + * Find a suitable display candidate for definitions where the DI does not + * correctly specify one. + */ +function findDisplayCandidate(definitions) { + return find(definitions.rootElements, function(e) { + return is(e, 'bpmn:Process') || is(e, 'bpmn:Collaboration'); + }); +} + + +function BpmnTreeWalker(handler, translate) { + + // list of containers already walked + var handledElements = {}; + + // list of elements to handle deferred to ensure + // prerequisites are drawn + var deferred = []; + + ///// Helpers ///////////////////////////////// + + function contextual(fn, ctx) { + return function(e) { + fn(e, ctx); + }; + } + + function handled(element) { + handledElements[element.id] = element; + } + + function isHandled(element) { + return handledElements[element.id]; + } + + function visit(element, ctx) { + + var gfx = element.gfx; + + // avoid multiple rendering of elements + if (gfx) { + throw new Error( + translate('already rendered {element}', { element: elementToString(element) }) + ); + } + + // call handler + return handler.element(element, ctx); + } + + function visitRoot(element, diagram) { + return handler.root(element, diagram); + } + + function visitIfDi(element, ctx) { + + try { + var gfx = element.di && visit(element, ctx); + + handled(element); + + return gfx; + } catch (e) { + logError(e.message, { element: element, error: e }); + + console.error(translate('failed to import {element}', { element: elementToString(element) })); + console.error(e); + } + } + + function logError(message, context) { + handler.error(message, context); + } + + ////// DI handling //////////////////////////// + + function registerDi(di) { + var bpmnElement = di.bpmnElement; + + if (bpmnElement) { + if (bpmnElement.di) { + logError( + translate('multiple DI elements defined for {element}', { + element: elementToString(bpmnElement) + }), + { element: bpmnElement } + ); + } else { + diRefs.bind(bpmnElement, 'di'); + bpmnElement.di = di; + } + } else { + logError( + translate('no bpmnElement referenced in {element}', { + element: elementToString(di) + }), + { element: di } + ); + } + } + + function handleDiagram(diagram) { + handlePlane(diagram.plane); + } + + function handlePlane(plane) { + registerDi(plane); + + forEach(plane.planeElement, handlePlaneElement); + } + + function handlePlaneElement(planeElement) { + registerDi(planeElement); + } + + + ////// Semantic handling ////////////////////// + + /** + * Handle definitions and return the rendered diagram (if any) + * + * @param {ModdleElement} definitions to walk and import + * @param {ModdleElement} [diagram] specific diagram to import and display + * + * @throws {Error} if no diagram to display could be found + */ + function handleDefinitions(definitions, diagram) { + // make sure we walk the correct bpmnElement + + var diagrams = definitions.diagrams; + + if (diagram && diagrams.indexOf(diagram) === -1) { + throw new Error(translate('diagram not part of bpmn:Definitions')); + } + + if (!diagram && diagrams && diagrams.length) { + diagram = diagrams[0]; + } + + // no diagram -> nothing to import + if (!diagram) { + throw new Error(translate('no diagram to display')); + } + + // load DI from selected diagram only + handleDiagram(diagram); + + + var plane = diagram.plane; + + if (!plane) { + throw new Error(translate( + 'no plane for {element}', + { element: elementToString(diagram) } + )); + } + + var rootElement = plane.bpmnElement; + + // ensure we default to a suitable display candidate (process or collaboration), + // even if non is specified in DI + if (!rootElement) { + rootElement = findDisplayCandidate(definitions); + + if (!rootElement) { + throw new Error(translate('no process or collaboration to display')); + } else { + + logError( + translate('correcting missing bpmnElement on {plane} to {rootElement}', { + plane: elementToString(plane), + rootElement: elementToString(rootElement) + }) + ); + + // correct DI on the fly + plane.bpmnElement = rootElement; + registerDi(plane); + } + } + + + var ctx = visitRoot(rootElement, plane); + + if (is(rootElement, 'bpmn:Process')) { + handleProcess(rootElement, ctx); + } else if (is(rootElement, 'bpmn:Collaboration')) { + handleCollaboration(rootElement, ctx); + + // force drawing of everything not yet drawn that is part of the target DI + handleUnhandledProcesses(definitions.rootElements, ctx); + } else { + throw new Error( + translate('unsupported bpmnElement for {plane}: {rootElement}', { + plane: elementToString(plane), + rootElement: elementToString(rootElement) + }) + ); + } + + // handle all deferred elements + handleDeferred(deferred); + } + + function handleDeferred(deferred) { + forEach(deferred, function(d) { d(); }); + } + + function handleProcess(process, context) { + handleFlowElementsContainer(process, context); + handleIoSpecification(process.ioSpecification, context); + + handleArtifacts(process.artifacts, context); + + // log process handled + handled(process); + } + + function handleUnhandledProcesses(rootElements) { + + // walk through all processes that have not yet been drawn and draw them + // if they contain lanes with DI information. + // we do this to pass the free-floating lane test cases in the MIWG test suite + var processes = filter(rootElements, function(e) { + return !isHandled(e) && is(e, 'bpmn:Process') && e.laneSets; + }); + + processes.forEach(contextual(handleProcess)); + } + + function handleMessageFlow(messageFlow, context) { + visitIfDi(messageFlow, context); + } + + function handleMessageFlows(messageFlows, context) { + forEach(messageFlows, contextual(handleMessageFlow, context)); + } + + function handleDataAssociation(association, context) { + visitIfDi(association, context); + } + + function handleDataInput(dataInput, context) { + visitIfDi(dataInput, context); + } + + function handleDataOutput(dataOutput, context) { + visitIfDi(dataOutput, context); + } + + function handleArtifact(artifact, context) { + + // bpmn:TextAnnotation + // bpmn:Group + // bpmn:Association + + visitIfDi(artifact, context); + } + + function handleArtifacts(artifacts, context) { + + forEach(artifacts, function(e) { + if (is(e, 'bpmn:Association')) { + deferred.push(function() { + handleArtifact(e, context); + }); + } else { + handleArtifact(e, context); + } + }); + } + + function handleIoSpecification(ioSpecification, context) { + + if (!ioSpecification) { + return; + } + + forEach(ioSpecification.dataInputs, contextual(handleDataInput, context)); + forEach(ioSpecification.dataOutputs, contextual(handleDataOutput, context)); + } + + function handleSubProcess(subProcess, context) { + handleFlowElementsContainer(subProcess, context); + handleArtifacts(subProcess.artifacts, context); + } + + function handleFlowNode(flowNode, context) { + var childCtx = visitIfDi(flowNode, context); + + if (is(flowNode, 'bpmn:SubProcess')) { + handleSubProcess(flowNode, childCtx || context); + } + + if (is(flowNode, 'bpmn:Activity')) { + handleIoSpecification(flowNode.ioSpecification, context); + } + + // defer handling of associations + // affected types: + // + // * bpmn:Activity + // * bpmn:ThrowEvent + // * bpmn:CatchEvent + // + deferred.push(function() { + forEach(flowNode.dataInputAssociations, contextual(handleDataAssociation, context)); + forEach(flowNode.dataOutputAssociations, contextual(handleDataAssociation, context)); + }); + } + + function handleSequenceFlow(sequenceFlow, context) { + visitIfDi(sequenceFlow, context); + } + + function handleDataElement(dataObject, context) { + visitIfDi(dataObject, context); + } + + function handleBoundaryEvent(dataObject, context) { + visitIfDi(dataObject, context); + } + + function handleLane(lane, context) { + var newContext = visitIfDi(lane, context); + + if (lane.childLaneSet) { + handleLaneSet(lane.childLaneSet, newContext || context); + } + + wireFlowNodeRefs(lane); + } + + function handleLaneSet(laneSet, context) { + forEach(laneSet.lanes, contextual(handleLane, context)); + } + + function handleLaneSets(laneSets, context) { + forEach(laneSets, contextual(handleLaneSet, context)); + } + + function handleFlowElementsContainer(container, context) { + if (container.laneSets) { + handleLaneSets(container.laneSets, context); + } + + handleFlowElements(container.flowElements, context); + } + + function handleFlowElements(flowElements, context) { + forEach(flowElements, function(e) { + if (is(e, 'bpmn:SequenceFlow')) { + deferred.push(function() { + handleSequenceFlow(e, context); + }); + } else if (is(e, 'bpmn:BoundaryEvent')) { + deferred.unshift(function() { + handleBoundaryEvent(e, context); + }); + } else if (is(e, 'bpmn:FlowNode')) { + handleFlowNode(e, context); + } else if (is(e, 'bpmn:DataObject')) { + // SKIP (assume correct referencing via DataObjectReference) + } else if (is(e, 'bpmn:DataStoreReference')) { + handleDataElement(e, context); + } else if (is(e, 'bpmn:DataObjectReference')) { + handleDataElement(e, context); + } else { + logError( + translate('unrecognized flowElement {element} in context {context}', { + element: elementToString(e), + context: (context ? elementToString(context.businessObject) : 'null') + }), + { element: e, context: context } + ); + } + }); + } + + function handleParticipant(participant, context) { + var newCtx = visitIfDi(participant, context); + + var process = participant.processRef; + if (process) { + handleProcess(process, newCtx || context); + } + } + + function handleCollaboration(collaboration) { + + forEach(collaboration.participants, contextual(handleParticipant)); + + handleArtifacts(collaboration.artifacts); + + // handle message flows latest in the process + deferred.push(function() { + handleMessageFlows(collaboration.messageFlows); + }); + } + + + function wireFlowNodeRefs(lane) { + // wire the virtual flowNodeRefs <-> relationship + forEach(lane.flowNodeRef, function(flowNode) { + var lanes = flowNode.get('lanes'); + + if (lanes) { + lanes.push(lane); + } + }); + } + + ///// API //////////////////////////////// + + return { + handleDefinitions: handleDefinitions + }; +} + +module.exports = BpmnTreeWalker; +},{"253":253,"254":254,"255":255,"407":407,"66":66}],65:[function(_dereq_,module,exports){ +'use strict'; + +var BpmnTreeWalker = _dereq_(64); + + +/** + * Import the definitions into a diagram. + * + * Errors and warnings are reported through the specified callback. + * + * @param {Diagram} diagram + * @param {ModdleElement} definitions + * @param {Function} done the callback, invoked with (err, [ warning ]) once the import is done + */ +function importBpmnDiagram(diagram, definitions, done) { + + var importer = diagram.get('bpmnImporter'), + eventBus = diagram.get('eventBus'), + translate = diagram.get('translate'); + + var error, + warnings = []; + + /** + * Walk the diagram semantically, importing (=drawing) + * all elements you encounter. + * + * @param {ModdleElement} definitions + */ + function render(definitions) { + + var visitor = { + + root: function(element) { + return importer.add(element); + }, + + element: function(element, parentShape) { + return importer.add(element, parentShape); + }, + + error: function(message, context) { + warnings.push({ message: message, context: context }); + } + }; + + var walker = new BpmnTreeWalker(visitor, translate); + + // traverse BPMN 2.0 document model, + // starting at definitions + walker.handleDefinitions(definitions); + } + + eventBus.fire('import.render.start', { definitions: definitions }); + + try { + render(definitions); + } catch (e) { + error = e; + } + + eventBus.fire('import.render.complete', { + error: error, + warnings: warnings + }); + + done(error, warnings); +} + +module.exports.importBpmnDiagram = importBpmnDiagram; +},{"64":64}],66:[function(_dereq_,module,exports){ +'use strict'; + +module.exports.elementToString = function(e) { + if (!e) { + return ''; + } + + return '<' + e.$type + (e.id ? ' id="' + e.id : '') + '" />'; +}; +},{}],67:[function(_dereq_,module,exports){ +module.exports = { + __depends__: [ + _dereq_(204) + ], + bpmnImporter: [ 'type', _dereq_(63) ] +}; +},{"204":204,"63":63}],68:[function(_dereq_,module,exports){ +'use strict'; + +var is = _dereq_(70).is, + getBusinessObject = _dereq_(70).getBusinessObject; + +module.exports.isExpanded = function(element) { + + if (is(element, 'bpmn:CallActivity')) { + return false; + } + + if (is(element, 'bpmn:SubProcess')) { + return !!getBusinessObject(element).di.isExpanded; + } + + if (is(element, 'bpmn:Participant')) { + return !!getBusinessObject(element).processRef; + } + + return true; +}; + +module.exports.isInterrupting = function(element) { + return element && getBusinessObject(element).isInterrupting !== false; +}; + +module.exports.isEventSubProcess = function(element) { + return element && !!getBusinessObject(element).triggeredByEvent; +}; + +},{"70":70}],69:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(377); + +var is = _dereq_(70).is; + +var DEFAULT_LABEL_SIZE = module.exports.DEFAULT_LABEL_SIZE = { + width: 90, + height: 20 +}; + + +/** + * Returns true if the given semantic has an external label + * + * @param {BpmnElement} semantic + * @return {Boolean} true if has label + */ +module.exports.hasExternalLabel = function(semantic) { + return is(semantic, 'bpmn:Event') || + is(semantic, 'bpmn:Gateway') || + is(semantic, 'bpmn:DataStoreReference') || + is(semantic, 'bpmn:DataObjectReference') || + is(semantic, 'bpmn:SequenceFlow') || + is(semantic, 'bpmn:MessageFlow'); +}; + + +/** + * Get the middle of a number of waypoints + * + * @param {Array} waypoints + * @return {Point} the mid point + */ +function getWaypointsMid(waypoints) { + + var mid = waypoints.length / 2 - 1; + + var first = waypoints[Math.floor(mid)]; + var second = waypoints[Math.ceil(mid + 0.01)]; + + return { + x: first.x + (second.x - first.x) / 2, + y: first.y + (second.y - first.y) / 2 + }; +} + +module.exports.getWaypointsMid = getWaypointsMid; + + +function getExternalLabelMid(element) { + + if (element.waypoints) { + return getWaypointsMid(element.waypoints); + } else { + return { + x: element.x + element.width / 2, + y: element.y + element.height + DEFAULT_LABEL_SIZE.height / 2 + }; + } +} + +module.exports.getExternalLabelMid = getExternalLabelMid; + + +/** + * Returns the bounds of an elements label, parsed from the elements DI or + * generated from its bounds. + * + * @param {BpmnElement} semantic + * @param {djs.model.Base} element + */ +module.exports.getExternalLabelBounds = function(semantic, element) { + + var mid, + size, + bounds, + di = semantic.di, + label = di.label; + + if (label && label.bounds) { + bounds = label.bounds; + + size = { + width: Math.max(DEFAULT_LABEL_SIZE.width, bounds.width), + height: bounds.height + }; + + mid = { + x: bounds.x + bounds.width / 2, + y: bounds.y + bounds.height / 2 + }; + } else { + + mid = getExternalLabelMid(element); + + size = DEFAULT_LABEL_SIZE; + } + + return assign({ + x: mid.x - size.width / 2, + y: mid.y - size.height / 2 + }, size); +}; + +},{"377":377,"70":70}],70:[function(_dereq_,module,exports){ +'use strict'; + +/** + * Is an element of the given BPMN type? + * + * @param {djs.model.Base|ModdleElement} element + * @param {String} type + * + * @return {Boolean} + */ +function is(element, type) { + var bo = getBusinessObject(element); + + return bo && (typeof bo.$instanceOf === 'function') && bo.$instanceOf(type); +} + +module.exports.is = is; + + +/** + * Return the business object for a given element. + * + * @param {djs.model.Base|ModdleElement} element + * + * @return {ModdleElement} + */ +function getBusinessObject(element) { + return (element && element.businessObject) || element; +} + +module.exports.getBusinessObject = getBusinessObject; + +},{}],71:[function(_dereq_,module,exports){ +/** + * This file must not be changed or exchanged. + * + * @see http://bpmn.io/license for more information. + */ + +'use strict'; + +var domify = _dereq_(394); + +var domDelegate = _dereq_(393); + +/* jshint -W101 */ + +// inlined ../resources/bpmnjs.png +var logoData = module.exports.BPMNIO_LOGO = 'iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAMAAADypuvZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRFiMte9PrwldFwfcZPqtqN0+zEyOe1XLgjvuKncsJAZ70y6fXh3vDT////UrQV////G2zN+AAAABB0Uk5T////////////////////AOAjXRkAAAHDSURBVHjavJZJkoUgDEBJmAX8979tM8u3E6x20VlYJfFFMoL4vBDxATxZcakIOJTWSmxvKWVIkJ8jHvlRv1F2LFrVISCZI+tCtQx+XfewgVTfyY3plPiQEAzI3zWy+kR6NBhFBYeBuscJLOUuA2WVLpCjVIaFzrNQZArxAZKUQm6gsj37L9Cb7dnIBUKxENaaMJQqMpDXvSL+ktxdGRm2IsKgJGGPg7atwUG5CcFUEuSv+CwQqizTrvDTNXdMU2bMiDWZd8d7QIySWVRsb2vBBioxOFt4OinPBapL+neAb5KL5IJ8szOza2/DYoipUCx+CjO0Bpsv0V6mktNZ+k8rlABlWG0FrOpKYVo8DT3dBeLEjUBAj7moDogVii7nSS9QzZnFcOVBp1g2PyBQ3Vr5aIapN91VJy33HTJLC1iX2FY6F8gRdaAeIEfVONgtFCzZTmoLEdOjBDfsIOA6128gw3eu1shAajdZNAORxuQDJN5A5PbEG6gNIu24QJD5iNyRMZIr6bsHbCtCU/OaOaSvgkUyDMdDa1BXGf5HJ1To+/Ym6mCKT02Y+/Sa126ZKyd3jxhzpc1r8zVL6YM1Qy/kR4ABAFJ6iQUnivhAAAAAAElFTkSuQmCC'; + +/* jshint +W101 */ + + +function css(attrs) { + return attrs.join(';'); +} + +var LIGHTBOX_STYLES = css([ + 'z-index: 1001', + 'position: fixed', + 'top: 0', + 'left: 0', + 'right: 0', + 'bottom: 0' +]); + +var BACKDROP_STYLES = css([ + 'width: 100%', + 'height: 100%', + 'background: rgba(0,0,0,0.2)' +]); + +var NOTICE_STYLES = css([ + 'position: absolute', + 'left: 50%', + 'top: 40%', + 'margin: 0 -130px', + 'width: 260px', + 'padding: 10px', + 'background: white', + 'border: solid 1px #AAA', + 'border-radius: 3px', + 'font-family: Helvetica, Arial, sans-serif', + 'font-size: 14px', + 'line-height: 1.2em' +]); + +var LIGHTBOX_MARKUP = + '
' + + '
' + + '
' + + '' + + '' + + '' + + 'Web-based tooling for BPMN, DMN and CMMN diagrams ' + + 'powered by bpmn.io.' + + '
' + + '
'; + + +var lightbox; + +function open() { + + if (!lightbox) { + lightbox = domify(LIGHTBOX_MARKUP); + + domDelegate.bind(lightbox, '.backdrop', 'click', function(event) { + document.body.removeChild(lightbox); + }); + } + + document.body.appendChild(lightbox); +} + +module.exports.open = open; +},{"393":393,"394":394}],72:[function(_dereq_,module,exports){ +module.exports = _dereq_(74); +},{"74":74}],73:[function(_dereq_,module,exports){ +'use strict'; + +var isString = _dereq_(374), + isFunction = _dereq_(369), + assign = _dereq_(377); + +var Moddle = _dereq_(80), + XmlReader = _dereq_(76), + XmlWriter = _dereq_(77); + +/** + * A sub class of {@link Moddle} with support for import and export of BPMN 2.0 xml files. + * + * @class BpmnModdle + * @extends Moddle + * + * @param {Object|Array} packages to use for instantiating the model + * @param {Object} [options] additional options to pass over + */ +function BpmnModdle(packages, options) { + Moddle.call(this, packages, options); +} + +BpmnModdle.prototype = Object.create(Moddle.prototype); + +module.exports = BpmnModdle; + + +/** + * Instantiates a BPMN model tree from a given xml string. + * + * @param {String} xmlStr + * @param {String} [typeName='bpmn:Definitions'] name of the root element + * @param {Object} [options] options to pass to the underlying reader + * @param {Function} done callback that is invoked with (err, result, parseContext) + * once the import completes + */ +BpmnModdle.prototype.fromXML = function(xmlStr, typeName, options, done) { + + if (!isString(typeName)) { + done = options; + options = typeName; + typeName = 'bpmn:Definitions'; + } + + if (isFunction(options)) { + done = options; + options = {}; + } + + var reader = new XmlReader(assign({ model: this, lax: true }, options)); + var rootHandler = reader.handler(typeName); + + reader.fromXML(xmlStr, rootHandler, done); +}; + + +/** + * Serializes a BPMN 2.0 object tree to XML. + * + * @param {String} element the root element, typically an instance of `bpmn:Definitions` + * @param {Object} [options] to pass to the underlying writer + * @param {Function} done callback invoked with (err, xmlStr) once the import completes + */ +BpmnModdle.prototype.toXML = function(element, options, done) { + + if (isFunction(options)) { + done = options; + options = {}; + } + + var writer = new XmlWriter(options); + try { + var result = writer.toXML(element); + done(null, result); + } catch (e) { + done(e); + } +}; + +},{"369":369,"374":374,"377":377,"76":76,"77":77,"80":80}],74:[function(_dereq_,module,exports){ +'use strict'; + +var assign = _dereq_(377); + +var BpmnModdle = _dereq_(73); + +var packages = { + bpmn: _dereq_(89), + bpmndi: _dereq_(90), + dc: _dereq_(91), + di: _dereq_(92) +}; + +module.exports = function(additionalPackages, options) { + return new BpmnModdle(assign({}, packages, additionalPackages), options); +}; +},{"377":377,"73":73,"89":89,"90":90,"91":91,"92":92}],75:[function(_dereq_,module,exports){ +'use strict'; + +function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); +} + +function lower(string) { + return string.charAt(0).toLowerCase() + string.slice(1); +} + +function hasLowerCaseAlias(pkg) { + return pkg.xml && pkg.xml.tagAlias === 'lowerCase'; +} + + +module.exports.aliasToName = function(alias, pkg) { + if (hasLowerCaseAlias(pkg)) { + return capitalize(alias); + } else { + return alias; + } +}; + +module.exports.nameToAlias = function(name, pkg) { + if (hasLowerCaseAlias(pkg)) { + return lower(name); + } else { + return name; + } +}; + +module.exports.DEFAULT_NS_MAP = { + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance' +}; + +var XSI_TYPE = module.exports.XSI_TYPE = 'xsi:type'; + +function serializeFormat(element) { + return element.xml && element.xml.serialize; +} + +module.exports.serializeAsType = function(element) { + return serializeFormat(element) === XSI_TYPE; +}; + +module.exports.serializeAsProperty = function(element) { + return serializeFormat(element) === 'property'; +}; +},{}],76:[function(_dereq_,module,exports){ +'use strict'; + +var reduce = _dereq_(259), + forEach = _dereq_(255), + find = _dereq_(254), + assign = _dereq_(377), + defer = _dereq_(266); + +var Stack = _dereq_(79), + SaxParser = _dereq_(78).parser, + Moddle = _dereq_(80), + parseNameNs = _dereq_(85).parseName, + Types = _dereq_(88), + coerceType = Types.coerceType, + isSimpleType = Types.isSimple, + common = _dereq_(75), + XSI_TYPE = common.XSI_TYPE, + XSI_URI = common.DEFAULT_NS_MAP.xsi, + serializeAsType = common.serializeAsType, + aliasToName = common.aliasToName; + +function parseNodeAttributes(node) { + var nodeAttrs = node.attributes; + + return reduce(nodeAttrs, function(result, v, k) { + var name, ns; + + if (!v.local) { + name = v.prefix; + } else { + ns = parseNameNs(v.name, v.prefix); + name = ns.name; + } + + result[name] = v.value; + return result; + }, {}); +} + +function normalizeType(node, attr, model) { + var nameNs = parseNameNs(attr.value); + + var uri = node.ns[nameNs.prefix || ''], + localName = nameNs.localName, + pkg = uri && model.getPackage(uri), + typePrefix; + + if (pkg) { + typePrefix = pkg.xml && pkg.xml.typePrefix; + + if (typePrefix && localName.indexOf(typePrefix) === 0) { + localName = localName.slice(typePrefix.length); + } + + attr.value = pkg.prefix + ':' + localName; + } +} + +/** + * Normalizes namespaces for a node given an optional default namespace and a + * number of mappings from uris to default prefixes. + * + * @param {XmlNode} node + * @param {Model} model the model containing all registered namespaces + * @param {Uri} defaultNsUri + */ +function normalizeNamespaces(node, model, defaultNsUri) { + var uri, prefix; + + uri = node.uri || defaultNsUri; + + if (uri) { + var pkg = model.getPackage(uri); + + if (pkg) { + prefix = pkg.prefix; + } else { + prefix = node.prefix; + } + + node.prefix = prefix; + node.uri = uri; + } + + forEach(node.attributes, function(attr) { + + // normalize xsi:type attributes because the + // assigned type may or may not be namespace prefixed + if (attr.uri === XSI_URI && attr.local === 'type') { + normalizeType(node, attr, model); + } + + normalizeNamespaces(attr, model, null); + }); +} + + +function error(message) { + return new Error(message); +} + +/** + * Get the moddle descriptor for a given instance or type. + * + * @param {ModdleElement|Function} element + * + * @return {Object} the moddle descriptor + */ +function getModdleDescriptor(element) { + return element.$descriptor; +} + +/** + * A parse context. + * + * @class + * + * @param {Object} options + * @param {ElementHandler} options.rootHandler the root handler for parsing a document + * @param {boolean} [options.lax=false] whether or not to ignore invalid elements + */ +function Context(options) { + + /** + * @property {ElementHandler} rootHandler + */ + + /** + * @property {Boolean} lax + */ + + assign(this, options); + + this.elementsById = {}; + this.references = []; + this.warnings = []; + + /** + * Add an unresolved reference. + * + * @param {Object} reference + */ + this.addReference = function(reference) { + this.references.push(reference); + }; + + /** + * Add a processed element. + * + * @param {ModdleElement} element + */ + this.addElement = function(element) { + + if (!element) { + throw error('expected element'); + } + + var descriptor = getModdleDescriptor(element); + + var idProperty = descriptor.idProperty, + id; + + if (idProperty) { + id = element.get(idProperty.name); + + if (id) { + this.elementsById[id] = element; + } + } + }; + + /** + * Add an import warning. + * + * @param {Object} warning + * @param {String} warning.message + * @param {Error} [warning.error] + */ + this.addWarning = function(warning) { + this.warnings.push(warning); + }; +} + +function BaseHandler() {} + +BaseHandler.prototype.handleEnd = function() {}; +BaseHandler.prototype.handleText = function() {}; +BaseHandler.prototype.handleNode = function() {}; + + +/** + * A simple pass through handler that does nothing except for + * ignoring all input it receives. + * + * This is used to ignore unknown elements and + * attributes. + */ +function NoopHandler() { } + +NoopHandler.prototype = new BaseHandler(); + +NoopHandler.prototype.handleNode = function() { + return this; +}; + +function BodyHandler() {} + +BodyHandler.prototype = new BaseHandler(); + +BodyHandler.prototype.handleText = function(text) { + this.body = (this.body || '') + text; +}; + +function ReferenceHandler(property, context) { + this.property = property; + this.context = context; +} + +ReferenceHandler.prototype = new BodyHandler(); + +ReferenceHandler.prototype.handleNode = function(node) { + + if (this.element) { + throw error('expected no sub nodes'); + } else { + this.element = this.createReference(node); + } + + return this; +}; + +ReferenceHandler.prototype.handleEnd = function() { + this.element.id = this.body; +}; + +ReferenceHandler.prototype.createReference = function(node) { + return { + property: this.property.ns.name, + id: '' + }; +}; + +function ValueHandler(propertyDesc, element) { + this.element = element; + this.propertyDesc = propertyDesc; +} + +ValueHandler.prototype = new BodyHandler(); + +ValueHandler.prototype.handleEnd = function() { + + var value = this.body, + element = this.element, + propertyDesc = this.propertyDesc; + + value = coerceType(propertyDesc.type, value); + + if (propertyDesc.isMany) { + element.get(propertyDesc.name).push(value); + } else { + element.set(propertyDesc.name, value); + } +}; + + +function BaseElementHandler() {} + +BaseElementHandler.prototype = Object.create(BodyHandler.prototype); + +BaseElementHandler.prototype.handleNode = function(node) { + var parser = this, + element = this.element; + + if (!element) { + element = this.element = this.createElement(node); + + this.context.addElement(element); + } else { + parser = this.handleChild(node); + } + + return parser; +}; + +/** + * @class XMLReader.ElementHandler + * + */ +function ElementHandler(model, type, context) { + this.model = model; + this.type = model.getType(type); + this.context = context; +} + +ElementHandler.prototype = new BaseElementHandler(); + +ElementHandler.prototype.addReference = function(reference) { + this.context.addReference(reference); +}; + +ElementHandler.prototype.handleEnd = function() { + + var value = this.body, + element = this.element, + descriptor = getModdleDescriptor(element), + bodyProperty = descriptor.bodyProperty; + + if (bodyProperty && value !== undefined) { + value = coerceType(bodyProperty.type, value); + element.set(bodyProperty.name, value); + } +}; + +/** + * Create an instance of the model from the given node. + * + * @param {Element} node the xml node + */ +ElementHandler.prototype.createElement = function(node) { + var attributes = parseNodeAttributes(node), + Type = this.type, + descriptor = getModdleDescriptor(Type), + context = this.context, + instance = new Type({}); + + forEach(attributes, function(value, name) { + + var prop = descriptor.propertiesByName[name], + values; + + if (prop && prop.isReference) { + + if (!prop.isMany) { + context.addReference({ + element: instance, + property: prop.ns.name, + id: value + }); + } else { + // IDREFS: parse references as whitespace-separated list + values = value.split(' '); + + forEach(values, function(v) { + context.addReference({ + element: instance, + property: prop.ns.name, + id: v + }); + }); + } + + } else { + if (prop) { + value = coerceType(prop.type, value); + } + + instance.set(name, value); + } + }); + + return instance; +}; + +ElementHandler.prototype.getPropertyForNode = function(node) { + + var nameNs = parseNameNs(node.local, node.prefix); + + var type = this.type, + model = this.model, + descriptor = getModdleDescriptor(type); + + var propertyName = nameNs.name, + property = descriptor.propertiesByName[propertyName], + elementTypeName, + elementType, + typeAnnotation; + + // search for properties by name first + + if (property) { + + if (serializeAsType(property)) { + typeAnnotation = node.attributes[XSI_TYPE]; + + // xsi type is optional, if it does not exists the + // default type is assumed + if (typeAnnotation) { + + elementTypeName = typeAnnotation.value; + + // TODO: extract real name from attribute + elementType = model.getType(elementTypeName); + + return assign({}, property, { effectiveType: getModdleDescriptor(elementType).name }); + } + } + + // search for properties by name first + return property; + } + + + var pkg = model.getPackage(nameNs.prefix); + + if (pkg) { + elementTypeName = nameNs.prefix + ':' + aliasToName(nameNs.localName, descriptor.$pkg); + elementType = model.getType(elementTypeName); + + // search for collection members later + property = find(descriptor.properties, function(p) { + return !p.isVirtual && !p.isReference && !p.isAttribute && elementType.hasType(p.type); + }); + + if (property) { + return assign({}, property, { effectiveType: getModdleDescriptor(elementType).name }); + } + } else { + // parse unknown element (maybe extension) + property = find(descriptor.properties, function(p) { + return !p.isReference && !p.isAttribute && p.type === 'Element'; + }); + + if (property) { + return property; + } + } + + throw error('unrecognized element <' + nameNs.name + '>'); +}; + +ElementHandler.prototype.toString = function() { + return 'ElementDescriptor[' + getModdleDescriptor(this.type).name + ']'; +}; + +ElementHandler.prototype.valueHandler = function(propertyDesc, element) { + return new ValueHandler(propertyDesc, element); +}; + +ElementHandler.prototype.referenceHandler = function(propertyDesc) { + return new ReferenceHandler(propertyDesc, this.context); +}; + +ElementHandler.prototype.handler = function(type) { + if (type === 'Element') { + return new GenericElementHandler(this.model, type, this.context); + } else { + return new ElementHandler(this.model, type, this.context); + } +}; + +/** + * Handle the child element parsing + * + * @param {Element} node the xml node + */ +ElementHandler.prototype.handleChild = function(node) { + var propertyDesc, type, element, childHandler; + + propertyDesc = this.getPropertyForNode(node); + element = this.element; + + type = propertyDesc.effectiveType || propertyDesc.type; + + if (isSimpleType(type)) { + return this.valueHandler(propertyDesc, element); + } + + if (propertyDesc.isReference) { + childHandler = this.referenceHandler(propertyDesc).handleNode(node); + } else { + childHandler = this.handler(type).handleNode(node); + } + + var newElement = childHandler.element; + + // child handles may decide to skip elements + // by not returning anything + if (newElement !== undefined) { + + if (propertyDesc.isMany) { + element.get(propertyDesc.name).push(newElement); + } else { + element.set(propertyDesc.name, newElement); + } + + if (propertyDesc.isReference) { + assign(newElement, { + element: element + }); + + this.context.addReference(newElement); + } else { + // establish child -> parent relationship + newElement.$parent = element; + } + } + + return childHandler; +}; + + +function GenericElementHandler(model, type, context) { + this.model = model; + this.context = context; +} + +GenericElementHandler.prototype = Object.create(BaseElementHandler.prototype); + +GenericElementHandler.prototype.createElement = function(node) { + + var name = node.name, + prefix = node.prefix, + uri = node.ns[prefix], + attributes = node.attributes; + + return this.model.createAny(name, uri, attributes); +}; + +GenericElementHandler.prototype.handleChild = function(node) { + + var handler = new GenericElementHandler(this.model, 'Element', this.context).handleNode(node), + element = this.element; + + var newElement = handler.element, + children; + + if (newElement !== undefined) { + children = element.$children = element.$children || []; + children.push(newElement); + + // establish child -> parent relationship + newElement.$parent = element; + } + + return handler; +}; + +GenericElementHandler.prototype.handleText = function(text) { + this.body = this.body || '' + text; +}; + +GenericElementHandler.prototype.handleEnd = function() { + if (this.body) { + this.element.$body = this.body; + } +}; + +/** + * A reader for a meta-model + * + * @param {Object} options + * @param {Model} options.model used to read xml files + * @param {Boolean} options.lax whether to make parse errors warnings + */ +function XMLReader(options) { + + if (options instanceof Moddle) { + options = { + model: options + }; + } + + assign(this, { lax: false }, options); +} + + +/** + * Parse the given XML into a moddle document tree. + * + * @param {String} xml + * @param {ElementHandler|Object} options or rootHandler + * @param {Function} done + */ +XMLReader.prototype.fromXML = function(xml, options, done) { + + var rootHandler = options.rootHandler; + + if (options instanceof ElementHandler) { + // root handler passed via (xml, { rootHandler: ElementHandler }, ...) + rootHandler = options; + options = {}; + } else { + if (typeof options === 'string') { + // rootHandler passed via (xml, 'someString', ...) + rootHandler = this.handler(options); + options = {}; + } else if (typeof rootHandler === 'string') { + // rootHandler passed via (xml, { rootHandler: 'someString' }, ...) + rootHandler = this.handler(rootHandler); + } + } + + var model = this.model, + lax = this.lax; + + var context = new Context(assign({}, options, { rootHandler: rootHandler })), + parser = new SaxParser(true, { xmlns: true, trim: true }), + stack = new Stack(); + + rootHandler.context = context; + + // push root handler + stack.push(rootHandler); + + + function resolveReferences() { + + var elementsById = context.elementsById; + var references = context.references; + + var i, r; + + for (i = 0; !!(r = references[i]); i++) { + var element = r.element; + var reference = elementsById[r.id]; + var property = getModdleDescriptor(element).propertiesByName[r.property]; + + if (!reference) { + context.addWarning({ + message: 'unresolved reference <' + r.id + '>', + element: r.element, + property: r.property, + value: r.id + }); + } + + if (property.isMany) { + var collection = element.get(property.name), + idx = collection.indexOf(r); + + // we replace an existing place holder (idx != -1) or + // append to the collection instead + if (idx === -1) { + idx = collection.length; + } + + if (!reference) { + // remove unresolvable reference + collection.splice(idx, 1); + } else { + // add or update reference in collection + collection[idx] = reference; + } + } else { + element.set(property.name, reference); + } + } + } + + function handleClose(tagName) { + stack.pop().handleEnd(); + } + + function handleOpen(node) { + var handler = stack.peek(); + + normalizeNamespaces(node, model); + + try { + stack.push(handler.handleNode(node)); + } catch (e) { + + var line = this.line, + column = this.column; + + var message = + 'unparsable content <' + node.name + '> detected\n\t' + + 'line: ' + line + '\n\t' + + 'column: ' + column + '\n\t' + + 'nested error: ' + e.message; + + if (lax) { + context.addWarning({ + message: message, + error: e + }); + + console.warn('could not parse node'); + console.warn(e); + + stack.push(new NoopHandler()); + } else { + console.error('could not parse document'); + console.error(e); + + throw error(message); + } + } + } + + function handleText(text) { + stack.peek().handleText(text); + } + + parser.onopentag = handleOpen; + parser.oncdata = parser.ontext = handleText; + parser.onclosetag = handleClose; + parser.onend = resolveReferences; + + // deferred parse XML to make loading really ascnchronous + // this ensures the execution environment (node or browser) + // is kept responsive and that certain optimization strategies + // can kick in + defer(function() { + var error; + + try { + parser.write(xml).close(); + } catch (e) { + error = e; + } + + done(error, error ? undefined : rootHandler.element, context); + }); +}; + +XMLReader.prototype.handler = function(name) { + return new ElementHandler(this.model, name); +}; + +module.exports = XMLReader; +module.exports.ElementHandler = ElementHandler; +},{"254":254,"255":255,"259":259,"266":266,"377":377,"75":75,"78":78,"79":79,"80":80,"85":85,"88":88}],77:[function(_dereq_,module,exports){ +'use strict'; + +var map = _dereq_(258), + forEach = _dereq_(255), + isString = _dereq_(374), + filter = _dereq_(253), + assign = _dereq_(377); + +var Types = _dereq_(88), + parseNameNs = _dereq_(85).parseName, + common = _dereq_(75), + nameToAlias = common.nameToAlias, + serializeAsType = common.serializeAsType, + serializeAsProperty = common.serializeAsProperty; + +var XML_PREAMBLE = '\n', + ESCAPE_CHARS = /(<|>|'|"|&|\n\r|\n)/g, + DEFAULT_NS_MAP = common.DEFAULT_NS_MAP, + XSI_TYPE = common.XSI_TYPE; + + +function nsName(ns) { + if (isString(ns)) { + return ns; + } else { + return (ns.prefix ? ns.prefix + ':' : '') + ns.localName; + } +} + +function getNsAttrs(namespaces) { + + function isUsed(ns) { + return namespaces.used[ns.uri]; + } + + function toAttr(ns) { + var name = 'xmlns' + (ns.prefix ? ':' + ns.prefix : ''); + return { name: name, value: ns.uri }; + } + + var allNs = [].concat(namespaces.wellknown, namespaces.custom); + + return map(filter(allNs, isUsed), toAttr); +} + +function getElementNs(ns, descriptor) { + if (descriptor.isGeneric) { + return descriptor.name; + } else { + return assign({ localName: nameToAlias(descriptor.ns.localName, descriptor.$pkg) }, ns); + } +} + +function getPropertyNs(ns, descriptor) { + return assign({ localName: descriptor.ns.localName }, ns); +} + +function getSerializableProperties(element) { + var descriptor = element.$descriptor; + + return filter(descriptor.properties, function(p) { + var name = p.name; + + if (p.isVirtual) { + return false; + } + + // do not serialize defaults + if (!element.hasOwnProperty(name)) { + return false; + } + + var value = element[name]; + + // do not serialize default equals + if (value === p.default) { + return false; + } + + return p.isMany ? value.length : true; + }); +} + +var ESCAPE_MAP = { + '\n': '10', + '\n\r': '10', + '"': '34', + '\'': '39', + '<': '60', + '>': '62', + '&': '38' +}; + +/** + * Escape a string attribute to not contain any bad values (line breaks, '"', ...) + * + * @param {String} str the string to escape + * @return {String} the escaped string + */ +function escapeAttr(str) { + + // ensure we are handling strings here + str = isString(str) ? str : '' + str; + + return str.replace(ESCAPE_CHARS, function(str) { + return '&#' + ESCAPE_MAP[str] + ';'; + }); +} + +function filterAttributes(props) { + return filter(props, function(p) { return p.isAttr; }); +} + +function filterContained(props) { + return filter(props, function(p) { return !p.isAttr; }); +} + + +function ReferenceSerializer(parent, ns) { + this.ns = ns; +} + +ReferenceSerializer.prototype.build = function(element) { + this.element = element; + return this; +}; + +ReferenceSerializer.prototype.serializeTo = function(writer) { + writer + .appendIndent() + .append('<' + nsName(this.ns) + '>' + this.element.id + '') + .appendNewLine(); +}; + +function BodySerializer() {} + +BodySerializer.prototype.serializeValue = BodySerializer.prototype.serializeTo = function(writer) { + var escape = this.escape; + + if (escape) { + writer.append(''); + } +}; + +BodySerializer.prototype.build = function(prop, value) { + this.value = value; + + if (prop.type === 'String' && value.search(ESCAPE_CHARS) !== -1) { + this.escape = true; + } + + return this; +}; + +function ValueSerializer(ns) { + this.ns = ns; +} + +ValueSerializer.prototype = new BodySerializer(); + +ValueSerializer.prototype.serializeTo = function(writer) { + + writer + .appendIndent() + .append('<' + nsName(this.ns) + '>'); + + this.serializeValue(writer); + + writer + .append( '') + .appendNewLine(); +}; + +function ElementSerializer(parent, ns) { + this.body = []; + this.attrs = []; + + this.parent = parent; + this.ns = ns; +} + +ElementSerializer.prototype.build = function(element) { + this.element = element; + + var otherAttrs = this.parseNsAttributes(element); + + if (!this.ns) { + this.ns = this.nsTagName(element.$descriptor); + } + + if (element.$descriptor.isGeneric) { + this.parseGeneric(element); + } else { + var properties = getSerializableProperties(element); + + this.parseAttributes(filterAttributes(properties)); + this.parseContainments(filterContained(properties)); + + this.parseGenericAttributes(element, otherAttrs); + } + + return this; +}; + +ElementSerializer.prototype.nsTagName = function(descriptor) { + var effectiveNs = this.logNamespaceUsed(descriptor.ns); + return getElementNs(effectiveNs, descriptor); +}; + +ElementSerializer.prototype.nsPropertyTagName = function(descriptor) { + var effectiveNs = this.logNamespaceUsed(descriptor.ns); + return getPropertyNs(effectiveNs, descriptor); +}; + +ElementSerializer.prototype.isLocalNs = function(ns) { + return ns.uri === this.ns.uri; +}; + +/** + * Get the actual ns attribute name for the given element. + * + * @param {Object} element + * @param {Boolean} [inherited=false] + * + * @return {Object} nsName + */ +ElementSerializer.prototype.nsAttributeName = function(element) { + + var ns; + + if (isString(element)) { + ns = parseNameNs(element); + } else { + ns = element.ns; + } + + // return just local name for inherited attributes + if (element.inherited) { + return { localName: ns.localName }; + } + + // parse + log effective ns + var effectiveNs = this.logNamespaceUsed(ns); + + // strip prefix if same namespace like parent + if (this.isLocalNs(effectiveNs)) { + return { localName: ns.localName }; + } else { + return assign({ localName: ns.localName }, effectiveNs); + } +}; + +ElementSerializer.prototype.parseGeneric = function(element) { + + var self = this, + body = this.body, + attrs = this.attrs; + + forEach(element, function(val, key) { + + if (key === '$body') { + body.push(new BodySerializer().build({ type: 'String' }, val)); + } else + if (key === '$children') { + forEach(val, function(child) { + body.push(new ElementSerializer(self).build(child)); + }); + } else + if (key.indexOf('$') !== 0) { + attrs.push({ name: key, value: escapeAttr(val) }); + } + }); +}; + +/** + * Parse namespaces and return a list of left over generic attributes + * + * @param {Object} element + * @return {Array} + */ +ElementSerializer.prototype.parseNsAttributes = function(element) { + var self = this; + + var genericAttrs = element.$attrs; + + var model = element.$model; + + var attributes = []; + + // parse namespace attributes first + // and log them. push non namespace attributes to a list + // and process them later + forEach(genericAttrs, function(value, name) { + var nameNs = parseNameNs(name); + + var ns; + + // parse xmlns:foo="http://foo.bar" + if (nameNs.prefix === 'xmlns') { + ns = { prefix: nameNs.localName, uri: value }; + } + + // parse xmlns="http://foo.bar" + if (!nameNs.prefix && nameNs.localName === 'xmlns') { + ns = { uri: value }; + } + + if (ns) { + if (model.getPackage(value)) { + // register well known namespace + self.logNamespace(ns, true); + } else { + // log custom namespace directly as used + self.logNamespaceUsed(ns); + } + } else { + attributes.push({ name: name, value: value }); + } + }); + + return attributes; +}; + +ElementSerializer.prototype.parseGenericAttributes = function(element, attributes) { + + var self = this; + + forEach(attributes, function(attr) { + + // do not serialize xsi:type attribute + // it is set manually based on the actual implementation type + if (attr.name === XSI_TYPE) { + return; + } + + try { + self.addAttribute(self.nsAttributeName(attr.name), attr.value); + } catch (e) { + console.warn( + 'missing namespace information for ', + attr.name, '=', attr.value, 'on', element, + e); + } + }); +}; + +ElementSerializer.prototype.parseContainments = function(properties) { + + var self = this, + body = this.body, + element = this.element; + + forEach(properties, function(p) { + var value = element.get(p.name), + isReference = p.isReference, + isMany = p.isMany; + + var ns = self.nsPropertyTagName(p); + + if (!isMany) { + value = [ value ]; + } + + if (p.isBody) { + body.push(new BodySerializer().build(p, value[0])); + } else + if (Types.isSimple(p.type)) { + forEach(value, function(v) { + body.push(new ValueSerializer(ns).build(p, v)); + }); + } else + if (isReference) { + forEach(value, function(v) { + body.push(new ReferenceSerializer(self, ns).build(v)); + }); + } else { + // allow serialization via type + // rather than element name + var asType = serializeAsType(p), + asProperty = serializeAsProperty(p); + + forEach(value, function(v) { + var serializer; + + if (asType) { + serializer = new TypeSerializer(self, ns); + } else + if (asProperty) { + serializer = new ElementSerializer(self, ns); + } else { + serializer = new ElementSerializer(self); + } + + body.push(serializer.build(v)); + }); + } + }); +}; + +ElementSerializer.prototype.getNamespaces = function() { + + var namespaces = this.namespaces, + parent = this.parent; + + if (!namespaces) { + namespaces = this.namespaces = parent ? parent.getNamespaces() : { + prefixMap: {}, + uriMap: {}, + used: {}, + wellknown: [], + custom: [] + }; + } + + return namespaces; +}; + +ElementSerializer.prototype.logNamespace = function(ns, wellknown) { + var namespaces = this.getNamespaces(); + + var nsUri = ns.uri; + + var existing = namespaces.uriMap[nsUri]; + + if (!existing) { + namespaces.uriMap[nsUri] = ns; + + if (wellknown) { + namespaces.wellknown.push(ns); + } else { + namespaces.custom.push(ns); + } + } + + namespaces.prefixMap[ns.prefix] = nsUri; + + return ns; +}; + +ElementSerializer.prototype.logNamespaceUsed = function(ns) { + var element = this.element, + model = element.$model, + namespaces = this.getNamespaces(); + + // ns may be + // + // * prefix only + // * prefix:uri + + var prefix = ns.prefix; + + var wellknownUri = DEFAULT_NS_MAP[prefix] || model && (model.getPackage(prefix) || {}).uri; + + var uri = ns.uri || namespaces.prefixMap[prefix] || wellknownUri; + + if (!uri) { + throw new Error('no namespace uri given for prefix <' + ns.prefix + '>'); + } + + ns = namespaces.uriMap[uri]; + + if (!ns) { + ns = this.logNamespace({ prefix: prefix, uri: uri }, wellknownUri); + } + + if (!namespaces.used[ns.uri]) { + namespaces.used[ns.uri] = ns; + } + + return ns; +}; + +ElementSerializer.prototype.parseAttributes = function(properties) { + var self = this, + element = this.element; + + forEach(properties, function(p) { + + var value = element.get(p.name); + + if (p.isReference) { + + if (!p.isMany) { + value = value.id; + } + else { + var values = []; + forEach(value, function(v) { + values.push(v.id); + }); + // IDREFS is a whitespace-separated list of references. + value = values.join(' '); + } + + } + + self.addAttribute(self.nsAttributeName(p), value); + }); +}; + +ElementSerializer.prototype.addAttribute = function(name, value) { + var attrs = this.attrs; + + if (isString(value)) { + value = escapeAttr(value); + } + + attrs.push({ name: name, value: value }); +}; + +ElementSerializer.prototype.serializeAttributes = function(writer) { + var attrs = this.attrs, + root = !this.parent; + + if (root) { + attrs = getNsAttrs(this.namespaces).concat(attrs); + } + + forEach(attrs, function(a) { + writer + .append(' ') + .append(nsName(a.name)).append('="').append(a.value).append('"'); + }); +}; + +ElementSerializer.prototype.serializeTo = function(writer) { + var hasBody = this.body.length, + indent = !(this.body.length === 1 && this.body[0] instanceof BodySerializer); + + writer + .appendIndent() + .append('<' + nsName(this.ns)); + + this.serializeAttributes(writer); + + writer.append(hasBody ? '>' : ' />'); + + if (hasBody) { + + if (indent) { + writer + .appendNewLine() + .indent(); + } + + forEach(this.body, function(b) { + b.serializeTo(writer); + }); + + if (indent) { + writer + .unindent() + .appendIndent(); + } + + writer.append(''); + } + + writer.appendNewLine(); +}; + +/** + * A serializer for types that handles serialization of data types + */ +function TypeSerializer(parent, ns) { + ElementSerializer.call(this, parent, ns); +} + +TypeSerializer.prototype = new ElementSerializer(); + +TypeSerializer.prototype.build = function(element) { + var descriptor = element.$descriptor; + + this.element = element; + + this.typeNs = this.nsTagName(descriptor); + + // add xsi:type attribute to represent the elements + // actual type + + var typeNs = this.typeNs, + pkg = element.$model.getPackage(typeNs.uri), + typePrefix = (pkg.xml && pkg.xml.typePrefix) || ''; + + this.addAttribute(this.nsAttributeName(XSI_TYPE), + (typeNs.prefix ? typeNs.prefix + ':' : '') + + typePrefix + descriptor.ns.localName); + + // do the usual stuff + return ElementSerializer.prototype.build.call(this, element); +}; + +TypeSerializer.prototype.isLocalNs = function(ns) { + return ns.uri === this.typeNs.uri; +}; + +function SavingWriter() { + this.value = ''; + + this.write = function(str) { + this.value += str; + }; +} + +function FormatingWriter(out, format) { + + var indent = ['']; + + this.append = function(str) { + out.write(str); + + return this; + }; + + this.appendNewLine = function() { + if (format) { + out.write('\n'); + } + + return this; + }; + + this.appendIndent = function() { + if (format) { + out.write(indent.join(' ')); + } + + return this; + }; + + this.indent = function() { + indent.push(''); + return this; + }; + + this.unindent = function() { + indent.pop(); + return this; + }; +} + +/** + * A writer for meta-model backed document trees + * + * @param {Object} options output options to pass into the writer + */ +function XMLWriter(options) { + + options = assign({ format: false, preamble: true }, options || {}); + + function toXML(tree, writer) { + var internalWriter = writer || new SavingWriter(); + var formatingWriter = new FormatingWriter(internalWriter, options.format); + + if (options.preamble) { + formatingWriter.append(XML_PREAMBLE); + } + + new ElementSerializer().build(tree).serializeTo(formatingWriter); + + if (!writer) { + return internalWriter.value; + } + } + + return { + toXML: toXML + }; +} + +module.exports = XMLWriter; + +},{"253":253,"255":255,"258":258,"374":374,"377":377,"75":75,"85":85,"88":88}],78:[function(_dereq_,module,exports){ +(function (Buffer){ +// wrapper for non-node envs +;(function (sax) { + +sax.parser = function (strict, opt) { return new SAXParser(strict, opt) } +sax.SAXParser = SAXParser +sax.SAXStream = SAXStream +sax.createStream = createStream + +// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns. +// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)), +// since that's the earliest that a buffer overrun could occur. This way, checks are +// as rare as required, but as often as necessary to ensure never crossing this bound. +// Furthermore, buffers are only tested at most once per write(), so passing a very +// large string into write() might have undesirable effects, but this is manageable by +// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme +// edge case, result in creating at most one complete copy of the string passed in. +// Set to Infinity to have unlimited buffers. +sax.MAX_BUFFER_LENGTH = 64 * 1024 + +var buffers = [ + "comment", "sgmlDecl", "textNode", "tagName", "doctype", + "procInstName", "procInstBody", "entity", "attribName", + "attribValue", "cdata", "script" +] + +sax.EVENTS = // for discoverability. + [ "text" + , "processinginstruction" + , "sgmldeclaration" + , "doctype" + , "comment" + , "attribute" + , "opentag" + , "closetag" + , "opencdata" + , "cdata" + , "closecdata" + , "error" + , "end" + , "ready" + , "script" + , "opennamespace" + , "closenamespace" + ] + +function SAXParser (strict, opt) { + if (!(this instanceof SAXParser)) return new SAXParser(strict, opt) + + var parser = this + clearBuffers(parser) + parser.q = parser.c = "" + parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH + parser.opt = opt || {} + parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags + parser.looseCase = parser.opt.lowercase ? "toLowerCase" : "toUpperCase" + parser.tags = [] + parser.closed = parser.closedRoot = parser.sawRoot = false + parser.tag = parser.error = null + parser.strict = !!strict + parser.noscript = !!(strict || parser.opt.noscript) + parser.state = S.BEGIN + parser.ENTITIES = Object.create(sax.ENTITIES) + parser.attribList = [] + + // namespaces form a prototype chain. + // it always points at the current tag, + // which protos to its parent tag. + if (parser.opt.xmlns) parser.ns = Object.create(rootNS) + + // mostly just for error reporting + parser.trackPosition = parser.opt.position !== false + if (parser.trackPosition) { + parser.position = parser.line = parser.column = 0 + } + emit(parser, "onready") +} + +if (!Object.create) Object.create = function (o) { + function f () { this.__proto__ = o } + f.prototype = o + return new f +} + +if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) { + return o.__proto__ +} + +if (!Object.keys) Object.keys = function (o) { + var a = [] + for (var i in o) if (o.hasOwnProperty(i)) a.push(i) + return a +} + +function checkBufferLength (parser) { + var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10) + , maxActual = 0 + for (var i = 0, l = buffers.length; i < l; i ++) { + var len = parser[buffers[i]].length + if (len > maxAllowed) { + // Text/cdata nodes can get big, and since they're buffered, + // we can get here under normal conditions. + // Avoid issues by emitting the text node now, + // so at least it won't get any bigger. + switch (buffers[i]) { + case "textNode": + closeText(parser) + break + + case "cdata": + emitNode(parser, "oncdata", parser.cdata) + parser.cdata = "" + break + + case "script": + emitNode(parser, "onscript", parser.script) + parser.script = "" + break + + default: + error(parser, "Max buffer length exceeded: "+buffers[i]) + } + } + maxActual = Math.max(maxActual, len) + } + // schedule the next check for the earliest possible buffer overrun. + parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual) + + parser.position +} + +function clearBuffers (parser) { + for (var i = 0, l = buffers.length; i < l; i ++) { + parser[buffers[i]] = "" + } +} + +function flushBuffers (parser) { + closeText(parser) + if (parser.cdata !== "") { + emitNode(parser, "oncdata", parser.cdata) + parser.cdata = "" + } + if (parser.script !== "") { + emitNode(parser, "onscript", parser.script) + parser.script = "" + } +} + +SAXParser.prototype = + { end: function () { end(this) } + , write: write + , resume: function () { this.error = null; return this } + , close: function () { return this.write(null) } + , flush: function () { flushBuffers(this) } + } + +try { + var Stream = _dereq_("stream").Stream +} catch (ex) { + var Stream = function () {} +} + + +var streamWraps = sax.EVENTS.filter(function (ev) { + return ev !== "error" && ev !== "end" +}) + +function createStream (strict, opt) { + return new SAXStream(strict, opt) +} + +function SAXStream (strict, opt) { + if (!(this instanceof SAXStream)) return new SAXStream(strict, opt) + + Stream.apply(this) + + this._parser = new SAXParser(strict, opt) + this.writable = true + this.readable = true + + + var me = this + + this._parser.onend = function () { + me.emit("end") + } + + this._parser.onerror = function (er) { + me.emit("error", er) + + // if didn't throw, then means error was handled. + // go ahead and clear error, so we can write again. + me._parser.error = null + } + + this._decoder = null; + + streamWraps.forEach(function (ev) { + Object.defineProperty(me, "on" + ev, { + get: function () { return me._parser["on" + ev] }, + set: function (h) { + if (!h) { + me.removeAllListeners(ev) + return me._parser["on"+ev] = h + } + me.on(ev, h) + }, + enumerable: true, + configurable: false + }) + }) +} + +SAXStream.prototype = Object.create(Stream.prototype, + { constructor: { value: SAXStream } }) + +SAXStream.prototype.write = function (data) { + if (typeof Buffer === 'function' && + typeof Buffer.isBuffer === 'function' && + Buffer.isBuffer(data)) { + if (!this._decoder) { + var SD = _dereq_('string_decoder').StringDecoder + this._decoder = new SD('utf8') + } + data = this._decoder.write(data); + } + + this._parser.write(data.toString()) + this.emit("data", data) + return true +} + +SAXStream.prototype.end = function (chunk) { + if (chunk && chunk.length) this.write(chunk) + this._parser.end() + return true +} + +SAXStream.prototype.on = function (ev, handler) { + var me = this + if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) { + me._parser["on"+ev] = function () { + var args = arguments.length === 1 ? [arguments[0]] + : Array.apply(null, arguments) + args.splice(0, 0, ev) + me.emit.apply(me, args) + } + } + + return Stream.prototype.on.call(me, ev, handler) +} + + + +// character classes and tokens +var whitespace = "\r\n\t " + // this really needs to be replaced with character classes. + // XML allows all manner of ridiculous numbers and digits. + , number = "0124356789" + , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + // (Letter | "_" | ":") + , quote = "'\"" + , entity = number+letter+"#" + , attribEnd = whitespace + ">" + , CDATA = "[CDATA[" + , DOCTYPE = "DOCTYPE" + , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace" + , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/" + , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE } + +// turn all the string character sets into character class objects. +whitespace = charClass(whitespace) +number = charClass(number) +letter = charClass(letter) + +// http://www.w3.org/TR/REC-xml/#NT-NameStartChar +// This implementation works on strings, a single character at a time +// as such, it cannot ever support astral-plane characters (10000-EFFFF) +// without a significant breaking change to either this parser, or the +// JavaScript language. Implementation of an emoji-capable xml parser +// is left as an exercise for the reader. +var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/ + +var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/ + +quote = charClass(quote) +entity = charClass(entity) +attribEnd = charClass(attribEnd) + +function charClass (str) { + return str.split("").reduce(function (s, c) { + s[c] = true + return s + }, {}) +} + +function isRegExp (c) { + return Object.prototype.toString.call(c) === '[object RegExp]' +} + +function is (charclass, c) { + return isRegExp(charclass) ? !!c.match(charclass) : charclass[c] +} + +function not (charclass, c) { + return !is(charclass, c) +} + +var S = 0 +sax.STATE = +{ BEGIN : S++ +, TEXT : S++ // general stuff +, TEXT_ENTITY : S++ // & and such. +, OPEN_WAKA : S++ // < +, SGML_DECL : S++ // +, SCRIPT : S++ // +``` + +#### Babel + +[Babel](http://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively. + +```js +import $ from "jquery"; +``` + +#### Browserify/Webpack + +There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project's documention. In the script, including jQuery will usually look like this... + +```js +var $ = require("jquery"); +``` + +#### AMD (Asynchronous Module Definition) + +AMD is a module format built for the browser. For more information, we recommend [require.js' documentation](http://requirejs.org/docs/whyamd.html). + +```js +define(["jquery"], function($) { + +}); +``` + +### Node + +To include jQuery in [Node](nodejs.org), first install with npm. + +```sh +npm install jquery +``` + +For jQuery to work in Node, a window with a document is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/tmpvar/jsdom). This can be useful for testing purposes. + +```js +require("jsdom").env("", function(err, window) { + if (err) { + console.error(err); + return; + } + + var $ = require("jquery")(window); +}); +``` diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/jquery/bower.json b/Rechnungseingang/target/process-test-coverage/bower_components/jquery/bower.json new file mode 100644 index 0000000..95798d5 --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/jquery/bower.json @@ -0,0 +1,14 @@ +{ + "name": "jquery", + "main": "dist/jquery.js", + "license": "MIT", + "ignore": [ + "package.json" + ], + "keywords": [ + "jquery", + "javascript", + "browser", + "library" + ] +} \ No newline at end of file diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/jquery/dist/jquery.js b/Rechnungseingang/target/process-test-coverage/bower_components/jquery/dist/jquery.js new file mode 100644 index 0000000..5c3c456 --- /dev/null +++ b/Rechnungseingang/target/process-test-coverage/bower_components/jquery/dist/jquery.js @@ -0,0 +1,9814 @@ +/*! + * jQuery JavaScript Library v2.2.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:23Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var arr = []; + +var document = window.document; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "2.2.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isPlainObject: function( obj ) { + var key; + + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android<4.0, iOS<6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf( "use strict" ) === 1 ) { + script = document.createElement( "script" ); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + + indirect( code ); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + len = this.length, + ret = [], + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) + if ( elem && elem.parentNode ) { + + // Inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // Add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // If we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * The ready event handler and self cleanup method + */ +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE9-10 only + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + } else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + register: function( owner, initial ) { + var value = initial || {}; + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable, non-writable property + // configurability must be true to allow the property to be + // deleted with the delete operator + } else { + Object.defineProperty( owner, this.expando, { + value: value, + writable: true, + configurable: true + } ); + } + return owner[ this.expando ]; + }, + cache: function( owner ) { + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( !acceptData( owner ) ) { + return {}; + } + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + if ( typeof data === "string" ) { + cache[ data ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ prop ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + owner[ this.expando ] && owner[ this.expando ][ key ]; + }, + access: function( owner, key, value ) { + var stored; + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + stored = this.get( owner, key ); + + return stored !== undefined ? + stored : this.get( owner, jQuery.camelCase( key ) ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, name, camel, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key === undefined ) { + this.register( owner ); + + } else { + + // Support array or space separated string of keys + if ( jQuery.isArray( key ) ) { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat( key.map( jQuery.camelCase ) ); + } else { + camel = jQuery.camelCase( key ); + + // Try the string as a key before any manipulation + if ( key in cache ) { + name = [ key, camel ]; + } else { + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [ name ] : ( name.match( rnotwhite ) || [] ); + } + } + + i = name.length; + + while ( i-- ) { + delete cache[ name[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <= 35-45+ + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data, camelKey; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // with the key as-is + data = dataUser.get( elem, key ) || + + // Try to find dashed key if it exists (gh-2779) + // This is for 2.2.x only + dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() ); + + if ( data !== undefined ) { + return data; + } + + camelKey = jQuery.camelCase( key ); + + // Attempt to get data from the cache + // with the key camelized + data = dataUser.get( elem, camelKey ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, camelKey, undefined ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + camelKey = jQuery.camelCase( key ); + this.each( function() { + + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = dataUser.get( this, camelKey ); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + dataUser.set( this, camelKey, value ); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if ( key.indexOf( "-" ) > -1 && data !== undefined ) { + dataUser.set( this, key, value ); + } + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE9 + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE9-11+ + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0-4.3, Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<=11+ + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " + + "screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome<28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android<4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( "