source: CMESS/mediaplayer/branches/zmsgraphic_extedit/zmsgraphic_extedit_arrow.metaobj.xml @ 1134

Revision 1134, 191.6 KB checked in by mhallbauer, 22 months ago (diff)

1.1.1

Line 
1<?xml version="1.0" encoding="utf-8"?>
2<list>
3<item type="dictionary"><dictionary>
4<item key="key"><![CDATA[ZMSGraphic_extEdit]]></item>
5<item key="value" type="dictionary"><dictionary>
6<item key="__obj_attrs__" type="list"><list>
7<item type="dictionary"><dictionary>
8<item key="custom">
9<data content_type="image/png" filename="ZMSGraphic_extEdit.png" type="file">89504e470d0a1a0a0000000d494844520000001000000010080600000168f4cff70000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000004084944415478da62aeabab7b2d2e219ac6101119a6f1e9d3a7ff0001c49c9a91a6cfcfc7c3c720d9cbfb7fc5e2ed7f00028831232b55534b27f4da7786ff0c7c7fdffe61707377fb6f616ee5dedadafa9f8181c11d2000004400bbff037878753e23242389191a18de191819dc02e7df02892c326057364368cdeeeded55020101010392f791000bfbdb00ecededf2003c3b423324232397dadadaff131213ff020084007bff017777763dd6cdf20b282a227f000000f70000000000000109e7e6ebb1d8e0bdce04ececebc2121316bea41a9d380009f2005be35b0013458b0024dba931c78fac0704e8e9e728130b179bc656bb0014141500fafbf6001212000061a6ba07e8e8e8520141414100fbfafb00f6f7f600f5f6f600dcdbdb00070707892a2a2a47cccccc5b02000801f7fe01797979fff3f3f130f5f5f5effafbfbe1f1f1f127f6f6f602fdfeffbdfcfafa5b04e6e2f11f13101ea9090d0204000000bf1a1201a301020000c9cac424fafce60304f5f5f824939769389ba1d300fc02f40000010100736742003e38b935f8f7f7c202fdfcfd2b0303030084fc4900d9cdaa00354b460003020400e6ebdf0af6f7f74702fafafac0010102000c190d000c0c0c003c19fb00dddddd00171321eaf3f3f4bc02fdfefe18f6f5f800c63bcc0000ff010005050500f4f4f300e8eadf11eaeae9fd04f8fce89b50505148fcfcfedf060701c62424241341414100f3f4ee550404041102fdfcfe20fafbf7b9f5f6f1da01010114dddddd0129292900eeefefb0fcfcfcb902b44835a14d0451f8dbdffcac886d2d09c55550bc780b5a44113c19a222280a6aa01e02de84e02925e0c583de3cf45028e941055b73f7a022355a0c146cc09c244805aba9ad855893dd99eececcfa363ac38337bc99f77df3be6f3807a5e4ebadae7f47839151a02d55378ad46582e75434a5940da5d4581445bf99cf559f6d5c0865f0806a051a43ffd8c6379e4d58230b8f9f3f3ce10d3ce8ba86f8638438cc4139f902b66d617666110bcf9e9c657ce722d55e999cf33121c26e3a6180f90c8f1a4b18b8dfe11a277166ff24fe887ffe58f90c4ce701cb309469257b5eaf9f24c67b4cc6d90b29b532ddf1745dc77ca70c2d8890b076b1fe740ad56a15b55a0df973f41a39621389f51f9d7119a9454d8bae9aa4fda9503823c4d089291e3f7214d943a7e16cdd87547787e8954a05c414b5f939743adbc68189c37cf5d3db1b9ec71a5ae17cfe960a521f6c6d7c62efbed4140d0aa6611bbd9dcd010bb6afbc597ae9b6db6d388e8352a984e5e5f7ef2cdbbe944c24af93d08dd8ae2b2214a3a4c4b5200c7e92340882900b21cbee41f7e6d7b5b58f24ddbd5c2eb7da6ab5468bc5e26ebd5ef7d3e9f42fc6fcdb43bf5303c4c8d400718390ce719ecd64d06c36e91ce2ff2a506c52a42814c597bf1496e7ea0dafa8440000000049454e44ae426082</data></item>
10<item key="id"><![CDATA[icon]]></item>
11<item key="mandatory" type="int">0</item>
12<item key="multilang" type="int">0</item>
13<item key="name"><![CDATA[icon]]></item>
14<item key="repetitive" type="int">0</item>
15<item key="type"><![CDATA[resource]]></item>
16</dictionary>
17</item>
18<item type="dictionary"><dictionary>
19<item key="custom">
20<data content_type="application/x-javascript" filename="handleEdit.js" type="file">7661722074656d705f6163745f6865696768740909090909093d20303b0d0a7661722074656d705f6163745f77696474680909090909093d20303b0d0a7661722074656d705f6163745f7468756d625f6865696768740909093d20303b0d0a7661722074656d705f6163745f7468756d625f77696474680909093d20303b0d0a7661722074656d705f63726f705f617069090909090909093d206e756c6c3b0d0a7661722074656d705f63726f705f68697265730909090909093d206e756c6c3b0d0a766172202474656d705f627574746f6e735f6172726f77090909093d206e756c6c3b0d0a766172202474656d705f627574746f6e735f63726f70090909093d206e756c6c3b0d0a766172202474656d705f627574746f6e735f64696d09090909093d206e756c6c3b0d0a766172202474656d705f627574746f6e735f6d61696e090909093d206e756c6c3b0d0a766172202474656d705f627574746f6e735f726573697a650909093d206e756c6c3b0d0a766172202474656d705f616374696f6e5f6c69737409090909093d206e756c6c3b0d0a766172202474656d705f666f726d2009090909090909093d206e756c6c3b0d0a766172202474656d705f696d675f636f6e7461696e6572090909093d206e756c6c3b0d0a766172202474656d705f696e707574735f64696d09090909093d206e756c6c3b0d0a766172202474656d705f6c6162656c5f686972657309090909093d206e756c6c3b0d0a766172202474656d705f6c6162656c5f68697265735f726573697a65093d206e756c6c3b0d0a766172202474656d705f6c6162656c5f7468756d6209090909093d206e756c6c3b0d0a766172202474656d705f6c6162656c5f7468756d625f63726f7009093d206e756c6c3b0d0a766172202474656d705f7069706509090909090909093d206e756c6c3b0d0a766172202474656d705f7468756d625f636f6e7461696e65720909093d206e756c6c3b0d0a766172202474656d705f7468756d625f776964746809090909093d206e756c6c3b0d0a766172202474656d705f7468756d625f686569676874090909093d206e756c6c3b0d0a766172202474656d705f776f726b73706163655f64696d090909093d206e756c6c3b0d0a0d0a66756e6374696f6e206368616e6765427574746f6e417661696c6162696c69747928617661696c61626c652c2024627574746f6e732c206368616e67655f7374796c65290d0a7b0d0a0969662028617661696c61626c65290d0a090924627574746f6e732e636c69636b28636c69636b6564416374696f6e293b0d0a09656c73650d0a090924627574746f6e732e756e62696e642827636c69636b272c20636c69636b6564416374696f6e293b0d0a090d0a09696620286368616e67655f7374796c65290d0a097b0d0a090924627574746f6e732e656163682866756e6374696f6e28696e6465782c20627574746f6e290d0a09097b0d0a09092020766172202474656d705f627574746f6e203d202428627574746f6e293b0d0a090920200d0a090920206966202821617661696c61626c65290d0a09092020092474656d705f627574746f6e2e72656d6f76654174747228277374796c6527293b0d0a09092020090d0a09092020696620282474656d705f627574746f6e2e69732827696d672729290d0a09092020092474656d705f627574746f6e2e617474722827737263272c202474656d705f627574746f6e2e61747472282773726327292e7265706c6163652828617661696c61626c65203f202f5f64697361626c65642f67203a202f2e706e672f67292c2028617661696c61626c65203f202727203a20275f64697361626c65642e706e67272929293b0d0a09092020656c73650d0a090920207b0d0a090920200969662028617661696c61626c65290d0a09092020097b0d0a0909202009092474656d705f627574746f6e2e72656d6f766541747472282764697361626c656427293b0d0a0909202009092474656d705f627574746f6e2e72656d6f76654174747228277374796c6527293b0d0a09092020097d0d0a0909202009656c73650d0a09092020097b0d0a0909092020092474656d705f627574746f6e2e61747472282764697361626c6564272c202764697361626c656427293b0d0a0909092020092474656d705f627574746f6e2e6373732827636f6c6f72272c20272363636327293b0d0a09092020097d0d0a090920207d0d0a09092020090d0a0909202069662028617661696c61626c65290d0a09092020092474656d705f627574746f6e2e6373732827637572736f72272c2027706f696e74657227293b0d0a09097d293b0d0a097d0d0a7d0d0a0d0a66756e6374696f6e206368616e6765427574746f6e5669736962696c6974792876697369626c652c2024627574746f6e73290d0a7b0d0a096368616e6765427574746f6e417661696c6162696c6974792876697369626c652c2024627574746f6e732c2066616c7365293b0d0a090d0a096966202876697369626c65290d0a090924627574746f6e732e73686f7728293b0d0a09656c73650d0a090924627574746f6e732e6869646528293b0d0a7d0d0a0d0a66756e6374696f6e206368616e67654a63726f70417661696c6162696c69747928617661696c61626c652c2063726f7070696e672c2063726f705f6869726573290d0a7b0d0a096966202874656d705f63726f705f61706920213d206e756c6c290d0a090974656d705f63726f705f6170692e64657374726f7928293b0d0a0909090d0a0969662028617661696c61626c65290d0a097b0d0a09097661722074656d705f686569676874093d202863726f7070696e67202626202163726f705f686972657329203f207061727365496e74282474656d705f7468756d625f6865696768742e76616c282929203a2074656d705f6163745f6865696768743b0d0a09097661722074656d705f7769647468093d202863726f7070696e67202626202163726f705f686972657329203f207061727365496e74282474656d705f7468756d625f77696474682e76616c282929203a2074656d705f6163745f77696474683b0d0a09090d0a090974656d705f63726f705f617069203d20242e4a63726f70282474656d705f696d675f636f6e7461696e65722e66696e642827696d6727292e65712830292c200d0a0909097b200d0a09090909616c6c6f7753656c656374093a2066616c73652c0d0a09090909617370656374526174696f093a2074656d705f77696474682f74656d705f6865696768742c0d0a090909096d696e53697a650909093a205b32352c2032355d2c0d0a090909096d617853697a650909093a205b696d675f696e666f5b27776f726b7370616365275d5b277769647468275d2c20696d675f696e666f5b27776f726b7370616365275d5b277769647468275d5d2c0d0a0909090968616e646c65730909093a20747275652c0d0a090909096f6e4368616e676509093a206368616e67656453656c656374696f6e0d0a0909097d293b0d0a090974656d705f63726f705f6170692e73657453656c656374285b302c20302c2074656d705f77696474682c2074656d705f6865696768745d293b0d0a090974656d705f63726f705f6170692e7365744f7074696f6e73287b20616c6c6f77526573697a653a20747275652c20616c6c6f774d6f76653a2063726f7070696e677d293b0d0a090974656d705f63726f705f6170692e666f63757328293b0d0a097d0d0a7d0d0a0d0a66756e6374696f6e206368616e67656453656c656374696f6e2864696d656e73696f6e73290d0a7b0d0a09696620282474656d705f6c6162656c5f68697265735f726573697a6520213d206e756c6c290d0a09092474656d705f6c6162656c5f68697265735f726573697a652e746578742864696d656e73696f6e732e77202b202720782027202b2064696d656e73696f6e732e68293b0d0a09656c736520696620282474656d705f6c6162656c5f7468756d625f63726f7020213d206e756c6c290d0a09092474656d705f6c6162656c5f7468756d625f63726f702e746578742864696d656e73696f6e732e77202b202720782027202b2064696d656e73696f6e732e68293b0d0a7d0d0a0d0a66756e6374696f6e206368616e676544696d656e73696f6e732872657365745f64696d73290d0a7b0d0a097661722074656d705f6368616e67655f776f726b73706163653b0d0a090d0a09696620282172657365745f64696d73290d0a097b0d0a09097661722074656d705f68656967687420090909093d097061727365496e74282474656d705f7468756d625f6865696768742e76616c2829293b0d0a09097661722074656d705f776964746809090909093d207061727365496e74282474656d705f7468756d625f77696474682e76616c2829293b0d0a09097661722074656d705f776f726b73706163655f64696d093d207061727365496e74282474656d705f776f726b73706163655f64696d2e76616c2829293b0d0a09090d0a090974656d705f68656967687420090909093d202874656d705f686569676874203d3d204e614e29203f2074656d705f6163745f7468756d625f686569676874203a2074656d705f6865696768743b0d0a090974656d705f776964746809090909093d202874656d705f7769647468203d3d204e614e29203f2074656d705f6163745f7468756d625f7769647468203a2074656d705f77696474683b0d0a090974656d705f776f726b73706163655f64696d093d202874656d705f776f726b73706163655f64696d203d3d204e614e29203f20696d675f696e666f5b27776f726b7370616365275d5b277769647468275d203a2074656d705f776f726b73706163655f64696d3b0d0a09090d0a09097661722074656d705f6368616e67655f7468756d62093d202874656d705f68656967687420213d2074656d705f6163745f7468756d625f68656967687429207c7c202874656d705f776964746820213d2074656d705f6163745f7468756d625f7769647468293b0d0a090974656d705f6368616e67655f776f726b7370616365093d2074656d705f776f726b73706163655f64696d20213d20696d675f696e666f5b27776f726b7370616365275d5b277769647468275d3b0d0a0d0a090969662028636f6e6669726d44696d656e73696f6e4368616e6765732874656d705f6368616e67655f7468756d622c2074656d705f6368616e67655f776f726b737061636529290d0a09097b0d0a0909096966202874656d705f6368616e67655f7468756d62290d0a0909097b0d0a090909097661722074656d705f7374796c65203d202474656d705f7468756d625f636f6e7461696e65722e6174747228277374796c6527293b0d0a090909090d0a0909090974656d705f6163745f7468756d625f686569676874203d204d6174682e6d61782832352c204d6174682e6d696e2874656d705f6865696768742c2074656d705f6163745f68656967687429293b0d0a0909090974656d705f6163745f7468756d625f7769647468093d204d6174682e6d61782832352c204d6174682e6d696e2874656d705f77696474682c2074656d705f6163745f776964746829293b0d0a090909090d0a0909090974656d705f7374796c65203d2074656d705f7374796c652e7265706c616365282f6d696e2d6865696768745b3a5c735c645c775d2a3b2f672c20276d696e2d6865696768743a2027202b2074656d705f6163745f7468756d625f686569676874202b202770783b2027293b0d0a0909090974656d705f7374796c65203d2074656d705f7374796c652e7265706c616365282f77696474685b3a5c735c645c775d2a3b2f672c202777696474683a2027202b2074656d705f6163745f7468756d625f7769647468202b202770783b2027293b0d0a090909090d0a090909092474656d705f7468756d625f636f6e7461696e65722e656d70747928293b0d0a090909092474656d705f7468756d625f636f6e7461696e65722e6174747228277374796c65272c2074656d705f7374796c65293b0d0a0909097d0d0a0909090d0a0909096966202874656d705f6368616e67655f776f726b7370616365290d0a0909097b0d0a090909097661722074656d705f7374796c65203d202474656d705f696d675f636f6e7461696e65722e6174747228277374796c6527293b0d0a090909090d0a09090909696d675f696e666f5b27776f726b7370616365275d5b277769647468275d203d204d6174682e6d696e28696d675f696e666f5b27776f726b7370616365275d5b2777696474685f6d6178275d2c2074656d705f776f726b73706163655f64696d290d0a090909090d0a0909090974656d705f7374796c65203d2074656d705f7374796c652e7265706c616365282f6d696e2d6865696768745b3a5c735c645c775d2a3b2f672c20276d696e2d6865696768743a2027202b20696d675f696e666f5b27776f726b7370616365275d5b277769647468275d202b202770783b2027293b0d0a0909090974656d705f7374796c65203d2074656d705f7374796c652e7265706c616365282f77696474685b3a5c735c645c775d2a3b2f672c202777696474683a2027202b20696d675f696e666f5b27776f726b7370616365275d5b277769647468275d202b202770783b2027293b0d0a090909090d0a090909092474656d705f616374696f6e5f6c6973742e656d70747928293b0d0a090909092474656d705f696d675f636f6e7461696e65722e656d70747928293b0d0a090909092474656d705f696d675f636f6e7461696e65722e6174747228277374796c65272c2074656d705f7374796c65293b0d0a090909092474656d705f7468756d625f636f6e7461696e65722e656d70747928293b0d0a0909097d0d0a09097d0d0a0909656c73650d0a09090974656d705f6368616e67655f776f726b7370616365203d2066616c73653b0d0a097d0d0a09656c73650d0a090974656d705f6368616e67655f776f726b7370616365203d2066616c73653b0d0a0d0a092474656d705f7468756d625f6865696768742e76616c2874656d705f6163745f7468756d625f686569676874293b0d0a092474656d705f7468756d625f77696474682e76616c2874656d705f6163745f7468756d625f7769647468293b0d0a092474656d705f776f726b73706163655f64696d2e76616c28696d675f696e666f5b27776f726b7370616365275d5b277769647468275d293b0d0a090d0a0972657475726e2074656d705f6368616e67655f776f726b73706163653b0d0a7d0d0a0d0a66756e6374696f6e20636c69636b6564416374696f6e28290d0a7b0d0a097661722074656d705f616374696f6e090909093d20242874686973292e617474722827696427292e746f4c6f7765724361736528292e7265706c616365282f7a6d73677261706869635f657874656469745f2f672c202727293b0d0a097661722074656d705f616a61785f72657175657374203d2066616c73653b0d0a090d0a09696620282874656d705f616374696f6e203d3d202763616e63656c2729207c7c202874656d705f616374696f6e203d3d20276f6b2729290d0a097b0d0a09092474656d705f666f726d2e66696e642827696e7075745b6e616d653d22616374696f6e225d27292e76616c2874656d705f616374696f6e293b0d0a09090d0a09096966202874656d705f616374696f6e203d3d20276f6b27290d0a0909092474656d705f666f726d2e66696e642827696e7075745b6e616d653d22696d675f696e666f225d27292e76616c2867657445646974506970654173584d4c28696d675f696e666f29293b0d0a09090d0a09092474656d705f666f726d2e7375626d697428293b0d0a097d0d0a09656c736520696620282874656d705f616374696f6e203d3d2027726f746174655f702729207c7c202874656d705f616374696f6e203d3d2027726f746174655f6d2729290d0a097b0d0a090969662028636f6e6669726d5468756d6252657365742829290d0a09097b0d0a090909696d675f696e666f5b277175657565275d2e707573682863726561746551756575654f626a6563742827726f74617465272c202874656d705f616374696f6e2e7265706c616365282f726f746174655f2f672c20272729203d3d20276d2729203f20202d31203a203129293b0d0a0909090d0a0909092474656d705f616374696f6e5f6c6973742e617070656e6428273c6f7074696f6e3e27202b20242874686973292e617474722827616c742729202b20273c2f6f7074696f6e3e27293b0d0a090909090d0a09090974656d705f616a61785f72657175657374203d20747275653b0d0a09097d0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d2027666c69705f6827290d0a097b0d0a090969662028636f6e6669726d5468756d6252657365742829290d0a09097b0d0a090909696d675f696e666f5b277175657565275d2e707573682863726561746551756575654f626a656374282766686f72697a6f6e74616c272c203129293b0d0a0909090d0a0909092474656d705f616374696f6e5f6c6973742e617070656e6428273c6f7074696f6e3e27202b20242874686973292e617474722827616c742729202b20273c2f6f7074696f6e3e27293b0d0a0909090d0a09090974656d705f616a61785f72657175657374203d20747275653b0d0a09097d0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d2027666c69705f7627290d0a097b0d0a090969662028636f6e6669726d5468756d6252657365742829290d0a09097b0d0a090909696d675f696e666f5b277175657565275d2e707573682863726561746551756575654f626a656374282766766572746963616c272c203129293b0d0a0909090d0a0909092474656d705f616374696f6e5f6c6973742e617070656e6428273c6f7074696f6e3e27202b20242874686973292e617474722827616c742729202b20273c2f6f7074696f6e3e27293b0d0a0909090d0a09090974656d705f616a61785f72657175657374203d20747275653b0d0a09097d0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d2027726573697a6527290d0a097b0d0a09092474656d705f6c6162656c5f68697265735f726573697a65203d202428273c6c6162656c207374796c653d22636f6c6f723a626c75653b223e27202b2074656d705f6163745f7769647468202b202720782027202b2074656d705f6163745f686569676874202b20273c2f6c6162656c3e27293b0d0a09092474656d705f6c6162656c5f68697265732e6e657874416c6c28273a6c61737427292e6166746572282474656d705f6c6162656c5f68697265735f726573697a65293b0d0a09090d0a09096368616e6765427574746f6e417661696c6162696c6974792866616c73652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c69747928747275652c202474656d705f627574746f6e735f726573697a65293b0d0a09096368616e67654a63726f70417661696c6162696c69747928747275652c2066616c73652c2066616c7365293b0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d2027726573697a655f6f6b27290d0a097b0d0a090964656c6574654c6162656c7328293b0d0a09096368616e6765427574746f6e417661696c6162696c69747928747275652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f726573697a65293b0d0a09090d0a090969662028636f6e6669726d5468756d6252657365742829290d0a09097b0d0a0909097661722074656d705f61726561203d2074656d705f63726f705f6170692e74656c6c53656c65637428293b200d0a090909696d675f696e666f5b277175657565275d2e707573682863726561746551756575654f626a6563742827726573697a65272c202874656d705f617265612e7832202d2074656d705f617265612e7829202b20272c27202b202874656d705f617265612e7932202d2074656d705f617265612e792929293b0d0a0909090d0a0909092474656d705f616374696f6e5f6c6973742e617070656e6428273c6f7074696f6e3e726573697a6520746f2027202b202874656d705f617265612e7832202d2074656d705f617265612e7829202b202720782027202b202874656d705f617265612e7932202d2074656d705f617265612e7929202b20273c2f6f7074696f6e3e27293b0d0a0909090d0a09090974656d705f616a61785f72657175657374203d20747275653b0d0a09097d0d0a09090d0a09096368616e67654a63726f70417661696c6162696c6974792866616c73652c2066616c73652c2066616c7365293b0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d2027726573697a655f63616e63656c27290d0a097b0d0a090964656c6574654c6162656c7328293b0d0a09096368616e6765427574746f6e417661696c6162696c69747928747275652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f726573697a65293b0d0a09096368616e67654a63726f70417661696c6162696c6974792866616c73652c2066616c73652c2066616c7365293b0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d202763726f7027290d0a097b0d0a090974656d705f63726f705f6869726573203d2066616c73653b0d0a09090d0a09092f2f206765742061637475616c207468756d622064696d656e73696f6e730d0a090974656d705f6163745f7468756d625f686569676874203d207061727365496e74282474656d705f7468756d625f6865696768742e76616c2829293b0d0a090974656d705f6163745f7468756d625f7769647468093d207061727365496e74282474656d705f7468756d625f77696474682e76616c2829293b0d0a09090d0a09092474656d705f6c6162656c5f7468756d625f63726f70203d202428273c6c6162656c207374796c653d22636f6c6f723a626c75653b223e27202b2074656d705f6163745f7468756d625f7769647468202b202720782027202b2074656d705f6163745f7468756d625f686569676874202b20273c2f6c6162656c3e27293b0d0a09092474656d705f6c6162656c5f7468756d622e6e657874416c6c28273a6c61737427292e6166746572282474656d705f6c6162656c5f7468756d625f63726f70293b0d0a09090d0a09096368616e6765427574746f6e417661696c6162696c6974792866616c73652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c69747928747275652c202474656d705f627574746f6e735f63726f70293b0d0a09096368616e67654a63726f70417661696c6162696c69747928747275652c20747275652c2066616c7365293b0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d202763726f705f686972657327290d0a097b0d0a09096966202874656d705f63726f705f6869726573290d0a09097b0d0a0909096368616e6765427574746f6e417661696c6162696c6974792866616c73652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a0909096368616e6765427574746f6e5669736962696c69747928747275652c202474656d705f627574746f6e735f63726f70293b0d0a0909096368616e67654a63726f70417661696c6162696c69747928747275652c20747275652c2074727565293b0d0a09097d0d0a0909656c73650d0a09097b0d0a09090969662028636f6e6669726d486972657352657365742829290d0a0909097b0d0a0909090974656d705f63726f705f686972657309093d20747275653b0d0a0909090974656d705f616a61785f72657175657374203d20747275653b0d0a090909090d0a09090909696d675f696e666f5b277175657565275d2e707573682863726561746551756575654f626a65637428277265736574272c203129293b0d0a0909097d0d0a09097d0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d202763726f705f6f6b27290d0a097b0d0a090964656c6574654c6162656c7328293b0d0a09096368616e6765427574746f6e417661696c6162696c69747928747275652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f63726f70293b0d0a09090d0a09097661722074656d705f61726561203d2074656d705f63726f705f6170692e74656c6c53656c65637428293b200d0a0909696d675f696e666f5b277175657565275d2e707573682863726561746551756575654f626a656374282874656d705f63726f705f6869726573203f202763726f705f686972657327203a202763726f7027292c200d0a090909090909090909090909090974656d705f617265612e78202b20272c27202b2074656d705f617265612e79202b20272c27202b2074656d705f617265612e7832202b20272c27202b2074656d705f617265612e7932202b20272c27202b200d0a09090909090909090909090909092874656d705f63726f705f6869726573203f2074656d705f6163745f7769647468202b20272c27202b2074656d705f6163745f686569676874203a202474656d705f7468756d625f77696474682e76616c2829202b20272c27202b202474656d705f7468756d625f6865696768742e76616c28292929293b0d0a09090d0a09096368616e67654a63726f70417661696c6162696c6974792866616c73652c2066616c73652c2066616c7365293b0d0a09090d0a090974656d705f616a61785f72657175657374203d20747275653b0d0a090974656d705f63726f705f686972657309093d2066616c73653b0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d202763726f705f63616e63656c27290d0a097b0d0a090964656c6574654c6162656c7328293b0d0a09096368616e6765427574746f6e417661696c6162696c69747928747275652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f63726f70293b0d0a09096368616e67654a63726f70417661696c6162696c6974792866616c73652c2066616c73652c2066616c7365293b0d0a09090d0a090974656d705f63726f705f6869726573203d2066616c73653b0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d202764696d656e73696f6e27290d0a097b0d0a09092f2f206765742061637475616c207468756d622064696d656e73696f6e730d0a090974656d705f6163745f7468756d625f686569676874203d207061727365496e74282474656d705f7468756d625f6865696768742e76616c2829293b0d0a090974656d705f6163745f7468756d625f7769647468093d207061727365496e74282474656d705f7468756d625f77696474682e76616c2829293b0d0a09092f2f206765742061637475616c20776f726b73706163652064696d656e73696f6e0d0a0909696d675f696e666f5b27776f726b7370616365275d5b277769647468275d093d207061727365496e74282474656d705f776f726b73706163655f64696d2e76616c2829293b0d0a09090d0a09096368616e6765427574746f6e417661696c6162696c6974792866616c73652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c69747928747275652c202474656d705f627574746f6e735f64696d293b0d0a09096368616e6765427574746f6e5669736962696c69747928747275652c202474656d705f696e707574735f64696d293b0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d202764696d656e73696f6e5f6f6b27290d0a097b0d0a09097661722074656d705f776f726b73706163655f6368616e676564203d206368616e676544696d656e73696f6e7328293b0d0a09096368616e6765427574746f6e417661696c6162696c69747928747275652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f64696d293b0d0a09096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f696e707574735f64696d293b0d0a09090d0a09096966202874656d705f776f726b73706163655f6368616e676564290d0a09097b0d0a090909696d675f696e666f5b277175657565275d2e707573682863726561746551756575654f626a6563742827776f726b7370616365272c20696d675f696e666f5b27776f726b7370616365275d5b277769647468275d29293b0d0a0909090d0a09090974656d705f616a61785f72657175657374203d20747275653b0d0a09097d0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d202764696d656e73696f6e5f63616e63656c27290d0a097b0d0a09096368616e6765427574746f6e417661696c6162696c69747928747275652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f64696d293b0d0a09096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f696e707574735f64696d293b0d0a09096368616e676544696d656e73696f6e732874727565293b0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d2027726573657427290d0a097b0d0a090969662028636f6e6669726d486972657352657365742829290d0a09097b0d0a090909696d675f696e666f5b277175657565275d2e707573682863726561746551756575654f626a65637428277265736574272c203129293b0d0a0909090d0a09090974656d705f616a61785f72657175657374203d20747275653b0d0a09097d0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d202764726f705f736861646f7727290d0a097b0d0a090969662028636f6e6669726d5468756d6252657365742829290d0a09097b0d0a090909696d675f696e666f5b277175657565275d2e707573682863726561746551756575654f626a656374282764726f705f736861646f77272c203129293b0d0a0909090d0a09090974656d705f616a61785f72657175657374203d20747275653b0d0a09097d0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d2027647261775f6172726f7727290d0a097b0d0a0909766172202474656d705f696d67203d202474656d705f696d675f636f6e7461696e65722e66696e642827696d6727293b0d0a09090d0a0909696e6974535647282474656d705f696d672e61747472282773726327292c2074656d705f6163745f77696474682c2074656d705f6163745f686569676874293b0d0a09092474656d705f696d672e72656d6f766528293b0d0a09090d0a09096368616e6765427574746f6e417661696c6162696c6974792866616c73652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c69747928747275652c202474656d705f627574746f6e735f6172726f77293b0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d2027647261775f6172726f775f6f6b27290d0a097b0d0a09096368616e6765427574746f6e417661696c6162696c69747928747275652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f6172726f77293b0d0a09090d0a09097661722074656d705f6172726f775f7265637473203d2064656c65746553564728293b0d0a09097661722074656d705f76616c756573203d2027273b0d0a09090d0a09092474656d705f696d675f636f6e7461696e65722e617070656e6428273c696d67207372633d2227202b20696d675f696e666f5b277175657565275d5b696d675f696e666f5b277175657565275d2e6c656e677468202d20315d5b2775726c275d202b202722202f3e27293b0d0a09090d0a0909666f7220287661722069203d20303b2069203c2074656d705f6172726f775f72656374732e6c656e6774683b20692b2b290d0a09097b0d0a09090974656d705f76616c756573202b3d2074656d705f6172726f775f72656374735b695d2e73746172742e58202b20272c27202b2074656d705f6172726f775f72656374735b695d2e73746172742e59202b20272c27202b2074656d705f6172726f775f72656374735b695d2e656e642e58202b20272c27202b2074656d705f6172726f775f72656374735b695d2e656e642e593b0d0a0909096966202869203c2074656d705f6172726f775f72656374732e6c656e677468202d2031290d0a0909090974656d705f76616c756573202b3d20273b273b0d0a09097d0d0a09090d0a09096966202874656d705f76616c7565732e6c656e677468203e2030290d0a09097b0d0a090909696d675f696e666f5b277175657565275d2e707573682863726561746551756575654f626a65637428276172726f77272c2074656d705f76616c75657329293b0d0a0909090d0a09090974656d705f616a61785f72657175657374203d20747275653b0d0a09097d0d0a097d0d0a09656c7365206966202874656d705f616374696f6e203d3d2027647261775f6172726f775f63616e63656c27290d0a097b0d0a09096368616e6765427574746f6e417661696c6162696c69747928747275652c202474656d705f627574746f6e735f6d61696e2c2074727565293b0d0a09096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f6172726f77293b0d0a09090d0a090964656c65746553564728293b0d0a09090d0a09092474656d705f696d675f636f6e7461696e65722e617070656e6428273c696d67207372633d2227202b20696d675f696e666f5b277175657565275d5b696d675f696e666f5b277175657565275d2e6c656e677468202d20315d5b2775726c275d202b202722202f3e27293b0d0a097d0d0a090d0a096966202874656d705f616a61785f72657175657374290d0a097b0d0a09096a51756572792e706f7374287a6d73677261706869635f657874656469745f726571756573745f75726c2c207b616374696f6e203a202772657175657374272c20696d675f696e666f203a2067657445646974506970654173584d4c28696d675f696e666f297d2c2072656365697665446174612c20276a736f6e27293b0d0a097d0d0a7d0d0a0d0a66756e6374696f6e20636f6e6669726d44696d656e73696f6e4368616e676573287468756d625f64696d5f6368616e6765642c20776f726b73706163655f64696d5f6368616e676564290d0a7b0d0a097661722074656d705f7465787409093d2027417474656e74696f6e21273b0d0a097661722074656d705f726573756c74093d20747275653b0d0a090d0a09696620287468756d625f64696d5f6368616e67656420262620776f726b73706163655f64696d5f6368616e676564290d0a090974656d705f74657874202b3d2027205468756d622d44696d656e73696f6e7320616e6420576f726b73706163652d44696d656e73696f6e2077657265206368616e6765642e2050726576696f7573206368616e67657320616e64205468756d622d496d6167652077696c6c206265206c6f73742e273b0d0a09656c736520696620287468756d625f64696d5f6368616e676564290d0a090974656d705f74657874202b3d2027205468756d622d44696d656e73696f6e732077657265206368616e6765642e20205468756d622d696d6167652077696c6c206265206c6f7374273b0d0a09656c73652069662028776f726b73706163655f64696d5f6368616e676564290d0a090974656d705f74657874202b3d202720576f726b73706163652d44696d656e73696f6e20776173206368616e6765642e2050726576696f7573206368616e67657320616e64205468756d622d496d6167652077696c6c206265206c6f73742e273b0d0a0974656d705f74657874202b3d20275c6e446f20796f752077616e7420746f20636f6e74696e75653f273b0d0a090d0a09696620287468756d625f64696d5f6368616e676564207c7c20776f726b73706163655f64696d5f6368616e676564290d0a090974656d705f726573756c74203d20636f6e6669726d2874656d705f74657874293b0d0a09090d0a0972657475726e2074656d705f726573756c743b0d0a7d0d0a0d0a66756e6374696f6e20636f6e6669726d4869726573526573657428290d0a7b0d0a097661722074656d705f726573756c74203d20636f6e6669726d2827417474656e74696f6e2120496d6167652077696c6c206265207265637265617465642066726f6d204f726967696e616c2e2050726576696f7573206368616e67657320616e64205468756d622d496d6167652077696c6c206265206c6f73742e5c6e446f20796f752077616e7420746f20636f6e74696e75653f27293b0d0a090d0a09696620282874656d705f726573756c742920262620282474656d705f7468756d625f636f6e7461696e65722e66696e642827696d6727292e6c656e677468203e203029290d0a09092474656d705f7468756d625f636f6e7461696e65722e656d70747928293b0d0a090d0a0972657475726e2074656d705f726573756c743b0d0a7d0d0a0d0a66756e6374696f6e20636f6e6669726d5468756d62526573657428290d0a7b0d0a097661722074656d705f726573756c74203d20747275653b0d0a090d0a09696620282474656d705f7468756d625f636f6e7461696e65722e66696e642827696d6727292e6c656e677468203e2030290d0a097b0d0a090974656d705f726573756c74203d20636f6e6669726d2827417474656e74696f6e2120507265766965772077696c6c206265206c6f73742e5c6e446f20796f752077616e7420746f20636f6e74696e75653f27293b0d0a090d0a09096966202874656d705f726573756c74290d0a0909092474656d705f7468756d625f636f6e7461696e65722e656d70747928293b0d0a097d0d0a090d0a0972657475726e2074656d705f726573756c743b0d0a7d0d0a0d0a66756e6374696f6e2063726561746551756575654f626a65637428616374696f6e2c2076616c7565290d0a7b0d0a097661722074656d705f6f626a203d206e6577204f626a65637428293b0d0a090d0a0974656d705f6f626a5b27616374696f6e275d09093d20616374696f6e3b0d0a0974656d705f6f626a5b2776616c7565275d0909093d2076616c75653b0d0a0974656d705f6f626a5b2766696c656e616d65275d093d206e756c6c3b0d0a0974656d705f6f626a5b2775726c275d090909093d206e756c6c3b0d0a0974656d705f6f626a5b277769647468275d0909093d206e756c6c3b0d0a0974656d705f6f626a5b27686569676874275d09093d206e756c6c3b0d0a090d0a0972657475726e2074656d705f6f626a3b0d0a7d0d0a0d0a66756e6374696f6e2064656c6574654c6162656c7328290d0a7b0d0a09696620282474656d705f6c6162656c5f68697265735f726573697a6520213d206e756c6c290d0a097b0d0a09092474656d705f6c6162656c5f68697265735f726573697a652e72656d6f766528293b0d0a09092474656d705f6c6162656c5f68697265735f726573697a65203d206e756c6c3b0d0a097d0d0a09696620282474656d705f6c6162656c5f7468756d625f63726f7020213d206e756c6c290d0a097b0d0a09092474656d705f6c6162656c5f7468756d625f63726f702e72656d6f766528293b0d0a09092474656d705f6c6162656c5f7468756d625f63726f70203d206e756c6c3b0d0a097d0d0a7d0d0a0d0a66756e6374696f6e2067657441637444696d46726f6d517565756528696d675f696e666f290d0a7b0d0a097661722074656d705f706f73203d20696d675f696e666f5b277175657565275d2e6c656e677468202d20313b0d0a090d0a0974656d705f6163745f686569676874093d20696d675f696e666f5b277175657565275d5b74656d705f706f735d5b27686569676874275d3b0d0a0974656d705f6163745f7769647468093d20696d675f696e666f5b277175657565275d5b74656d705f706f735d5b277769647468275d3b0d0a7d0d0a0d0a66756e6374696f6e2067657445646974506970654173584d4c28696d675f696e666f290d0a7b0d0a097661722074656d705f786d6c203d2027273b0d0a090d0a0974656d705f786d6c202b3d20273c64696374696f6e6172793e5c6e273b0d0a0974656d705f786d6c202b3d20273c6974656d206b65793d2271756575652220747970653d226c697374223e3c6c6973743e5c6e273b0d0a090d0a09666f7220287661722069203d20303b2069203c20696d675f696e666f5b277175657565275d2e6c656e6774683b20692b2b290d0a097b0d0a090974656d705f786d6c202b3d20273c6974656d20747970653d2264696374696f6e617279223e3c64696374696f6e6172793e5c6e273b0d0a090974656d705f786d6c202b3d20273c6974656d206b65793d22616374696f6e223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277175657565275d5b695d5b27616374696f6e275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a090974656d705f786d6c202b3d20273c6974656d206b65793d2276616c7565223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277175657565275d5b695d5b2776616c7565275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a090974656d705f786d6c202b3d20273c6974656d206b65793d2266696c656e616d65223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277175657565275d5b695d5b2766696c656e616d65275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a090974656d705f786d6c202b3d20273c6974656d206b65793d2275726c223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277175657565275d5b695d5b2775726c275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a090974656d705f786d6c202b3d20273c6974656d206b65793d227769647468223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277175657565275d5b695d5b277769647468275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a090974656d705f786d6c202b3d20273c6974656d206b65793d22686569676874223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277175657565275d5b695d5b27686569676874275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a090974656d705f786d6c202b3d20273c2f64696374696f6e6172793e3c2f6974656d3e5c6e273b0d0a097d0d0a090d0a0974656d705f786d6c202b3d20273c2f6c6973743e3c2f6974656d3e5c6e273b0d0a090d0a0974656d705f786d6c202b3d20273c6974656d206b65793d227468756d622220747970653d2264696374696f6e617279223e3c64696374696f6e6172793e5c6e273b0d0a0974656d705f786d6c202b3d20273c6974656d206b65793d2266696c656e616d65223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277468756d62275d5b2766696c656e616d65275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a0974656d705f786d6c202b3d20273c6974656d206b65793d2275726c223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277468756d62275d5b2775726c275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a0974656d705f786d6c202b3d20273c6974656d206b65793d2263726f705f626f78223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277468756d62275d5b2763726f705f626f78275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a0974656d705f786d6c202b3d20273c6974656d206b65793d227769647468223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277468756d62275d5b277769647468275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a0974656d705f786d6c202b3d20273c6974656d206b65793d22686569676874223e3c215b434441544127202b20275b27202b20696d675f696e666f5b277468756d62275d5b27686569676874275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a0974656d705f786d6c202b3d20273c2f64696374696f6e6172793e3c2f6974656d3e5c6e273b0d0a090d0a0974656d705f786d6c202b3d20273c6974656d206b65793d22776f726b73706163652220747970653d2264696374696f6e617279223e3c64696374696f6e6172793e5c6e273b0d0a0974656d705f786d6c202b3d20273c6974656d206b65793d227769647468223e3c215b434441544127202b20275b27202b20696d675f696e666f5b27776f726b7370616365275d5b277769647468275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a0974656d705f786d6c202b3d20273c6974656d206b65793d2277696474685f6d6178223e3c215b434441544127202b20275b27202b20696d675f696e666f5b27776f726b7370616365275d5b2777696474685f6d6178275d202b20275d27202b20275d3e3c2f6974656d3e5c6e273b0d0a0974656d705f786d6c202b3d20273c2f64696374696f6e6172793e3c2f6974656d3e5c6e270d0a090d0a0974656d705f786d6c202b3d20273c2f64696374696f6e6172793e5c6e273b0d0a090d0a0972657475726e2074656d705f786d6c3b0d0a7d0d0a0d0a66756e6374696f6e20726563656976654461746128646174612c2074657874537461747573290d0a7b0d0a09696620282874657874537461747573203d3d20277375636365737327292026262028646174615b27726573756c74275d203e203029290d0a097b0d0a0909696d675f696e666f203d20646174615b27696d675f696e666f275d3b0d0a09090d0a09097661722074656d705f71756575655f706f73203d20696d675f696e666f5b277175657565275d2e6c656e677468202d20313b0d0a09090d0a0909696620282474656d705f696d675f636f6e7461696e65722e66696e642827696d6727292e6c656e677468203e2030290d0a09097b0d0a090909696620282474656d705f696d675f636f6e7461696e65722e66696e642827696d6727292e617474722827737263272920213d20696d675f696e666f5b277175657565275d5b74656d705f71756575655f706f735d5b2775726c275d290d0a090909092474656d705f696d675f636f6e7461696e65722e66696e642827696d6727292e617474722827737263272c20696d675f696e666f5b277175657565275d5b74656d705f71756575655f706f735d5b2775726c275d293b0d0a09097d0d0a0909656c73650d0a0909092474656d705f696d675f636f6e7461696e65722e617070656e6428273c696d67207372633d2227202b20696d675f696e666f5b277175657565275d5b74656d705f71756575655f706f735d5b2775726c275d202b202722202f3e27293b0d0a09090d0a090969662028696d675f696e666f5b277468756d62275d5b2775726c275d20213d20276e756c6c27290d0a09097b0d0a090909696620282474656d705f7468756d625f636f6e7461696e65722e66696e642827696d6727292e6c656e677468203e2030290d0a090909092474656d705f7468756d625f636f6e7461696e65722e66696e642827696d6727292e617474722827737263272c20696d675f696e666f5b277468756d62275d5b2775726c275d293b0d0a090909656c73650d0a090909092474656d705f7468756d625f636f6e7461696e65722e617070656e6428273c696d67207372633d2227202b20696d675f696e666f5b277468756d62275d5b2775726c275d202b202722202f3e27293b0d0a09097d0d0a0909090d0a090967657441637444696d46726f6d517565756528696d675f696e666f290d0a090972656e646572496d67496e666f28696d675f696e666f290d0a09090d0a09096966202874656d705f63726f705f6869726573290d0a090909242827235a4d53477261706869635f657874456469745f63726f705f686972657327292e636c69636b28293b0d0a097d0d0a7d0d0a0d0a66756e6374696f6e2072656e646572496d67496e666f28696d675f696e666f290d0a7b0d0a092474656d705f6c6162656c5f68697265732e746578742874656d705f6163745f7769647468202b202720782027202b2074656d705f6163745f686569676874293b0d0a0969662028696d675f696e666f5b277468756d62275d5b2775726c275d203d3d20276e756c6c27290d0a09092474656d705f6c6162656c5f7468756d622e7465787428274e6f6e6527293b0d0a09656c73650d0a09092474656d705f6c6162656c5f7468756d622e746578742874656d705f6163745f7468756d625f7769647468202b202720782027202b2074656d705f6163745f7468756d625f686569676874293b0d0a7d0d0a0d0a242827646f63756d656e7427292e72656164792866756e6374696f6e28290d0a7b0d0a092474656d705f666f726d0909090909093d20242827235a4d53477261706869635f657874456469745f666f726d27293b0d0a092474656d705f706970650909090909093d202474656d705f666f726d2e66696e642827696e7075745b6e616d653d2270697065225d27293b0d0a092474656d705f616374696f6e5f6c6973740909093d20242827235a4d53477261706869635f657874456469745f616374696f6e4c69737427293b0d0a092474656d705f696d675f636f6e7461696e657220093d20242827235a4d53477261706869635f657874456469745f696d61676527293b0d0a092474656d705f6c6162656c5f68697265730909093d20242827235a4d53477261706869635f657874456469745f696e666f5f686972657327293b0d0a092474656d705f6c6162656c5f7468756d620909093d20242827235a4d53477261706869635f657874456469745f696e666f5f7468756d6227293b0d0a092474656d705f7468756d625f636f6e7461696e6572093d20242827235a4d53477261706869635f657874456469745f7468756d625f696d6727293b0d0a092474656d705f7468756d625f68656967687409093d20242827235a4d53477261706869635f657874456469745f7468756d625f68656967687427293b0d0a092474656d705f7468756d625f77696474680909093d20242827235a4d53477261706869635f657874456469745f7468756d625f776964746827293b0d0a092474656d705f776f726b73706163655f64696d09093d20242827235a4d53477261706869635f657874456469745f776f726b737061636527293b0d0a090d0a092474656d705f627574746f6e735f6172726f7709093d20242827235a4d53477261706869635f657874456469745f647261775f6172726f775f63616e63656c2c20235a4d53477261706869635f657874456469745f647261775f6172726f775f6f6b27293b0d0a092474656d705f627574746f6e735f63726f7009093d20242827235a4d53477261706869635f657874456469745f63726f705f63616e63656c2c20235a4d53477261706869635f657874456469745f63726f705f6f6b27293b0d0a092474656d705f627574746f6e735f64696d0909093d20242827235a4d53477261706869635f657874456469745f64696d656e73696f6e5f63616e63656c2c20235a4d53477261706869635f657874456469745f64696d656e73696f6e5f6f6b27293b0d0a09696620287a6d73677261706869635f657874656469745f6861735f7375706572726573290d0a09092474656d705f627574746f6e735f6d61696e093d20242827235a4d53477261706869635f657874456469745f63726f702c20235a4d53477261706869635f657874456469745f64696d656e73696f6e2c20235a4d53477261706869635f657874456469745f666c69705f682c20235a4d53477261706869635f657874456469745f666c69705f762c2027202b0d0a090909090909090909090909090927235a4d53477261706869635f657874456469745f726573697a652c20235a4d53477261706869635f657874456469745f726f746174655f6d2c20235a4d53477261706869635f657874456469745f726f746174655f702c20235a4d53477261706869635f657874456469745f72657365742c2027202b0d0a090909090909090909090909090927235a4d53477261706869635f657874456469745f63726f705f68697265732c20235a4d53477261706869635f657874456469745f64726f705f736861646f772c20235a4d53477261706869635f657874456469745f647261775f6172726f772c2027202b0d0a090909090909090909090909090927235a4d53477261706869635f657874456469745f63616e63656c2c20235a4d53477261706869635f657874456469745f6f6b27293b0d0a09656c73650d0a097b0d0a09092474656d705f627574746f6e735f6d61696e093d20242827235a4d53477261706869635f657874456469745f63726f702c20235a4d53477261706869635f657874456469745f64696d656e73696f6e2c20235a4d53477261706869635f657874456469745f666c69705f682c20235a4d53477261706869635f657874456469745f666c69705f762c2027202b0d0a090909090909090909090909090927235a4d53477261706869635f657874456469745f726573697a652c20235a4d53477261706869635f657874456469745f726f746174655f6d2c20235a4d53477261706869635f657874456469745f726f746174655f702c2027202b0d0a090909090909090909090909090927235a4d53477261706869635f657874456469745f64726f705f736861646f772c20235a4d53477261706869635f657874456469745f647261775f6172726f772c20235a4d53477261706869635f657874456469745f63616e63656c2c20235a4d53477261706869635f657874456469745f6f6b27293b0d0a09090909090909090909090909090d0a09096368616e6765427574746f6e417661696c6162696c6974792866616c73652c20242827235a4d53477261706869635f657874456469745f72657365742c20235a4d53477261706869635f657874456469745f63726f705f686972657327292c2074727565293b0d0a097d0d0a09090d0a092474656d705f627574746f6e735f726573697a65093d20242827235a4d53477261706869635f657874456469745f726573697a655f63616e63656c2c20235a4d53477261706869635f657874456469745f726573697a655f6f6b27293b0d0a092474656d705f696e707574735f64696d0909093d20242827235a4d53477261706869635f657874456469745f7468756d625f64696d27293b0d0a090d0a096368616e6765427574746f6e417661696c6162696c69747928747275652c202474656d705f627574746f6e735f6d61696e293b0d0a096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f6172726f77293b0d0a096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f63726f70293b0d0a096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f64696d293b0d0a096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f627574746f6e735f726573697a65293b0d0a096368616e6765427574746f6e5669736962696c6974792866616c73652c202474656d705f696e707574735f64696d293b0d0a090d0a0967657441637444696d46726f6d517565756528696d675f696e666f293b0d0a7d293b</data></item>
21<item key="id"><![CDATA[handleEdit.js]]></item>
22<item key="mandatory" type="int">0</item>
23<item key="multilang" type="int">0</item>
24<item key="name"><![CDATA[handleEdit.js]]></item>
25<item key="repetitive" type="int">0</item>
26<item key="type"><![CDATA[resource]]></item>
27</dictionary>
28</item>
29<item type="dictionary"><dictionary>
30<item key="custom">
31<data content_type="text/x-c" filename="jquery.Jcrop.js" type="file"><![CDATA[/**
32 * jquery.Jcrop.js v0.9.8
33 * jQuery Image Cropping Plugin
34 * @author Kelly Hallman <khallman@gmail.com>
35 * Copyright (c) 2008-2009 Kelly Hallman - released under MIT License {{{
36 *
37 * Permission is hereby granted, free of charge, to any person
38 * obtaining a copy of this software and associated documentation
39 * files (the "Software"), to deal in the Software without
40 * restriction, including without limitation the rights to use,
41 * copy, modify, merge, publish, distribute, sublicense, and/or sell
42 * copies of the Software, and to permit persons to whom the
43 * Software is furnished to do so, subject to the following
44 * conditions:
45
46 * The above copyright notice and this permission notice shall be
47 * included in all copies or substantial portions of the Software.
48
49 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
50 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
51 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
52 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
53 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
54 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
55 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
56 * OTHER DEALINGS IN THE SOFTWARE.
57
58 * }}}
59 */
60
61(function($) {
62
63$.Jcrop = function(obj,opt)
64{
65        // Initialization {{{
66
67        // Sanitize some options {{{
68        var obj = obj, opt = opt;
69
70        if (typeof(obj) !== 'object') obj = $(obj)[0];
71        if (typeof(opt) !== 'object') opt = { };
72
73        // Some on-the-fly fixes for MSIE...sigh
74        if (!('trackDocument' in opt))
75        {
76                opt.trackDocument = $.browser.msie ? false : true;
77                if ($.browser.msie && $.browser.version.split('.')[0] == '8')
78                        opt.trackDocument = true;
79        }
80
81        if (!('keySupport' in opt))
82                        opt.keySupport = $.browser.msie ? false : true;
83               
84        // }}}
85        // Extend the default options {{{
86        var defaults = {
87
88                // Basic Settings
89                trackDocument:          false,
90                baseClass:                      'jcrop',
91                addClass:                       null,
92
93                // Styling Options
94                bgColor:                        'black',
95                bgOpacity:                      .6,
96                borderOpacity:          .4,
97                handleOpacity:          .5,
98
99                handlePad:                      5,
100                handleSize:                     9,
101                handleOffset:           5,
102                edgeMargin:                     14,
103
104                aspectRatio:            0,
105                keySupport:                     true,
106                cornerHandles:          true,
107                sideHandles:            true,
108                drawBorders:            true,
109                dragEdges:                      true,
110
111                boxWidth:                       0,
112                boxHeight:                      0,
113
114                boundary:                       8,
115                animationDelay:         20,
116                swingSpeed:                     3,
117
118                allowSelect:            true,
119                allowMove:                      true,
120                allowResize:            true,
121
122                minSelect:                      [ 0, 0 ],
123                maxSize:                        [ 0, 0 ],
124                minSize:                        [ 0, 0 ],
125
126                // Callbacks / Event Handlers
127                onChange: function() { },
128                onSelect: function() { }
129
130        };
131        var options = defaults;
132        setOptions(opt);
133
134        // }}}
135        // Initialize some jQuery objects {{{
136
137        var $origimg = $(obj);
138        var $img = $origimg.clone().removeAttr('id').css({ position: 'absolute' });
139
140        $img.width($origimg.width());
141        $img.height($origimg.height());
142        $origimg.after($img).hide();
143
144        presize($img,options.boxWidth,options.boxHeight);
145
146        var boundx = $img.width(),
147                boundy = $img.height(),
148
149                $div = $('<div />')
150                        .width(boundx).height(boundy)
151                        .addClass(cssClass('holder'))
152                        .css({
153                                position: 'relative',
154                                backgroundColor: options.bgColor
155                        }).insertAfter($origimg).append($img);
156        ;
157       
158        if (options.addClass) $div.addClass(options.addClass);
159        //$img.wrap($div);
160
161        var $img2 = $('<img />')/*{{{*/
162                        .attr('src',$img.attr('src'))
163                        .css('position','absolute')
164                        .width(boundx).height(boundy)
165        ;/*}}}*/
166        var $img_holder = $('<div />')/*{{{*/
167                .width(pct(100)).height(pct(100))
168                .css({
169                        zIndex: 310,
170                        position: 'absolute',
171                        overflow: 'hidden'
172                })
173                .append($img2)
174        ;/*}}}*/
175        var $hdl_holder = $('<div />')/*{{{*/
176                .width(pct(100)).height(pct(100))
177                .css('zIndex',320);
178        /*}}}*/
179        var $sel = $('<div />')/*{{{*/
180                .css({
181                        position: 'absolute',
182                        zIndex: 300
183                })
184                .insertBefore($img)
185                .append($img_holder,$hdl_holder)
186        ;/*}}}*/
187
188        var bound = options.boundary;
189        var $trk = newTracker().width(boundx+(bound*2)).height(boundy+(bound*2))
190                .css({ position: 'absolute', top: px(-bound), left: px(-bound), zIndex: 290 })
191                .mousedown(newSelection);       
192       
193        /* }}} */
194        // Set more variables {{{
195
196        var xlimit, ylimit, xmin, ymin;
197        var xscale, yscale, enabled = true;
198        var docOffset = getPos($img),
199                // Internal states
200                btndown, lastcurs, dimmed, animating,
201                shift_down;
202
203        // }}}
204               
205
206                // }}}
207        // Internal Modules {{{
208
209        var Coords = function()/*{{{*/
210        {
211                var x1 = 0, y1 = 0, x2 = 0, y2 = 0, ox, oy;
212
213                function setPressed(pos)/*{{{*/
214                {
215                        var pos = rebound(pos);
216                        x2 = x1 = pos[0];
217                        y2 = y1 = pos[1];
218                };
219                /*}}}*/
220                function setCurrent(pos)/*{{{*/
221                {
222                        var pos = rebound(pos);
223                        ox = pos[0] - x2;
224                        oy = pos[1] - y2;
225                        x2 = pos[0];
226                        y2 = pos[1];
227                };
228                /*}}}*/
229                function getOffset()/*{{{*/
230                {
231                        return [ ox, oy ];
232                };
233                /*}}}*/
234                function moveOffset(offset)/*{{{*/
235                {
236                        var ox = offset[0], oy = offset[1];
237
238                        if (0 > x1 + ox) ox -= ox + x1;
239                        if (0 > y1 + oy) oy -= oy + y1;
240
241                        if (boundy < y2 + oy) oy += boundy - (y2 + oy);
242                        if (boundx < x2 + ox) ox += boundx - (x2 + ox);
243
244                        x1 += ox;
245                        x2 += ox;
246                        y1 += oy;
247                        y2 += oy;
248                };
249                /*}}}*/
250                function getCorner(ord)/*{{{*/
251                {
252                        var c = getFixed();
253                        switch(ord)
254                        {
255                                case 'ne': return [ c.x2, c.y ];
256                                case 'nw': return [ c.x, c.y ];
257                                case 'se': return [ c.x2, c.y2 ];
258                                case 'sw': return [ c.x, c.y2 ];
259                        }
260                };
261                /*}}}*/
262                function getFixed()/*{{{*/
263                {
264                        if (!options.aspectRatio) return getRect();
265                        // This function could use some optimization I think...
266                        var aspect = options.aspectRatio,
267                                min_x = options.minSize[0]/xscale,
268                                min_y = options.minSize[1]/yscale,
269                                max_x = options.maxSize[0]/xscale,
270                                max_y = options.maxSize[1]/yscale,
271                                rw = x2 - x1,
272                                rh = y2 - y1,
273                                rwa = Math.abs(rw),
274                                rha = Math.abs(rh),
275                                real_ratio = rwa / rha,
276                                xx, yy
277                        ;
278                        if (max_x == 0) { max_x = boundx * 10 }
279                        if (max_y == 0) { max_y = boundy * 10 }
280                        if (real_ratio < aspect)
281                        {
282                                yy = y2;
283                                w = rha * aspect;
284                                xx = rw < 0 ? x1 - w : w + x1;
285
286                                if (xx < 0)
287                                {
288                                        xx = 0;
289                                        h = Math.abs((xx - x1) / aspect);
290                                        yy = rh < 0 ? y1 - h: h + y1;
291                                }
292                                else if (xx > boundx)
293                                {
294                                        xx = boundx;
295                                        h = Math.abs((xx - x1) / aspect);
296                                        yy = rh < 0 ? y1 - h : h + y1;
297                                }
298                        }
299                        else
300                        {
301                                xx = x2;
302                                h = rwa / aspect;
303                                yy = rh < 0 ? y1 - h : y1 + h;
304                                if (yy < 0)
305                                {
306                                        yy = 0;
307                                        w = Math.abs((yy - y1) * aspect);
308                                        xx = rw < 0 ? x1 - w : w + x1;
309                                }
310                                else if (yy > boundy)
311                                {
312                                        yy = boundy;
313                                        w = Math.abs(yy - y1) * aspect;
314                                        xx = rw < 0 ? x1 - w : w + x1;
315                                }
316                        }
317
318                        // Magic %-)
319                        if(xx > x1) { // right side
320                          if(xx - x1 < min_x) {
321                                xx = x1 + min_x;
322                          } else if (xx - x1 > max_x) {
323                                xx = x1 + max_x;
324                          }
325                          if(yy > y1) {
326                                yy = y1 + (xx - x1)/aspect;
327                          } else {
328                                yy = y1 - (xx - x1)/aspect;
329                          }
330                        } else if (xx < x1) { // left side
331                          if(x1 - xx < min_x) {
332                                xx = x1 - min_x
333                          } else if (x1 - xx > max_x) {
334                                xx = x1 - max_x;
335                          }
336                          if(yy > y1) {
337                                yy = y1 + (x1 - xx)/aspect;
338                          } else {
339                                yy = y1 - (x1 - xx)/aspect;
340                          }
341                        }
342
343                        if(xx < 0) {
344                                x1 -= xx;
345                                xx = 0;
346                        } else  if (xx > boundx) {
347                                x1 -= xx - boundx;
348                                xx = boundx;
349                        }
350
351                        if(yy < 0) {
352                                y1 -= yy;
353                                yy = 0;
354                        } else  if (yy > boundy) {
355                                y1 -= yy - boundy;
356                                yy = boundy;
357                        }
358
359                        return last = makeObj(flipCoords(x1,y1,xx,yy));
360                };
361                /*}}}*/
362                function rebound(p)/*{{{*/
363                {
364                        if (p[0] < 0) p[0] = 0;
365                        if (p[1] < 0) p[1] = 0;
366
367                        if (p[0] > boundx) p[0] = boundx;
368                        if (p[1] > boundy) p[1] = boundy;
369
370                        return [ p[0], p[1] ];
371                };
372                /*}}}*/
373                function flipCoords(x1,y1,x2,y2)/*{{{*/
374                {
375                        var xa = x1, xb = x2, ya = y1, yb = y2;
376                        if (x2 < x1)
377                        {
378                                xa = x2;
379                                xb = x1;
380                        }
381                        if (y2 < y1)
382                        {
383                                ya = y2;
384                                yb = y1;
385                        }
386                        return [ Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb) ];
387                };
388                /*}}}*/
389                function getRect()/*{{{*/
390                {
391                        var xsize = x2 - x1;
392                        var ysize = y2 - y1;
393
394                        if (xlimit && (Math.abs(xsize) > xlimit))
395                                x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit);
396                        if (ylimit && (Math.abs(ysize) > ylimit))
397                                y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit);
398
399                        if (ymin && (Math.abs(ysize) < ymin))
400                                y2 = (ysize > 0) ? (y1 + ymin) : (y1 - ymin);
401                        if (xmin && (Math.abs(xsize) < xmin))
402                                x2 = (xsize > 0) ? (x1 + xmin) : (x1 - xmin);
403
404                        if (x1 < 0) { x2 -= x1; x1 -= x1; }
405                        if (y1 < 0) { y2 -= y1; y1 -= y1; }
406                        if (x2 < 0) { x1 -= x2; x2 -= x2; }
407                        if (y2 < 0) { y1 -= y2; y2 -= y2; }
408                        if (x2 > boundx) { var delta = x2 - boundx; x1 -= delta; x2 -= delta; }
409                        if (y2 > boundy) { var delta = y2 - boundy; y1 -= delta; y2 -= delta; }
410                        if (x1 > boundx) { var delta = x1 - boundy; y2 -= delta; y1 -= delta; }
411                        if (y1 > boundy) { var delta = y1 - boundy; y2 -= delta; y1 -= delta; }
412
413                        return makeObj(flipCoords(x1,y1,x2,y2));
414                };
415                /*}}}*/
416                function makeObj(a)/*{{{*/
417                {
418                        return { x: a[0], y: a[1], x2: a[2], y2: a[3],
419                                w: a[2] - a[0], h: a[3] - a[1] };
420                };
421                /*}}}*/
422
423                return {
424                        flipCoords: flipCoords,
425                        setPressed: setPressed,
426                        setCurrent: setCurrent,
427                        getOffset: getOffset,
428                        moveOffset: moveOffset,
429                        getCorner: getCorner,
430                        getFixed: getFixed
431                };
432        }();
433
434        /*}}}*/
435        var Selection = function()/*{{{*/
436        {
437                var start, end, dragmode, awake, hdep = 370;
438                var borders = { };
439                var handle = { };
440                var seehandles = false;
441                var hhs = options.handleOffset;
442
443                /* Insert draggable elements {{{*/
444
445                // Insert border divs for outline
446                if (options.drawBorders) {
447                        borders = {
448                                        top: insertBorder('hline')
449                                                .css('top',$.browser.msie?px(-1):px(0)),
450                                        bottom: insertBorder('hline'),
451                                        left: insertBorder('vline'),
452                                        right: insertBorder('vline')
453                        };
454                }
455
456                // Insert handles on edges
457                if (options.dragEdges) {
458                        handle.t = insertDragbar('n');
459                        handle.b = insertDragbar('s');
460                        handle.r = insertDragbar('e');
461                        handle.l = insertDragbar('w');
462                }
463
464                // Insert side handles
465                options.sideHandles &&
466                        createHandles(['n','s','e','w']);
467
468                // Insert corner handles
469                options.cornerHandles &&
470                        createHandles(['sw','nw','ne','se']);
471
472                /*}}}*/
473                // Private Methods
474                function insertBorder(type)/*{{{*/
475                {
476                        var jq = $('<div />')
477                                .css({position: 'absolute', opacity: options.borderOpacity })
478                                .addClass(cssClass(type));
479                        $img_holder.append(jq);
480                        return jq;
481                };
482                /*}}}*/
483                function dragDiv(ord,zi)/*{{{*/
484                {
485                        var jq = $('<div />')
486                                .mousedown(createDragger(ord))
487                                .css({
488                                        cursor: ord+'-resize',
489                                        position: 'absolute',
490                                        zIndex: zi
491                                })
492                        ;
493                        $hdl_holder.append(jq);
494                        return jq;
495                };
496                /*}}}*/
497                function insertHandle(ord)/*{{{*/
498                {
499                        return dragDiv(ord,hdep++)
500                                .css({ top: px(-hhs+1), left: px(-hhs+1), opacity: options.handleOpacity })
501                                .addClass(cssClass('handle'));
502                };
503                /*}}}*/
504                function insertDragbar(ord)/*{{{*/
505                {
506                        var s = options.handleSize,
507                                o = hhs,
508                                h = s, w = s,
509                                t = o, l = o;
510
511                        switch(ord)
512                        {
513                                case 'n': case 's': w = pct(100); break;
514                                case 'e': case 'w': h = pct(100); break;
515                        }
516
517                        return dragDiv(ord,hdep++).width(w).height(h)
518                                .css({ top: px(-t+1), left: px(-l+1)});
519                };
520                /*}}}*/
521                function createHandles(li)/*{{{*/
522                {
523                        for(i in li) handle[li[i]] = insertHandle(li[i]);
524                };
525                /*}}}*/
526                function moveHandles(c)/*{{{*/
527                {
528                        var midvert  = Math.round((c.h / 2) - hhs),
529                                midhoriz = Math.round((c.w / 2) - hhs),
530                                north = west = -hhs+1,
531                                east = c.w - hhs,
532                                south = c.h - hhs,
533                                x, y;
534
535                        'e' in handle &&
536                                handle.e.css({ top: px(midvert), left: px(east) }) &&
537                                handle.w.css({ top: px(midvert) }) &&
538                                handle.s.css({ top: px(south), left: px(midhoriz) }) &&
539                                handle.n.css({ left: px(midhoriz) });
540
541                        'ne' in handle &&
542                                handle.ne.css({ left: px(east) }) &&
543                                handle.se.css({ top: px(south), left: px(east) }) &&
544                                handle.sw.css({ top: px(south) });
545
546                        'b' in handle &&
547                                handle.b.css({ top: px(south) }) &&
548                                handle.r.css({ left: px(east) });
549                };
550                /*}}}*/
551                function moveto(x,y)/*{{{*/
552                {
553                        $img2.css({ top: px(-y), left: px(-x) });
554                        $sel.css({ top: px(y), left: px(x) });
555                };
556                /*}}}*/
557                function resize(w,h)/*{{{*/
558                {
559                        $sel.width(w).height(h);
560                };
561                /*}}}*/
562                function refresh()/*{{{*/
563                {
564                        var c = Coords.getFixed();
565
566                        Coords.setPressed([c.x,c.y]);
567                        Coords.setCurrent([c.x2,c.y2]);
568
569                        updateVisible();
570                };
571                /*}}}*/
572
573                // Internal Methods
574                function updateVisible()/*{{{*/
575                        { if (awake) return update(); };
576                /*}}}*/
577                function update()/*{{{*/
578                {
579                        var c = Coords.getFixed();
580
581                        resize(c.w,c.h);
582                        moveto(c.x,c.y);
583
584                        options.drawBorders &&
585                                borders['right'].css({ left: px(c.w-1) }) &&
586                                        borders['bottom'].css({ top: px(c.h-1) });
587
588                        seehandles && moveHandles(c);
589                        awake || show();
590
591                        options.onChange(unscale(c));
592                };
593                /*}}}*/
594                function show()/*{{{*/
595                {
596                        $sel.show();
597                        $img.css('opacity',options.bgOpacity);
598                        awake = true;
599                };
600                /*}}}*/
601                function release()/*{{{*/
602                {
603                        disableHandles();
604                        $sel.hide();
605                        $img.css('opacity',1);
606                        awake = false;
607                };
608                /*}}}*/
609                function showHandles()//{{{
610                {
611                        if (seehandles)
612                        {
613                                moveHandles(Coords.getFixed());
614                                $hdl_holder.show();
615                        }
616                };
617                //}}}
618                function enableHandles()/*{{{*/
619                {
620                        seehandles = true;
621                        if (options.allowResize)
622                        {
623                                moveHandles(Coords.getFixed());
624                                $hdl_holder.show();
625                                return true;
626                        }
627                };
628                /*}}}*/
629                function disableHandles()/*{{{*/
630                {
631                        seehandles = false;
632                        $hdl_holder.hide();
633                };
634                /*}}}*/
635                function animMode(v)/*{{{*/
636                {
637                        (animating = v) ? disableHandles(): enableHandles();
638                };
639                /*}}}*/
640                function done()/*{{{*/
641                {
642                        animMode(false);
643                        refresh();
644                };
645                /*}}}*/
646
647                var $track = newTracker().mousedown(createDragger('move'))
648                                .css({ cursor: 'move', position: 'absolute', zIndex: 360 })
649
650                $img_holder.append($track);
651                disableHandles();
652
653                return {
654                        updateVisible: updateVisible,
655                        update: update,
656                        release: release,
657                        refresh: refresh,
658                        setCursor: function (cursor) { $track.css('cursor',cursor); },
659                        enableHandles: enableHandles,
660                        enableOnly: function() { seehandles = true; },
661                        showHandles: showHandles,
662                        disableHandles: disableHandles,
663                        animMode: animMode,
664                        done: done
665                };
666        }();
667        /*}}}*/
668        var Tracker = function()/*{{{*/
669        {
670                var onMove              = function() { },
671                        onDone          = function() { },
672                        trackDoc        = options.trackDocument;
673
674                if (!trackDoc)
675                {
676                        $trk
677                                .mousemove(trackMove)
678                                .mouseup(trackUp)
679                                .mouseout(trackUp)
680                        ;
681                }
682
683                function toFront()/*{{{*/
684                {
685                        $trk.css({zIndex:450});
686                        if (trackDoc)
687                        {
688                                $(document)
689                                        .mousemove(trackMove)
690                                        .mouseup(trackUp)
691                                ;
692                        }
693                }
694                /*}}}*/
695                function toBack()/*{{{*/
696                {
697                        $trk.css({zIndex:290});
698                        if (trackDoc)
699                        {
700                                $(document)
701                                        .unbind('mousemove',trackMove)
702                                        .unbind('mouseup',trackUp)
703                                ;
704                        }
705                }
706                /*}}}*/
707                function trackMove(e)/*{{{*/
708                {
709                        onMove(mouseAbs(e));
710                };
711                /*}}}*/
712                function trackUp(e)/*{{{*/
713                {
714                        e.preventDefault();
715                        e.stopPropagation();
716
717                        if (btndown)
718                        {
719                                btndown = false;
720
721                                onDone(mouseAbs(e));
722                                options.onSelect(unscale(Coords.getFixed()));
723                                toBack();
724                                onMove = function() { };
725                                onDone = function() { };
726                        }
727
728                        return false;
729                };
730                /*}}}*/
731
732                function activateHandlers(move,done)/* {{{ */
733                {
734                        btndown = true;
735                        onMove = move;
736                        onDone = done;
737                        toFront();
738                        return false;
739                };
740                /* }}} */
741
742                function setCursor(t) { $trk.css('cursor',t); };
743
744                $img.before($trk);
745                return {
746                        activateHandlers: activateHandlers,
747                        setCursor: setCursor
748                };
749        }();
750        /*}}}*/
751        var KeyManager = function()/*{{{*/
752        {
753                var $keymgr = $('<input type="radio" />')
754                                .css({ position: 'absolute', left: '-30px' })
755                                .keypress(parseKey)
756                                .blur(onBlur),
757
758                        $keywrap = $('<div />')
759                                .css({
760                                        position: 'absolute',
761                                        overflow: 'hidden'
762                                })
763                                .append($keymgr)
764                ;
765
766                function watchKeys()/*{{{*/
767                {
768                        if (options.keySupport)
769                        {
770                                $keymgr.show();
771                                $keymgr.focus();
772                        }
773                };
774                /*}}}*/
775                function onBlur(e)/*{{{*/
776                {
777                        $keymgr.hide();
778                };
779                /*}}}*/
780                function doNudge(e,x,y)/*{{{*/
781                {
782                        if (options.allowMove) {
783                                Coords.moveOffset([x,y]);
784                                Selection.updateVisible();
785                        };
786                        e.preventDefault();
787                        e.stopPropagation();
788                };
789                /*}}}*/
790                function parseKey(e)/*{{{*/
791                {
792                        if (e.ctrlKey) return true;
793                        shift_down = e.shiftKey ? true : false;
794                        var nudge = shift_down ? 10 : 1;
795                        switch(e.keyCode)
796                        {
797                                case 37: doNudge(e,-nudge,0); break;
798                                case 39: doNudge(e,nudge,0); break;
799                                case 38: doNudge(e,0,-nudge); break;
800                                case 40: doNudge(e,0,nudge); break;
801
802                                case 27: Selection.release(); break;
803
804                                case 9: return true;
805                        }
806
807                        return nothing(e);
808                };
809                /*}}}*/
810               
811                if (options.keySupport) $keywrap.insertBefore($img);
812                return {
813                        watchKeys: watchKeys
814                };
815        }();
816        /*}}}*/
817
818        // }}}
819        // Internal Methods {{{
820
821        function px(n) { return '' + parseInt(n) + 'px'; };
822        function pct(n) { return '' + parseInt(n) + '%'; };
823        function cssClass(cl) { return options.baseClass + '-' + cl; };
824        function getPos(obj)/*{{{*/
825        {
826                // Updated in v0.9.4 to use built-in dimensions plugin
827                var pos = $(obj).offset();
828                return [ pos.left, pos.top ];
829        };
830        /*}}}*/
831        function mouseAbs(e)/*{{{*/
832        {
833                return [ (e.pageX - docOffset[0]), (e.pageY - docOffset[1]) ];
834        };
835        /*}}}*/
836        function myCursor(type)/*{{{*/
837        {
838                if (type != lastcurs)
839                {
840                        Tracker.setCursor(type);
841                        //Handles.xsetCursor(type);
842                        lastcurs = type;
843                }
844        };
845        /*}}}*/
846        function startDragMode(mode,pos)/*{{{*/
847        {
848                docOffset = getPos($img);
849                Tracker.setCursor(mode=='move'?mode:mode+'-resize');
850
851                if (mode == 'move')
852                        return Tracker.activateHandlers(createMover(pos), doneSelect);
853
854                var fc = Coords.getFixed();
855                var opp = oppLockCorner(mode);
856                var opc = Coords.getCorner(oppLockCorner(opp));
857
858                Coords.setPressed(Coords.getCorner(opp));
859                Coords.setCurrent(opc);
860
861                Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);
862        };
863        /*}}}*/
864        function dragmodeHandler(mode,f)/*{{{*/
865        {
866                return function(pos) {
867                        if (!options.aspectRatio) switch(mode)
868                        {
869                                case 'e': pos[1] = f.y2; break;
870                                case 'w': pos[1] = f.y2; break;
871                                case 'n': pos[0] = f.x2; break;
872                                case 's': pos[0] = f.x2; break;
873                        }
874                        else switch(mode)
875                        {
876                                case 'e': pos[1] = f.y+1; break;
877                                case 'w': pos[1] = f.y+1; break;
878                                case 'n': pos[0] = f.x+1; break;
879                                case 's': pos[0] = f.x+1; break;
880                        }
881                        Coords.setCurrent(pos);
882                        Selection.update();
883                };
884        };
885        /*}}}*/
886        function createMover(pos)/*{{{*/
887        {
888                var lloc = pos;
889                KeyManager.watchKeys();
890
891                return function(pos)
892                {
893                        Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]);
894                        lloc = pos;
895                       
896                        Selection.update();
897                };
898        };
899        /*}}}*/
900        function oppLockCorner(ord)/*{{{*/
901        {
902                switch(ord)
903                {
904                        case 'n': return 'sw';
905                        case 's': return 'nw';
906                        case 'e': return 'nw';
907                        case 'w': return 'ne';
908                        case 'ne': return 'sw';
909                        case 'nw': return 'se';
910                        case 'se': return 'nw';
911                        case 'sw': return 'ne';
912                };
913        };
914        /*}}}*/
915        function createDragger(ord)/*{{{*/
916        {
917                return function(e) {
918                        if (options.disabled) return false;
919                        if ((ord == 'move') && !options.allowMove) return false;
920                        btndown = true;
921                        startDragMode(ord,mouseAbs(e));
922                        e.stopPropagation();
923                        e.preventDefault();
924                        return false;
925                };
926        };
927        /*}}}*/
928        function presize($obj,w,h)/*{{{*/
929        {
930                var nw = $obj.width(), nh = $obj.height();
931                if ((nw > w) && w > 0)
932                {
933                        nw = w;
934                        nh = (w/$obj.width()) * $obj.height();
935                }
936                if ((nh > h) && h > 0)
937                {
938                        nh = h;
939                        nw = (h/$obj.height()) * $obj.width();
940                }
941                xscale = $obj.width() / nw;
942                yscale = $obj.height() / nh;
943                $obj.width(nw).height(nh);
944        };
945        /*}}}*/
946        function unscale(c)/*{{{*/
947        {
948                return {
949                        x: parseInt(c.x * xscale), y: parseInt(c.y * yscale),
950                        x2: parseInt(c.x2 * xscale), y2: parseInt(c.y2 * yscale),
951                        w: parseInt(c.w * xscale), h: parseInt(c.h * yscale)
952                };
953        };
954        /*}}}*/
955        function doneSelect(pos)/*{{{*/
956        {
957                var c = Coords.getFixed();
958                if (c.w > options.minSelect[0] && c.h > options.minSelect[1])
959                {
960                        Selection.enableHandles();
961                        Selection.done();
962                }
963                else
964                {
965                        Selection.release();
966                }
967                Tracker.setCursor( options.allowSelect?'crosshair':'default' );
968        };
969        /*}}}*/
970        function newSelection(e)/*{{{*/
971        {
972                if (options.disabled) return false;
973                if (!options.allowSelect) return false;
974                btndown = true;
975                docOffset = getPos($img);
976                Selection.disableHandles();
977                myCursor('crosshair');
978                var pos = mouseAbs(e);
979                Coords.setPressed(pos);
980                Tracker.activateHandlers(selectDrag,doneSelect);
981                KeyManager.watchKeys();
982                Selection.update();
983
984                e.stopPropagation();
985                e.preventDefault();
986                return false;
987        };
988        /*}}}*/
989        function selectDrag(pos)/*{{{*/
990        {
991                Coords.setCurrent(pos);
992                Selection.update();
993        };
994        /*}}}*/
995        function newTracker()
996        {
997                var trk = $('<div></div>').addClass(cssClass('tracker'));
998                $.browser.msie && trk.css({ opacity: 0, backgroundColor: 'white' });
999                return trk;
1000        };
1001
1002        // }}}
1003        // API methods {{{
1004               
1005        function animateTo(a)/*{{{*/
1006        {
1007                var x1 = a[0] / xscale,
1008                        y1 = a[1] / yscale,
1009                        x2 = a[2] / xscale,
1010                        y2 = a[3] / yscale;
1011
1012                if (animating) return;
1013
1014                var animto = Coords.flipCoords(x1,y1,x2,y2);
1015                var c = Coords.getFixed();
1016                var animat = initcr = [ c.x, c.y, c.x2, c.y2 ];
1017                var interv = options.animationDelay;
1018
1019                var x = animat[0];
1020                var y = animat[1];
1021                var x2 = animat[2];
1022                var y2 = animat[3];
1023                var ix1 = animto[0] - initcr[0];
1024                var iy1 = animto[1] - initcr[1];
1025                var ix2 = animto[2] - initcr[2];
1026                var iy2 = animto[3] - initcr[3];
1027                var pcent = 0;
1028                var velocity = options.swingSpeed;
1029
1030                Selection.animMode(true);
1031
1032                var animator = function()
1033                {
1034                        return function()
1035                        {
1036                                pcent += (100 - pcent) / velocity;
1037
1038                                animat[0] = x + ((pcent / 100) * ix1);
1039                                animat[1] = y + ((pcent / 100) * iy1);
1040                                animat[2] = x2 + ((pcent / 100) * ix2);
1041                                animat[3] = y2 + ((pcent / 100) * iy2);
1042
1043                                if (pcent < 100) animateStart();
1044                                        else Selection.done();
1045
1046                                if (pcent >= 99.8) pcent = 100;
1047
1048                                setSelectRaw(animat);
1049                        };
1050                }();
1051
1052                function animateStart()
1053                        { window.setTimeout(animator,interv); };
1054
1055                animateStart();
1056        };
1057        /*}}}*/
1058        function setSelect(rect)//{{{
1059        {
1060                setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]);
1061        };
1062        //}}}
1063        function setSelectRaw(l) /*{{{*/
1064        {
1065                Coords.setPressed([l[0],l[1]]);
1066                Coords.setCurrent([l[2],l[3]]);
1067                Selection.update();
1068        };
1069        /*}}}*/
1070        function setOptions(opt)/*{{{*/
1071        {
1072                if (typeof(opt) != 'object') opt = { };
1073                options = $.extend(options,opt);
1074
1075                if (typeof(options.onChange)!=='function')
1076                        options.onChange = function() { };
1077
1078                if (typeof(options.onSelect)!=='function')
1079                        options.onSelect = function() { };
1080
1081        };
1082        /*}}}*/
1083        function tellSelect()/*{{{*/
1084        {
1085                return unscale(Coords.getFixed());
1086        };
1087        /*}}}*/
1088        function tellScaled()/*{{{*/
1089        {
1090                return Coords.getFixed();
1091        };
1092        /*}}}*/
1093        function setOptionsNew(opt)/*{{{*/
1094        {
1095                setOptions(opt);
1096                interfaceUpdate();
1097        };
1098        /*}}}*/
1099        function disableCrop()//{{{
1100        {
1101                options.disabled = true;
1102                Selection.disableHandles();
1103                Selection.setCursor('default');
1104                Tracker.setCursor('default');
1105        };
1106        //}}}
1107        function enableCrop()//{{{
1108        {
1109                options.disabled = false;
1110                interfaceUpdate();
1111        };
1112        //}}}
1113        function cancelCrop()//{{{
1114        {
1115                Selection.done();
1116                Tracker.activateHandlers(null,null);
1117        };
1118        //}}}
1119        function destroy()//{{{
1120        {
1121                $div.remove();
1122                $origimg.show();
1123        };
1124        //}}}
1125
1126        function interfaceUpdate(alt)//{{{
1127        // This method tweaks the interface based on options object.
1128        // Called when options are changed and at end of initialization.
1129        {
1130                options.allowResize ?
1131                        alt?Selection.enableOnly():Selection.enableHandles():
1132                        Selection.disableHandles();
1133
1134                Tracker.setCursor( options.allowSelect? 'crosshair': 'default' );
1135                Selection.setCursor( options.allowMove? 'move': 'default' );
1136
1137                $div.css('backgroundColor',options.bgColor);
1138
1139                if ('setSelect' in options) {
1140                        setSelect(opt.setSelect);
1141                        Selection.done();
1142                        delete(options.setSelect);
1143                }
1144
1145                if ('trueSize' in options) {
1146                        xscale = options.trueSize[0] / boundx;
1147                        yscale = options.trueSize[1] / boundy;
1148                }
1149
1150                xlimit = options.maxSize[0] || 0;
1151                ylimit = options.maxSize[1] || 0;
1152                xmin = options.minSize[0] || 0;
1153                ymin = options.minSize[1] || 0;
1154
1155                if ('outerImage' in options)
1156                {
1157                        $img.attr('src',options.outerImage);
1158                        delete(options.outerImage);
1159                }
1160
1161                Selection.refresh();
1162        };
1163        //}}}
1164
1165        // }}}
1166
1167        $hdl_holder.hide();
1168        interfaceUpdate(true);
1169       
1170        var api = {
1171                animateTo: animateTo,
1172                setSelect: setSelect,
1173                setOptions: setOptionsNew,
1174                tellSelect: tellSelect,
1175                tellScaled: tellScaled,
1176
1177                disable: disableCrop,
1178                enable: enableCrop,
1179                cancel: cancelCrop,
1180
1181                focus: KeyManager.watchKeys,
1182
1183                getBounds: function() { return [ boundx * xscale, boundy * yscale ]; },
1184                getWidgetSize: function() { return [ boundx, boundy ]; },
1185
1186                release: Selection.release,
1187                destroy: destroy
1188
1189        };
1190
1191        $origimg.data('Jcrop',api);
1192        return api;
1193};
1194
1195$.fn.Jcrop = function(options)/*{{{*/
1196{
1197        function attachWhenDone(from)/*{{{*/
1198        {
1199                var loadsrc = options.useImg || from.src;
1200                var img = new Image();
1201                img.onload = function() { $.Jcrop(from,options); };
1202                img.src = loadsrc;
1203        };
1204        /*}}}*/
1205        if (typeof(options) !== 'object') options = { };
1206
1207        // Iterate over each object, attach Jcrop
1208        this.each(function()
1209        {
1210                // If we've already attached to this object
1211                if ($(this).data('Jcrop'))
1212                {
1213                        // The API can be requested this way (undocumented)
1214                        if (options == 'api') return $(this).data('Jcrop');
1215                        // Otherwise, we just reset the options...
1216                        else $(this).data('Jcrop').setOptions(options);
1217                }
1218                // If we haven't been attached, preload and attach
1219                else attachWhenDone(this);
1220        });
1221
1222        // Return "this" so we're chainable a la jQuery plugin-style!
1223        return this;
1224};
1225/*}}}*/
1226
1227})(jQuery);
1228]]></data></item>
1229<item key="id"><![CDATA[jquery.Jcrop.js]]></item>
1230<item key="mandatory" type="int">0</item>
1231<item key="multilang" type="int">0</item>
1232<item key="name"><![CDATA[jquery.Jcrop.js]]></item>
1233<item key="repetitive" type="int">0</item>
1234<item key="type"><![CDATA[resource]]></item>
1235</dictionary>
1236</item>
1237<item type="dictionary"><dictionary>
1238<item key="custom">
1239<data content_type="text/css" filename="jcrop.css" type="file"><![CDATA[/* Fixes issue here http://code.google.com/p/jcrop/issues/detail?id=1 */
1240.jcrop-holder { text-align: left; }
1241
1242.jcrop-vline, .jcrop-hline
1243{
1244        font-size: 0;
1245        position: absolute;
1246        background: white url('metaobj_manager/ZMSMediaPlayerLib.Jcrop.gif') top left repeat;
1247}
1248.jcrop-vline { height: 100%; width: 1px !important; }
1249.jcrop-hline { width: 100%; height: 1px !important; }
1250.jcrop-handle {
1251        font-size: 1px;
1252        width: 7px !important;
1253        height: 7px !important;
1254        border: 1px #eee solid;
1255        background-color: #333;
1256        *width: 9px;
1257        *height: 9px;
1258}
1259
1260.jcrop-tracker { width: 100%; height: 100%; }
1261
1262.custom .jcrop-vline,
1263.custom .jcrop-hline
1264{
1265        background: yellow;
1266}
1267.custom .jcrop-handle
1268{
1269        border-color: black;
1270        background-color: #C7BB00;
1271        -moz-border-radius: 3px;
1272        -webkit-border-radius: 3px;
1273}
1274]]></data></item>
1275<item key="id"><![CDATA[jcrop.css]]></item>
1276<item key="mandatory" type="int">0</item>
1277<item key="multilang" type="int">0</item>
1278<item key="name"><![CDATA[jcrop.css]]></item>
1279<item key="repetitive" type="int">0</item>
1280<item key="type"><![CDATA[resource]]></item>
1281</dictionary>
1282</item>
1283<item type="dictionary"><dictionary>
1284<item key="custom">
1285<data content_type="text/x-c" filename="jquery.svg.min.js" type="file"><![CDATA[/* http://keith-wood.name/svg.html
1286   SVG for jQuery v1.4.3.
1287   Written by Keith Wood (kbwood{at}iinet.com.au) August 2007.
1288   Dual licensed under the GPL (http://dev.jquery.com/browser/trunk/jquery/GPL-LICENSE.txt) and
1289   MIT (http://dev.jquery.com/browser/trunk/jquery/MIT-LICENSE.txt) licenses.
1290   Please attribute the author if you use it. */
1291(function($){function SVGManager(){this._settings=[];this._extensions=[];this.regional=[];this.regional['']={errorLoadingText:'Error loading',notSupportedText:'This browser does not support SVG'};this.local=this.regional[''];this._uuid=new Date().getTime();this._renesis=detectActiveX('RenesisX.RenesisCtrl')}function detectActiveX(a){try{return!!(window.ActiveXObject&&new ActiveXObject(a))}catch(e){return false}}var p='svgwrapper';$.extend(SVGManager.prototype,{markerClassName:'hasSVG',svgNS:'http://www.w3.org/2000/svg',xlinkNS:'http://www.w3.org/1999/xlink',_wrapperClass:SVGWrapper,_attrNames:{class_:'class',in_:'in',alignmentBaseline:'alignment-baseline',baselineShift:'baseline-shift',clipPath:'clip-path',clipRule:'clip-rule',colorInterpolation:'color-interpolation',colorInterpolationFilters:'color-interpolation-filters',colorRendering:'color-rendering',dominantBaseline:'dominant-baseline',enableBackground:'enable-background',fillOpacity:'fill-opacity',fillRule:'fill-rule',floodColor:'flood-color',floodOpacity:'flood-opacity',fontFamily:'font-family',fontSize:'font-size',fontSizeAdjust:'font-size-adjust',fontStretch:'font-stretch',fontStyle:'font-style',fontVariant:'font-variant',fontWeight:'font-weight',glyphOrientationHorizontal:'glyph-orientation-horizontal',glyphOrientationVertical:'glyph-orientation-vertical',horizAdvX:'horiz-adv-x',horizOriginX:'horiz-origin-x',imageRendering:'image-rendering',letterSpacing:'letter-spacing',lightingColor:'lighting-color',markerEnd:'marker-end',markerMid:'marker-mid',markerStart:'marker-start',stopColor:'stop-color',stopOpacity:'stop-opacity',strikethroughPosition:'strikethrough-position',strikethroughThickness:'strikethrough-thickness',strokeDashArray:'stroke-dasharray',strokeDashOffset:'stroke-dashoffset',strokeLineCap:'stroke-linecap',strokeLineJoin:'stroke-linejoin',strokeMiterLimit:'stroke-miterlimit',strokeOpacity:'stroke-opacity',strokeWidth:'stroke-width',textAnchor:'text-anchor',textDecoration:'text-decoration',textRendering:'text-rendering',underlinePosition:'underline-position',underlineThickness:'underline-thickness',vertAdvY:'vert-adv-y',vertOriginY:'vert-origin-y',wordSpacing:'word-spacing',writingMode:'writing-mode'},_attachSVG:function(a,b){var c=(a.namespaceURI==this.svgNS?a:null);var a=(c?null:a);if($(a||c).hasClass(this.markerClassName)){return}if(typeof b=='string'){b={loadURL:b}}else if(typeof b=='function'){b={onLoad:b}}$(a||c).addClass(this.markerClassName);try{if(!c){c=document.createElementNS(this.svgNS,'svg');c.setAttribute('version','1.1');c.setAttribute('width',a.clientWidth);c.setAttribute('height',a.clientHeight);a.appendChild(c)}this._afterLoad(a,c,b||{})}catch(e){if($.browser.msie){if(!a.id){a.id='svg'+(this._uuid++)}this._settings[a.id]=b;a.innerHTML='<embed type="image/svg+xml" width="100%" '+'height="100%" src="'+(b.initPath||'')+'blank.svg"/>'}else{a.innerHTML='<p class="svg_error">'+this.local.notSupportedText+'</p>'}}},_registerSVG:function(){for(var i=0;i<document.embeds.length;i++){var a=document.embeds[i].parentNode;if(!$(a).hasClass($.svg.markerClassName)||$.data(a,p)){continue}var b=null;try{b=document.embeds[i].getSVGDocument()}catch(e){setTimeout($.svg._registerSVG,250);return}b=(b?b.documentElement:null);if(b){$.svg._afterLoad(a,b)}}},_afterLoad:function(a,b,c){var c=c||this._settings[a.id];this._settings[a?a.id:'']=null;var d=new this._wrapperClass(b,a);$.data(a||b,p,d);try{if(c.loadURL){d.load(c.loadURL,c)}if(c.settings){d.configure(c.settings)}if(c.onLoad&&!c.loadURL){c.onLoad.apply(a||b,[d])}}catch(e){alert(e)}},_getSVG:function(a){a=(typeof a=='string'?$(a)[0]:(a.jquery?a[0]:a));return $.data(a,p)},_destroySVG:function(a){var b=$(a);if(!b.hasClass(this.markerClassName)){return}b.removeClass(this.markerClassName);if(a.namespaceURI!=this.svgNS){b.empty()}$.removeData(a,p)},addExtension:function(a,b){this._extensions.push([a,b])}});function SVGWrapper(a,b){this._svg=a;this._container=b;for(var i=0;i<$.svg._extensions.length;i++){var c=$.svg._extensions[i];this[c[0]]=new c[1](this)}}$.extend(SVGWrapper.prototype,{_width:function(){return(this._container?this._container.clientWidth:this._svg.width)},_height:function(){return(this._container?this._container.clientHeight:this._svg.height)},root:function(){return this._svg},configure:function(a,b){if(b){for(var i=this._svg.attributes.length-1;i>=0;i--){var c=this._svg.attributes.item(i);if(!(c.nodeName=='onload'||c.nodeName=='version'||c.nodeName.substring(0,5)=='xmlns')){this._svg.attributes.removeNamedItem(c.nodeName)}}}for(var d in a){this._svg.setAttribute(d,a[d])}return this},getElementById:function(a){return this._svg.ownerDocument.getElementById(a)},change:function(a,b){if(a){for(var c in b){if(b[c]==null){a.removeAttribute(c)}else{a.setAttribute(c,b[c])}}}return this},_args:function(b,c,d){c.splice(0,0,'parent');c.splice(c.length,0,'settings');var e={};var f=0;if(b[0]!=null&&b[0].jquery){b[0]=b[0][0]}if(b[0]!=null&&!(typeof b[0]=='object'&&b[0].nodeName)){e['parent']=null;f=1}for(var i=0;i<b.length;i++){e[c[i+f]]=b[i]}if(d){$.each(d,function(i,a){if(typeof e[a]=='object'){e.settings=e[a];e[a]=null}})}return e},title:function(a,b,c){var d=this._args(arguments,['text']);var e=this._makeNode(d.parent,'title',d.settings||{});e.appendChild(this._svg.ownerDocument.createTextNode(d.text));return e},describe:function(a,b,c){var d=this._args(arguments,['text']);var e=this._makeNode(d.parent,'desc',d.settings||{});e.appendChild(this._svg.ownerDocument.createTextNode(d.text));return e},defs:function(a,b,c){var d=this._args(arguments,['id'],['id']);return this._makeNode(d.parent,'defs',$.extend((d.id?{id:d.id}:{}),d.settings||{}))},symbol:function(a,b,c,d,e,f,g){var h=this._args(arguments,['id','x1','y1','width','height']);return this._makeNode(h.parent,'symbol',$.extend({id:h.id,viewBox:h.x1+' '+h.y1+' '+h.width+' '+h.height},h.settings||{}))},marker:function(a,b,c,d,e,f,g,h){var i=this._args(arguments,['id','refX','refY','mWidth','mHeight','orient'],['orient']);return this._makeNode(i.parent,'marker',$.extend({id:i.id,refX:i.refX,refY:i.refY,markerWidth:i.mWidth,markerHeight:i.mHeight,orient:i.orient||'auto'},i.settings||{}))},style:function(a,b,c){var d=this._args(arguments,['styles']);var e=this._makeNode(d.parent,'style',$.extend({type:'text/css'},d.settings||{}));e.appendChild(this._svg.ownerDocument.createTextNode(d.styles));if($.browser.opera){$('head').append('<style type="text/css">'+d.styles+'</style>')}return e},script:function(a,b,c,d){var e=this._args(arguments,['script','type'],['type']);var f=this._makeNode(e.parent,'script',$.extend({type:e.type||'text/javascript'},e.settings||{}));f.appendChild(this._svg.ownerDocument.createTextNode(this._escapeXML(e.script)));if(!$.browser.mozilla){$.globalEval(e.script)}return f},linearGradient:function(a,b,c,d,e,f,g,h){var i=this._args(arguments,['id','stops','x1','y1','x2','y2'],['x1']);var j=$.extend({id:i.id},(i.x1!=null?{x1:i.x1,y1:i.y1,x2:i.x2,y2:i.y2}:{}));return this._gradient(i.parent,'linearGradient',$.extend(j,i.settings||{}),i.stops)},radialGradient:function(a,b,c,d,e,r,f,g,h){var i=this._args(arguments,['id','stops','cx','cy','r','fx','fy'],['cx']);var j=$.extend({id:i.id},(i.cx!=null?{cx:i.cx,cy:i.cy,r:i.r,fx:i.fx,fy:i.fy}:{}));return this._gradient(i.parent,'radialGradient',$.extend(j,i.settings||{}),i.stops)},_gradient:function(a,b,c,d){var e=this._makeNode(a,b,c);for(var i=0;i<d.length;i++){var f=d[i];this._makeNode(e,'stop',$.extend({offset:f[0],stopColor:f[1]},(f[2]!=null?{stopOpacity:f[2]}:{})))}return e},pattern:function(a,b,x,y,c,d,e,f,g,h,i){var j=this._args(arguments,['id','x','y','width','height','vx','vy','vwidth','vheight'],['vx']);var k=$.extend({id:j.id,x:j.x,y:j.y,width:j.width,height:j.height},(j.vx!=null?{viewBox:j.vx+' '+j.vy+' '+j.vwidth+' '+j.vheight}:{}));return this._makeNode(j.parent,'pattern',$.extend(k,j.settings||{}))},mask:function(a,b,x,y,c,d,e){var f=this._args(arguments,['id','x','y','width','height']);return this._makeNode(f.parent,'mask',$.extend({id:f.id,x:f.x,y:f.y,width:f.width,height:f.height},f.settings||{}))},createPath:function(){return new SVGPath()},createText:function(){return new SVGText()},svg:function(a,x,y,b,c,d,e,f,g,h){var i=this._args(arguments,['x','y','width','height','vx','vy','vwidth','vheight'],['vx']);var j=$.extend({x:i.x,y:i.y,width:i.width,height:i.height},(i.vx!=null?{viewBox:i.vx+' '+i.vy+' '+i.vwidth+' '+i.vheight}:{}));return this._makeNode(i.parent,'svg',$.extend(j,i.settings||{}))},group:function(a,b,c){var d=this._args(arguments,['id'],['id']);return this._makeNode(d.parent,'g',$.extend({id:d.id},d.settings||{}))},use:function(a,x,y,b,c,d,e){var f=this._args(arguments,['x','y','width','height','ref']);if(typeof f.x=='string'){f.ref=f.x;f.settings=f.y;f.x=f.y=f.width=f.height=null}var g=this._makeNode(f.parent,'use',$.extend({x:f.x,y:f.y,width:f.width,height:f.height},f.settings||{}));g.setAttributeNS($.svg.xlinkNS,'href',f.ref);return g},link:function(a,b,c){var d=this._args(arguments,['ref']);var e=this._makeNode(d.parent,'a',d.settings);e.setAttributeNS($.svg.xlinkNS,'href',d.ref);return e},image:function(a,x,y,b,c,d,e){var f=this._args(arguments,['x','y','width','height','ref']);var g=this._makeNode(f.parent,'image',$.extend({x:f.x,y:f.y,width:f.width,height:f.height},f.settings||{}));g.setAttributeNS($.svg.xlinkNS,'href',f.ref);return g},path:function(a,b,c){var d=this._args(arguments,['path']);return this._makeNode(d.parent,'path',$.extend({d:(d.path.path?d.path.path():d.path)},d.settings||{}))},rect:function(a,x,y,b,c,d,e,f){var g=this._args(arguments,['x','y','width','height','rx','ry'],['rx']);return this._makeNode(g.parent,'rect',$.extend({x:g.x,y:g.y,width:g.width,height:g.height},(g.rx?{rx:g.rx,ry:g.ry}:{}),g.settings||{}))},circle:function(a,b,c,r,d){var e=this._args(arguments,['cx','cy','r']);return this._makeNode(e.parent,'circle',$.extend({cx:e.cx,cy:e.cy,r:e.r},e.settings||{}))},ellipse:function(a,b,c,d,e,f){var g=this._args(arguments,['cx','cy','rx','ry']);return this._makeNode(g.parent,'ellipse',$.extend({cx:g.cx,cy:g.cy,rx:g.rx,ry:g.ry},g.settings||{}))},line:function(a,b,c,d,e,f){var g=this._args(arguments,['x1','y1','x2','y2']);return this._makeNode(g.parent,'line',$.extend({x1:g.x1,y1:g.y1,x2:g.x2,y2:g.y2},g.settings||{}))},polyline:function(a,b,c){var d=this._args(arguments,['points']);return this._poly(d.parent,'polyline',d.points,d.settings)},polygon:function(a,b,c){var d=this._args(arguments,['points']);return this._poly(d.parent,'polygon',d.points,d.settings)},_poly:function(a,b,c,d){var e='';for(var i=0;i<c.length;i++){e+=c[i].join()+' '}return this._makeNode(a,b,$.extend({points:$.trim(e)},d||{}))},text:function(a,x,y,b,c){var d=this._args(arguments,['x','y','value']);if(typeof d.x=='string'&&arguments.length<4){d.value=d.x;d.settings=d.y;d.x=d.y=null}return this._text(d.parent,'text',d.value,$.extend({x:(d.x&&isArray(d.x)?d.x.join(' '):d.x),y:(d.y&&isArray(d.y)?d.y.join(' '):d.y)},d.settings||{}))},textpath:function(a,b,c,d){var e=this._args(arguments,['path','value']);var f=this._text(e.parent,'textPath',e.value,e.settings||{});f.setAttributeNS($.svg.xlinkNS,'href',e.path);return f},_text:function(a,b,c,d){var e=this._makeNode(a,b,d);if(typeof c=='string'){e.appendChild(e.ownerDocument.createTextNode(c))}else{for(var i=0;i<c._parts.length;i++){var f=c._parts[i];if(f[0]=='tspan'){var g=this._makeNode(e,f[0],f[2]);g.appendChild(e.ownerDocument.createTextNode(f[1]));e.appendChild(g)}else if(f[0]=='tref'){var g=this._makeNode(e,f[0],f[2]);g.setAttributeNS($.svg.xlinkNS,'href',f[1]);e.appendChild(g)}else if(f[0]=='textpath'){var h=$.extend({},f[2]);h.href=null;var g=this._makeNode(e,f[0],h);g.setAttributeNS($.svg.xlinkNS,'href',f[2].href);g.appendChild(e.ownerDocument.createTextNode(f[1]));e.appendChild(g)}else{e.appendChild(e.ownerDocument.createTextNode(f[1]))}}}return e},other:function(a,b,c){var d=this._args(arguments,['name']);return this._makeNode(d.parent,d.name,d.settings||{})},_makeNode:function(a,b,c){a=a||this._svg;var d=this._svg.ownerDocument.createElementNS($.svg.svgNS,b);for(var b in c){var e=c[b];if(e!=null&&e!=null&&(typeof e!='string'||e!='')){d.setAttribute($.svg._attrNames[b]||b,e)}}a.appendChild(d);return d},add:function(b,c){var d=this._args((arguments.length==1?[null,b]:arguments),['node']);var f=this;d.parent=d.parent||this._svg;try{if($.svg._renesis){throw'Force traversal';}d.parent.appendChild(d.node.cloneNode(true))}catch(e){d.node=(d.node.jquery?d.node:$(d.node));d.node.each(function(){var a=f._cloneAsSVG(this);if(a){d.parent.appendChild(a)}})}return this},_cloneAsSVG:function(a){var b=null;if(a.nodeType==1){b=this._svg.ownerDocument.createElementNS($.svg.svgNS,this._checkName(a.nodeName));for(var i=0;i<a.attributes.length;i++){var c=a.attributes.item(i);if(c.nodeName!='xmlns'&&c.nodeValue){if(c.prefix=='xlink'){b.setAttributeNS($.svg.xlinkNS,c.localName,c.nodeValue)}else{b.setAttribute(this._checkName(c.nodeName),c.nodeValue)}}}for(var i=0;i<a.childNodes.length;i++){var d=this._cloneAsSVG(a.childNodes[i]);if(d){b.appendChild(d)}}}else if(a.nodeType==3){if($.trim(a.nodeValue)){b=this._svg.ownerDocument.createTextNode(a.nodeValue)}}else if(a.nodeType==4){if($.trim(a.nodeValue)){try{b=this._svg.ownerDocument.createCDATASection(a.nodeValue)}catch(e){b=this._svg.ownerDocument.createTextNode(a.nodeValue.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;'))}}}return b},_checkName:function(a){a=(a.substring(0,1)>='A'&&a.substring(0,1)<='Z'?a.toLowerCase():a);return(a.substring(0,4)=='svg:'?a.substring(4):a)},load:function(h,j){j=(typeof j=='boolean'?{addTo:j}:(typeof j=='function'?{onLoad:j}:j||{}));if(!j.addTo){this.clear(false)}var k=[this._svg.getAttribute('width'),this._svg.getAttribute('height')];var l=this;var m=function(a){a=$.svg.local.errorLoadingText+': '+a;if(j.onLoad){j.onLoad.apply(l._container||l._svg,[l,a])}else{l.text(null,10,20,a)}};var n=function(a){var b=new ActiveXObject('Microsoft.XMLDOM');b.validateOnParse=false;b.resolveExternals=false;b.async=false;b.loadXML(a);if(b.parseError.errorCode!=0){m(b.parseError.reason);return null}return b};var o=function(a){if(!a){return}if(a.documentElement.nodeName!='svg'){var b=a.getElementsByTagName('parsererror');var c=(b.length?b[0].getElementsByTagName('div'):[]);m(!b.length?'???':(c.length?c[0]:b[0]).firstChild.nodeValue);return}var d={};for(var i=0;i<a.documentElement.attributes.length;i++){var f=a.documentElement.attributes.item(i);if(!(f.nodeName=='version'||f.nodeName.substring(0,5)=='xmlns')){d[f.nodeName]=f.nodeValue}}l.configure(d,true);var g=a.documentElement.childNodes;for(var i=0;i<g.length;i++){try{if($.svg._renesis){throw'Force traversal';}l._svg.appendChild(g[i].cloneNode(true));if(g[i].nodeName=='script'){$.globalEval(g[i].textContent)}}catch(e){l.add(null,g[i])}}if(!j.changeSize){l.configure({width:k[0],height:k[1]})}if(j.onLoad){j.onLoad.apply(l._container||l._svg,[l])}};if(h.match('<svg')){o($.browser.msie?n(h):new DOMParser().parseFromString(h,'text/xml'))}else{$.ajax({url:h,dataType:($.browser.msie?'text':'xml'),success:function(a){o($.browser.msie?n(a):a)},error:function(a,b,c){m(b+(c?' '+c.message:''))}})}return this},remove:function(a){a=(a.jquery?a[0]:a);a.parentNode.removeChild(a);return this},clear:function(a){if(a){this.configure({},true)}while(this._svg.firstChild){this._svg.removeChild(this._svg.firstChild)}return this},toSVG:function(a){a=a||this._svg;return(typeof XMLSerializer=='undefined'?this._toSVG(a):new XMLSerializer().serializeToString(a))},_toSVG:function(a){var b='';if(!a){return b}if(a.nodeType==3){b=a.nodeValue}else if(a.nodeType==4){b='<![CDATA['+a.nodeValue+']]>'}else{b='<'+a.nodeName;if(a.attributes){for(var i=0;i<a.attributes.length;i++){var c=a.attributes.item(i);if(!($.trim(c.nodeValue)==''||c.nodeValue.match(/^\[object/)||c.nodeValue.match(/^function/))){b+=' '+(c.namespaceURI==$.svg.xlinkNS?'xlink:':'')+c.nodeName+'="'+c.nodeValue+'"'}}}if(a.firstChild){b+='>';var d=a.firstChild;while(d){b+=this._toSVG(d);d=d.nextSibling}b+='</'+a.nodeName+'>'}else{b+='/>'}}return b},_escapeXML:function(a){a=a.replace(/&/g,'&amp;');a=a.replace(/</g,'&lt;');a=a.replace(/>/g,'&gt;');return a}});function SVGPath(){this._path=''}$.extend(SVGPath.prototype,{reset:function(){this._path='';return this},move:function(x,y,a){a=(isArray(x)?y:a);return this._coords((a?'m':'M'),x,y)},line:function(x,y,a){a=(isArray(x)?y:a);return this._coords((a?'l':'L'),x,y)},horiz:function(x,a){this._path+=(a?'h':'H')+(isArray(x)?x.join(' '):x);return this},vert:function(y,a){this._path+=(a?'v':'V')+(isArray(y)?y.join(' '):y);return this},curveC:function(a,b,c,d,x,y,e){e=(isArray(a)?b:e);return this._coords((e?'c':'C'),a,b,c,d,x,y)},smoothC:function(a,b,x,y,c){c=(isArray(a)?b:c);return this._coords((c?'s':'S'),a,b,x,y)},curveQ:function(a,b,x,y,c){c=(isArray(a)?b:c);return this._coords((c?'q':'Q'),a,b,x,y)},smoothQ:function(x,y,a){a=(isArray(x)?y:a);return this._coords((a?'t':'T'),x,y)},_coords:function(a,b,c,d,e,f,g){if(isArray(b)){for(var i=0;i<b.length;i++){var h=b[i];this._path+=(i==0?a:' ')+h[0]+','+h[1]+(h.length<4?'':' '+h[2]+','+h[3]+(h.length<6?'':' '+h[4]+','+h[5]))}}else{this._path+=a+b+','+c+(d==null?'':' '+d+','+e+(f==null?'':' '+f+','+g))}return this},arc:function(a,b,c,d,e,x,y,f){f=(isArray(a)?b:f);this._path+=(f?'a':'A');if(isArray(a)){for(var i=0;i<a.length;i++){var g=a[i];this._path+=(i==0?'':' ')+g[0]+','+g[1]+' '+g[2]+' '+(g[3]?'1':'0')+','+(g[4]?'1':'0')+' '+g[5]+','+g[6]}}else{this._path+=a+','+b+' '+c+' '+(d?'1':'0')+','+(e?'1':'0')+' '+x+','+y}return this},close:function(){this._path+='z';return this},path:function(){return this._path}});SVGPath.prototype.moveTo=SVGPath.prototype.move;SVGPath.prototype.lineTo=SVGPath.prototype.line;SVGPath.prototype.horizTo=SVGPath.prototype.horiz;SVGPath.prototype.vertTo=SVGPath.prototype.vert;SVGPath.prototype.curveCTo=SVGPath.prototype.curveC;SVGPath.prototype.smoothCTo=SVGPath.prototype.smoothC;SVGPath.prototype.curveQTo=SVGPath.prototype.curveQ;SVGPath.prototype.smoothQTo=SVGPath.prototype.smoothQ;SVGPath.prototype.arcTo=SVGPath.prototype.arc;function SVGText(){this._parts=[]}$.extend(SVGText.prototype,{reset:function(){this._parts=[];return this},string:function(a){this._parts[this._parts.length]=['text',a];return this},span:function(a,b){this._parts[this._parts.length]=['tspan',a,b];return this},ref:function(a,b){this._parts[this._parts.length]=['tref',a,b];return this},path:function(a,b,c){this._parts[this._parts.length]=['textpath',b,$.extend({href:a},c||{})];return this}});$.fn.svg=function(a){var b=Array.prototype.slice.call(arguments,1);if(typeof a=='string'&&a=='get'){return $.svg['_'+a+'SVG'].apply($.svg,[this[0]].concat(b))}return this.each(function(){if(typeof a=='string'){$.svg['_'+a+'SVG'].apply($.svg,[this].concat(b))}else{$.svg._attachSVG(this,a||{})}})};function isArray(a){return(a&&a.constructor==Array)}$.svg=new SVGManager()})(jQuery);]]></data></item>
1292<item key="id"><![CDATA[jquery.svg.js]]></item>
1293<item key="mandatory" type="int">0</item>
1294<item key="multilang" type="int">0</item>
1295<item key="name"><![CDATA[jquery.svg.js]]></item>
1296<item key="repetitive" type="int">0</item>
1297<item key="type"><![CDATA[resource]]></item>
1298</dictionary>
1299</item>
1300<item type="dictionary"><dictionary>
1301<item key="custom">
1302<data content_type="application/x-javascript" filename="handleSVG.js" type="file">7661722074656d705f6172726f775f616e676c650909093d206e756c6c3b0d0a7661722074656d705f6172726f775f6c656e6774680909093d206e756c6c3b0d0a7661722074656d705f6172726f775f72656374730909093d206e756c6c3b0d0a7661722074656d705f646567327261645f6d6f646966696572093d204d6174682e5049202f203138303b0d0a7661722074656d705f6472616767696e6709090909093d2066616c73653b0d0a7661722074656d705f6472616767696e675f7061746809093d206e756c6c3b0d0a7661722074656d705f6c6173745f6e6f6465090909093d206e756c6c3b0d0a7661722074656d705f6f66667365745f706f73090909093d206e756c6c3b0d0a7661722074656d705f6f75746c696e6509090909093d206e756c6c3b0d0a7661722074656d705f706f735f656e6409090909093d206e756c6c3b0d0a7661722074656d705f706f735f7374617274090909093d206e756c6c3b0d0a7661722074656d705f7374726f6b655f636f6c6f720909093d206e756c6c3b0d0a7661722074656d705f7374726f6b655f77696474680909093d206e756c6c3b0d0a7661722074656d705f737667090909090909093d206e756c6c3b0d0a766172202474656d705f63616e76617309090909093d206e756c6c3b0d0a0d0a66756e6374696f6e2063616c634172726f775061746828706174685f6f626a2c207374617274782c207374617274792c20656e64782c20656e6479290d0a7b0d0a097661722074656d705f616e676c65093d206e756c6c3b0d0a097661722074656d705f7061746809093d206e756c6c3b0d0a090d0a0969662028737461727478203d3d20656e6478290d0a090974656d705f616e676c65203d2028737461727479203e20656e647929203f2039302e30203a202d39302e303b0d0a09656c73650d0a090974656d705f616e676c65203d204d6174682e6174616e2828737461727479202d20656e647929202f2028737461727478202d20656e64782929202a20313830202f204d6174682e50493b0d0a090d0a0969662028737461727478203c20656e6478290d0a2020202074656d705f70617468203d20706174685f6f626a2e726573657428292e6d6f7665287374617274782c20737461727479292e6c696e6528656e64782c20656e6479292e0d0a0909090909090909096c696e6528656e6478202d204d6174682e666c6f6f72284d6174682e636f73282874656d705f616e676c65202b2074656d705f6172726f775f616e676c6529202a2074656d705f646567327261645f6d6f64696669657229202a2074656d705f6172726f775f6c656e677468292c200d0a090909090909090909090909656e6479202d204d6174682e666c6f6f72284d6174682e73696e282874656d705f616e676c65202b2074656d705f6172726f775f616e676c6529202a2074656d705f646567327261645f6d6f64696669657229202a2074656d705f6172726f775f6c656e67746829292e0d0a0909090909090909096d6f766528656e64782c20656e6479292e0d0a0909090909090909096c696e6528656e6478202d204d6174682e666c6f6f72284d6174682e636f73282874656d705f616e676c65202d2074656d705f6172726f775f616e676c6529202a2074656d705f646567327261645f6d6f64696669657229202a2074656d705f6172726f775f6c656e677468292c200d0a090909090909090909090909656e6479202d204d6174682e666c6f6f72284d6174682e73696e282874656d705f616e676c65202d2074656d705f6172726f775f616e676c6529202a2074656d705f646567327261645f6d6f64696669657229202a2074656d705f6172726f775f6c656e67746829292e0d0a090909090909090909636c6f736528293b0d0a09656c73650d0a090974656d705f70617468203d20706174685f6f626a2e726573657428292e6d6f7665287374617274782c20737461727479292e6c696e6528656e64782c20656e6479292e0d0a0909090909090909096c696e6528656e6478202b204d6174682e666c6f6f72284d6174682e636f73282874656d705f616e676c65202b2074656d705f6172726f775f616e676c6529202a2074656d705f646567327261645f6d6f64696669657229202a2074656d705f6172726f775f6c656e677468292c200d0a090909090909090909090909656e6479202b204d6174682e666c6f6f72284d6174682e73696e282874656d705f616e676c65202b2074656d705f6172726f775f616e676c6529202a2074656d705f646567327261645f6d6f64696669657229202a2074656d705f6172726f775f6c656e67746829292e0d0a0909090909090909096d6f766528656e64782c20656e6479292e0d0a0909090909090909096c696e6528656e6478202b204d6174682e666c6f6f72284d6174682e636f73282874656d705f616e676c65202d2074656d705f6172726f775f616e676c6529202a2074656d705f646567327261645f6d6f64696669657229202a2074656d705f6172726f775f6c656e677468292c200d0a090909090909090909090909656e6479202b204d6174682e666c6f6f72284d6174682e73696e282874656d705f616e676c65202d2074656d705f6172726f775f616e676c6529202a2074656d705f646567327261645f6d6f64696669657229202a2074656d705f6172726f775f6c656e67746829292e0d0a090909090909090909636c6f736528293b0d0a0d0a0972657475726e2074656d705f706174683b0d0a7d0d0a0d0a66756e6374696f6e2064656c65746553564728290d0a7b0d0a092474656d705f63616e7661732e737667282764657374726f7927293b0d0a090d0a0972657475726e2074656d705f6172726f775f72656374733b0d0a7d0d0a0d0a2f2f206472617720726573756c740d0a66756e6374696f6e2064726167456e64286576656e74290d0a7b200d0a09696620282174656d705f6472616767696e67290d0a090972657475726e3b0d0a090d0a0972656d6f766554656d705061746828293b0d0a090d0a0974656d705f706f735f656e64203d207b583a206576656e742e636c69656e7458202d2074656d705f6f66667365745f706f732e6c6566742c20593a206576656e742e636c69656e7459202d2074656d705f6f66667365745f706f732e746f707d3b0d0a090d0a09766172207061746832203d2074656d705f7376672e6372656174655061746828293b0d0a090d0a0974656d705f7376672e706174682863616c634172726f77506174682870617468322c2074656d705f706f735f73746172742e582c2074656d705f706f735f73746172742e592c2074656d705f706f735f656e642e582c2074656d705f706f735f656e642e59292c0d0a0909090909090909097b66696c6c3a20276e6f6e65272c207374726f6b653a2074656d705f7374726f6b655f636f6c6f722c207374726f6b6557696474683a2074656d705f7374726f6b655f77696474687d293b0d0a090d0a092f2f242874656d705f6f75746c696e65292e72656d6f766528293b0d0a092f2f74656d705f6f75746c696e65203d206e756c6c3b0d0a090d0a0974656d705f6472616767696e67090909093d2066616c73653b0d0a0974656d705f6472616767696e675f70617468093d206e756c6c3b0d0a090d0a0974656d705f6172726f775f72656374732e70757368287b73746172743a2074656d705f706f735f73746172742c20656e643a2074656d705f706f735f656e647d293b0d0a090d0a092474656d705f63616e7661732e666f63757328293b0d0a7d0d0a0d0a2f2f2070726f7669646520666565646261636b207768696c65206472616767696e670d0a66756e6374696f6e206472616767696e67286576656e74290d0a7b0d0a09696620282174656d705f6472616767696e67290d0a090972657475726e3b0d0a202020200d0a092f2a0d0a09696620282174656d705f6f75746c696e65290d0a097b0d0a090974656d705f6f75746c696e65203d2074656d705f7376672e7265637428302c20302c20302c20302c207b66696c6c3a20276e6f6e65272c207374726f6b653a202723633063306330272c207374726f6b6557696474683a20312c207374726f6b654461736841727261793a2027322c32277d293b0d0a0909242874656d705f6f75746c696e65292e6d6f75736575702864726167456e64293b0d0a097d0d0a090d0a0974656d705f7376672e6368616e67652874656d705f6f75746c696e652c207b783a204d6174682e6d696e286576656e742e636c69656e7458202d2074656d705f6f66667365745f706f732e6c6566742c2074656d705f706f735f73746172742e58292c0d0a090909090909090909090909092020202020202020793a204d6174682e6d696e286576656e742e636c69656e7459202d2074656d705f6f66667365745f706f732e746f702c2074656d705f706f735f73746172742e59292c0d0a09090909090909090909090909202020202020202077696474683a204d6174682e616273286576656e742e636c69656e7458202d2074656d705f6f66667365745f706f732e6c656674202d2074656d705f706f735f73746172742e58292c0d0a0909090909090909090909090920202020202020206865696768743a204d6174682e616273286576656e742e636c69656e7459202d2074656d705f6f66667365745f706f732e746f70202d2074656d705f706f735f73746172742e59297d293b0d0a092a2f0d0a090d0a09696620282174656d705f6472616767696e675f70617468290d0a097b0d0a090974656d705f6472616767696e675f70617468203d2074656d705f7376672e6372656174655061746828293b0d0a097d0d0a090d0a0972656d6f766554656d705061746828293b0d0a090d0a0974656d705f6c6173745f6e6f6465203d2074656d705f7376672e706174682863616c634172726f77506174682874656d705f6472616767696e675f706174682c2074656d705f706f735f73746172742e582c2074656d705f706f735f73746172742e592c206576656e742e636c69656e7458202d2074656d705f6f66667365745f706f732e6c6566742c206576656e742e636c69656e7459202d2074656d705f6f66667365745f706f732e746f70292c0d0a09090909090909090909090909090909097b66696c6c3a20276e6f6e65272c207374726f6b653a2074656d705f7374726f6b655f636f6c6f722c207374726f6b6557696474683a2074656d705f7374726f6b655f77696474687d293b0d0a09242874656d705f6c6173745f6e6f6465292e6d6f75736575702864726167456e64293b0d0a7d0d0a0d0a2f2f2072656d656d6265722074656d705f73746172745f706f73706f736974696f6e0d0a66756e6374696f6e20647261675374617274286576656e74290d0a7b0d0a096966202874656d705f6472616767696e67290d0a090972657475726e3b0d0a09090d0a0974656d705f6f66667365745f706f73203d2028242e62726f777365722e6d736965203f207b6c6566743a20302c20746f703a20307d203a202474656d705f63616e7661732e6f66667365742829293b0d0a096966202821242e62726f777365722e6d736965290d0a097b0d0a090974656d705f6f66667365745f706f732e6c656674202d3d20646f63756d656e742e646f63756d656e74456c656d656e742e7363726f6c6c4c656674207c7c20646f63756d656e742e626f64792e7363726f6c6c4c6566743b0d0a090974656d705f6f66667365745f706f732e746f70202d3d20646f63756d656e742e646f63756d656e74456c656d656e742e7363726f6c6c546f70207c7c20646f63756d656e742e626f64792e7363726f6c6c546f703b0d0a097d0d0a090d0a0974656d705f706f735f7374617274093d207b583a206576656e742e636c69656e7458202d2074656d705f6f66667365745f706f732e6c6566742c20593a206576656e742e636c69656e7459202d2074656d705f6f66667365745f706f732e746f707d3b0d0a0974656d705f6472616767696e6709093d20747275653b0d0a7d0d0a0d0a66756e6374696f6e20696e697453564728696d6167655f75726c2c2077696474682c20686569676874290d0a7b0d0a0974656d705f6172726f775f7265637473203d206e657720417272617928293b0d0a090d0a09686569676874093d2028686569676874203d3d20756e646566696e656429203f20333030203a206865696768743b0d0a09776964746809093d20287769647468203d3d20756e646566696e656429203f20343030203a2077696474683b0d0a090d0a092474656d705f63616e7661732e737667287b6f6e4c6f61643a2066756e6374696f6e2873766729200d0a09097b0d0a20202020202074656d705f737667203d207376673b0d0a2020202020200d0a2020202020207661722073757266616365203d207376672e7265637428302c20302c2077696474682c206865696768742c207b69643a202773757266616365272c2066696c6c3a20277768697465277d293b0d0a20202020202076617220696d616765203d2074656d705f7376672e696d61676528302c20302c2077696474682c206865696768742c20696d6167655f75726c293b0d0a0909090d0a0909092f2f242873757266616365292e6d6f757365646f776e28647261675374617274292e6d6f7573656d6f7665286472616767696e67292e6d6f75736575702864726167456e64293b0d0a0909092428696d616765292e6d6f757365646f776e28647261675374617274292e6d6f7573656d6f7665286472616767696e67292e6d6f75736575702864726167456e64293b0d0a202020207d0d0a097d293b0d0a7d0d0a0d0a66756e6374696f6e2072656d6f766554656d705061746828290d0a7b0d0a096966202874656d705f6c6173745f6e6f6465290d0a097b0d0a090974656d705f7376672e72656d6f76652874656d705f6c6173745f6e6f6465293b0d0a090974656d705f6c6173745f6e6f6465203d206e756c6c3b0d0a097d0d0a7d0d0a0d0a2428646f63756d656e74292e72656164792866756e6374696f6e28290d0a7b0d0a0974656d705f6172726f775f616e676c65093d2032303b0d0a0974656d705f6172726f775f6c656e677468093d2033353b0d0a0974656d705f7374726f6b655f636f6c6f72093d202723343939313162273b0d0a0974656d705f7374726f6b655f7769647468203d20353b0d0a090d0a092474656d705f63616e766173203d20242827235a4d53477261706869635f657874456469745f696d61676527293b0d0a7d293b</data></item>
1303<item key="id"><![CDATA[handleSVG.js]]></item>
1304<item key="mandatory" type="int">0</item>
1305<item key="multilang" type="int">0</item>
1306<item key="name"><![CDATA[handleSVG.js]]></item>
1307<item key="repetitive" type="int">0</item>
1308<item key="type"><![CDATA[resource]]></item>
1309</dictionary>
1310</item>
1311<item type="dictionary"><dictionary>
1312<item key="custom">
1313<data content_type="image/png" filename="action_cancel.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff61000002df49444154388da591cf6f93051cc63fdfb73fd76e6b69d7769d334b818d9529c34d37319081c651438c86838a07e3cd3f004ffe133a63e2851310885146341cf460444492893f8610f60bc9469a755db7b6ebf6b67ddbbeefd7033d78f7499ec373789e3cc9475495ff2331c487a3167160261cf9e8d94a7179d3e12701b2801fe804bcc00b7ee3953b9eaed1f3bb3b5fe6016f2088801b68e183d1fa6a7e9ec5bfb89ac978bdd05c6f0f0400033877f1b2eabe38c137a7276a70d7d5d181012d80973f1f9f9c275f82e421c64f4d352ca0d9b6054c4cbfa11c398e3c738099d732bf01276cdb4680fdd637bffce35d5d821bd7b183115c2fbdc8c2f50b5cbb775ffcc0eb63933a9a7987c6837b7869c1509afbd92d8e7cfdc58800b8c3bdd5f9547fc7c8d23285661d7c01623d514a6fbd4d3d9723393747a15281aa49cceb612d1c26b5b18d620900fb922980078f2351ad83de04fd19b43c98d64232a9b7406f835641174181b5ae6014fc7e04a0a37f905a768518cccd76754e9477f7d8005c6d542ea00710c3c5878efd7013467ca10456a382ac4d9ee4d7b99bec012b806730fd7da6563dbd905dc3fe0fefe76209be737b6e4b2e7b6298a73792dd118c0ddb660b2801267072b77cda32f7280135a00194818a5567dae53a6eb67311d802dc75c7a1da2e7f10ef532bbfce8ac22120d6be9f038a951d0e9a55de8f27f4c7cdbc00582846d36e5107f75430a84621c79ec2619e3a30368effd8319e075240d16ed2592c31150d690d022d47319a8d46f4934f3f6b769b26255506dae53fc261b61e3d9c5d5f98bf743712e228d00f145a0d42db3b7c7cf65db3a94e1f77cebcc7ad9e6efd1bf411a8057a251ed3accfbdfc4328c08d7080558febcf2b895e6d813e065dea0eeaefc95e9d11c170505444b68103c369ae0d0ff36aa1f0c48621074145b0616caa985ffc2a9e2095e8a35c3171c410c4c050041bc106991ddacfb9e953d8ca80a38ab671390ab6a3e9b343037c9b3e8803a2223822fc0b66623e7859e6be1b0000000049454e44ae426082</data></item>
1314<item key="id"><![CDATA[action_cancel.png]]></item>
1315<item key="mandatory" type="int">0</item>
1316<item key="multilang" type="int">0</item>
1317<item key="name"><![CDATA[action_cancel.png]]></item>
1318<item key="repetitive" type="int">0</item>
1319<item key="type"><![CDATA[resource]]></item>
1320</dictionary>
1321</item>
1322<item type="dictionary"><dictionary>
1323<item key="custom">
1324<data content_type="image/png" filename="action_ok.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000022b49444154388da5925d48536118c7ffefcedee3ce39fb385b6a114462348cf6114ad6888cc4ba4b24280be903d2ba89c008eaaa8f9b6e92e8428ac8863692848a912d4b7375a1c30f2c299b36743484b4ac3575b60f3b7bbb9044ca6cd51f9e9be7e1f75cfcf911c618fe27aabf05845aa2fee707a29348f2a8a9db74506e995f32c6d21ae106a4e567e4fef6c15676c0b997a976e121630c249d0e846b44328464dfadc38db686ae3a8c25c721270d703f78dc3cff20ab915f064672272a12bd0b617d3d913286f43e5755a3cde5bf89d64f1e70318a592f0d2666a2052a00d0d4924cf3477b6043d8d121d593ed3fe095f725adf69dd1e73a7edbd634de805eda012dd521ec890d47a7239668cb6c449d7d51cc2e164bfcd5a5d5a6a812c5a427e2597157b35312b53d7448d75973e4b2adf9f33d0cd2d710133af89b42232495b2269eb03800708a4cae1795380a3f08ef892c1a5190974ffbbc03e508d1aa739567cd2fe33d08706fa04c11f43b03412e4bb1c6efccc100e64a14ca344ff376afda6a2fb4f3f9ba8da08487811a31a8bcc208de62facb0c9ed57407f94d494bf8a8125bd8911a0062ee780957a66a838c22b6f91b6fe6d721cc4d60821b833205745c7d11cca9c85c3f503c1ac74f99b74a71a776d03daa76596fda62dc66cc108880d424f0fc5257d071c26a79b4b6f31778519132f6a9dbca7b4b1317c2a759eea99ce1935f2b354b09b6e8527748f4ae39bfbaaf8e5d11fe64e86f0fc7e2fb693a8aa7a5f252f90efa3664491dd43f160000000049454e44ae426082</data></item>
1325<item key="id"><![CDATA[action_ok.png]]></item>
1326<item key="mandatory" type="int">0</item>
1327<item key="multilang" type="int">0</item>
1328<item key="name"><![CDATA[action_ok.png]]></item>
1329<item key="repetitive" type="int">0</item>
1330<item key="type"><![CDATA[resource]]></item>
1331</dictionary>
1332</item>
1333<item type="dictionary"><dictionary>
1334<item key="custom">
1335<data content_type="image/png" filename="crop_thumb.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c0000022c4944415438cba553316c1261147e87475b0a346d358db9041988038cc2e4d068188993830446757070c048024c2e2c24b2903010244c3a19217173705131a665686cd11aad5e6bad06b1831e84fbffff7cef07da42bbf54fbeffddddffde77dffbee9d6259169c66a9b4e572391d893c88562a950a4c26a5d3e997a6695e1142b4f2f97ce018012e4f2412817abdee7fb662588203902e8a0263b7db85582c06954ac57fa202ce79b356ab5d72cc2dc1e2ac4d1659b80964a10ee7ce5d8052a9048cb1d79304cac883a7ef0cebaccb260bc411c87b24dbdd1770ebeaac72a2025aa3c437cf8bd0f9b503ea8c1b2e5fbb0bf619d7e08c0b99170e8757d08f2062b5d168846c2302d92f26b6f7748846a3f0fbe70eac6fb761ed5b07d6b6dab0f7671f1e3cd1ad5eaf17cc6432e44b704c01c3628eb03be6a1582cc29929272cb9559876d88123b3c0438ace050d92c924a082e68107894442ca72ce9f87e5ebf7e13dbe555b98c296b010fb22f51c374e2488cdef0614ee5c947ec816484e3c1e871ffa26ec76d8205958323286ea18450bd890c0340f874f12605fcd42a120e3edb04b3129918a381509093e2219c6b1af50ad5683473fcde06d87920f3c185e33c68fcfc168854221bddfef7bdc8b1adcb8f748169212f283a31f8f1fde842f1b6f69f85aa838609b1c0c7ce8c966b3e8c727f8b86dc007fd1fc2808daf7fa1b565c0e7f50694cb659a4aff7080ac31f87cbe55afd72b344d6b4c9e1154557da1280ac97e45f7ca697fe7ff1fa88b9df58d166d0000000049454e44ae426082</data></item>
1336<item key="id"><![CDATA[crop_thumb.png]]></item>
1337<item key="mandatory" type="int">0</item>
1338<item key="multilang" type="int">0</item>
1339<item key="name"><![CDATA[crop_thumb.png]]></item>
1340<item key="repetitive" type="int">0</item>
1341<item key="type"><![CDATA[resource]]></item>
1342</dictionary>
1343</item>
1344<item type="dictionary"><dictionary>
1345<item key="custom">
1346<data content_type="image/png" filename="crop_thumb_disabled.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000001d54944415478daa4533b6b0241109e8b117c3f40acb415b4cce507e417586a2188166ae70fd042106c142c2c6c6cb4b1162d530424218ddac981e0b310516c7deb6567c2ca79da39f0ddb2bb33dfce7c3327c8b20ccfd82b7e1289c48c11b919a44aa5e2533b050281afe3f1f8713e9fa566b3e9bb2360e60e854250abd5bcad564b3e9d4e74c8020033dc6c36f808944a25efc30c9863af5aadbe592c16406010e272b9101c0e07148b45f4fb5113085c8346a321dbed760ae0c14aa2e57209e170587898011a3a61caf57a9d9c753a1d04834130180c44c2cbf2783c1de627b27d773a9dbebf2809108bc50262b118ac562b180c06204912f4fb7ddae77239998929a65229381c0ee24d06f83a12e8f57a28140aa0d56ac166b381c964a23b0ea3d108e9749a74bb6ae0f7fb3bc88c024622117ad5e9745ecb52024b994c26282ae941256cb75b311e8fc37c3ea7127836e8cc886f564ec28d08f6fb7d2f9fcfc36eb7eb45a351e15100079e236ebad06eb745656b9401ea1278667773c0cde572cd98831bc54b2693d70cb81ee57299dacc4c629df0bda807831dba33990cacd76b188fc7301a8d681d0e87040cce66b348f63fd67cda38d83476ad56ebc56c36ffaaef101a8de613c318be712f3cfb3bff09300083719dbdbb82fb6f0000000049454e44ae426082</data></item>
1347<item key="id"><![CDATA[crop_thumb_disabled.png]]></item>
1348<item key="mandatory" type="int">0</item>
1349<item key="multilang" type="int">0</item>
1350<item key="name"><![CDATA[crop_thumb_disabled.png]]></item>
1351<item key="repetitive" type="int">0</item>
1352<item key="type"><![CDATA[resource]]></item>
1353</dictionary>
1354</item>
1355<item type="dictionary"><dictionary>
1356<item key="custom">
1357<data content_type="image/png" filename="dimensions.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000001b9494441541819a5c1bb6f8d7100c7e1cffbf6489d6a2369d579d5ed0f40a5b1da4874301106529168420c2cfe0e0993582462109741108989c9cad491440f272e71ab4b2fbfcf574739b1f579aa4b2fce85554948420c97f75faff88fb34f66a241c512546a567506b7b0bdbd93184c9a8bcf67439fb34f66a269103aed86ce50078bd449484267b0616b7b072dd6f534f4b388c5dea6f6385b87b73150b550a963e8fd7ecf9b85370c571bd8bd719228fd8a616af33e465a2374bf7779fdf935a5486d4229a579f7b3cb60ab4d950a4be8679104d6b786e87eeba23616a99270e1d999c4a04125866bd3372bfe71eadef1a868b088ca9d9907559584b5a859a39a35aa59a316ab661f9d8c068ba868b875ec6ec53f8edc389c182ca241e5f1f9a7553dfbe8642c36031960d7d81e26c7a7b0483f4b989cd8cbae89dda8689ae9ab07535b44d31b5b3fceb7df5f595e59c222fd5416cb125f7e7d61d3f03855e8a9d416698626181d1ce5c7e202afdebf44a59f45e6e6e7585a5ea1b3b1c3e8f01831b48af267f90ff38bf37c5cf84029366a8f3e1a8a8bcdfca7b73d4b210613aa13b78f46c5221a54ee9f7e58f11f87ae1c480c26c49084bf80a04a8daf86177c0000000049454e44ae426082</data></item>
1358<item key="id"><![CDATA[dimensions.png]]></item>
1359<item key="mandatory" type="int">0</item>
1360<item key="multilang" type="int">0</item>
1361<item key="name"><![CDATA[dimensions.png]]></item>
1362<item key="repetitive" type="int">0</item>
1363<item key="type"><![CDATA[resource]]></item>
1364</dictionary>
1365</item>
1366<item type="dictionary"><dictionary>
1367<item key="custom">
1368<data content_type="image/png" filename="dimensions_disabled.png" type="file">89504e470d0a1a0a0000000d494844520000001000000010080600000168f4cff70000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000002104944415478da62983163c67f2060600411200010408c93274ffefffefd7b84084000318044d6ac5903563773e6ccff2caf5fbf668081070f1e30000410c3f4e9d3c1b2205c5b5bfb9fe5fbf7ef605910e7dbb76f1208c360a0abab0bac252d2ded7f7c7cfc7f8000629c366dda7f39393986fbf7ef33e4e4e4308214353535fde7e1e181380cc30834c002221a1a1afefffefd9ba1b5b5156c02d02430ffcf9f3f0c4c555555ff99989818be7cf92201d305741d03c8b59c9c9c0c0001082183130842188ac6b02028e2750f1e6ccc062c443cd9808d891578b2004166360117e6341f029204f3fe1794c6de1b628ce22ca494f8072ad45a8331064a297f181a78ef61ad0538e7fc2aa5b87944ae5a6bbcf0ea02e1451f0ae500e59c19f407ccbd5aab407a586bf9de91730e28c910c285524a18633c207bef9c09d9bf05289d8c51200462289a2c1e40d062402cbc98bd5858790f6f67215a47d1c24e1b353f8b8bbbec62b103824c3233c9cbffc601d980354d13e6eab66d93a228f85a8b52de75df695c90afff348e233d807b9e675ad795c230a4288ae4fada955d1cc71204811deefbdef6bc3ccfb9aaaa7d59162b09417c9f0b3dd675fd8a2357cff12de7bbf5f70536272dc731b338f7145cd77550fe1bc42ccbf624494ca26ddba20d83eda1379da34074b01c5cf98b41d334e4fbbe09711806511d129765691ec3cd272035337f2b374d538cd22c7c3e720001fe61e663879b410000000049454e44ae426082</data></item>
1369<item key="id"><![CDATA[dimensions_disabled.png]]></item>
1370<item key="mandatory" type="int">0</item>
1371<item key="multilang" type="int">0</item>
1372<item key="name"><![CDATA[dimensions_disabled.png]]></item>
1373<item key="repetitive" type="int">0</item>
1374<item key="type"><![CDATA[resource]]></item>
1375</dictionary>
1376</item>
1377<item type="dictionary"><dictionary>
1378<item key="custom">
1379<data content_type="image/png" filename="flip_horizontal.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000001254944415438cbddd33d4a03511405e033f9313e34112d02161681d94d202ec0d6ce7a208d6ec0664010449b20822ec24241b115c1c234294c69299949ee39d7c2898d8a9160e359c0f7de3bf7bec8dd314f4a98337f039cdd8dc3e96dde0780bd8b617ff7fc39fc0a203d31210600c963ca939981de4dde3279d7f85eae2490ea26bd416b26c0e8e9fa4a294c01936363ad128c4a7f044eaeb37623449d462dc214208550065697ca9d9da3a7f6b7c0f155168c9ed66b1172034cd31b09af19b15806cc946e1f3c862f01a327cd7a29ae9601a3832a9e60c2682c9811cd4635362af9041c5e8e5a46ef2e2f449814a753d38910d99818e502e420d5dddabfff28b452149552080fc309e88004a85871a33078c9200a9443ee41f214c0260044fff42ffc266f7edfb08cd6d90ddc0000000049454e44ae426082</data></item>
1380<item key="id"><![CDATA[flip_horizontal.png]]></item>
1381<item key="mandatory" type="int">0</item>
1382<item key="multilang" type="int">0</item>
1383<item key="name"><![CDATA[flip_horizontal.png]]></item>
1384<item key="repetitive" type="int">0</item>
1385<item key="type"><![CDATA[resource]]></item>
1386</dictionary>
1387</item>
1388<item type="dictionary"><dictionary>
1389<item key="custom">
1390<data content_type="image/png" filename="flip_horizontal_disabled.png" type="file">89504e470d0a1a0a0000000d494844520000001000000010080600000168f4cff70000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000001764944415478da62fcffff3f03188018e5e5e5ff0102881126c2b27bf7eeff9b366de2020820b01408373737ff07d170253000104018024c2062c58a157051a6c58b17737efaf489a1ababeb3f562d00018421800e58608ca54b976efcfdfbb7dffdfbf71980f4a6b6b6367fb8a573e6ccf9262a2aeaf7f5eb5706907d2c2c2c7ee9e9e9df88b2022080082a60622000e00a56ae5c5907a281615687558190905023328da260e1c285b7595959c102402f32141414dc862b98376f9ea2949494cacf9f3fc102206ff2f1f1a9a4a6a62a52c717000146d004a2830119ac59b38673d5aa55608f00e3ec766b6b2b27d10600c353f1d7af5f6f819e5601f1fffcf9a302e2d7d6d62a1234009862bc393838eec9cbcb73023581c540b4b4b4342710dc2b2929f1c669c082050bea80c1bb058819be7dfbc60033e0c78f1f0cefdebd03b3797878b6646565d561a4576072dcf8efdf3fbf274f9e3000693086052e28fe1e3f7e0c1707e2c6e4e464e3b973e7fad32e164801000940cf2674e2ee1e0000000049454e44ae426082</data></item>
1391<item key="id"><![CDATA[flip_horizontal_disabled.png]]></item>
1392<item key="mandatory" type="int">0</item>
1393<item key="multilang" type="int">0</item>
1394<item key="name"><![CDATA[flip_horizontal_disabled.png]]></item>
1395<item key="repetitive" type="int">0</item>
1396<item key="type"><![CDATA[resource]]></item>
1397</dictionary>
1398</item>
1399<item type="dictionary"><dictionary>
1400<item key="custom">
1401<data content_type="image/png" filename="flip_vertical.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000001344944415438cbb591cf4a025118c5ddce63ccf3cc3e82a045d0a645d02208b2d9248558522061586161d21f12a609276160088220425393889b3496d40358e35c37a7332fa0ce448b0feee2fece39df776200627f99509fb34e5fcdd89e115a60efa6af10d6097b5b951f841220ac1116a5071f7673808df2f77802f95b5f256c9cddfbb0ea12f69384f52891bc1a2150b8930a619db067d6249cd600958644996fb32ab176d91b2e4058100663833b23d839881d380770c2e821720b236b5c39e96a1cc1c172f1034b850e160f5d2c1cb4319f1398cbbe6036f33c3c016185b04ed8dbb53e5174beb07fddc58ef98ef4858b99edd6782bd059a5b3913875b159ea2075fe86d5e336a6d38d7037606c8db145fce815f1bcc054aa1efe888cadd05927ec4d266bd15b20ac4eac578dffab31cafc027494fa973b52b3050000000049454e44ae426082</data></item>
1402<item key="id"><![CDATA[flip_vertical.png]]></item>
1403<item key="mandatory" type="int">0</item>
1404<item key="multilang" type="int">0</item>
1405<item key="name"><![CDATA[flip_vertical.png]]></item>
1406<item key="repetitive" type="int">0</item>
1407<item key="type"><![CDATA[resource]]></item>
1408</dictionary>
1409</item>
1410<item type="dictionary"><dictionary>
1411<item key="custom">
1412<data content_type="image/png" filename="flip_vertical_disabled.png" type="file">89504e470d0a1a0a0000000d494844520000001000000010080600000168f4cff70000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000001934944415478da62fcffff3f03188018b5b5b5ff0102881126c2ccc6c6767beddab5930002082eb271e3c6ff8f1f3f86a885e1e4e4e4ff0001045701034c2062c58a158afbf7efff0f17b873e7cebd1d3b7620ec03e18c8c8c3a100d10402886c2f0c2850beb66cd9af51fc4668119be72e5cadbbf7efd52f9f1e307c3cf9f3f19fefefd8bb01404c2c3c3556fdfbeadf4e6cd1b866fdfbe31dcbc79132c8ee14c74001040041530a10b2c5dba9473debc79df607c1634c98d6262627ec8a6322149fe07bade0f18287007c24d686b6bf306d17ffefc017b1184b13ab2baba7aa3888888dfd7af5f196a6a6a18311cd9dadaea7fefde3d2e60bc7d27da9b000186352e70e1458b162902836023b2180b030100f4bdf7bf7fff26080a0aaa484b4ba38400463882003021720243a314882b84858539656464c0a103c2c0c4c0f0fbf76fd2a29210c07001304e388149ad14e8ec0a0909094e6e6e6e86efdfbf836d07c5cffdfbf719264f9ecc48b40b4a4a4abc81ce9fc0cfcfaf0252fbe2c50b06606267242b1680d950313131112516280e03000cee4f0564e6a9940000000049454e44ae426082</data></item>
1413<item key="id"><![CDATA[flip_vertical_disabled.png]]></item>
1414<item key="mandatory" type="int">0</item>
1415<item key="multilang" type="int">0</item>
1416<item key="name"><![CDATA[flip_vertical_disabled.png]]></item>
1417<item key="repetitive" type="int">0</item>
1418<item key="type"><![CDATA[resource]]></item>
1419</dictionary>
1420</item>
1421<item type="dictionary"><dictionary>
1422<item key="custom">
1423<data content_type="image/png" filename="information.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c0000029c4944415438cba593cb6bd4571cc53f774cac644c26310a9989368fd1a82868a189522c08c54d21523b5441a22e5c74956d155cf91f080a3e56beb0a5749aae855a9a9486cea21b99c630d5c4348fd11833c924fdcddcefbdf7eb42487cb41b3dcb2f5f3e1c38e71855e57d54f3e6217375342dc11d57174e56adb4380d28a108e1a677e1cee0d94f1ebefa6f5e75f0c595918cb572b123a1c99eb6461ad6ae016021720c159e707f7a7906a3fdb9f39f65df021cbe9ccfd8486e1cda5617dfdd5acfd49ca5b810e18392a85b432ab18ec2b332033f3f5ca68653b90b87b32b80de4bf73b45dcd0a1adf1d4f6967a7263259c13f6b435812a7f8ecd6362865dc9f5fc335fe6a7bb8569347c9abb76f4510c4082ebeb68d0d48e6403c385e7d8c822d540efc7497abb5388136cd5929f2cd1be3141d7d6869446d2071003b0de9fd8d7decc587109114182c707c78fc313648727b062b1ceb214458ccf2e72606f1bc6da132b29d8c8b636d5d7509829e1bc47bca021d077b013058647a6d1100043716e91aed466d447adab0eaa160d8a53b0ae4af09e1094fce379fead38bc7578f13871382ba801bc6705007e6a6eb94273bc16a3313428c17b5e26a478710411825812f10f78b258c69830b50ab0eed6607e92b64d7108019c72647f3b3b3f6ca26e5d2dfd47f6202238113a5a120c0dfd0de8add52656a2db230fca5fa7938da99eae4dfc969fe4fb5f47f9f6de5fa83854038af2d1f62d8c971679942f4c1bb8fd5a91ba4f7f97d172e5c6e75fee8e776eace7c1e359669f97092eb0a1b18e6d5b9a192f2d71ef875f9631b5a77203df64dfaa72f7b1eb19d45e4cef4a260fec4bd3bc7e2da03c5da830f8fb2813f9c28c31b1fedcc099ec7f6e01a0e7ab2b69557f1c0d2709951634608c2902370d72e78f8173ff3fa677d10ba83f827b59b621b90000000049454e44ae426082</data></item>
1424<item key="id"><![CDATA[information.png]]></item>
1425<item key="mandatory" type="int">0</item>
1426<item key="multilang" type="int">0</item>
1427<item key="name"><![CDATA[information.png]]></item>
1428<item key="repetitive" type="int">0</item>
1429<item key="type"><![CDATA[resource]]></item>
1430</dictionary>
1431</item>
1432<item type="dictionary"><dictionary>
1433<item key="custom">
1434<data content_type="image/png" filename="resize.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000001ac4944415438cba592318b13511485bf9151d0425c0441d8147649204d7e8190c222ff2258e60784fc8480648b9449bf6582761636cada68e9244d24b3e8c2d6261998f7eed9226f2609460bbdf0e0f1de3d8773cebd9124fea76280c160904aaa484a7abd5efd6f806eb7fb21cff397ceb9643299d4e3f05e69b7dbcc66b3da9b7737320901de03029961026fb0dd6ee9743a8c46a35aa9c07bff753a9d36e3474f797e761f1908900913e880e4f6c939c3e110e7dc2780a8c860f0f6a7cecf1eec00069290c0a492c84c9889e54dc6a0f3222a1510e47a0324cc02b0b8db3149eeed38440079db350acc0c19016025b02074ee048133302f2c34ed9a8bbbed9508cce97702738637953e75e059c152a1c49d22700ebcb7d2ff31c95e9104ce4e59f01eefe3907a002a8cf2204049787f52c1eea3946b60c1fbe13815b22a2a9244abd54af33caf3c7cfc8c579d8ba3c40fa54be2f2e235df93cf78ef932ccbeaf700b22cabf4fb7d6e7f2c595caf595c6f98a76b16ab5fccd335f3d58664b52649372cbf5d311e8f71ced576f39768369b5f1a8d8655abd52b8505fad389e3f87d1445023e4adaaff2bfd61df935bc3c4be0dd6f0000000049454e44ae426082</data></item>
1435<item key="id"><![CDATA[resize.png]]></item>
1436<item key="mandatory" type="int">0</item>
1437<item key="multilang" type="int">0</item>
1438<item key="name"><![CDATA[resize.png]]></item>
1439<item key="repetitive" type="int">0</item>
1440<item key="type"><![CDATA[resource]]></item>
1441</dictionary>
1442</item>
1443<item type="dictionary"><dictionary>
1444<item key="custom">
1445<data content_type="image/png" filename="resize_disabled.png" type="file">89504e470d0a1a0a0000000d494844520000001000000010080600000168f4cff70000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000001f44944415478da62fcffff3f0308308188499326fd070820469808cbac59b3fe7ffcf891012080c022cb962dfbffebd72f861f3f7e30b080a49f3f7fce00129832650a034000c1f5c0000bc824414141b08ae4e4644696cf9f3f33b0b0b030fcfcf91362dfbc79f318be7cf9c2f0f5eb57065656d66b0001981c77158041188adee2248a6bbecbafcdd049e8208ef91907b58fa4141a08e742c8e5584729e51211681e6360ad056646effd356cad21a5841002628cc69c336aad9b69a9b0f71e734efbfe68a3b544742affeb9cdb9ff3710b200c7fa003c6f4f4747030181818c08d066155555586e0e06046b0092b56acf88f6c37083f78f080a1b5b515e24890d74092300c52000a5870d08108901530ffc3681405a06084e94456080e5a7575f547d3a74f072b026198690b162c8078435a5afaac8888c871f4706004bbff3f03408042a9d80662100692868201e822d17ea6f896a168e85231405af6608cf44f89f42390f72119118a0fd2c920f0199faf7541ad7e28ae84f3388eed9f2ed6da4415def48d33a5b4b53fd2a11056a5d40b92d45adb63440045384a294529053d7d9bd03c8910c2a5b5ee8f39010dcfe79cb3d8f77de92acd528e243370c712df08e03da8385662a2718fc8eebe11f008e6044e1a4979869dc0187339e7044006eb897365ac18a3f0dec3cef0dff268e7a7f50312c8e53d339dcf5d0000000049454e44ae426082</data></item>
1446<item key="id"><![CDATA[resize_disabled.png]]></item>
1447<item key="mandatory" type="int">0</item>
1448<item key="multilang" type="int">0</item>
1449<item key="name"><![CDATA[resize_disabled.png]]></item>
1450<item key="repetitive" type="int">0</item>
1451<item key="type"><![CDATA[resource]]></item>
1452</dictionary>
1453</item>
1454<item type="dictionary"><dictionary>
1455<item key="custom">
1456<data content_type="image/png" filename="rotate_anticlockwise.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000002234944415438cba5934d68134114c7df24dba64bad6dd5c458518c06bc78118fea4d5189a4879e143c59c482b112680d28968282d54b842a6a110fa1e0a122112b5a2852150ca18a5a056bd2f48be650230561bb3b5f3bbe6d4dacf643b00b7f7666f6bddfbcf9ef1ba29482d53cae7f05b4a49adcd1d7a762ff0d105cdce1941f5fee3b59e908cd038d717fc5a66684c0c874ee1ba7ec2db5f87366b1878f9bfa2657049c7d71f2f2c60aff851d354190b604831950f8f11df2853c0c8f7e4d22a463e062ea8db654f2f9c478886d60e5ccc580490633e60c68ee72d03c1a6cdbbc1d4091faf4bb41d81ddd1559e4416b625c97d28edf3e9268cde6b39def473f806551c84c6480e29b0a0aebbd5ea8f3d7d55393362caa00935b504167dc7dec51e468e7813543c39ff660c9fd78fe86fd7bf76d712aa9aead0146f9a13f00d1fbb980b4550c01a535d3b01a3139f6aa2d7d054b86a7bdcfce712640a0a49087c131b1a8485726d9d133a64edffaa29c79cf204ba2020b63fe56c983485736b4aed21d2e23f8ef7f5710b6157c7e906697ba534c5fb691cedccda07132eec19961c912009361a78fe8be2ad22ea4fa78efa5155a12e018e7ab2a0b726e83c56c287a807ecc41aa3d04b6d692e05a9d3cb9d96f266ff4cd068a000dcf3b671c761498988c3b2d000030a1700dc0ed22e0ad24ce8ee1b1823878add7b88a79d7352c378e033d373dfb6b47943ddf9d0e6c680aa1f6fcb82804eb18db8e6127c86aaff34faf1c5f4f628956340000000049454e44ae426082</data></item>
1457<item key="id"><![CDATA[rotate_anticlockwise.png]]></item>
1458<item key="mandatory" type="int">0</item>
1459<item key="multilang" type="int">0</item>
1460<item key="name"><![CDATA[rotate_anticlockwise.png]]></item>
1461<item key="repetitive" type="int">0</item>
1462<item key="type"><![CDATA[resource]]></item>
1463</dictionary>
1464</item>
1465<item type="dictionary"><dictionary>
1466<item key="custom">
1467<data content_type="image/png" filename="rotate_anticlockwise_disabled.png" type="file">89504e470d0a1a0a0000000d494844520000001000000010080600000168f4cff70000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000002614944415478da62fcffff3f03188018a1a1a1cc0001c40817292f2fff666363f31f2080e0225bb76efd7fe2c409062610a7b6b6f6bf8c8c0c83a2a2e226800042e881021610d1d7d7d722252555bd6ad52a2bb0f1306c6464f49fa1b1b1f13f8873e0c001300d1040282a4078d2a4497390f9704beaebeb3981babfb7b4b4fcfff3e70f83a4a424c3f1e3c7215e282d2df5eeeded051bb971e3c66f6bd6ace18499c0929b9bbb11a8c3effdfbf760933e7ffeccf9ebd7af6fd3a74f67f8fdfb3703400061f8031d30a10b00adba84cc473161ce9c39ffc5c4c4189e3c79c270e4c8918dcb962d0b802ba8a9a9b9fdf3e7cf1dcacaca39205f800050412158417575b522d061f7babbbb19030202aa3f7dfa24f2eddbb702a006881520bfbf7efd9ac1d5d59501a8bb1ea8a809eec8a2a2a2babf7fff328054838c9695956d0486c5ffd9b3672b821d999595f51fe45f902237373706a0550cdfbf7f07870150c31d8000c3880b743c63c60ce6c9932757e092c71b9013274e9cc0cbcb9b0fb2151834af7ffcf87116887702f15a60903dc60847180046bc373b3bbb3d1f1f5f2928e901438581959515ec7410b877ef1ec3d9b3673702fd9d8b610030bceb807e6bece8e86004f1131313e7036d34062ade0bc4c1b6b6b6b21c1c1c0c8f1e3d0245d60e1403805961a3888888dff3e7cf41c99a71f3e6cd1b81c205bebebef77179139c0780c991f3dfbf7f97809a5540d101c2d0dce6a7a0a0e077e8d02106a0a177803151101515b515c580c2c24245a0e6abc2c2c29cc0a4ca006483a30a044034d0f90c2c2c2c0cc04ca60294db028c639061df81deec00f2bb0926674200008520bdcee578a4df0000000049454e44ae426082</data></item>
1468<item key="id"><![CDATA[rotate_anticlockwise_disabled.png]]></item>
1469<item key="mandatory" type="int">0</item>
1470<item key="multilang" type="int">0</item>
1471<item key="name"><![CDATA[rotate_anticlockwise_disabled.png]]></item>
1472<item key="repetitive" type="int">0</item>
1473<item key="type"><![CDATA[resource]]></item>
1474</dictionary>
1475</item>
1476<item type="dictionary"><dictionary>
1477<item key="custom">
1478<data content_type="image/png" filename="rotate_clockwise.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000002334944415438cba5934f48545114c6bf3733da3cd4a9b034151782548b762da265b430109c85b4b1852ddc8404ba989a450589ae8298d2452e5c58040549498118862209b6186cec9f380a8a83082a44d17bf7de77cf392dc6812ca7202f9ccd3de7fcce772fdf714404fb39a162898e976dc9f66717c3ff0dd09e6ef33d3df82f80537842e7c4e5fa40db56a383a6409bd3d51535478d31c8ae2edd1bef9eeafa2be0caebf6b3810eaed796d5c663d1838896ba70e04091c6fb2f19649796fa667bd337f6028437ce2cd71b6dfa8e579e88d71daa43000b16c696b705471ce4d673d8dcd87cb7fe355e7aee542cfbc71f28dfb41e736be2956547a0ac86561a8bab5918df229d99c3e2427660eeeec76b0052379fe4dcdf0111e5a9a6f2ca7228abf0cdfb8ef1e9f135ad8291409bf34607e90ff717ae0200b334b2480240cf6e059ebef0363383e76f5e606c720cbea747667bd3ddca374fb50a3a0a85cc0c224e2686571a76491091a2f160d26f1898f046450489872bd2ff2a275d43cba3bfd6ece983a169e50e4ea95b96e4932569010022861b060e97855b3a07179b8b1a69685a355bc67c558573fb6475c4b594f78925c60f458886016b39d5d1ffd9058048a171784637589254cc755a2a0e38280903811510e7f3d6327cc3206654c54a1ad7b6fd04809ec8e359e35a9284254956c7426e79a903430213002400715e01114199100a8a883879e94ee651c492cc5b9246cbc0ea36c192c0527e32b160a71f96182bdb0a4cbc732f2eb3a49cfdaef34fd7d967e699b5fc230000000049454e44ae426082</data></item>
1479<item key="id"><![CDATA[rotate_clockwise.png]]></item>
1480<item key="mandatory" type="int">0</item>
1481<item key="multilang" type="int">0</item>
1482<item key="name"><![CDATA[rotate_clockwise.png]]></item>
1483<item key="repetitive" type="int">0</item>
1484<item key="type"><![CDATA[resource]]></item>
1485</dictionary>
1486</item>
1487<item type="dictionary"><dictionary>
1488<item key="custom">
1489<data content_type="image/png" filename="rotate_clockwise_disabled.png" type="file">89504e470d0a1a0a0000000d494844520000001000000010080600000168f4cff70000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000002854944415478da62fcffff3f0318a4a5a5fd07710002881126c27cf2e4c9fe9b376fde0208200690c8ecd9b3ffe7e6e622946cdcb8f1ff93274f183e7efcc8001040703d30c0ccc4c4b40128bb5c4f4faf112c121616f6dfc6c6a6bab1b11162c68a152b14c5c4c4ee6dddba95e1dbb76ff5000104b605864b4b4b2f21f34198f9cf9f3f056fdebc397ee4c89106666666f19a9a1a9167cf9e4db2b5b59d0cb202c5158b162daafbf1e347e3a3478f18b8b8b818aaaaaa184176defef9f3a70a1033fcfaf58b016822c39d3b77c03408030410863fd0011332273f3f7f0eba0296cece4e4b0e0e8e632222220c8686860c5e5e5e2fb66ddb56033701e872b0e4b56bd7180e1f3ecc00926c6d6de5849b70f9f265b0043080192d2c2c98418240c7be05525c6015b00059b26409e7bc79f3be81d83367cefc5f5c5cec0d62b380142d5dba74233078fd603e7af7ee1d030f0fcf165038b10025ff83c2e0eeddbbe0707073736300c525889d9c9cbc1120c018d0c31e861b1a1a2a2a2b2b9971c9c3303c20bbbbbb6581d1100cb4cd1d481b0b0a0a8a826cbe77efde44a0fb0b700534331b1b9bec9e3d7b16898a8ace949595f5e0e7e757111717e76664646400b2198009c1a2bfbf9ffbe9d3a76cc004701bdd00c6c2c2c2ed2a2a2a1e7c7c7c0c9f3f7f66d8bd7bf763a00bd6fefefddb19e8cfb3070f1e4c04296c6969f9ffefdfbffabababa261403f0a50560ea5204269809494949fef5f5f5ff8121cd0074c9a6b6b6367f7844a26b0286ba37d0a6090202022a402f31dcb871032c0e0a0fa0ab1880e27e050505b7816af4264d9af49d65cd9a359c7ffffe2d05da54212c2ccc292323034faa40af8035c10c006543a05a06a077555ebe7cf9363535559b60722604001067a1e996e25dee0000000049454e44ae426082</data></item>
1490<item key="id"><![CDATA[rotate_clockwise_disabled.png]]></item>
1491<item key="mandatory" type="int">0</item>
1492<item key="multilang" type="int">0</item>
1493<item key="name"><![CDATA[rotate_clockwise_disabled.png]]></item>
1494<item key="repetitive" type="int">0</item>
1495<item key="type"><![CDATA[resource]]></item>
1496</dictionary>
1497</item>
1498<item type="dictionary"><dictionary>
1499<item key="custom">
1500<data content_type="image/png" filename="drop-shadow.png" type="file">89504e470d0a1a0a0000000d494844520000001000000010080600000168f4cff70000001974455874536f6674776172650041646f626520496d616765526561647971c9653c0000022b4944415478da62fcffff3f0308308188ae558ffe030410234c8465f2e6a7ff6fbd78dc0e1040609185075efffffefd0f83b3ca1788da780751c6ab4f1eb64f3af0f62f4000c1f5c000cbd2c36ffefff8f997e11b508b8bca270696cf5f7e03397f197efcf8c3f0fbf76f060690969c59c79f82e8e3c78fff070820b019bd5b9effff0ba4fffc6100aafacbf0fbd77f8696183946b80b85b8981904d9991904d818809891418083812177f689a7d7af5fffcf025270e1e647869fbfff0175ff03ebfef3f72fc3b21a0be9b367cffec770263a00084008b92341080241740236357437dd886b791acb6beca10ce0161ba88038d80d456c303543cd87d7fd386008c822e722675649f82641e7327d1b24e9c7e18530f246fe20d337e75c5d342962235d0d3013b4c81e54acb5ed42c023e2640f0ec7705599f5c2769cb2fe231ada4c028baab2f7ab9454e1bd2fb077ee36f79af128f3166004151002e0a800859594201bd8ca7f40f3feff03b99381e12f9000d1ff80fcbf7fff33dc7df69da127458911c3805f7f4029e11f564d601a6420900d0a5f60e8b4815265960dbf94a6a6262338b5fc0426b69fc050fa090ac29f9060fd8114b4600c9407193039d5a20a14827f8109069edc402916972670dc4023f3e76f48fc800c01a76e788e4a5464ccf69162f4d1f9c970f7cd936745c1b28c8f3e3c6b7ff2e9d9b3ca2805c617df5fb4bffaf1f2d9d26a5d90ff1f020df9f30794fad16301967e40cefb070e0bdc1804acacac18298e46005292b72d500388820000000049454e44ae426082</data></item>
1501<item key="id"><![CDATA[drop-shadow.png]]></item>
1502<item key="mandatory" type="int">0</item>
1503<item key="multilang" type="int">0</item>
1504<item key="name"><![CDATA[drop-shadow.png]]></item>
1505<item key="repetitive" type="int">0</item>
1506<item key="type"><![CDATA[resource]]></item>
1507</dictionary>
1508</item>
1509<item type="dictionary"><dictionary>
1510<item key="custom">
1511<data content_type="image/png" filename="drop-shadow_disabled.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000001364944415478dac4533b6e83401065a2880a5120992647a1e4045c801c02941358b62c4143e18e821289825344200e815c844398cf86b7cae035c6958b8c34ccec8a37fbde63212184f64abc692fc63b1e49920822921bd33469e3386a60868a1c8661a9fbfd9e1e06006cdbb604610027405c9197cb659b817aea1690d760d0348de03dc771487aa00254ba7ddfcbca3d32cff3635114dd9d89ea4b003370dda3cef11945d1077b26076c01f8445506d60087617840bf78c00c54ddcf8c04182cd02f0caed7eb838cb5073c8025fcc9b93168dbf6ce489501df09044b705df7c6e0743a511cc7e4fbbea6eb7a773e9fc9308ca3699a5d9aa66459d671b7db755996d10cfe9e215f182e03d339ebba16a841101ce6fc79d20fe8cbb294ef92fa33555525f8abac0de48bc4d2109ee711fdfbdff82bc000ee88a508657ee4330000000049454e44ae426082</data></item>
1512<item key="id"><![CDATA[drop-shadow_disabled.png]]></item>
1513<item key="mandatory" type="int">0</item>
1514<item key="multilang" type="int">0</item>
1515<item key="name"><![CDATA[drop-shadow_disabled.png]]></item>
1516<item key="repetitive" type="int">0</item>
1517<item key="type"><![CDATA[resource]]></item>
1518</dictionary>
1519</item>
1520<item type="dictionary"><dictionary>
1521<item key="custom">
1522<data content_type="image/png" filename="reset.png" type="file">89504e470d0a1a0a0000000d494844520000000f0000000f08060000003bd6954a000000097048597300000b1300000b1301009a9c180000000467414d410000b18e7cfb5193000000206348524d00007a25000080830000f9ff000080e9000075300000ea6000003a980000176f925fc5460000017e4944415478da62f8ffff3fc33f1cb865d3f3ffd8c4ff43314000b130e0004d1b9efffff4fd2f033e0010408c6053b069fcf69701843f7efbc7f01988bffdfccb70a05e8d11ac09aa0e20809870d9f8f1fb3f864fdf411aff327c06f1bffc6550cbb982620f40006168ae0b9064fcfae33fc3a7af7fc1f833d0802f4003be02e96fdfff3308c55c841b0010404cd8fc323d51961164e317a0730f37aa319eefd664fcf603a819887ffc40580e10404cb802635b850ae317a400fb0ed4f8f3e77f865fbffec1c50002081cdac5cb9ffefffced0fc3c7afff1856e629c2c283e11cd046181b64e34f248d2000104060cda050fdfcf51fd89930a09673f5ffad29da70cd5fd71830a2bb0e2080c0ce06070c346ae08a8101248c1438d800400081e3d9b3e3ce7fd45005c52bd08f207ffefacff06793118aad300e4000c1138951e9f5ff5fbe4342f43b18a3060eb201300640003121070e2c3abea3852a2e0010405893273824fdcec184ff006d65c5e66c800062c16732ba5fd101408001005a9410e9e22e4a040000000049454e44ae426082</data></item>
1523<item key="id"><![CDATA[reset.png]]></item>
1524<item key="mandatory" type="int">0</item>
1525<item key="multilang" type="int">0</item>
1526<item key="name"><![CDATA[reset.png]]></item>
1527<item key="repetitive" type="int">0</item>
1528<item key="type"><![CDATA[resource]]></item>
1529</dictionary>
1530</item>
1531<item type="dictionary"><dictionary>
1532<item key="custom">
1533<data content_type="image/png" filename="reset_disabled.png" type="file">89504e470d0a1a0a0000000d494844520000000f0000000f08060000003bd6954a0000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000000f64944415478da94923d0a84301085278b7b245b7b4bafe015bc818d95d8585b89ada547b0f03afe2bccee0b8c842509ec832191e49b9f678899c9155555b1ef3c2087cab2e46559c827850c36709e6702bcaeab8ef33ca96d5b65de7bb92a02d8b64daffbbeeb44711cb317ceb24c0192ca00f18df5380e8aa2889d305414854e80e8ba4ef57dafaeeb22092f0c354da3504d8499effbd621d26ee779aee744d475fd98828ab24745137c6001618e08e60cc3f0c0e338aadfee74db3047dc35db34cd71fee7344dd97415a0988356a76952de47922409db40912dc1cb34c705fef53ca1300ce5e0fe567ddbee04beccae59451f0106009e590f814d8292bd0000000049454e44ae426082</data></item>
1534<item key="id"><![CDATA[reset_disabled.png]]></item>
1535<item key="mandatory" type="int">0</item>
1536<item key="multilang" type="int">0</item>
1537<item key="name"><![CDATA[reset_disabled.png]]></item>
1538<item key="repetitive" type="int">0</item>
1539<item key="type"><![CDATA[resource]]></item>
1540</dictionary>
1541</item>
1542<item type="dictionary"><dictionary>
1543<item key="custom">
1544<data content_type="image/png" filename="crop_hires.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c000001bb4944415438cb8d93318b53511085cf0bd1c228618dd8c816762a36bad67103428a54f901c2a691fc84b476a631ff42c8569b2e04c14a0392dd428b45d6425670cbd89817de9b33c7e2be17dfea433230ccdccbccc799b9dc68381c9e4bda95743a180c1e600bebf7fbefd234dd27795a01b0dbe97440f21eb6b4388ef77bbd1ee238be5f257932994c1e5dbd7e3b3a5aac24004e208f0ec00590c0f3e6b50800d6ebf5dbd168f4ccccde47920000478b95766a1540a1491e1aa5102f7e3a0e9e0640d1aa79420fc57943ee12e00e98978fb301e485ca24bbff0561396133c2e187956edea840023e9d2f832a0924203acc0137871960245e1ddc8d2e2930012c8c7067e74a50e1025d7086480a5f7fa4253b604136959d0577071d201d640024a99700045c2c1d740fc52e381d24b2bb3f4ad254ff028a4ff4f270299a6f24d31d6e0a7ba0c3ac04503433c10a92373bc87233fe1f9026845975d36854b64c8713971574bbdd4592247b248fa7d3e9130048cd71f6fd175207680e23604638c3d37e7cf302b75e7f91999da1dd6e6b369ba9d96c4a12b6f146a3a1f178ac5aada6a8d56a1d2749f298e4c97c3edfdbe637d6ebf5cf66f690e4b7df0925a260120fa46f0000000049454e44ae426082</data></item>
1545<item key="id"><![CDATA[crop_hires.png]]></item>
1546<item key="mandatory" type="int">0</item>
1547<item key="multilang" type="int">0</item>
1548<item key="name"><![CDATA[crop_hires.png]]></item>
1549<item key="repetitive" type="int">0</item>
1550<item key="type"><![CDATA[resource]]></item>
1551</dictionary>
1552</item>
1553<item type="dictionary"><dictionary>
1554<item key="custom">
1555<data content_type="image/png" filename="crop_hires_disabled.png" type="file">89504e470d0a1a0a0000000d494844520000001000000010080600000168f4cff70000001974455874536f6674776172650041646f626520496d616765526561647971c9653c0000023d4944415478da62484b4b7bf4ffff7f060610316fdebcff0001c408e60101cbf6eddbffdfbe7d9b012080c052fbf6edfbbf63c78eff20365c497f7fffff2f5fbe30000410434a4aca359020083b3838fc675cbf7efd7f5e5e5e86a74f9f32c4c5c531b27cfbf68de1ebd7af0cdfbf7f076b658a8a8a627cfffe3dc3870f1fc0020001c4989c9c7c968b8bcbc8d5d595e1cf9f3f60fcfbf76f0690426363e3ff605b57af5efd5f505090e1faf5eb60c95fbf7e31fcf8f183a1a1a1819105644c68682823887ef8f0e17f9024131313188381a6a6e67f2525a5ff30a722e3aeaeaeff0001d8a09613864220b84210c4cbc37e3c8b0dd881955888455840b0018f292377216a9c25e6f416d483333b1f8a31de7e6e4f4f6bedebb1355729658d31d8e09c93420862a7f8f4dedf6cb2d6ca8003f2de0bfa0d9b8473240078b3a8b5b69022a524d8ea615ed745c618426434c8cde172ce09307050e979ff121830b4d62c816d00f1e49c6f632aa59694727d05e89b0a5218848160022d78cbc95ff4125a6ff9895e7c8d7e24979c7d800f684f0509f403e2231a77845d4c095d588c6633ceee4c14b922cdf39cfabeff960a4be99c4b90a7699a240ec1ac8c3159219ae3f5b66daaeb3a194f3626043b018161733200342e853008211c8ec17b8c51d5752d2c7e934ca3c671d4190388b5aeeb518049e28f67f9f9896fac5106d0b6adf4470a1f4ae35089814804006bed930aefb4f15a96e5c19ae2529e01788db6a66952defb448c3e17ba701af46943180cc3a0d59fa8aaea4df53702b8ee2e970b61db5e74010000000049454e44ae426082</data></item>
1556<item key="id"><![CDATA[crop_hires_disabled.png]]></item>
1557<item key="mandatory" type="int">0</item>
1558<item key="multilang" type="int">0</item>
1559<item key="name"><![CDATA[crop_hires_disabled.png]]></item>
1560<item key="repetitive" type="int">0</item>
1561<item key="type"><![CDATA[resource]]></item>
1562</dictionary>
1563</item>
1564<item type="dictionary"><dictionary>
1565<item key="custom">
1566<data content_type="image/png" filename="arrow.png" type="file">89504e470d0a1a0a0000000d49484452000000100000001008060000001ff3ff610000000467414d410000afc837058ae90000001974455874536f6674776172650041646f626520496d616765526561647971c9653c0000012c4944415438cb63f8ffff3f03259861981b90bdd8fc6bea7cc3fff1737539c9322079bee1d7c6cd51ffc36768fcf79f2acf49d080fca5b6ff73179bff4d5f68fc3771aefedf9af5a1ff579d9ef8bf64b5ff7fd77ef1bfb6dd823c780d003af9ff8673d3feaf3d3b05ac71c5e909ff27ec29f9bff078d7ff8ca56eff4ddbd9ffea3633f2e33400e864b0e6be5df9ff3b7764ff6fdd96f6bf6173e2ffa6ade9ff671c6afe1fb3c0e6bf6a3dc31f9c0644cfd6fcbff2d484ff4b4ff4fe5f78acebffbca31d4043b2fe4f3fd4f43f6da9c77fc55a8657d2950c06380d089caef8cf73a2f43fe77ed17fd6ddfcffe2e65bfd9f76b0e17fd262b7fff2b50ccf252b19b4488a05ed66c6aff10b9dffcb57333c016a5627391a814efe2a57cdfc5fb4924191ec94285ccec039b8f302008795c7fa0eddacec0000000049454e44ae426082</data></item>
1567<item key="id"><![CDATA[arrow.png]]></item>
1568<item key="mandatory" type="int">0</item>
1569<item key="multilang" type="int">0</item>
1570<item key="name"><![CDATA[arrow.png]]></item>
1571<item key="repetitive" type="int">0</item>
1572<item key="type"><![CDATA[resource]]></item>
1573</dictionary>
1574</item>
1575<item type="dictionary"><dictionary>
1576<item key="custom">
1577<data content_type="image/png" filename="arrow_disabled.png" type="file">89504e470d0a1a0a0000000d4948445200000010000000100804000000b5fa37ea000000097048597300000b1300000b1301009a9c180000031b6943435050686f746f73686f70204943432070726f66696c65000078da6360609ee0e8e2e4ca24c0c050505452e41ee418191119a5c07e9e818d819981818181812131b9b8c03120c087818181212f3f2f9501153032307cbbc6c0c8c0c0c07059d7d1c5c9958134c09a5c5054c2c0c070808181c12825b538998181e10b0303437a794941090303630c03038348527641090303630103038348764890330303630b0303134f496a450903030383737e416551667a468982a1a5a5a582634a7e52aa42706571496a6eb182675e727e51417e5162496a0a030303d40e060606065e97fc1205f7c4cc3c05435355062a8388c82805080b113e083104482e2d2a8307250383008316831f4325c32a86078cd28c518cf3189f32193235305d62d6606e64becb62c3328f9599359bf52a9b13db267615f6991c021c9d9cac9ccd5ccc5c6ddcdcdc1379a47896f21af31ee20be67bc65f2d2024b05ad04df09150a3b0a2f0619174515ed1ad6271e29ce25b25522485258f4a5548eb4a3f9199231b2a27287756be47c1479157f182d214e528152595d7aa5bd51ad5fd346435de6aeed39aa89daa63ad2ba4fb4aef88fe7c831ac328234b6349e3df26f74c0f9bad30efb7a8b04cb4f2b1b6b051b515b163b1fb6affdce1b6e305a763ce7b5db6baae775be9bed46391e742af05de0b7d16fb2ef35be5bf3e606be0dea063c1e7436e853e0bfb12c1142918a5146d1ce3161b159717df92303b7173d2d9e4e7a94c6972e9361951995559b3b2f7e4dccb63ca572ff0292c2e9a5d7cb8e46d9944b94b4561e5bcaab3d57f6bf5eae2eb27351c6bfcdd6cd092de3aafed7a8760a777577bf7e15e863efbfeba09fb26fe9fec38a575ea89e9bc338267ce9af5688ed6dc9279fb16702d0c5bb478f1c7a50ecb262c7fb8d27855ebea9b6b75d735adbfb9d16053c7e6075badb64dddfe61a7efae557b38f6a6ef3b7e40fd60e7a1d747fc8e6e3e2e7ea2f6e493d3de67b69c933ddf7ee1d3a5b8cba7ae5a5c5b7643f466ebadaf77d2efdebceff3e0c023d3c7ab9f2a3e9bf942f065d76be637756f7fbe2ffdf0e953c1e7775ff3bebdfb91fff3c3efe23fdffe55fdff0f002e0c1d8ba03c09310000000467414d410000b18e7cfb5193000000206348524d00007a25000080830000f9ff000080e9000075300000ea6000003a980000176f925fc546000000ac4944415478dabcd1ad0ac25000c5f1d581e033980493ef20db1882c132502c8a208ccd8fcd66320c5404b1a94114c181fa568260bfcd7bffe6295b1239f557ce391a5a76b4bf8391f071f50ce08b882e6dfd0b8c09e440ba724acc84a674721f20e0c6959898354742eab2964f008f0b2b962c8898b1c3a7fa4a801e674e1cd833674b88fd34ca09d0512dd5508ef2d830c47e98a5941635d1c7ba9bc5d49ab6b0300a994b56f45f7ff11e00e6bc130af9fb49370000000049454e44ae426082</data></item>
1578<item key="id"><![CDATA[arrow_disabled.png]]></item>
1579<item key="mandatory" type="int">0</item>
1580<item key="multilang" type="int">0</item>
1581<item key="name"><![CDATA[arrow_disabled.png]]></item>
1582<item key="repetitive" type="int">0</item>
1583<item key="type"><![CDATA[resource]]></item>
1584</dictionary>
1585</item>
1586<item type="dictionary"><dictionary>
1587<item key="custom"><![CDATA[<dtml-comment>--// BO bodyContentZMSCustom_ZMSGraphic_extEdit //--</dtml-comment>
1588
1589
1590<dtml-comment>--// EO bodyContentZMSCustom_ZMSGraphic_extEdit //--</dtml-comment>]]></item>
1591<item key="id"><![CDATA[bodyContentZMSCustom_ZMSGraphic_extEdit]]></item>
1592<item key="mandatory" type="int">0</item>
1593<item key="multilang" type="int">0</item>
1594<item key="name"><![CDATA[Template: ZMSGraphic_extEdit]]></item>
1595<item key="repetitive" type="int">0</item>
1596<item key="type"><![CDATA[DTML Method]]></item>
1597</dictionary>
1598</item>
1599<item type="dictionary"><dictionary>
1600<item key="custom"><![CDATA[<dtml-comment>--// BO ZMSGraphic_extEdit_Form //--</dtml-comment>
1601
1602<dtml-var manage_page_header>
1603        <script type="text/javascript">
1604                var img_info = new Object();
1605                var zmsgraphic_extedit_workspace_width                  = &dtml-workspace_width;
1606                var zmsgraphic_extedit_workspace_width_max      = &dtml-workspace_width_max;
1607                var zmsgraphic_extedit_request_url                                      = "<dtml-var "absolute_url()">/ZMSGraphic_extEdit_core";
1608                var zmsgraphic_extedit_has_superres                                     = <dtml-if "(img_info['imgsuperres'] is not None) and (img_info['imgsuperres']['filename'] is not None)">true<dtml-else>false</dtml-if>;
1609               
1610                img_info['queue'] = new Array();
1611                img_info['queue'].push(new Object());
1612                img_info['queue'][0]['action']                  = 'create';
1613                img_info['queue'][0]['value']                           = null;
1614                img_info['queue'][0]['filename']                = '<dtml-var "img_info['act']['filename']">';
1615                img_info['queue'][0]['url']                                     = '<dtml-var "ZMSGraphic_extEdit_getTempFolder().absolute_url()">/<dtml-var "img_info['act']['filename']">';
1616                img_info['queue'][0]['width']                           = <dtml-var "img_info['act']['width']">;
1617                img_info['queue'][0]['height']                  = <dtml-var "img_info['act']['height']">;
1618                img_info['thumb']                                                                       = new Object();
1619                img_info['thumb']['filename']                           = '<dtml-var "img_info['img']['filename']">';
1620                img_info['thumb']['url']                                                = '<dtml-var "ZMSGraphic_extEdit_getTempFolder().absolute_url()">/<dtml-var "img_info['img']['filename']">';
1621                img_info['thumb']['width']                                      = <dtml-var "img_info['img']['width']">;
1622                img_info['thumb']['height']                                     = <dtml-var "img_info['img']['height']">;
1623                img_info['thumb']['crop_box']                           = null;
1624                img_info['workspace']                                                           = new Object();
1625                img_info['workspace']['width']                  = &dtml-workspace_width;;
1626                img_info['workspace']['width_max']      = &dtml-workspace_width_max;;
1627        </script>
1628        <script type="text/javascript" src="<dtml-var "getDocumentElement().absolute_url()">/metaobj_manager/ZMSGraphic_extEdit.jquery.Jcrop.js"></script>
1629        <script type="text/javascript" src="<dtml-var "getDocumentElement().absolute_url()">/metaobj_manager/ZMSGraphic_extEdit.jquery.svg.js"></script>
1630        <script type="text/javascript" src="<dtml-var "getDocumentElement().absolute_url()">/metaobj_manager/ZMSGraphic_extEdit.handleEdit.js"></script>
1631        <script type="text/javascript" src="<dtml-var "getDocumentElement().absolute_url()">/metaobj_manager/ZMSGraphic_extEdit.handleSVG.js"></script>
1632       
1633        <link type="text/css" href="<dtml-var "getDocumentElement().absolute_url()">/metaobj_manager/ZMSGraphic_extEdit.jcrop.css" rel="stylesheet" />
1634</head>
1635<dtml-var "manage_tabs(_,_,my_manage_options=[{'label':'Abbildung bearbeiten','action':''}])">
1636<dtml-var f_bo_area>
1637
1638<dtml-if "((img_info['act'].has_key('filename')) and (len(img_info['act']['filename']) > 0))">
1639<dtml-let resUrl="getDocumentElement().absolute_url()+'/metaobj_manager'"
1640                                        has_superres="(img_info['imgsuperres'] is not None) and (img_info['imgsuperres']['filename'] is not None)">
1641        <div id="ZMSGraphic_extEdit_main" style="text-align:left;">
1642                <div id="ZMSGraphic_extEdit_info">
1643                        <div class="form-label"><img src="<dtml-var resUrl>/ZMSGraphic_extEdit.information.png" id="ZMSGraphic_extEdit_info" alt="info" /> <dtml-if "img_info['imgsuperres'] is not None"><strong style="vertical-align:top;"><dtml-var "img_info['imgsuperres']['filename']"></strong></dtml-if></div>
1644                        <table cellspacing="0" cellpadding="3" border="0">
1645                        <tr>
1646                                <th><div class="form-label">Original (aka SuperRes)</div></th>
1647                                <td><div class="form-element"><label id="ZMSGraphic_extEdit_info_superres"><dtml-if "img_info['imgsuperres'] is not None"><dtml-var "img_info['imgsuperres']['width']"> x <dtml-var "img_info['imgsuperres']['height']"><dtml-else>None</dtml-if></label></div></td>
1648                                <td rowspan="3" align="right">
1649                                        <div id="ZMSGraphic_extEdit_thumb">
1650                                                <div id="ZMSGraphic_extEdit_thumb_img" style="border: 1px solid #000; min-height: <dtml-var "img_info['img']['height']">px; width: <dtml-var "img_info['img']['width']">px;">
1651                                                <dtml-if "thumb_filename is not None">
1652                                                        <img src="<dtml-var "ZMSGraphic_extEdit_getTempFolder().absolute_url()">/<dtml-var "img_info['img']['filename']">" />
1653                                                </dtml-if>
1654                                                </div>
1655                                        </div>
1656                                </td>
1657                        </tr>
1658                        <tr>
1659                                <th><div class="form-label">Image (aka HighRes)</div></th>
1660                                <td><div class="form-element"><label id="ZMSGraphic_extEdit_info_hires"><dtml-var "img_info['act']['width']"> x <dtml-var "img_info['act']['height']"></label><br /></div></td>
1661                        </tr>
1662                        <tr>
1663                                <th><div class="form-label">Preview (aka Thumbnail)</div></th>
1664                                <td><div class="form-element"><label id="ZMSGraphic_extEdit_info_thumb"><dtml-if "img_info['img'] is not None"><dtml-var "img_info['img']['width']"> x <dtml-var "img_info['img']['height']"><dtml-else>None</dtml-if></label><br /></div></td>
1665                        </tr>
1666                        <tr>
1667                                <th></th>
1668                                <td colspan="2">
1669                                        <div id="ZMSGraphic_extEdit_thumb_dim" class="form-element">
1670                                                <label>Preview (px) </label><input type="text" id="ZMSGraphic_extEdit_thumb_width" max-length="3" size="3" value="<dtml-var "img_info['img']['width']">" /> x <input type="text" id="ZMSGraphic_extEdit_thumb_height" max-length="3" size="3" value="<dtml-var "img_info['img']['height']">" /><br />
1671                                                <label>Working space (px) </label><input type="text" id="ZMSGraphic_extEdit_workspace" max-length="4" size="3" value="&dtml-workspace_width;" />
1672                                        </div> 
1673                                </td>
1674                        </tr>
1675                        <tr>
1676                                <th></th>
1677                                <td>
1678                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.action_ok.png" id="ZMSGraphic_extEdit_dimension_ok" alt="accept dimensions" style="cursor:pointer;" /> <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.action_cancel.png" id="ZMSGraphic_extEdit_dimension_cancel" alt="cancel dimensions" style="cursor:pointer;" />
1679                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.action_ok.png" id="ZMSGraphic_extEdit_crop_ok" alt="accept crop" style="cursor:pointer;" /> <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.action_cancel.png" id="ZMSGraphic_extEdit_crop_cancel" alt="cancel crop" style="cursor:pointer;" />
1680                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.action_ok.png" id="ZMSGraphic_extEdit_resize_ok" alt="accept resize" style="cursor:pointer;" /> <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.action_cancel.png" id="ZMSGraphic_extEdit_resize_cancel" alt="cancel resize" style="cursor:pointer;" />
1681                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.action_ok.png" id="ZMSGraphic_extEdit_draw_arrow_ok" alt="accept arrow" style="cursor:pointer;" /> <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.action_cancel.png" id="ZMSGraphic_extEdit_draw_arrow_cancel" alt="cancel arrow" style="cursor:pointer;" />
1682                                </td>
1683                                <td></td>
1684                        </tr>
1685                        </table>
1686                </div>
1687                <div id="ZMSGraphic_extEdit_actions">
1688                        <table cellspacing="3" cellpadding="3" border="0">
1689                        <tr valign="top">               
1690                                <td>
1691                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.dimensions.png" id="ZMSGraphic_extEdit_dimension" alt="change dimensions" title="change dimensions" style="cursor:pointer;" /><br /><br />
1692                                        <br />
1693                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.resize.png" id="ZMSGraphic_extEdit_resize" alt="resize image" title="resize image" style="cursor:pointer;" /><br /><br />
1694                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.crop_hires.png" id="ZMSGraphic_extEdit_crop_hires" alt="crop image" title="crop image"<dtml-if "has_superres"> style="cursor:pointer;"</dtml-if> /><br /><br />
1695                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.crop_thumb.png" id="ZMSGraphic_extEdit_crop" alt="crop preview" title="crop preview" style="cursor:pointer;" /><br /><br />
1696                                        <br />
1697                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.drop-shadow.png" id="ZMSGraphic_extEdit_drop_shadow" alt="drop shadow" title="drop shadow" style="cursor:pointer;" /><br /><br />
1698                                        <br />
1699                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.rotate_clockwise.png" id="ZMSGraphic_extEdit_rotate_p" alt="rotate clockwise" title="rotate clockwise" style="cursor:pointer;" /><br /><br />
1700                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.rotate_anticlockwise.png" id="ZMSGraphic_extEdit_rotate_m" alt="rotate anticlockwise" title="rotate anticlockwise" style="cursor:pointer;" /><br /><br />
1701                                        <br />
1702                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.flip_vertical.png" id="ZMSGraphic_extEdit_flip_v" alt="flip vertical" title="flip vertical" style="cursor:pointer;" /><br />
1703                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.flip_horizontal.png" id="ZMSGraphic_extEdit_flip_h" alt="flip horizontal" title="flip horizontal" style="cursor:pointer;" /><br /><br />
1704                                        <br />
1705                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.reset.png" id="ZMSGraphic_extEdit_reset" alt="reset image" title="reset image"<dtml-if "has_superres"> style="cursor:pointer;"</dtml-if> /><br /><br />
1706                                        <br />
1707                                        <img src="<dtml-var resUrl>/ZMSGraphic_extEdit.arrow.png" id="ZMSGraphic_extEdit_draw_arrow" alt="draw arrow" title="draw arrow" style="cursor:pointer;" /><br /><br />
1708                                </td>
1709                                <td>
1710                                        <div id="ZMSGraphic_extEdit_image" style="border: 1px solid #000; min-height: <dtml-var "workspace_width">px; width: <dtml-var "workspace_width">px;">
1711                                                <img src="<dtml-var "ZMSGraphic_extEdit_getTempFolder().absolute_url()">/<dtml-var "img_info['act']['filename']">" />
1712                                        </div>
1713                                </td>
1714                        </tr>
1715                        <tr>
1716                                <td></td>
1717                                <td>
1718                                        <div id="ZMSGraphic_extEdit_footer" class="form-element">
1719                                                <form action="<dtml-var "absolute_url()">/ZMSGraphic_extEdit?lang=<dtml-var "lang">" method="POST" id="ZMSGraphic_extEdit_form">
1720                                                        <input type="hidden" name="action" value="cancel" />
1721                                                        <input type="hidden" name="img_info" value="" />
1722                                                </form>
1723                                                <input type="button" id="ZMSGraphic_extEdit_ok" value="OK" title="OK" style="cursor:pointer;" />
1724                                                <input type="button" id="ZMSGraphic_extEdit_cancel" value="Cancel" title="Cancel" style="cursor:pointer;" />
1725                                        </div>
1726                                </td>                           
1727                        </tr>
1728                        </table>
1729                </div>
1730                <dtml-comment>
1731                <div id="ZMSGraphic_extEdit_actions">
1732                        <label>Actions:</label>
1733                        <select id="ZMSGraphic_extEdit_actionList" size="5" style="width: 150px;">
1734                        </select>
1735                </div>
1736                </dtml-comment>
1737        </div>
1738</dtml-let>
1739</dtml-if>
1740
1741<dtml-var f_eo_area>
1742<dtml-var manage_page_footer>
1743
1744<dtml-comment>--// EO ZMSGraphic_extEdit_Form //--</dtml-comment>]]></item>
1745<item key="id"><![CDATA[ZMSGraphic_extEdit_Form]]></item>
1746<item key="mandatory" type="int">0</item>
1747<item key="multilang" type="int">0</item>
1748<item key="name"><![CDATA[ZMSGraphic_extEdit_Form]]></item>
1749<item key="repetitive" type="int">0</item>
1750<item key="type"><![CDATA[DTML Method]]></item>
1751</dictionary>
1752</item>
1753<item type="dictionary"><dictionary>
1754<item key="custom"><![CDATA[# --// BO ZMSGraphic_extEdit_getTempFolder(createIt=False) //--
1755
1756temp_folder                     = context.temp_folder
1757temp_folder_id  = 'zmsgraphic_extedit'
1758
1759if (temp_folder_id not in temp_folder.objectIds()):
1760        if (createIt):
1761                temp_folder.manage_addFolder(temp_folder_id)
1762                temp_folder = getattr(temp_folder, temp_folder_id)
1763        else:
1764                temp_folder = None
1765else:
1766        temp_folder = getattr(temp_folder, temp_folder_id)
1767
1768return temp_folder
1769
1770# --// EO ZMSGraphic_extEdit_getTempFolder //--
1771]]></item>
1772<item key="id"><![CDATA[ZMSGraphic_extEdit_getTempFolder]]></item>
1773<item key="mandatory" type="int">0</item>
1774<item key="multilang" type="int">0</item>
1775<item key="name"><![CDATA[ZMSGraphic_extEdit_getTempFolder]]></item>
1776<item key="repetitive" type="int">0</item>
1777<item key="type"><![CDATA[Script (Python)]]></item>
1778</dictionary>
1779</item>
1780<item type="dictionary"><dictionary>
1781<item key="custom"><![CDATA[from time import localtime, strftime
1782from PIL import Image
1783from cStringIO import StringIO
1784import os.path
1785
1786def ZMSGraphic_extEdit_crop(dest_folder, source_id, coords, dest_id = None, unique_filename = False):
1787        if (dest_folder is not None):
1788                if (not source_id in dest_folder.objectIds()):
1789                        raise 'ZMSGraphic_extEdit_crop: can\'t find source-image'
1790               
1791                temp_source = getattr(dest_folder, source_id)
1792                temp_source = StringIO(str(temp_source.data))
1793               
1794                temp_image = Image.open(temp_source)
1795                temp_image = temp_image.convert('RGB')
1796                temp_thumb = temp_image.crop(coords)
1797                temp_image_size = temp_thumb.size
1798       
1799                temp_dest = StringIO()
1800                temp_thumb.save(temp_dest, "JPEG")
1801                temp_dest.seek(0)
1802               
1803                temp_path, temp_ext = os.path.splitext(source_id)
1804                temp_dest_id = (dest_id is None) and temp_path or dest_id
1805                if (unique_filename):
1806                        temp_dest_id += '_%s'%strftime('%Y%m%d%H%M%S', localtime())
1807                temp_dest_id += '_crop.jpg'
1808               
1809                if (temp_dest_id in dest_folder.objectIds()):
1810                        dest_folder.manage_delObjects(temp_dest_id)
1811               
1812                dest_folder.manage_addImage(temp_dest_id, temp_dest)
1813               
1814                temp_result = temp_dest_id
1815                temp_result = (temp_dest_id, temp_image_size[0], temp_image_size[1])
1816        else:
1817                temp_result = None
1818               
1819        return temp_result]]></item>
1820<item key="id"><![CDATA[ZMSGraphic_extEdit_crop]]></item>
1821<item key="mandatory" type="int">0</item>
1822<item key="multilang" type="int">0</item>
1823<item key="name"><![CDATA[ZMSGraphic_extEdit_crop]]></item>
1824<item key="repetitive" type="int">0</item>
1825<item key="type"><![CDATA[External Method]]></item>
1826</dictionary>
1827</item>
1828<item type="dictionary"><dictionary>
1829<item key="custom"><![CDATA[from time import localtime, strftime
1830from PIL import Image
1831from cStringIO import StringIO
1832import os.path
1833
1834def ZMSGraphic_extEdit_resize(dest_folder, source_id, max_width, max_height = None, dest_id = None, replace_source = False, unique_filename = False):
1835        if (dest_folder is not None):
1836                if (not source_id in dest_folder.objectIds()):
1837                        raise 'ZMSGraphic_extEdit_resize: can\'t find source-image'
1838               
1839                if (max_height is None):
1840                        max_height = max_width
1841               
1842                temp_source = getattr(dest_folder, source_id)
1843                temp_source = StringIO(str(temp_source.data))
1844               
1845                temp_image                      = Image.open(temp_source)
1846                temp_image                      = temp_image.convert('RGB')
1847                temp_resized            = temp_image.resize((max_width, max_height), Image.ANTIALIAS)
1848                temp_image_size = temp_resized.size
1849               
1850                temp_dest = StringIO()
1851                temp_resized.save(temp_dest, "JPEG")
1852                temp_dest.seek(0)
1853               
1854                temp_path, temp_ext = os.path.splitext(source_id)
1855                temp_dest_id = (dest_id is None) and temp_path or dest_id
1856                if (not replace_source):
1857                        temp_dest_id += '_preview'
1858                if (unique_filename):
1859                        temp_dest_id += '_%s'%strftime('%Y%m%d%H%M%S', localtime())
1860                temp_dest_id += '.jpg'
1861               
1862                if (replace_source):
1863                        dest_folder.manage_delObjects(source_id)
1864               
1865                if (temp_dest_id in dest_folder.objectIds()):
1866                        dest_folder.manage_delObjects(temp_dest_id)
1867               
1868                dest_folder.manage_addImage(temp_dest_id, temp_dest)
1869               
1870                temp_result = (temp_dest_id, temp_image_size[0], temp_image_size[1])
1871        else:
1872                temp_result = None
1873       
1874        return temp_result]]></item>
1875<item key="id"><![CDATA[ZMSGraphic_extEdit_resize]]></item>
1876<item key="mandatory" type="int">0</item>
1877<item key="multilang" type="int">0</item>
1878<item key="name"><![CDATA[ZMSGraphic_extEdit_resize]]></item>
1879<item key="repetitive" type="int">0</item>
1880<item key="type"><![CDATA[External Method]]></item>
1881</dictionary>
1882</item>
1883<item type="dictionary"><dictionary>
1884<item key="custom"><![CDATA[from time import localtime, strftime
1885from PIL import Image
1886from cStringIO import StringIO
1887import os.path
1888
1889# @param methods list of FLIP_LEFT_RIGHT (0), FLIP_TOP_BOTTOM (1), ROTATE_90 (2), ROTATE_180 (3) or ROTATE_270 (4)
1890
1891def ZMSGraphic_extEdit_transpose(dest_folder, source_id, methods, replace_source = False, dest_id = None, unique_filename = False):
1892        if (dest_folder is not None):
1893                if (not source_id in dest_folder.objectIds()):
1894                        raise 'ZMSGraphic_extEdit_transpose: can\'t find source-image'
1895               
1896                if (type(methods) != type([])):
1897                        methods = [methods]
1898               
1899                temp_source = getattr(dest_folder, source_id)
1900                temp_source = StringIO(str(temp_source.data))
1901               
1902                temp_image                      = Image.open(temp_source)
1903                temp_image                      = temp_image.convert('RGB')
1904                for one_method in methods:
1905                        temp_image              = temp_image.transpose(one_method)
1906                temp_image_size = temp_image.size
1907               
1908                temp_dest = StringIO()
1909                temp_image.save(temp_dest, "JPEG")
1910                temp_dest.seek(0)
1911               
1912                temp_path, temp_ext = os.path.splitext(source_id)
1913                temp_dest_id = (dest_id is None) and temp_path or dest_id
1914                if (not replace_source):
1915                        temp_dest_id += '_preview'
1916                if (unique_filename):
1917                        temp_dest_id += '_%s'%strftime('%Y%m%d%H%M%S', localtime())
1918                temp_dest_id += '.jpg'
1919               
1920                if (replace_source):
1921                        dest_folder.manage_delObjects(source_id)
1922               
1923                if (temp_dest_id in dest_folder.objectIds()):
1924                        dest_folder.manage_delObjects(temp_dest_id)
1925               
1926                dest_folder.manage_addImage(temp_dest_id, temp_dest)
1927               
1928                temp_result = (temp_dest_id, temp_image_size[0], temp_image_size[1])
1929        else:
1930                temp_result = None
1931       
1932        return temp_result]]></item>
1933<item key="id"><![CDATA[ZMSGraphic_extEdit_transpose]]></item>
1934<item key="mandatory" type="int">0</item>
1935<item key="multilang" type="int">0</item>
1936<item key="name"><![CDATA[ZMSGraphic_extEdit_transpose]]></item>
1937<item key="repetitive" type="int">0</item>
1938<item key="type"><![CDATA[External Method]]></item>
1939</dictionary>
1940</item>
1941<item type="dictionary"><dictionary>
1942<item key="custom"><![CDATA[from DateTime import DateTime
1943
1944def calcCropValues(src_values, src_dim, dest_dim):
1945        temp_factor = float (dest_dim[0]) / float (src_dim[0])
1946       
1947        for i in range(0, len(src_values)):
1948                src_values[i] = int (float (src_values[i]) * temp_factor)
1949               
1950        return src_values
1951       
1952def calcResizeDim(src_width, src_height, dest_width = None, dest_height = None):
1953        if (dest_width is None):
1954                dest_width = src_width
1955        if (dest_height is None):
1956                dest_height = src_height
1957       
1958        if src_width > dest_width: src_height = max(int (round(float (src_height * dest_width) / float(src_width))), 1); src_width = dest_width
1959        if src_height > dest_height: src_width = max(int (round(src_width * dest_height / src_height)), 1); src_height = dest_height
1960       
1961        return (src_width, src_height)
1962
1963def calcRotateValue(source_value):
1964        return (source_value < 0) and 4 - (abs(source_value) % 4) or source_value % 4
1965
1966def clearGarbage(dest_folder):
1967        if ((dest_folder is not None) and (dest_folder.getId() in context.temp_folder.objectIds())):
1968                context.temp_folder.manage_delObjects(dest_folder.getId())
1969
1970def createTempImage(dest_folder, image_filename, image_data):
1971        # delete old image
1972        if (image_filename in dest_folder.objectIds()):
1973                dest_folder.manage_delObjects(image_filename)
1974        # create image 
1975        dest_folder.manage_addImage(image_filename, image_data)
1976
1977def createTempImages(dest_folder, image_dict, conf_dimensions, use_hires = False):
1978        temp_image_dict = ((image_dict['imgsuperres'] is not None) and (not use_hires)) and image_dict['imgsuperres'] or image_dict['imghires']
1979       
1980        if (temp_image_dict is not None):
1981                # create new filename
1982                image_dict['act']['filename'] = createUniqueFilename(temp_image_dict['filename'])
1983                # create image
1984                createTempImage(dest_folder, image_dict['act']['filename'], temp_image_dict['data'])
1985               
1986                # resize image if its greater than workspace width
1987                if (max(temp_image_dict['height'], temp_image_dict['width']) > conf_dimensions['workspace']):
1988                        temp_size = calcResizeDim(temp_image_dict['width'], temp_image_dict['height'], conf_dimensions['workspace'], conf_dimensions['workspace'])
1989                        temp_info = context.ZMSGraphic_extEdit_resize(dest_folder, image_dict['act']['filename'], temp_size[0], temp_size[1], replace_source = True)
1990                       
1991                        image_dict['act']['width']              = temp_info[1]
1992                        image_dict['act']['height']             = temp_info[2]
1993                else:
1994                        image_dict['act']['height']             = temp_image_dict['height']
1995                        image_dict['act']['width']              = temp_image_dict['width']
1996               
1997                if ((image_dict['img'] is not None) and (image_dict['img'].has_key('filename')) and (image_dict['img']['filename'] is not None)):
1998                        # delete old thumb
1999                        if (image_dict['img']['filename'] in dest_folder.objectIds()):
2000                                dest_folder.manage_delObjects(image_dict['img']['filename'])
2001                        # create thumb
2002                        dest_folder.manage_addImage(image_dict['img']['filename'], image_dict['img']['data'])
2003                       
2004        return image_dict
2005
2006def createUniqueFilename(src_filename):
2007        temp_parts = src_filename.rsplit('.')
2008       
2009        return '%s_%s%s'%(temp_parts[0], DateTime().strftime('%Y%m%d%H%M%S'), (len(temp_parts) > 1) and '.%s'%temp_parts[1] or '')
2010
2011def cropImage(dest_folder, source_id, crop_box, max_dim, unique_filename = False):
2012        temp_info = None
2013       
2014        if ((dest_folder is not None) and (source_id in dest_folder.objectIds())):
2015                temp_info = context.ZMSGraphic_extEdit_crop(dest_folder, source_id,
2016                                                                                                                                                                                                (int (crop_box[0]), int (crop_box[1]), int (crop_box[2]), int (crop_box[3])),
2017                                                                                                                                                                                                unique_filename = unique_filename)
2018               
2019                max_dim[0] = int (max_dim[0])
2020                max_dim[1] = int (max_dim[1])
2021               
2022                # resize cropped image to max dimensions if dimensions are unequal to thumb-dimension-settings
2023                if ((temp_info[1] <> max_dim[0]) or (temp_info[2] <> max_dim[1])):
2024                        temp_info = context.ZMSGraphic_extEdit_resize(dest_folder, temp_info[0], max_dim[0], max_dim[1], replace_source = True)
2025               
2026        return temp_info
2027
2028def getConfDimensions(is_gallery):
2029        temp_result = {}
2030       
2031        if (is_gallery):
2032                temp_result['thumb_height']     = int (context.aq_parent.getObjProperty('galleryThumbsMaxHeight', REQUEST))
2033                temp_result['thumb_width']      = int (context.aq_parent.getObjProperty('galleryThumbsMaxWidth', REQUEST))
2034                temp_result['workspace']                = int (context.aq_parent.getObjProperty('galleryWidth', REQUEST))
2035        else:
2036                if (context.getConfProperty('InstalledProducts.pil')):
2037                        temp_result['thumb_height']     = int (context.getConfProperty('InstalledProducts.pil.thumbnail.max', 75))
2038                        temp_result['thumb_width']      = int (context.getConfProperty('InstalledProducts.pil.thumbnail.max', 75))
2039                        temp_result['workspace']                = int (context.getConfProperty('InstalledProducts.pil.hires.thumbnail.max', 400))
2040                       
2041                        if (temp_result['workspace'] < 1):
2042                                temp_result['workspace'] = int (context.getConfProperty('ZMSGraphic.zmi_max_width', 400))
2043                else:
2044                        temp_result['thumb_height']     = 75
2045                        temp_result['thumb_width']      = 75
2046                        temp_result['workspace']                = int (context.getConfProperty('ZMSGraphic.zmi_max_width', 400))
2047       
2048        if (temp_result['workspace'] < 1):
2049                temp_result['workspace'] = 400
2050       
2051        return temp_result
2052
2053def getFileData(dest_folder, filename):
2054        if ((dest_folder is not None) and (filename in dest_folder.objectIds())):
2055                temp_data = getattr(dest_folder, filename)
2056                temp_data = {'filename'                         : temp_data.getId(),
2057                                                                        'data'                                  : str(temp_data.data),
2058                                                                        'content_type'  : temp_data.getContentType(),
2059                                                                        'size'                                  : temp_data.get_size()}
2060        else:
2061                temp_data = None
2062               
2063        return temp_data
2064
2065def getSourceImageData(attr_name, create_it = False, dest_folder = None):
2066        temp_image = context.getObjProperty(attr_name, REQUEST)
2067       
2068        if (temp_image is None):
2069                temp_result = None
2070        else:
2071                temp_result = {}
2072                temp_result['data']                     = temp_image.getData()
2073                temp_result['filename'] = temp_image.getFilename()
2074                temp_result['height']           = temp_image.getHeight()
2075                temp_result['width']            = temp_image.getWidth()
2076               
2077                # create image
2078                if (create_it and (dest_folder is not None)):
2079                        createTempImage(dest_folder, temp_image.getFilename(), temp_image.getData())
2080               
2081        return temp_result
2082
2083def handleEditQueue(dest_folder, img_info, is_gallery):
2084        if ((img_info is not None) and (len(img_info['queue']) > 1) and (img_info['queue'][-1]['filename'] == 'null')):
2085                temp_action             = img_info['queue'][-1]['action']
2086                temp_dest_id    = img_info['queue'][0]['filename'].rsplit('.', 1)[0]
2087               
2088                if (temp_action == 'rotate'):
2089                        temp_value = int (img_info['queue'][-1]['value'])
2090                       
2091                        temp_value = (temp_value < 0) and 4 - (abs(temp_value) % 4) or temp_value % 4
2092                        if (temp_value != 0):
2093                                img_info = handleFlipRotateActions(dest_folder, temp_dest_id, img_info, temp_value + 1)
2094                elif (temp_action == 'fhorizontal'):
2095                        img_info = handleFlipRotateActions(dest_folder, temp_dest_id, img_info, 0)
2096                elif (temp_action == 'fvertical'):
2097                        img_info = handleFlipRotateActions(dest_folder, temp_dest_id, img_info, 1)
2098                elif (temp_action == 'resize'):
2099                        # resize image 
2100                        temp_size = img_info['queue'][-1]['value'].split(',')
2101                        temp_info = context.ZMSGraphic_extEdit_resize(dest_folder, img_info['queue'][-2]['filename'], int (temp_size[0]), int (temp_size[1]),
2102                                                                                                                                                                                                                dest_id = temp_dest_id, unique_filename = True)
2103       
2104                        img_info['queue'][-1]['filename']       = temp_info[0]
2105                        img_info['queue'][-1]['url']                    = '%s/%s'%(dest_folder.absolute_url(), temp_info[0])
2106                        img_info['queue'][-1]['width']          = temp_info[1]
2107                        img_info['queue'][-1]['height']         = temp_info[2]
2108                       
2109                        img_info = setThumbInfo(img_info)
2110                elif (temp_action == 'crop'):
2111                        temp_crop_info = img_info['queue'][-1]['value'].split(',')
2112                        # crop thumb
2113                        temp_info       = cropImage(dest_folder, img_info['queue'][-2]['filename'], temp_crop_info[:4], temp_crop_info[-2:], True)
2114                        img_info        = setThumbInfo(img_info, temp_info, img_info['queue'][-1]['value'], dest_folder)
2115                        # delete crop-action from edit-queue
2116                        img_info['queue'].pop()
2117                elif (temp_action == 'crop_hires'):
2118                        temp_source_dict = getSourceImageData('imgsuperres', True, dest_folder)
2119                        if (temp_source_dict is not None):
2120                                # calculate crop-values
2121                                temp_crop_info  = img_info['queue'][-1]['value'].split(',')
2122                                temp_max_dim            = temp_crop_info[-2:]
2123                                temp_crop_info  = calcCropValues(temp_crop_info[:4], temp_max_dim, (temp_source_dict['width'], temp_source_dict['height']))
2124                                # crop thumb
2125                                temp_info = cropImage(dest_folder, temp_source_dict['filename'], temp_crop_info, temp_max_dim, True)
2126                                # reset edit-queue
2127                                img_info['queue'] = [{'action'          : 'crop_hires',
2128                                                                                                                        'value'                 : '%i,%i,%i,%i,%s,%s'%(temp_crop_info[0], temp_crop_info[1], temp_crop_info[2], temp_crop_info[3],
2129                                                                                                                                                                                                                                                                        temp_max_dim[0], temp_max_dim[1]),
2130                                                                                                                        'filename'      : temp_info[0],
2131                                                                                                                        'url'                   : '%s/%s'%(dest_folder.absolute_url(), temp_info[0]),
2132                                                                                                                        'width'                 : temp_info[1],
2133                                                                                                                        'height'                : temp_info[2]}]
2134                               
2135                                img_info = setThumbInfo(img_info)
2136                        else:
2137                                # delete crop-hires-action from edit-queue
2138                                img_info['queue'].pop()
2139                elif ((temp_action == 'workspace') or (temp_action == 'reset')):
2140                        temp_workspace_width = (temp_action == 'reset') and int (img_info['workspace']['width']) or int (img_info['queue'][-1]['value'])
2141                        temp_dims                                       = {'thumb_height' : 0, 'thumb_width' : 0, 'workspace' : temp_workspace_width}
2142                       
2143                        temp_source_dict                                                                = {}
2144                        temp_source_dict['act']                                 = {}
2145                        temp_source_dict['img']                                 = None
2146                        temp_source_dict['imghires']            = getSourceImageData('imghires')
2147                        temp_source_dict['imgsuperres'] = getSourceImageData('imgsuperres')
2148                        temp_source_dict                                                                = createTempImages(dest_folder, temp_source_dict, temp_dims)
2149                        # reset edit-queue
2150                        img_info['queue'] = [{'action'          : 'reset',
2151                                                                                                                'value'                 : 'null',
2152                                                                                                                'filename'      : temp_source_dict['act']['filename'],
2153                                                                                                                'url'                   : '%s/%s'%(dest_folder.absolute_url(), temp_source_dict['act']['filename']),
2154                                                                                                                'width'                 : temp_source_dict['act']['width'],
2155                                                                                                                'height'                : temp_source_dict['act']['height']}]
2156                       
2157                        img_info = setThumbInfo(img_info)
2158                elif (temp_action == 'drop_shadow'):
2159                        temp_info = context.ZMSGraphic_extEdit_dropShadow(dest_folder, img_info['queue'][-2]['filename'], unique_filename = True)
2160                       
2161                        img_info['queue'][-1]['filename']       = temp_info[0]
2162                        img_info['queue'][-1]['url']                    = '%s/%s'%(dest_folder.absolute_url(), temp_info[0])
2163                        img_info['queue'][-1]['width']          = temp_info[1]
2164                        img_info['queue'][-1]['height']         = temp_info[2]
2165                       
2166                        img_info = setThumbInfo(img_info)
2167                elif (temp_action == 'arrow'):
2168                        # convert coordinates-string into list of coordinate-tuples
2169                        temp_arrow_rects = []
2170                        for one_rect in img_info['queue'][-1]['value'].split(';'):
2171                                temp_one_rect = one_rect.split(',')
2172                               
2173                                temp_arrow_rects.append((float (temp_one_rect[0]), float (temp_one_rect[1]), float (temp_one_rect[2]), float (temp_one_rect[3])))
2174                       
2175                        if (len(temp_arrow_rects) > 0):
2176                                temp_info = context.ZMSGraphic_extEdit_drawArrow(dest_folder, img_info['queue'][-2]['filename'], temp_arrow_rects, dest_id = temp_dest_id, unique_filename = True)
2177                               
2178                                img_info['queue'][-1]['filename']       = temp_info[0]
2179                                img_info['queue'][-1]['url']                    = '%s/%s'%(dest_folder.absolute_url(), temp_info[0])
2180                                img_info['queue'][-1]['width']          = temp_info[1]
2181                                img_info['queue'][-1]['height']         = temp_info[2]
2182                       
2183        return img_info
2184
2185def handleFlipRotateActions(dest_folder, dest_id, img_info, temp_action):
2186        temp_info = context.ZMSGraphic_extEdit_transpose(dest_folder, img_info['queue'][-2]['filename'], temp_action, dest_id = dest_id, unique_filename = True)
2187       
2188        img_info['queue'][-1]['filename']       = temp_info[0]
2189        img_info['queue'][-1]['url']                    = '%s/%s'%(dest_folder.absolute_url(), temp_info[0])
2190        img_info['queue'][-1]['width']          = temp_info[1]
2191        img_info['queue'][-1]['height']         = temp_info[2]
2192               
2193        return setThumbInfo(img_info)
2194
2195def optimizeQueue(img_info):
2196        if ((img_info is not None) and (len(img_info['queue']) > 0)):
2197                temp_dest_actions       = []
2198                temp_last_action        = None
2199                temp_value                              = None
2200               
2201                def appendToList(action, value):
2202                        if (action in ['rotate']):
2203                                value = calcRotateValue(value)
2204                               
2205                                if (value > 0):
2206                                        temp_dest_actions.append({'action' : action, 'value' : value})
2207                        elif (action in ['fvertical', 'fhorizontal']):
2208                                value = value % 2
2209                               
2210                                if (value > 0):
2211                                        temp_dest_actions.append({'action' : action, 'value' : value})
2212                        else:
2213                                temp_dest_actions.append({'action' : action, 'value' : value})
2214                               
2215                for i in range(0, len(img_info['queue']) + 1):
2216                        if (i == len(img_info['queue'])):
2217                                appendToList(temp_last_action, temp_value)
2218                        elif (temp_last_action is None):
2219                                temp_last_action = img_info['queue'][i]['action']
2220                                temp_value = img_info['queue'][i]['value']
2221                        elif (temp_last_action == img_info['queue'][i]['action']):
2222                                if (temp_last_action in ['rotate', 'fvertical', 'fhorizontal']):
2223                                        temp_value = (temp_value is None) and int (img_info['queue'][i]['value']) or temp_value + int (img_info['queue'][i]['value'])
2224                                else:
2225                                        temp_value = img_info['queue'][i]['value']
2226                        else:
2227                                appendToList(temp_last_action, temp_value)
2228                               
2229                                temp_last_action        = img_info['queue'][i]['action']
2230                                temp_value                              = (temp_last_action in ['rotate', 'fvertical', 'fhorizontal']) and int (img_info['queue'][i]['value']) or img_info['queue'][i]['value']
2231               
2232                img_info['queue'] = temp_dest_actions
2233               
2234        return img_info
2235
2236def recreateImages(dest_folder, img_info, is_gallery = False):
2237        def setInfo(dest_dict, source_list):
2238                dest_dict['filename'] = source_list[0]
2239                dest_dict['height']             = source_list[2]
2240                dest_dict['width']              = source_list[1]
2241               
2242                return dest_dict
2243       
2244        def doTranspose(image_dict, action_list):
2245                if (len(action_list) > 0):
2246                        if (image_dict['imgsuperres'] is not None):
2247                                image_dict['imgsuperres'] = setInfo(image_dict['imgsuperres'], context.ZMSGraphic_extEdit_transpose(dest_folder, temp_image_dict['imgsuperres']['filename'], action_list, replace_source = True))
2248                        if (image_dict['imghires'] is not None):
2249                                image_dict['imghires'] = setInfo(image_dict['imghires'], context.ZMSGraphic_extEdit_transpose(dest_folder, temp_image_dict['imghires']['filename'], action_list, replace_source = True))
2250                               
2251                return image_dict
2252                       
2253        # delete temp-images
2254        clearGarbage(dest_folder)
2255        # create new temp-folder
2256        dest_folder     = context.ZMSGraphic_extEdit_getTempFolder(True)
2257       
2258        temp_image_dict                                                                 = {}
2259        temp_image_dict['img']                                  = (img_info['thumb']['url'] != 'null') and getSourceImageData('img', True, dest_folder) or None
2260        temp_image_dict['imghires']                     = (img_info['queue'][0]['action'] == 'create') and getSourceImageData('imghires', True, dest_folder) or None
2261        temp_image_dict['imgsuperres']  = getSourceImageData('imgsuperres', True, dest_folder)
2262       
2263        if (temp_image_dict['imghires'] is None):
2264                # create hires from superres
2265                if (temp_image_dict['imgsuperres'] is not None):
2266                        # crop hires from superres
2267                        if (img_info['queue'][0]['action'] == 'crop_hires'):
2268                                temp_crop_info  = img_info['queue'][0]['value'].split(',')
2269                                temp_info                       = cropImage(dest_folder, temp_image_dict['imgsuperres']['filename'], temp_crop_info[:4], temp_crop_info[-2:], True)
2270                        else:
2271                                temp_size = calcResizeDim(temp_image_dict['imgsuperres']['width'], temp_image_dict['imgsuperres']['height'], img_info['workspace']['width'])
2272                                temp_info = context.ZMSGraphic_extEdit_resize(dest_folder, temp_image_dict['imgsuperres']['filename'], temp_size[0], temp_size[1])
2273                               
2274                        temp_image_dict['imghires'] = {}
2275                        temp_image_dict['imghires']['filename'] = temp_info[0]
2276                        temp_image_dict['imghires']['height']           = temp_info[2]
2277                        temp_image_dict['imghires']['width']            = temp_info[1]
2278        # crop hires from superres
2279        elif (img_info['queue'][0]['action'] == 'crop_hires'):
2280                temp_crop_info  = img_info['queue'][0]['value'].split(',')
2281                temp_info                       = cropImage(dest_folder, temp_image_dict['imgsuperres']['filename'], temp_crop_info[:4], temp_crop_info[-2:], True)
2282               
2283                temp_image_dict['imghires']['filename'] = temp_info[0]
2284                temp_image_dict['imghires']['height']           = temp_info[2]
2285                temp_image_dict['imghires']['width']            = temp_info[1]
2286       
2287        if ((temp_image_dict['imghires'] is not None or temp_image_dict['imgsuperres'] is not None) and (img_info is not None)):
2288                if (temp_image_dict['imghires'] is not None):
2289                        img_info['workspace']['width'] = int (img_info['workspace']['width'])
2290                        temp_hires_max_dim = max(temp_image_dict['imghires']['height'], temp_image_dict['imghires']['width'])
2291                        # resize hires if its greater than workspace width
2292                        if (((temp_is_gallery) and (temp_hires_max_dim <> img_info['workspace']['width'])) or
2293                                        ((not temp_is_gallery) and (temp_hires_max_dim > img_info['workspace']['width']))):
2294                                temp_size = calcResizeDim(temp_image_dict['imghires']['width'], temp_image_dict['imghires']['height'], img_info['workspace']['width'])
2295                                temp_info = context.ZMSGraphic_extEdit_resize(dest_folder, temp_image_dict['imghires']['filename'], temp_size[0], temp_size[1], replace_source = True)
2296                               
2297                                temp_image_dict['imghires']['width']    = temp_info[1]
2298                                temp_image_dict['imghires']['height']   = temp_info[2]
2299               
2300                # apply edit-actions to hires and/or superres
2301                if (len(img_info['queue']) > 1):
2302                        temp_action_list = []
2303                       
2304                        for i in range(0, len(img_info['queue'])):
2305                                temp_action     = img_info['queue'][i]['action']
2306                               
2307                                if (temp_action == 'rotate'):
2308                                        temp_value = calcRotateValue(int (img_info['queue'][i]['value']))
2309                                        if (temp_value != 0):
2310                                                temp_action_list.append(temp_value + 1)
2311                                elif (temp_action == 'fhorizontal'):
2312                                        temp_action_list.append(0)
2313                                elif (temp_action == 'fvertical'):
2314                                        temp_action_list.append(1)
2315                                elif (temp_action == 'resize'):
2316                                        temp_image_dict = doTranspose(temp_image_dict, temp_action_list)
2317                                        # resize image 
2318                                        temp_size = img_info['queue'][i]['value'].split(',')
2319                                        temp_image_dict['imghires'] = setInfo(temp_image_dict['imghires'], context.ZMSGraphic_extEdit_resize(dest_folder, temp_image_dict['imghires']['filename'], int (temp_size[0]), int (temp_size[1]), replace_source = True))
2320                                        # reset action-list
2321                                        temp_action_list = []
2322                                elif (temp_action == 'drop_shadow'):
2323                                        temp_image_dict = doTranspose(temp_image_dict, temp_action_list)
2324                                        # draw drop-shadow
2325                                        temp_image_dict['imghires'] = setInfo(temp_image_dict['imghires'], context.ZMSGraphic_extEdit_dropShadow(dest_folder, temp_image_dict['imghires']['filename'], replace_source = True))
2326                                        # reset action-list
2327                                        temp_action_list = []
2328                                elif (temp_action == 'arrow'):
2329                                        temp_image_dict = doTranspose(temp_image_dict, temp_action_list)
2330                                        # convert coordinates-string into list of coordinate-tuples
2331                                        temp_arrow_rects = []
2332                                        for one_rect in img_info['queue'][-1]['value'].split(';'):
2333                                                temp_one_rect = one_rect.split(',')
2334                                                temp_arrow_rects.append((float (temp_one_rect[0]), float (temp_one_rect[1]), float (temp_one_rect[2]), float (temp_one_rect[3])))
2335                                       
2336                                        if (len(temp_arrow_rects) > 0):
2337                                                temp_image_dict['imghires'] = setInfo(temp_image_dict['imghires'], context.ZMSGraphic_extEdit_drawArrow(dest_folder, temp_image_dict['imghires']['filename'], temp_arrow_rects, replace_source = True))
2338                                               
2339                                        # reset action-list
2340                                        temp_action_list = []
2341                       
2342                        temp_image_dict = doTranspose(temp_image_dict, temp_action_list)
2343                # create thumb                 
2344                if (img_info['thumb']['crop_box'] != 'null'):
2345                        temp_crop_info = img_info['thumb']['crop_box'].split(',')
2346                        temp_info = cropImage(dest_folder, temp_image_dict['imghires']['filename'], temp_crop_info[:4], temp_crop_info[-2:])
2347
2348                        temp_image_dict['img']                                                  = {}
2349                        temp_image_dict['img']['filename']      = temp_info[0]
2350                        temp_image_dict['img']['height']                = temp_info[2]
2351                        temp_image_dict['img']['width']                 = temp_info[1]
2352                # draw drop shadow
2353                #if ((int (img_info['drop_shadow']) != 0) and (temp_image_dict['imghires'] is not None)):
2354                #       context.ZMSGraphic_extEdit_dropShadow(dest_folder, temp_image_dict['imghires']['filename'], replace_source = True)
2355               
2356                if (temp_image_dict['img'] is None):
2357                        context.setObjProperty('img', None)
2358                else:
2359                        context.setObjProperty('img', getFileData(dest_folder, temp_image_dict['img']['filename']))
2360                if (temp_image_dict['imghires'] is not None):
2361                        context.setObjProperty('imghires', getFileData(dest_folder, temp_image_dict['imghires']['filename']))
2362                if (temp_image_dict['imgsuperres'] is not None):
2363                        context.setObjProperty('imgsuperres', getFileData(dest_folder, temp_image_dict['imgsuperres']['filename']))
2364               
2365def setThumbInfo(img_info, info = None, thumb_box = None, dest_folder = None):
2366        if (info is None):
2367                img_info['thumb']['filename']   = 'null'
2368                img_info['thumb']['url']                        = 'null'
2369                img_info['thumb']['crop_box']   = 'null'
2370        else:
2371                img_info['thumb']['filename']   = info[0]
2372                img_info['thumb']['url']                        = '%s/%s'%(dest_folder.absolute_url(), info[0])
2373                img_info['thumb']['crop_box']   = thumb_box
2374                img_info['thumb']['width']              = info[1]
2375                img_info['thumb']['height']             = info[2]
2376               
2377        return img_info
2378
2379##################################################################################################
2380REQUEST                 = context.REQUEST
2381temp_action     = REQUEST.get('action', None)
2382temp_lang               = REQUEST.get('lang', context.getPrimaryLanguage())
2383temp_result = ''
2384
2385temp_folder                     = context.ZMSGraphic_extEdit_getTempFolder(True)
2386temp_is_gallery = context.aq_parent.meta_id in ['ZMSGallery']
2387
2388if (temp_action is not None):
2389        # button ok pressed
2390        if (temp_action == 'ok'):
2391                recreateImages(temp_folder, optimizeQueue(context.parseXmlString(REQUEST.get('img_info', None))), temp_is_gallery)
2392               
2393                clearGarbage(temp_folder)
2394               
2395                REQUEST.RESPONSE.redirect('%s/manage_main?lang=%s&manage_lang=%s'%(context.aq_parent.absolute_url(), temp_lang, temp_lang))
2396        # ajax request
2397        elif (temp_action == 'request'):
2398                REQUEST.RESPONSE.setHeader('Content-type', 'text/html; charset=utf-8;')
2399               
2400                temp_img_info   = context.parseXmlString(REQUEST.get('img_info', None))
2401               
2402                if ((temp_img_info is not None) and (len(temp_img_info['queue']) > 0)):
2403                        temp_img_info = handleEditQueue(temp_folder, temp_img_info, temp_is_gallery)
2404                       
2405                        temp_result = {'result' : 1, 'img_info' :  temp_img_info}
2406                else:
2407                        temp_result = {'result' : 0}
2408        # button cancel pressed
2409        else:
2410                clearGarbage(temp_folder)
2411               
2412                REQUEST.RESPONSE.redirect('%s/manage_main?lang=%s&manage_lang=%s'%(context.aq_parent.absolute_url(), temp_lang, temp_lang))
2413# show edit-form
2414else:
2415        temp_conf_dims = getConfDimensions(temp_is_gallery)
2416       
2417        temp_source_dict                                                                = {}
2418        temp_source_dict['act']                                 = {}
2419        temp_source_dict['img']                                 = getSourceImageData('img')
2420        temp_source_dict['imghires']            = getSourceImageData('imghires')
2421        temp_source_dict['imgsuperres'] = getSourceImageData('imgsuperres')
2422       
2423        if (temp_source_dict['img'] is None):
2424                temp_source_dict['img']                                                 =  {}
2425                temp_source_dict['img']['filename'] = None
2426                temp_source_dict['img']['height']               = temp_conf_dims['thumb_height']
2427                temp_source_dict['img']['width']                = temp_conf_dims['thumb_width']
2428                temp_source_dict['img']['data']                 = None
2429       
2430        if ((temp_source_dict['imghires'] is not None) or (temp_source_dict['imgsuperres'] is not None)):
2431                if (temp_source_dict['imgsuperres'] is not None):
2432                        temp_max_workspace_width = max(temp_source_dict['imgsuperres']['height'], temp_source_dict['imgsuperres']['width'])
2433                else:
2434                        temp_max_workspace_width = max(temp_source_dict['imghires']['height'], temp_source_dict['imghires']['width'])
2435                       
2436                        if (not temp_is_gallery):
2437                                temp_conf_dims['workspace']     = temp_max_workspace_width
2438                       
2439                temp_source_dict = createTempImages(temp_folder, temp_source_dict, temp_conf_dims, use_hires = True)
2440               
2441                REQUEST.set('filename', temp_source_dict['act']['filename'])
2442                REQUEST.set('height', temp_source_dict['act']['height'])
2443                REQUEST.set('width', temp_source_dict['act']['width'])
2444                REQUEST.set('thumb_filename', temp_source_dict['img']['filename'])
2445                REQUEST.set('thumb_height', temp_source_dict['img']['height'])
2446                REQUEST.set('thumb_width', temp_source_dict['img']['width'])
2447               
2448                REQUEST.set('img_info', temp_source_dict)
2449               
2450                REQUEST.set('workspace_width', temp_conf_dims['workspace'])
2451                REQUEST.set('workspace_width_max', temp_max_workspace_width)
2452        else:
2453                REQUEST.set('filename', None)
2454       
2455        temp_result = context.dt_html(str(context.ZMSGraphic_extEdit_Form.document_src()), REQUEST)
2456
2457return temp_result
2458]]></item>
2459<item key="id"><![CDATA[ZMSGraphic_extEdit_core]]></item>
2460<item key="mandatory" type="int">0</item>
2461<item key="multilang" type="int">0</item>
2462<item key="name"><![CDATA[ZMSGraphic_extEdit_core]]></item>
2463<item key="repetitive" type="int">0</item>
2464<item key="type"><![CDATA[Script (Python)]]></item>
2465</dictionary>
2466</item>
2467<item type="dictionary"><dictionary>
2468<item key="custom"><![CDATA[from time import localtime, strftime
2469from PIL import Image, ImageFilter
2470from cStringIO import StringIO
2471import os.path
2472
2473def ZMSGraphic_extEdit_dropShadow(dest_folder, source_id, dest_id = None, replace_source = False, unique_filename = False, maintain_size = True,
2474                                                                                                                                        iterations = 3, border = 5, offset = (3, 3), background_color = 0xffffff, shadow_color = 0x444444):
2475        # image: base image to give a drop shadow
2476        # iterations: number of times to apply the blur filter to the shadow
2477        # border: border to give the image to leave space for the shadow
2478        # offset: offset of the shadow as [x,y]
2479        # background_color: color of the background
2480        # shadow_color: color of the drop shadow
2481       
2482        if (dest_folder is not None):
2483                if (not source_id in dest_folder.objectIds()):
2484                        raise 'ZMSGraphic_extEdit_resize: can\'t find source-image'
2485               
2486                temp_source = getattr(dest_folder, source_id)
2487                temp_source = StringIO(str(temp_source.data))
2488               
2489                temp_image = Image.open(temp_source)
2490                temp_image = temp_image.convert('RGB')
2491       
2492                # calculate size of shadow image
2493                temp_dest_width  = maintain_size and temp_image.size[0] or temp_image.size[0] + abs(offset[0]) + 2 * border
2494                temp_dest_height = maintain_size and temp_image.size[1] or temp_image.size[1] + abs(offset[1]) + 2 * border
2495                # resize image if necessary
2496                if (maintain_size):
2497                        temp_image = temp_image.resize((temp_image.size[0] - abs(offset[0]) - 2 * border, temp_image.size[1] - abs(offset[1]) - 2 * border), Image.ANTIALIAS)
2498                # create shadow image
2499                temp_shadow = Image.new(temp_image.mode, (temp_dest_width, temp_dest_height), background_color)
2500                # place the shadow, with the required offset
2501                temp_left = border + max(offset[0], 0) #if <0, push the rest of the image right
2502                temp_top        = border + max(offset[1], 0) #if <0, push the rest of the image down
2503                # paste in constant color
2504                temp_shadow.paste(shadow_color,
2505                                                    [temp_left, temp_top,
2506                                                     temp_left + temp_image.size[0],
2507                                                     temp_top  + temp_image.size[1]])
2508                # apply BLUR filter repeatedly
2509                for i in range(iterations):
2510                    temp_shadow = temp_shadow.filter(ImageFilter.BLUR)
2511               
2512                temp_image_size = temp_shadow.size
2513               
2514                # paste image on top of shadow
2515                temp_left = border - min(offset[0], 0) #if the shadow offset was <0, push right
2516                temp_top        = border - min(offset[1], 0) #if the shadow offset was <0, push down
2517                temp_shadow.paste(temp_image, (temp_left, temp_top))
2518               
2519                temp_dest = StringIO()
2520                temp_shadow.save(temp_dest, "JPEG")
2521                temp_dest.seek(0)
2522               
2523                temp_path, temp_ext = os.path.splitext(source_id)
2524                temp_dest_id = (dest_id is None) and temp_path or dest_id
2525                if (not replace_source):
2526                        temp_dest_id += '_shadow'
2527                if (unique_filename):
2528                        temp_dest_id += '_%s'%strftime('%Y%m%d%H%M%S', localtime())
2529                temp_dest_id += '.jpg'
2530               
2531                if (replace_source):
2532                        dest_folder.manage_delObjects(source_id)
2533               
2534                if (temp_dest_id in dest_folder.objectIds()):
2535                        dest_folder.manage_delObjects(temp_dest_id)
2536               
2537                dest_folder.manage_addImage(temp_dest_id, temp_dest)
2538               
2539                temp_result = (temp_dest_id, temp_image_size[0], temp_image_size[1])
2540        else:
2541                temp_result = None
2542
2543        return temp_result]]></item>
2544<item key="id"><![CDATA[ZMSGraphic_extEdit_dropShadow]]></item>
2545<item key="mandatory" type="int">0</item>
2546<item key="multilang" type="int">0</item>
2547<item key="name"><![CDATA[ZMSGraphic_extEdit_dropShadow]]></item>
2548<item key="repetitive" type="int">0</item>
2549<item key="type"><![CDATA[External Method]]></item>
2550</dictionary>
2551</item>
2552<item type="dictionary"><dictionary>
2553<item key="custom"><![CDATA[from time import localtime, strftime
2554from PIL import Image, ImageDraw
2555from cStringIO import StringIO
2556import math
2557import os.path
2558
2559# arrow_tuple = (start_x, start_y, end_x, end_y)
2560def _drawArrow(draw_obj, arrow_tuple, arrow_angle = 20, arrow_length = 35, stroke_color = '#49911b', stroke_width = 5):
2561        if ((arrow_tuple[0] != arrow_tuple[2]) and (arrow_tuple[1] != arrow_tuple[3])):
2562                if (arrow_tuple[0] == arrow_tuple[2]):
2563                        temp_angle = (arrow_tuple[1] > arrow_tuple[3]) and 90.0 or -90.0
2564                else:
2565                        temp_angle = math.atan(float (arrow_tuple[1] - arrow_tuple[3]) / float (arrow_tuple[0] - arrow_tuple[2])) * 180 / math.pi
2566                       
2567                temp_deg2rad_modifier   = math.pi / 180
2568               
2569                if (arrow_tuple[0] < arrow_tuple[2]):
2570                        draw_obj.line((arrow_tuple[0], arrow_tuple[1], arrow_tuple[2], arrow_tuple[3]), fill = stroke_color, width = stroke_width)
2571                        draw_obj.line((arrow_tuple[2], arrow_tuple[3],
2572                                                                                arrow_tuple[2] - round(math.cos((temp_angle + arrow_angle) * temp_deg2rad_modifier) * arrow_length),
2573                                                                                arrow_tuple[3] - round(math.sin((temp_angle + arrow_angle) * temp_deg2rad_modifier) * arrow_length)),
2574                                                                                fill = stroke_color, width = stroke_width + 2)
2575                        draw_obj.line((arrow_tuple[2], arrow_tuple[3],
2576                                                                                arrow_tuple[2] - round(math.cos((temp_angle - arrow_angle) * temp_deg2rad_modifier) * arrow_length),
2577                                                                                arrow_tuple[3] - round(math.sin((temp_angle - arrow_angle) * temp_deg2rad_modifier) * arrow_length)),
2578                                                                                fill = stroke_color, width = stroke_width + 2)
2579                else:
2580                        draw_obj.line((arrow_tuple[0], arrow_tuple[1], arrow_tuple[2], arrow_tuple[3]), fill = stroke_color, width = stroke_width)
2581                        draw_obj.line((arrow_tuple[2], arrow_tuple[3],
2582                                                                                arrow_tuple[2] + round(math.cos((temp_angle + arrow_angle) * temp_deg2rad_modifier) * arrow_length),
2583                                                                                arrow_tuple[3] + round(math.sin((temp_angle + arrow_angle) * temp_deg2rad_modifier) * arrow_length)),
2584                                                                                fill = stroke_color, width = stroke_width + 2)
2585                        draw_obj.line((arrow_tuple[2], arrow_tuple[3],
2586                                                                                arrow_tuple[2] + round(math.cos((temp_angle - arrow_angle) * temp_deg2rad_modifier) * arrow_length),
2587                                                                                arrow_tuple[3] + round(math.sin((temp_angle - arrow_angle) * temp_deg2rad_modifier) * arrow_length)),
2588                                                                                fill = stroke_color, width = stroke_width + 2)
2589
2590def ZMSGraphic_extEdit_drawArrow(dest_folder, source_id, arrow_rect_list, replace_source = False, dest_id = None, unique_filename = False):
2591        if (dest_folder is not None):
2592                if (not source_id in dest_folder.objectIds()):
2593                        raise 'ZMSGraphic_extEdit_drawArrow: can\'t find source-image'
2594               
2595                temp_source = getattr(dest_folder, source_id)
2596                temp_source = StringIO(str(temp_source.data))
2597               
2598                temp_image      = Image.open(temp_source)
2599                temp_image      = temp_image.convert('RGB')
2600               
2601                temp_image_size = temp_image.size
2602               
2603                if (type(arrow_rect_list) == type((0,))):
2604                        methods = [methods]
2605               
2606                if (len(arrow_rect_list) > 0):
2607                        temp_draw       = ImageDraw.Draw(temp_image)
2608                       
2609                        for one_rect in arrow_rect_list:
2610                                _drawArrow(temp_draw, one_rect)
2611                                #temp_draw.line((one_rect[0], one_rect[1], one_rect[2], one_rect[3]), fill = '#ffff00', width = 5)
2612                               
2613                        del temp_draw
2614                       
2615                        temp_dest = StringIO()
2616                        temp_image.save(temp_dest, "JPEG")
2617                        temp_dest.seek(0)
2618                       
2619                        temp_path, temp_ext = os.path.splitext(source_id)
2620                        temp_dest_id = (dest_id is None) and temp_path or dest_id
2621                        if (not replace_source):
2622                                temp_dest_id += '_arrow'
2623                        if (unique_filename):
2624                                temp_dest_id += '_%s'%strftime('%Y%m%d%H%M%S', localtime())
2625                        temp_dest_id += '.jpg'
2626                       
2627                        if (replace_source):
2628                                dest_folder.manage_delObjects(source_id)
2629                       
2630                        if (temp_dest_id in dest_folder.objectIds()):
2631                                dest_folder.manage_delObjects(temp_dest_id)
2632                       
2633                        dest_folder.manage_addImage(temp_dest_id, temp_dest)
2634               
2635                temp_result = (temp_dest_id, temp_image_size[0], temp_image_size[1])
2636        else:
2637                temp_result = None
2638       
2639        return temp_result]]></item>
2640<item key="id"><![CDATA[ZMSGraphic_extEdit_drawArrow]]></item>
2641<item key="mandatory" type="int">0</item>
2642<item key="multilang" type="int">0</item>
2643<item key="name"><![CDATA[ZMSGraphic_extEdit_drawArrow]]></item>
2644<item key="repetitive" type="int">0</item>
2645<item key="type"><![CDATA[External Method]]></item>
2646</dictionary>
2647</item>
2648</list>
2649</item>
2650<item key="access" type="dictionary"><dictionary>
2651<item key="delete" type="list"><list>
2652</list>
2653</item>
2654<item key="delete_custom"></item>
2655<item key="edit" type="list"><list>
2656</list>
2657</item>
2658<item key="edit_custom"></item>
2659<item key="insert" type="list"><list>
2660</list>
2661</item>
2662<item key="insert_custom"></item>
2663</dictionary>
2664</item>
2665<item key="enabled" type="int">0</item>
2666<item key="id"><![CDATA[ZMSGraphic_extEdit]]></item>
2667<item key="name"><![CDATA[ZMSGraphic_extEdit]]></item>
2668<item key="package"><![CDATA[com.zms.zmsgraphic_extedit]]></item>
2669<item key="revision"><![CDATA[1.1.1-arrow]]></item>
2670<item key="type"><![CDATA[ZMSLibrary]]></item>
2671</dictionary>
2672</item>
2673</dictionary>
2674</item>
2675<item type="dictionary"><dictionary>
2676<item key="key"><![CDATA[com.zms.zmsgraphic_extedit]]></item>
2677<item key="value" type="dictionary"><dictionary>
2678<item key="__obj_attrs__" type="list"><list>
2679</list>
2680</item>
2681<item key="access" type="dictionary"><dictionary>
2682<item key="delete" type="list"><list>
2683</list>
2684</item>
2685<item key="delete_custom"></item>
2686<item key="edit" type="list"><list>
2687</list>
2688</item>
2689<item key="edit_custom"></item>
2690<item key="insert" type="list"><list>
2691</list>
2692</item>
2693<item key="insert_custom"></item>
2694</dictionary>
2695</item>
2696<item key="enabled" type="int">0</item>
2697<item key="id"><![CDATA[com.zms.zmsgraphic_extedit]]></item>
2698<item key="name"><![CDATA[com.zms.extensions]]></item>
2699<item key="package"></item>
2700<item key="revision"><![CDATA[1.1.1-arrow]]></item>
2701<item key="type"><![CDATA[ZMSPackage]]></item>
2702</dictionary>
2703</item>
2704</dictionary>
2705</item>
2706</list>
Note: See TracBrowser for help on using the repository browser.