...
...
12
12
13
Regards,
13
Regards,
14
Benjamin
14
Benjamin
15
15
16
---
16
---
17
Changes in v5:
18
- Include missing proprety.h header
19
- Move link_freq to device structure
20
- Update get_vblank_limits() prototype
21
- Add BUILD_BUG_ON() in vd55g1_update_patgen()
22
- Drop hdl->error check
23
- Use device_property*() instead of of_property*()
24
- Drop OF requirement
25
- Improve runtime pm usage
26
- Various syntax fixes
27
- Link to v4: https://lore.kernel.org/r/20250402-b4-vd55g1-v4-0-84b1f54c670c@foss.st.com
28
29
Changes in v4:
30
- Fix data-lanes syntax in binding
31
- Link to v3: https://lore.kernel.org/r/20250402-b4-vd55g1-v3-0-393985404759@foss.st.com
32
33
Changes in v3:
34
- Add maxItems to data-lanes in binding
35
- Drop redondant 'binding' in binding commit message
36
- Link to v2: https://lore.kernel.org/r/20250401-b4-vd55g1-v2-0-0c8ab8a48c55@foss.st.com
37
17
Changes in v2:
38
Changes in v2:
18
- Fix device tree binding mistakes
39
- Fix device tree binding mistakes
19
- Drop linux media git from MAINTAINERS file
40
- Drop linux media git from MAINTAINERS file
20
- Fix coding style mistakes
41
- Fix coding style mistakes
21
- Drop vd55g1_err_probe wrapper
42
- Drop vd55g1_err_probe wrapper
22
- Fix 32bits build
43
- Fix 32bits build
23
- Fix config symbol help paragraph being too short for checkpatch
44
- Fix config symbol help paragraph being too short for checkpatch
24
- Link to v1: https://lore.kernel.org/r/20250328-b4-vd55g1-v1-0-8d16b4a79f29@foss.st.com
45
- Link to v1: https://lore.kernel.org/r/20250328-b4-vd55g1-v1-0-8d16b4a79f29@foss.st.com
25
46
26
---
47
---
27
Benjamin Mugnier (2):
48
Benjamin Mugnier (2):
28
media: dt-bindings: Add ST VD55G1 camera sensor binding
49
media: dt-bindings: Add ST VD55G1 camera sensor
29
media: i2c: Add driver for ST VD55G1 camera sensor
50
media: i2c: Add driver for ST VD55G1 camera sensor
30
51
31
.../devicetree/bindings/media/i2c/st,vd55g1.yaml | 132 ++
52
.../devicetree/bindings/media/i2c/st,vd55g1.yaml | 132 ++
32
MAINTAINERS | 9 +
53
MAINTAINERS | 9 +
33
drivers/media/i2c/Kconfig | 11 +
54
drivers/media/i2c/Kconfig | 11 +
34
drivers/media/i2c/Makefile | 1 +
55
drivers/media/i2c/Makefile | 1 +
35
drivers/media/i2c/vd55g1.c | 1993 ++++++++++++++++++++
56
drivers/media/i2c/vd55g1.c | 2005 ++++++++++++++++++++
36
5 files changed, 2146 insertions(+)
57
5 files changed, 2158 insertions(+)
37
---
58
---
38
base-commit: b2c4bf0c102084e77ed1b12090d77a76469a6814
59
base-commit: b2c4bf0c102084e77ed1b12090d77a76469a6814
39
change-id: 20250225-b4-vd55g1-bdb90dbe39b3
60
change-id: 20250225-b4-vd55g1-bdb90dbe39b3
40
61
41
Best regards,
62
Best regards,
42
--
63
--
43
Benjamin Mugnier <benjamin.mugnier@foss.st.com>
64
Benjamin Mugnier <benjamin.mugnier@foss.st.com>
diff view generated by jsdifflib
1
Also update MAINTAINERS file accordingly.
1
Also update MAINTAINERS file accordingly.
2
2
3
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
3
Signed-off-by: Benjamin Mugnier <benjamin.mugnier@foss.st.com>
4
Signed-off-by: Benjamin Mugnier <benjamin.mugnier@foss.st.com>
4
---
5
---
5
.../devicetree/bindings/media/i2c/st,vd55g1.yaml | 132 +++++++++++++++++++++
6
.../devicetree/bindings/media/i2c/st,vd55g1.yaml | 132 +++++++++++++++++++++
6
MAINTAINERS | 7 ++
7
MAINTAINERS | 7 ++
7
2 files changed, 139 insertions(+)
8
2 files changed, 139 insertions(+)
...
...
81
+ unevaluatedProperties: false
82
+ unevaluatedProperties: false
82
+
83
+
83
+ properties:
84
+ properties:
84
+ data-lanes:
85
+ data-lanes:
85
+ items:
86
+ items:
86
+ const: 1
87
+ - const: 1
87
+
88
+
88
+ link-frequencies:
89
+ link-frequencies:
89
+ maxItems: 1
90
+ maxItems: 1
90
+ items:
91
+ items:
91
+ minimum: 125000000
92
+ minimum: 125000000
...
...
diff view generated by jsdifflib
...
...
13
Signed-off-by: Benjamin Mugnier <benjamin.mugnier@foss.st.com>
13
Signed-off-by: Benjamin Mugnier <benjamin.mugnier@foss.st.com>
14
---
14
---
15
MAINTAINERS | 2 +
15
MAINTAINERS | 2 +
16
drivers/media/i2c/Kconfig | 11 +
16
drivers/media/i2c/Kconfig | 11 +
17
drivers/media/i2c/Makefile | 1 +
17
drivers/media/i2c/Makefile | 1 +
18
drivers/media/i2c/vd55g1.c | 1993 ++++++++++++++++++++++++++++++++++++++++++++
18
drivers/media/i2c/vd55g1.c | 2005 ++++++++++++++++++++++++++++++++++++++++++++
19
4 files changed, 2007 insertions(+)
19
4 files changed, 2019 insertions(+)
20
20
21
diff --git a/MAINTAINERS b/MAINTAINERS
21
diff --git a/MAINTAINERS b/MAINTAINERS
22
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
23
--- a/MAINTAINERS
23
--- a/MAINTAINERS
24
+++ b/MAINTAINERS
24
+++ b/MAINTAINERS
...
...
47
     camera sensor.
47
     camera sensor.
48
48
49
+config VIDEO_VD55G1
49
+config VIDEO_VD55G1
50
+    tristate "ST VD55G1 sensor support"
50
+    tristate "ST VD55G1 sensor support"
51
+    select V4L2_CCI_I2C
51
+    select V4L2_CCI_I2C
52
+    depends on OF && GPIOLIB
52
+    depends on GPIOLIB
53
+    help
53
+    help
54
+     This is a Video4Linux2 sensor driver for the ST VD55G1
54
+     This is a Video4Linux2 sensor driver for the ST VD55G1
55
+     camera sensor.
55
+     camera sensor.
56
+
56
+
57
+     To compile this driver as a module, choose M here: the
57
+     To compile this driver as a module, choose M here: the
...
...
90
+#include <linux/gpio/consumer.h>
90
+#include <linux/gpio/consumer.h>
91
+#include <linux/i2c.h>
91
+#include <linux/i2c.h>
92
+#include <linux/iopoll.h>
92
+#include <linux/iopoll.h>
93
+#include <linux/module.h>
93
+#include <linux/module.h>
94
+#include <linux/pm_runtime.h>
94
+#include <linux/pm_runtime.h>
95
+#include <linux/property.h>
95
+#include <linux/regmap.h>
96
+#include <linux/regmap.h>
96
+#include <linux/regulator/consumer.h>
97
+#include <linux/regulator/consumer.h>
97
+#include <linux/unaligned.h>
98
+#include <linux/unaligned.h>
98
+#include <linux/units.h>
99
+#include <linux/units.h>
99
+
100
+
...
...
141
+#define VD55G1_REG_APPLIED_ANALOG_GAIN            CCI_REG16_LE(0x00ea)
142
+#define VD55G1_REG_APPLIED_ANALOG_GAIN            CCI_REG16_LE(0x00ea)
142
+#define VD55G1_REG_APPLIED_DIGITAL_GAIN            CCI_REG16_LE(0x00ec)
143
+#define VD55G1_REG_APPLIED_DIGITAL_GAIN            CCI_REG16_LE(0x00ec)
143
+#define VD55G1_REG_AE_FORCE_COLDSTART            CCI_REG16_LE(0x0308)
144
+#define VD55G1_REG_AE_FORCE_COLDSTART            CCI_REG16_LE(0x0308)
144
+#define VD55G1_REG_AE_COLDSTART_EXP_TIME        CCI_REG32_LE(0x0374)
145
+#define VD55G1_REG_AE_COLDSTART_EXP_TIME        CCI_REG32_LE(0x0374)
145
+#define VD55G1_REG_READOUT_CTRL                CCI_REG8(0x052e)
146
+#define VD55G1_REG_READOUT_CTRL                CCI_REG8(0x052e)
146
+#define VD55G1_REG_DARKCAL_CTRL                CCI_REG8(0x032a)
147
+#define VD55G1_DARKCAL_BYPASS                0
148
+#define VD55G1_DARKCAL_AUTO                1
149
+#define VD55G1_REG_DUSTER_CTRL                CCI_REG8(0x03ea)
147
+#define VD55G1_REG_DUSTER_CTRL                CCI_REG8(0x03ea)
150
+#define VD55G1_DUSTER_ENABLE                BIT(0)
148
+#define VD55G1_DUSTER_ENABLE                BIT(0)
151
+#define VD55G1_DUSTER_DISABLE                0
149
+#define VD55G1_DUSTER_DISABLE                0
152
+#define VD55G1_DUSTER_DYN_ENABLE            BIT(1)
150
+#define VD55G1_DUSTER_DYN_ENABLE            BIT(1)
153
+#define VD55G1_DUSTER_RING_ENABLE            BIT(4)
151
+#define VD55G1_DUSTER_RING_ENABLE            BIT(4)
...
...
204
+#define VD55G1_CTX_OFFSET                0x50
202
+#define VD55G1_CTX_OFFSET                0x50
205
+#define VD55G1_FWPATCH_REVISION_MAJOR            2
203
+#define VD55G1_FWPATCH_REVISION_MAJOR            2
206
+#define VD55G1_FWPATCH_REVISION_MINOR            9
204
+#define VD55G1_FWPATCH_REVISION_MINOR            9
207
+
205
+
208
+static const u8 patch_array[] = {
206
+static const u8 patch_array[] = {
209
+0x44, 0x03, 0x09, 0x02, 0xe6, 0x01, 0x42, 0x00, 0xea, 0x01, 0x42, 0x00, 0xf0,
207
+    0x44, 0x03, 0x09, 0x02, 0xe6, 0x01, 0x42, 0x00, 0xea, 0x01, 0x42, 0x00,
210
+0x01, 0x42, 0x00, 0xe6, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208
+    0xf0, 0x01, 0x42, 0x00, 0xe6, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00,
211
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00,
213
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
216
+0xfa, 0x68, 0x40, 0x00, 0xe8, 0x09, 0xbe, 0x4c, 0x08, 0x00, 0xf2, 0x93, 0xdd,
214
+    0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0xfa, 0x68, 0x40, 0x00, 0xe8,
217
+0x1c, 0x00, 0xc0, 0xe2, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x00, 0xfa, 0x6b,
215
+    0x09, 0xbe, 0x4c, 0x08, 0x00, 0xf2, 0x93, 0xdd, 0x1c, 0x00, 0xc0, 0xe2,
218
+0x80, 0x98, 0x7f, 0xfc, 0xef, 0x11, 0xc1, 0x0f, 0x82, 0x69, 0xbe, 0x0f, 0xac,
216
+    0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x00, 0xfa, 0x6b, 0x80, 0x98, 0x7f,
219
+0x58, 0x40, 0x00, 0xe8, 0x0c, 0x0c, 0x00, 0xf2, 0x93, 0xdd, 0x1c, 0x00, 0x40,
217
+    0xfc, 0xef, 0x11, 0xc1, 0x0f, 0x82, 0x69, 0xbe, 0x0f, 0xac, 0x58, 0x40,
220
+0xe3, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x84, 0xfa, 0x46, 0x0e, 0xe8, 0xe0,
218
+    0x00, 0xe8, 0x0c, 0x0c, 0x00, 0xf2, 0x93, 0xdd, 0x1c, 0x00, 0x40, 0xe3,
221
+0x08, 0xde, 0x4a, 0x40, 0x84, 0xe0, 0xa5, 0x86, 0xa8, 0x7d, 0xfc, 0xef, 0x6b,
219
+    0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x84, 0xfa, 0x46, 0x0e, 0xe8, 0xe0,
222
+0x80, 0x01, 0xbf, 0x28, 0x77, 0x0c, 0xef, 0x0b, 0x0e, 0x21, 0x78, 0x06, 0xc0,
220
+    0x08, 0xde, 0x4a, 0x40, 0x84, 0xe0, 0xa5, 0x86, 0xa8, 0x7d, 0xfc, 0xef,
223
+0x0b, 0xa5, 0xb5, 0x84, 0x06, 0x42, 0x98, 0xe1, 0x01, 0x81, 0x01, 0x42, 0x38,
221
+    0x6b, 0x80, 0x01, 0xbf, 0x28, 0x77, 0x0c, 0xef, 0x0b, 0x0e, 0x21, 0x78,
224
+0xe0, 0x0c, 0xc4, 0x0e, 0x84, 0x46, 0x02, 0x84, 0xe0, 0x0c, 0x84, 0x11, 0x81,
222
+    0x06, 0xc0, 0x0b, 0xa5, 0xb5, 0x84, 0x06, 0x42, 0x98, 0xe1, 0x01, 0x81,
225
+0x21, 0x81, 0x31, 0x81, 0x41, 0x81, 0x51, 0x81, 0xc1, 0x81, 0x05, 0x83, 0x0c,
223
+    0x01, 0x42, 0x38, 0xe0, 0x0c, 0xc4, 0x0e, 0x84, 0x46, 0x02, 0x84, 0xe0,
226
+0x0c, 0x84, 0xf2, 0x93, 0xdd, 0x06, 0x40, 0x98, 0xe1, 0xc8, 0x80, 0x58, 0x82,
224
+    0x0c, 0x84, 0x11, 0x81, 0x21, 0x81, 0x31, 0x81, 0x41, 0x81, 0x51, 0x81,
227
+0x48, 0xc0, 0x38, 0xc2, 0x29, 0x00, 0x10, 0xe0, 0x19, 0x00, 0x14, 0xe0, 0x09,
225
+    0xc1, 0x81, 0x05, 0x83, 0x0c, 0x0c, 0x84, 0xf2, 0x93, 0xdd, 0x06, 0x40,
228
+0x00, 0x38, 0xe0, 0x5f, 0xb8, 0x5f, 0xa8, 0x5f, 0xa6, 0x5f, 0xa4, 0x5f, 0xa2,
226
+    0x98, 0xe1, 0xc8, 0x80, 0x58, 0x82, 0x48, 0xc0, 0x38, 0xc2, 0x29, 0x00,
229
+0x5f, 0xa0, 0x56, 0x41, 0x98, 0xe1, 0x18, 0x82, 0x28, 0x80, 0x38, 0xc0, 0x5f,
227
+    0x10, 0xe0, 0x19, 0x00, 0x14, 0xe0, 0x09, 0x00, 0x38, 0xe0, 0x5f, 0xb8,
230
+0xa2, 0x19, 0x00, 0x20, 0xf8, 0x5f, 0xa4, 0x28, 0xc2, 0x5f, 0xa6, 0x39, 0x00,
228
+    0x5f, 0xa8, 0x5f, 0xa6, 0x5f, 0xa4, 0x5f, 0xa2, 0x5f, 0xa0, 0x56, 0x41,
231
+0x10, 0xe0, 0x5f, 0xa2, 0x19, 0x00, 0x14, 0xe0, 0x5f, 0xa4, 0x29, 0x00, 0x18,
229
+    0x98, 0xe1, 0x18, 0x82, 0x28, 0x80, 0x38, 0xc0, 0x5f, 0xa2, 0x19, 0x00,
232
+0xe0, 0x5f, 0xa6, 0x39, 0x00, 0x40, 0xe0, 0x5f, 0xa2, 0x19, 0x00, 0x44, 0xe0,
230
+    0x20, 0xf8, 0x5f, 0xa4, 0x28, 0xc2, 0x5f, 0xa6, 0x39, 0x00, 0x10, 0xe0,
233
+0x5f, 0xa4, 0x29, 0x00, 0x1c, 0xe0, 0x5f, 0xa6, 0x39, 0x00, 0x38, 0xe0, 0x5f,
231
+    0x5f, 0xa2, 0x19, 0x00, 0x14, 0xe0, 0x5f, 0xa4, 0x29, 0x00, 0x18, 0xe0,
234
+0xa2, 0x19, 0x00, 0x20, 0xe0, 0x5f, 0xa4, 0x29, 0x00, 0x24, 0xe0, 0x5f, 0xa6,
232
+    0x5f, 0xa6, 0x39, 0x00, 0x40, 0xe0, 0x5f, 0xa2, 0x19, 0x00, 0x44, 0xe0,
235
+0x39, 0x00, 0x28, 0xe0, 0x5f, 0xa2, 0x19, 0x00, 0x2c, 0xe0, 0x5f, 0xa4, 0x29,
233
+    0x5f, 0xa4, 0x29, 0x00, 0x1c, 0xe0, 0x5f, 0xa6, 0x39, 0x00, 0x38, 0xe0,
236
+0x00, 0x30, 0xe0, 0x5f, 0xa6, 0x09, 0x00, 0x34, 0xe0, 0x5f, 0xa2, 0x5f, 0xa4,
234
+    0x5f, 0xa2, 0x19, 0x00, 0x20, 0xe0, 0x5f, 0xa4, 0x29, 0x00, 0x24, 0xe0,
237
+0x5f, 0xa0, 0x4a, 0x0a, 0xfc, 0xfb, 0xe5, 0x82, 0x08, 0xde, 0x4a, 0x40, 0x88,
235
+    0x5f, 0xa6, 0x39, 0x00, 0x28, 0xe0, 0x5f, 0xa2, 0x19, 0x00, 0x2c, 0xe0,
238
+0xe0, 0xf6, 0x40, 0x00, 0xe0, 0x01, 0x4e, 0x99, 0x78, 0x0a, 0xc0, 0x85, 0x80,
236
+    0x5f, 0xa4, 0x29, 0x00, 0x30, 0xe0, 0x5f, 0xa6, 0x09, 0x00, 0x34, 0xe0,
239
+0x98, 0x40, 0x00, 0xe8, 0x35, 0x81, 0xa8, 0x40, 0x00, 0xe8, 0x0b, 0x8c, 0x0c,
237
+    0x5f, 0xa2, 0x5f, 0xa4, 0x5f, 0xa0, 0x4a, 0x0a, 0xfc, 0xfb, 0xe5, 0x82,
240
+0x0c, 0x84, 0xf2, 0xd5, 0xed, 0x83, 0xc1, 0x13, 0xc5, 0x93, 0xdd, 0xc3, 0xc1,
238
+    0x08, 0xde, 0x4a, 0x40, 0x88, 0xe0, 0xf6, 0x40, 0x00, 0xe0, 0x01, 0x4e,
241
+0x83, 0xc1, 0x13, 0xc3, 0x93, 0xdd, 0xc3, 0xc1, 0x4c, 0x04, 0x04, 0xfa, 0xc6,
239
+    0x99, 0x78, 0x0a, 0xc0, 0x85, 0x80, 0x98, 0x40, 0x00, 0xe8, 0x35, 0x81,
242
+0x0f, 0x94, 0xe0, 0x19, 0x0e, 0xc9, 0x65, 0x01, 0xc0, 0x28, 0xde, 0x0a, 0x42,
240
+    0xa8, 0x40, 0x00, 0xe8, 0x0b, 0x8c, 0x0c, 0x0c, 0x84, 0xf2, 0xd5, 0xed,
243
+0x80, 0xe0, 0x24, 0x02, 0x00, 0xfc, 0x16, 0xde, 0xa5, 0x8a, 0x19, 0x00, 0xb8,
241
+    0x83, 0xc1, 0x13, 0xc5, 0x93, 0xdd, 0xc3, 0xc1, 0x83, 0xc1, 0x13, 0xc3,
244
+0xe0, 0x10, 0x02, 0x0c, 0xec, 0x1d, 0xe6, 0x14, 0x02, 0x88, 0x80, 0x4e, 0x04,
242
+    0x93, 0xdd, 0xc3, 0xc1, 0x4c, 0x04, 0x04, 0xfa, 0xc6, 0x0f, 0x94, 0xe0,
245
+0x01, 0x00, 0x10, 0x80, 0x25, 0x02, 0x08, 0x9c, 0x86, 0x02, 0x00, 0x80, 0x08,
243
+    0x19, 0x0e, 0xc9, 0x65, 0x01, 0xc0, 0x28, 0xde, 0x0a, 0x42, 0x80, 0xe0,
246
+0x44, 0x00, 0x98, 0x55, 0x81, 0x11, 0x85, 0x45, 0x81, 0x11, 0x89, 0x25, 0x81,
244
+    0x24, 0x02, 0x00, 0xfc, 0x16, 0xde, 0xa5, 0x8a, 0x19, 0x00, 0xb8, 0xe0,
247
+0x11, 0x83, 0x2b, 0x00, 0x24, 0xe0, 0x64, 0xc2, 0x0b, 0x84, 0x08, 0x51, 0x00,
245
+    0x10, 0x02, 0x0c, 0xec, 0x1d, 0xe6, 0x14, 0x02, 0x88, 0x80, 0x4e, 0x04,
248
+0xef, 0x2b, 0x80, 0x01, 0x83, 0x1b, 0x8c, 0x38, 0x7d, 0x5c, 0xef, 0x18, 0xde,
246
+    0x01, 0x00, 0x10, 0x80, 0x25, 0x02, 0x08, 0x9c, 0x86, 0x02, 0x00, 0x80,
249
+0x0b, 0xa1, 0x25, 0x82, 0x0b, 0x0e, 0x88, 0xf9, 0x0a, 0x00, 0x00, 0xe8, 0x10,
247
+    0x08, 0x44, 0x00, 0x98, 0x55, 0x81, 0x11, 0x85, 0x45, 0x81, 0x11, 0x89,
250
+0x42, 0x04, 0x9c, 0x11, 0x4e, 0x0c, 0x80, 0x10, 0x40, 0x04, 0xf0, 0x4e, 0x05,
248
+    0x25, 0x81, 0x11, 0x83, 0x2b, 0x00, 0x24, 0xe0, 0x64, 0xc2, 0x0b, 0x84,
251
+0x01, 0x60, 0x10, 0xc0, 0x06, 0x88, 0x10, 0x40, 0xf8, 0xf3, 0x06, 0xde, 0x4c,
249
+    0x08, 0x51, 0x00, 0xef, 0x2b, 0x80, 0x01, 0x83, 0x1b, 0x8c, 0x38, 0x7d,
252
+0x0c, 0x04, 0xf2, 0x93, 0xdd, 0x0c, 0x04, 0x1c, 0xfe, 0xf6, 0x0f, 0x94, 0xe0,
250
+    0x5c, 0xef, 0x18, 0xde, 0x0b, 0xa1, 0x25, 0x82, 0x0b, 0x0e, 0x88, 0xf9,
253
+0x38, 0x9c, 0x46, 0x51, 0xfc, 0xe0, 0x46, 0x49, 0x38, 0xe2, 0x30, 0x46, 0xf8,
251
+    0x0a, 0x00, 0x00, 0xe8, 0x10, 0x42, 0x04, 0x9c, 0x11, 0x4e, 0x0c, 0x80,
254
+0xf3, 0x36, 0x9c, 0xc6, 0x46, 0x0c, 0xe1, 0x34, 0x8c, 0x94, 0xa0, 0x4e, 0xa0,
252
+    0x10, 0x40, 0x04, 0xf0, 0x4e, 0x05, 0x01, 0x60, 0x10, 0xc0, 0x06, 0x88,
255
+0x39, 0x06, 0x80, 0xe0, 0x4a, 0x46, 0x94, 0xe0, 0x05, 0x8c, 0x6a, 0x40, 0x80,
253
+    0x10, 0x40, 0xf8, 0xf3, 0x06, 0xde, 0x4c, 0x0c, 0x04, 0xf2, 0x93, 0xdd,
256
+0xe0, 0x2c, 0x0c, 0x00, 0xe2, 0x0b, 0x8c, 0xb8, 0x7c, 0x5c, 0xef, 0x0b, 0x8c,
254
+    0x0c, 0x04, 0x1c, 0xfe, 0xf6, 0x0f, 0x94, 0xe0, 0x38, 0x9c, 0x46, 0x51,
257
+0x9e, 0xa0, 0xf8, 0x40, 0x60, 0xef, 0x0b, 0xa1, 0x5a, 0x40, 0x80, 0xe0, 0x65,
255
+    0xfc, 0xe0, 0x46, 0x49, 0x38, 0xe2, 0x30, 0x46, 0xf8, 0xf3, 0x36, 0x9c,
258
+0x88, 0x28, 0x02, 0x01, 0x40, 0x00, 0x80, 0x2a, 0x42, 0x9c, 0xe1, 0x28, 0x49,
256
+    0xc6, 0x46, 0x0c, 0xe1, 0x34, 0x8c, 0x94, 0xa0, 0x4e, 0xa0, 0x39, 0x06,
259
+0x60, 0xef, 0x96, 0x4d, 0x9c, 0xe1, 0x01, 0x81, 0x06, 0x98, 0xd5, 0x81, 0x09,
257
+    0x80, 0xe0, 0x4a, 0x46, 0x94, 0xe0, 0x05, 0x8c, 0x6a, 0x40, 0x80, 0xe0,
260
+0x0e, 0xa1, 0x64, 0x01, 0xc0, 0x4a, 0x40, 0x88, 0xe0, 0x85, 0x80, 0xb8, 0x77,
258
+    0x2c, 0x0c, 0x00, 0xe2, 0x0b, 0x8c, 0xb8, 0x7c, 0x5c, 0xef, 0x0b, 0x8c,
261
+0xfc, 0xef, 0x35, 0x81, 0xc8, 0x77, 0xfc, 0xef, 0x08, 0x98, 0x4a, 0x00, 0xfc,
259
+    0x9e, 0xa0, 0xf8, 0x40, 0x60, 0xef, 0x0b, 0xa1, 0x5a, 0x40, 0x80, 0xe0,
262
+0xfb, 0x55, 0xfc, 0xe8, 0x4a, 0x60, 0xef, 0x1a, 0x44, 0x9c, 0xe1, 0x35, 0x81,
260
+    0x65, 0x88, 0x28, 0x02, 0x01, 0x40, 0x00, 0x80, 0x2a, 0x42, 0x9c, 0xe1,
263
+0x1a, 0x4e, 0x9c, 0xe9, 0x1c, 0x00, 0x00, 0xe2, 0x0c, 0x0c, 0x1c, 0xf6, 0x93,
261
+    0x28, 0x49, 0x60, 0xef, 0x96, 0x4d, 0x9c, 0xe1, 0x01, 0x81, 0x06, 0x98,
264
+0xdd, 0x0d, 0xc3, 0x1a, 0x41, 0x08, 0xe4, 0x0a, 0x40, 0x84, 0xe1, 0x0c, 0x00,
262
+    0xd5, 0x81, 0x09, 0x0e, 0xa1, 0x64, 0x01, 0xc0, 0x4a, 0x40, 0x88, 0xe0,
265
+0x00, 0xe2, 0x93, 0xdd, 0x4c, 0x04, 0x1c, 0xfa, 0x86, 0x52, 0xec, 0xe1, 0x08,
263
+    0x85, 0x80, 0xb8, 0x77, 0xfc, 0xef, 0x35, 0x81, 0xc8, 0x77, 0xfc, 0xef,
266
+0xa6, 0x65, 0x12, 0x24, 0xf8, 0x0e, 0x02, 0x99, 0x7a, 0x00, 0xc0, 0x00, 0x40,
264
+    0x08, 0x98, 0x4a, 0x00, 0xfc, 0xfb, 0x55, 0xfc, 0xe8, 0x4a, 0x60, 0xef,
267
+0xa0, 0xf3, 0x06, 0xa6, 0x0b, 0x8c, 0x08, 0x49, 0x00, 0xef, 0x85, 0x12, 0x28,
265
+    0x1a, 0x44, 0x9c, 0xe1, 0x35, 0x81, 0x1a, 0x4e, 0x9c, 0xe9, 0x1c, 0x00,
268
+0xf8, 0x02, 0x02, 0xfc, 0xed, 0xf6, 0x47, 0xfd, 0x6f, 0xe0, 0xff, 0x04, 0xe2,
266
+    0x00, 0xe2, 0x0c, 0x0c, 0x1c, 0xf6, 0x93, 0xdd, 0x0d, 0xc3, 0x1a, 0x41,
269
+0x14, 0x04, 0xc0, 0xe0, 0x0f, 0x86, 0x2f, 0xa0, 0x0b, 0x8c, 0x2e, 0xe2, 0x08,
267
+    0x08, 0xe4, 0x0a, 0x40, 0x84, 0xe1, 0x0c, 0x00, 0x00, 0xe2, 0x93, 0xdd,
270
+0x48, 0x00, 0xef, 0x86, 0x02, 0x84, 0xfe, 0x0e, 0x05, 0x09, 0x7d, 0x00, 0xc0,
268
+    0x4c, 0x04, 0x1c, 0xfa, 0x86, 0x52, 0xec, 0xe1, 0x08, 0xa6, 0x65, 0x12,
271
+0x05, 0x52, 0x08, 0xf8, 0x18, 0x7d, 0xfc, 0xef, 0x4a, 0x40, 0x80, 0xe0, 0x09,
269
+    0x24, 0xf8, 0x0e, 0x02, 0x99, 0x7a, 0x00, 0xc0, 0x00, 0x40, 0xa0, 0xf3,
272
+0x12, 0x04, 0xc0, 0x65, 0x12, 0x20, 0xf8, 0x00, 0x40, 0x40, 0xdc, 0x01, 0x52,
270
+    0x06, 0xa6, 0x0b, 0x8c, 0x08, 0x49, 0x00, 0xef, 0x85, 0x12, 0x28, 0xf8,
273
+0x04, 0xc0, 0x0e, 0x00, 0x41, 0x78, 0xf5, 0xc5, 0x6d, 0xc0, 0xb5, 0x82, 0x05,
271
+    0x02, 0x02, 0xfc, 0xed, 0xf6, 0x47, 0xfd, 0x6f, 0xe0, 0xff, 0x04, 0xe2,
274
+0x10, 0x10, 0xe0, 0x11, 0xf1, 0x0f, 0x82, 0x05, 0x50, 0x10, 0xe0, 0x05, 0x10,
272
+    0x14, 0x04, 0xc0, 0xe0, 0x0f, 0x86, 0x2f, 0xa0, 0x0b, 0x8c, 0x2e, 0xe2,
275
+0x10, 0xe0, 0xfe, 0x02, 0xf0, 0xff, 0x0f, 0x82, 0x85, 0x83, 0x15, 0x10, 0x10,
273
+    0x08, 0x48, 0x00, 0xef, 0x86, 0x02, 0x84, 0xfe, 0x0e, 0x05, 0x09, 0x7d,
276
+0xe0, 0x16, 0x00, 0x91, 0x6e, 0x69, 0xcd, 0x21, 0xf1, 0x6d, 0xc1, 0x01, 0x83,
274
+    0x00, 0xc0, 0x05, 0x52, 0x08, 0xf8, 0x18, 0x7d, 0xfc, 0xef, 0x4a, 0x40,
277
+0x2f, 0x82, 0x26, 0x00, 0x00, 0x80, 0x2f, 0xa0, 0x25, 0x50, 0x10, 0xe0, 0x05,
275
+    0x80, 0xe0, 0x09, 0x12, 0x04, 0xc0, 0x65, 0x12, 0x20, 0xf8, 0x00, 0x40,
278
+0x10, 0x10, 0xe0, 0x11, 0xa1, 0xfe, 0x04, 0xf0, 0xff, 0x06, 0x42, 0x00, 0x80,
276
+    0x40, 0xdc, 0x01, 0x52, 0x04, 0xc0, 0x0e, 0x00, 0x41, 0x78, 0xf5, 0xc5,
279
+0x0f, 0x84, 0x0f, 0xa2, 0x05, 0x50, 0x10, 0xe0, 0x16, 0x00, 0x91, 0x6e, 0x69,
277
+    0x6d, 0xc0, 0xb5, 0x82, 0x05, 0x10, 0x10, 0xe0, 0x11, 0xf1, 0x0f, 0x82,
280
+0xcd, 0x6d, 0xc1, 0x71, 0x8d, 0x16, 0x00, 0x79, 0x61, 0x2d, 0xcb, 0x86, 0x0e,
278
+    0x05, 0x50, 0x10, 0xe0, 0x05, 0x10, 0x10, 0xe0, 0xfe, 0x02, 0xf0, 0xff,
281
+0x00, 0x80, 0x6d, 0xc1, 0x56, 0x0e, 0x00, 0xc0, 0x0b, 0x8c, 0x1b, 0x8e, 0x71,
279
+    0x0f, 0x82, 0x85, 0x83, 0x15, 0x10, 0x10, 0xe0, 0x16, 0x00, 0x91, 0x6e,
282
+0x52, 0x0c, 0xf8, 0x08, 0x43, 0x00, 0xef, 0x05, 0x52, 0x14, 0xf8, 0x15, 0x10,
280
+    0x69, 0xcd, 0x21, 0xf1, 0x6d, 0xc1, 0x01, 0x83, 0x2f, 0x82, 0x26, 0x00,
283
+0x28, 0xe0, 0x70, 0x04, 0x04, 0xec, 0x31, 0xe1, 0x29, 0x9e, 0x1f, 0x86, 0x1f,
281
+    0x00, 0x80, 0x2f, 0xa0, 0x25, 0x50, 0x10, 0xe0, 0x05, 0x10, 0x10, 0xe0,
284
+0xa4, 0x15, 0x50, 0x28, 0xe0, 0x86, 0x42, 0x3c, 0xe0, 0x0e, 0x04, 0x9d, 0x64,
282
+    0x11, 0xa1, 0xfe, 0x04, 0xf0, 0xff, 0x06, 0x42, 0x00, 0x80, 0x0f, 0x84,
285
+0x9b, 0xc2, 0x05, 0x52, 0x1c, 0xf8, 0x78, 0xa6, 0x48, 0x77, 0xfc, 0xef, 0x4a,
283
+    0x0f, 0xa2, 0x05, 0x50, 0x10, 0xe0, 0x16, 0x00, 0x91, 0x6e, 0x69, 0xcd,
286
+0x40, 0x80, 0xe0, 0x70, 0x4e, 0x10, 0xdc, 0x1e, 0x00, 0x81, 0x70, 0xeb, 0xcb,
284
+    0x6d, 0xc1, 0x71, 0x8d, 0x16, 0x00, 0x79, 0x61, 0x2d, 0xcb, 0x86, 0x0e,
287
+0x70, 0x4e, 0xec, 0x93, 0x6d, 0xc1, 0x11, 0x85, 0x36, 0x02, 0x00, 0x80, 0x76,
285
+    0x00, 0x80, 0x6d, 0xc1, 0x56, 0x0e, 0x00, 0xc0, 0x0b, 0x8c, 0x1b, 0x8e,
288
+0xa6, 0x11, 0x52, 0x10, 0xf8, 0x05, 0x10, 0x40, 0xe0, 0xfe, 0x47, 0x0c, 0xff,
286
+    0x71, 0x52, 0x0c, 0xf8, 0x08, 0x43, 0x00, 0xef, 0x05, 0x52, 0x14, 0xf8,
289
+0x14, 0x04, 0xa0, 0xe0, 0x0f, 0x86, 0x0f, 0xa4, 0x05, 0x50, 0x40, 0xe0, 0x05,
287
+    0x15, 0x10, 0x28, 0xe0, 0x70, 0x04, 0x04, 0xec, 0x31, 0xe1, 0x29, 0x9e,
290
+0x10, 0x28, 0xe0, 0xfe, 0x47, 0xfd, 0x7f, 0xe3, 0xff, 0x14, 0x04, 0xd0, 0xe0,
288
+    0x1f, 0x86, 0x1f, 0xa4, 0x15, 0x50, 0x28, 0xe0, 0x86, 0x42, 0x3c, 0xe0,
291
+0x0f, 0x86, 0x2f, 0xa0, 0x20, 0x00, 0x01, 0x6c, 0x00, 0xd0, 0x05, 0x50, 0x28,
289
+    0x0e, 0x04, 0x9d, 0x64, 0x9b, 0xc2, 0x05, 0x52, 0x1c, 0xf8, 0x78, 0xa6,
292
+0xe0, 0x0b, 0x8c, 0xf8, 0x7e, 0xfc, 0xee, 0x0e, 0x03, 0x59, 0x78, 0xf5, 0xc5,
290
+    0x48, 0x77, 0xfc, 0xef, 0x4a, 0x40, 0x80, 0xe0, 0x70, 0x4e, 0x10, 0xdc,
293
+0x0d, 0xc2, 0x05, 0x52, 0x0c, 0xf8, 0x08, 0xa6, 0x46, 0x42, 0xb4, 0xe0, 0x18,
291
+    0x1e, 0x00, 0x81, 0x70, 0xeb, 0xcb, 0x70, 0x4e, 0xec, 0x93, 0x6d, 0xc1,
294
+0x84, 0x00, 0x40, 0xf4, 0x93, 0x00, 0x40, 0x08, 0xdc, 0x1b, 0xa1, 0x06, 0xa6,
292
+    0x11, 0x85, 0x36, 0x02, 0x00, 0x80, 0x76, 0xa6, 0x11, 0x52, 0x10, 0xf8,
295
+0x05, 0x10, 0x40, 0x80, 0x04, 0x00, 0x50, 0x9c, 0x65, 0x8a, 0x05, 0x10, 0x44,
293
+    0x05, 0x10, 0x40, 0xe0, 0xfe, 0x47, 0x0c, 0xff, 0x14, 0x04, 0xa0, 0xe0,
296
+0xe0, 0xf6, 0x43, 0xfd, 0x6f, 0x00, 0xf8, 0x0f, 0x82, 0x06, 0x02, 0x01, 0x60,
294
+    0x0f, 0x86, 0x0f, 0xa4, 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x28, 0xe0,
297
+0x1e, 0xc0, 0x0f, 0xa2, 0x05, 0x50, 0x44, 0xe0, 0x05, 0x10, 0x44, 0xe0, 0x0e,
295
+    0xfe, 0x47, 0xfd, 0x7f, 0xe3, 0xff, 0x14, 0x04, 0xd0, 0xe0, 0x0f, 0x86,
298
+0x02, 0x00, 0xf8, 0x0f, 0x82, 0x09, 0xf6, 0x05, 0x50, 0x44, 0xe0, 0x05, 0x10,
296
+    0x2f, 0xa0, 0x20, 0x00, 0x01, 0x6c, 0x00, 0xd0, 0x05, 0x50, 0x28, 0xe0,
299
+0x40, 0xe0, 0x04, 0x00, 0x54, 0xfc, 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40,
297
+    0x0b, 0x8c, 0xf8, 0x7e, 0xfc, 0xee, 0x0e, 0x03, 0x59, 0x78, 0xf5, 0xc5,
300
+0xe0, 0x04, 0x00, 0xcc, 0xfc, 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, 0xe0,
298
+    0x0d, 0xc2, 0x05, 0x52, 0x0c, 0xf8, 0x08, 0xa6, 0x46, 0x42, 0xb4, 0xe0,
301
+0x04, 0x00, 0x4c, 0xfc, 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, 0xe0, 0x04,
299
+    0x18, 0x84, 0x00, 0x40, 0xf4, 0x93, 0x00, 0x40, 0x08, 0xdc, 0x1b, 0xa1,
302
+0x00, 0xd0, 0xfc, 0x05, 0x50, 0x40, 0xe0, 0x4c, 0x0c, 0x1c, 0xf2, 0x93, 0xdd,
300
+    0x06, 0xa6, 0x05, 0x10, 0x40, 0x80, 0x04, 0x00, 0x50, 0x9c, 0x65, 0x8a,
303
+0xc3, 0xc1, 0xc6, 0x40, 0xfc, 0xe0, 0x04, 0x80, 0xc6, 0x44, 0x0c, 0xe1, 0x15,
301
+    0x05, 0x10, 0x44, 0xe0, 0xf6, 0x43, 0xfd, 0x6f, 0x00, 0xf8, 0x0f, 0x82,
304
+0x04, 0x0c, 0xf8, 0x0a, 0x80, 0x06, 0x07, 0x04, 0xe0, 0x03, 0x42, 0x48, 0xe1,
302
+    0x06, 0x02, 0x01, 0x60, 0x1e, 0xc0, 0x0f, 0xa2, 0x05, 0x50, 0x44, 0xe0,
305
+0x46, 0x02, 0x40, 0xe2, 0x08, 0xc6, 0x44, 0x88, 0x06, 0x46, 0x0e, 0xe0, 0x86,
303
+    0x05, 0x10, 0x44, 0xe0, 0x0e, 0x02, 0x00, 0xf8, 0x0f, 0x82, 0x09, 0xf6,
306
+0x01, 0x84, 0xe0, 0x33, 0x80, 0x39, 0x06, 0xd8, 0xef, 0x0a, 0x46, 0x80, 0xe0,
304
+    0x05, 0x50, 0x44, 0xe0, 0x05, 0x10, 0x40, 0xe0, 0x04, 0x00, 0x54, 0xfc,
307
+0x31, 0xbf, 0x06, 0x06, 0x00, 0xc0, 0x31, 0x48, 0x60, 0xe0, 0x34, 0x88, 0x49,
305
+    0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, 0xe0, 0x04, 0x00, 0xcc, 0xfc,
308
+0x06, 0x40, 0xe1, 0x40, 0x48, 0x7c, 0xf3, 0x41, 0x46, 0x40, 0xe1, 0x24, 0x8a,
306
+    0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, 0xe0, 0x04, 0x00, 0x4c, 0xfc,
309
+0x39, 0x04, 0x10, 0xe0, 0x39, 0xc2, 0x31, 0x44, 0x10, 0xe0, 0x14, 0xc4, 0x1b,
307
+    0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, 0xe0, 0x04, 0x00, 0xd0, 0xfc,
310
+0xa5, 0x11, 0x83, 0x11, 0x40, 0x25, 0x6a, 0x01, 0xc0, 0x08, 0x5c, 0x00, 0xda,
308
+    0x05, 0x50, 0x40, 0xe0, 0x4c, 0x0c, 0x1c, 0xf2, 0x93, 0xdd, 0xc3, 0xc1,
311
+0x15, 0x00, 0xcc, 0xe0, 0x25, 0x00, 0xf8, 0xe0, 0x1b, 0x85, 0x08, 0x5c, 0x00,
309
+    0xc6, 0x40, 0xfc, 0xe0, 0x04, 0x80, 0xc6, 0x44, 0x0c, 0xe1, 0x15, 0x04,
312
+0x9a, 0x4e, 0x03, 0x01, 0x60, 0x10, 0xc0, 0x29, 0x00, 0x1c, 0xe4, 0x18, 0x84,
310
+    0x0c, 0xf8, 0x0a, 0x80, 0x06, 0x07, 0x04, 0xe0, 0x03, 0x42, 0x48, 0xe1,
313
+0x20, 0x44, 0xf8, 0xf3, 0x2f, 0xa2, 0x21, 0x40, 0x1c, 0xe4, 0x93, 0xdd, 0x0c,
311
+    0x46, 0x02, 0x40, 0xe2, 0x08, 0xc6, 0x44, 0x88, 0x06, 0x46, 0x0e, 0xe0,
314
+0x00, 0x80, 0xfa, 0x15, 0x00, 0x3c, 0xe0, 0x21, 0x81, 0x31, 0x85, 0x21, 0x42,
312
+    0x86, 0x01, 0x84, 0xe0, 0x33, 0x80, 0x39, 0x06, 0xd8, 0xef, 0x0a, 0x46,
315
+0x60, 0xe0, 0x15, 0x00, 0x44, 0xe0, 0x31, 0x42, 0x40, 0xe1, 0x15, 0x00, 0x34,
313
+    0x80, 0xe0, 0x31, 0xbf, 0x06, 0x06, 0x00, 0xc0, 0x31, 0x48, 0x60, 0xe0,
316
+0xe0, 0x21, 0x42, 0x20, 0xe0, 0x15, 0x00, 0x34, 0xe0, 0xd6, 0x04, 0x10, 0xe0,
314
+    0x34, 0x88, 0x49, 0x06, 0x40, 0xe1, 0x40, 0x48, 0x7c, 0xf3, 0x41, 0x46,
317
+0x23, 0x42, 0x30, 0xe0, 0x15, 0x00, 0x34, 0xe0, 0x86, 0x44, 0x04, 0xe0, 0x23,
315
+    0x40, 0xe1, 0x24, 0x8a, 0x39, 0x04, 0x10, 0xe0, 0x39, 0xc2, 0x31, 0x44,
318
+0x42, 0x38, 0xe0, 0x05, 0x00, 0x30, 0xe0, 0xc6, 0x02, 0x08, 0xe0, 0x13, 0x40,
316
+    0x10, 0xe0, 0x14, 0xc4, 0x1b, 0xa5, 0x11, 0x83, 0x11, 0x40, 0x25, 0x6a,
319
+0x10, 0xe3, 0xe8, 0x56, 0x40, 0xef, 0x06, 0x40, 0x0c, 0xe1, 0x04, 0x80, 0x06,
317
+    0x01, 0xc0, 0x08, 0x5c, 0x00, 0xda, 0x15, 0x00, 0xcc, 0xe0, 0x25, 0x00,
320
+0x02, 0x94, 0xe0, 0x2b, 0x02, 0xc4, 0xea, 0x3b, 0x00, 0x78, 0xe2, 0x20, 0x44,
318
+    0xf8, 0xe0, 0x1b, 0x85, 0x08, 0x5c, 0x00, 0x9a, 0x4e, 0x03, 0x01, 0x60,
321
+0xfd, 0x73, 0x07, 0xc0, 0x30, 0x46, 0x01, 0x70, 0xf8, 0xc0, 0x3f, 0xa4, 0x33,
319
+    0x10, 0xc0, 0x29, 0x00, 0x1c, 0xe4, 0x18, 0x84, 0x20, 0x44, 0xf8, 0xf3,
322
+0x40, 0x78, 0xe2, 0x0a, 0x84, 0x0c, 0x08, 0x80, 0xf2, 0xf8, 0x3b, 0x3c, 0xff,
320
+    0x2f, 0xa2, 0x21, 0x40, 0x1c, 0xe4, 0x93, 0xdd, 0x0c, 0x00, 0x80, 0xfa,
323
+0xc3, 0xc1, 0x06, 0x40, 0x0c, 0xe1, 0x04, 0x80, 0x1b, 0x00, 0x40, 0xe4, 0x19,
321
+    0x15, 0x00, 0x3c, 0xe0, 0x21, 0x81, 0x31, 0x85, 0x21, 0x42, 0x60, 0xe0,
324
+0xc2, 0x13, 0x40, 0x40, 0xe4, 0x1b, 0x00, 0x40, 0xe4, 0x19, 0xc4, 0x13, 0x40,
322
+    0x15, 0x00, 0x44, 0xe0, 0x31, 0x42, 0x40, 0xe1, 0x15, 0x00, 0x34, 0xe0,
325
+0x40, 0xe4, 0x93, 0xdd, 0xc6, 0x43, 0xec, 0xe0, 0x46, 0x41, 0xfc, 0xe0, 0x24,
323
+    0x21, 0x42, 0x20, 0xe0, 0x15, 0x00, 0x34, 0xe0, 0xd6, 0x04, 0x10, 0xe0,
326
+0x84, 0x04, 0x80, 0x31, 0x81, 0x4a, 0x44, 0x80, 0xe0, 0x86, 0x44, 0x0c, 0xe1,
324
+    0x23, 0x42, 0x30, 0xe0, 0x15, 0x00, 0x34, 0xe0, 0x86, 0x44, 0x04, 0xe0,
327
+0x09, 0x00, 0x6c, 0xe0, 0xc4, 0x8a, 0x8e, 0x47, 0xfc, 0x9f, 0x01, 0x42, 0x51,
325
+    0x23, 0x42, 0x38, 0xe0, 0x05, 0x00, 0x30, 0xe0, 0xc6, 0x02, 0x08, 0xe0,
328
+0x78, 0x0c, 0xc0, 0x31, 0x58, 0x90, 0xe0, 0x34, 0x8a, 0x41, 0xbf, 0x06, 0x08,
326
+    0x13, 0x40, 0x10, 0xe3, 0xe8, 0x56, 0x40, 0xef, 0x06, 0x40, 0x0c, 0xe1,
329
+0x00, 0xc0, 0x41, 0x46, 0xa0, 0xe0, 0x34, 0x8a, 0x51, 0x81, 0xf6, 0x0b, 0x00,
327
+    0x04, 0x80, 0x06, 0x02, 0x94, 0xe0, 0x2b, 0x02, 0xc4, 0xea, 0x3b, 0x00,
330
+0xc0, 0x51, 0x46, 0xd0, 0xe0, 0x34, 0x8a, 0x01, 0xbf, 0x51, 0x46, 0xe0, 0xe0,
328
+    0x78, 0xe2, 0x20, 0x44, 0xfd, 0x73, 0x07, 0xc0, 0x30, 0x46, 0x01, 0x70,
331
+0x44, 0x84, 0x0a, 0x48, 0x84, 0xe0, 0x75, 0x86, 0x54, 0xca, 0x49, 0x88, 0x44,
329
+    0xf8, 0xc0, 0x3f, 0xa4, 0x33, 0x40, 0x78, 0xe2, 0x0a, 0x84, 0x0c, 0x08,
332
+0x06, 0x88, 0xe1, 0x36, 0x94, 0x4a, 0x46, 0x80, 0xe0, 0x34, 0xca, 0x47, 0xc6,
330
+    0x80, 0xf2, 0xf8, 0x3b, 0x3c, 0xff, 0xc3, 0xc1, 0x06, 0x40, 0x0c, 0xe1,
333
+0x11, 0x8d, 0x41, 0x46, 0xd0, 0xe0, 0x34, 0x88, 0x76, 0x02, 0x00, 0xc0, 0x06,
331
+    0x04, 0x80, 0x1b, 0x00, 0x40, 0xe4, 0x19, 0xc2, 0x13, 0x40, 0x40, 0xe4,
334
+0x00, 0x00, 0xc0, 0x16, 0x8c, 0x14, 0x88, 0x01, 0x42, 0xc0, 0xe1, 0x01, 0x42,
332
+    0x1b, 0x00, 0x40, 0xe4, 0x19, 0xc4, 0x13, 0x40, 0x40, 0xe4, 0x93, 0xdd,
335
+0xe0, 0xe1, 0x01, 0x42, 0xf0, 0xe1, 0x93, 0xdd, 0x34, 0xca, 0x41, 0x85, 0x46,
333
+    0xc6, 0x43, 0xec, 0xe0, 0x46, 0x41, 0xfc, 0xe0, 0x24, 0x84, 0x04, 0x80,
336
+0x8c, 0x34, 0xca, 0x06, 0x48, 0x00, 0xe0, 0x41, 0x46, 0xd0, 0xe0, 0x34, 0x88,
334
+    0x31, 0x81, 0x4a, 0x44, 0x80, 0xe0, 0x86, 0x44, 0x0c, 0xe1, 0x09, 0x00,
337
+0x41, 0x83, 0x46, 0x8c, 0x34, 0x88, 0x01, 0x46, 0xc0, 0xe1, 0x01, 0x46, 0xe0,
335
+    0x6c, 0xe0, 0xc4, 0x8a, 0x8e, 0x47, 0xfc, 0x9f, 0x01, 0x42, 0x51, 0x78,
338
+0xe1, 0x01, 0x46, 0xf0, 0xe1, 0x09, 0x02, 0x20, 0xe0, 0x14, 0xca, 0x03, 0x42,
336
+    0x0c, 0xc0, 0x31, 0x58, 0x90, 0xe0, 0x34, 0x8a, 0x41, 0xbf, 0x06, 0x08,
339
+0x58, 0xe0, 0x93, 0xdd, 0xc3, 0xc1, 0x4c, 0x04, 0x04, 0xfa, 0x46, 0x4e, 0x08,
337
+    0x00, 0xc0, 0x41, 0x46, 0xa0, 0xe0, 0x34, 0x8a, 0x51, 0x81, 0xf6, 0x0b,
340
+0xe1, 0x06, 0x4c, 0x0c, 0xe1, 0x0a, 0x9e, 0x14, 0x98, 0x05, 0x42, 0x44, 0xe0,
338
+    0x00, 0xc0, 0x51, 0x46, 0xd0, 0xe0, 0x34, 0x8a, 0x01, 0xbf, 0x51, 0x46,
341
+0x10, 0x00, 0xe1, 0x65, 0x03, 0xc0, 0x78, 0x41, 0x00, 0xe8, 0x08, 0x9c, 0x0b,
339
+    0xe0, 0xe0, 0x44, 0x84, 0x0a, 0x48, 0x84, 0xe0, 0x75, 0x86, 0x54, 0xca,
342
+0xa1, 0x04, 0x98, 0x06, 0x02, 0x10, 0x80, 0x13, 0x40, 0xf8, 0x86, 0x65, 0x82,
340
+    0x49, 0x88, 0x44, 0x06, 0x88, 0xe1, 0x36, 0x94, 0x4a, 0x46, 0x80, 0xe0,
343
+0x00, 0x00, 0xe1, 0x65, 0x03, 0xc0, 0xa8, 0x40, 0x00, 0xe8, 0x14, 0x98, 0x04,
341
+    0x34, 0xca, 0x47, 0xc6, 0x11, 0x8d, 0x41, 0x46, 0xd0, 0xe0, 0x34, 0x88,
344
+0x00, 0xa0, 0xfc, 0x03, 0x42, 0x00, 0xe7, 0x4c, 0x0c, 0x04, 0xf2, 0x93, 0xdd,
342
+    0x76, 0x02, 0x00, 0xc0, 0x06, 0x00, 0x00, 0xc0, 0x16, 0x8c, 0x14, 0x88,
345
+0x0a, 0x80, 0x93, 0xdd, 0x0c, 0x04, 0x00, 0xfa, 0x06, 0x02, 0xec, 0xe1, 0x64,
343
+    0x01, 0x42, 0xc0, 0xe1, 0x01, 0x42, 0xe0, 0xe1, 0x01, 0x42, 0xf0, 0xe1,
346
+0x84, 0x15, 0x0c, 0x2c, 0xe0, 0x14, 0x02, 0xa0, 0xfc, 0x15, 0x4c, 0x2c, 0xe0,
344
+    0x93, 0xdd, 0x34, 0xca, 0x41, 0x85, 0x46, 0x8c, 0x34, 0xca, 0x06, 0x48,
347
+0xd8, 0x40, 0x00, 0xe8, 0x14, 0xd8, 0x09, 0x82, 0x14, 0x02, 0x00, 0xfc, 0x1f,
345
+    0x00, 0xe0, 0x41, 0x46, 0xd0, 0xe0, 0x34, 0x88, 0x41, 0x83, 0x46, 0x8c,
348
+0xa0, 0x1e, 0xd8, 0x01, 0x85, 0x0c, 0x0c, 0x00, 0xf2, 0xe8, 0x32, 0x2c, 0xff,
346
+    0x34, 0x88, 0x01, 0x46, 0xc0, 0xe1, 0x01, 0x46, 0xe0, 0xe1, 0x01, 0x46,
349
+0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x00, 0xfa, 0x6b, 0x80, 0xf6, 0x01, 0x94,
347
+    0xf0, 0xe1, 0x09, 0x02, 0x20, 0xe0, 0x14, 0xca, 0x03, 0x42, 0x58, 0xe0,
350
+0xe0, 0x08, 0x80, 0x4a, 0x40, 0x80, 0xe0, 0x45, 0x86, 0x06, 0x40, 0x0c, 0xe1,
348
+    0x93, 0xdd, 0xc3, 0xc1, 0x4c, 0x04, 0x04, 0xfa, 0x46, 0x4e, 0x08, 0xe1,
351
+0x04, 0x80, 0xc6, 0x02, 0x40, 0xe2, 0x09, 0x00, 0xd0, 0xe0, 0x14, 0x84, 0x1b,
349
+    0x06, 0x4c, 0x0c, 0xe1, 0x0a, 0x9e, 0x14, 0x98, 0x05, 0x42, 0x44, 0xe0,
352
+0xa5, 0x15, 0x84, 0x07, 0xc5, 0x09, 0x82, 0x18, 0x41, 0x00, 0xe8, 0x46, 0x43,
350
+    0x10, 0x00, 0xe1, 0x65, 0x03, 0xc0, 0x78, 0x41, 0x00, 0xe8, 0x08, 0x9c,
353
+0xfc, 0xe0, 0x14, 0x84, 0x19, 0x02, 0xd8, 0xe0, 0x19, 0x82, 0x0b, 0x83, 0x16,
351
+    0x0b, 0xa1, 0x04, 0x98, 0x06, 0x02, 0x10, 0x80, 0x13, 0x40, 0xf8, 0x86,
354
+0x00, 0x00, 0xc0, 0x01, 0x4c, 0x00, 0xc0, 0x0c, 0x0c, 0x00, 0xf2, 0x93, 0xdd,
352
+    0x65, 0x82, 0x00, 0x00, 0xe1, 0x65, 0x03, 0xc0, 0xa8, 0x40, 0x00, 0xe8,
355
+0xc3, 0xc1, 0x4a, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0xe2, 0x93, 0xdd, 0xc3,
353
+    0x14, 0x98, 0x04, 0x00, 0xa0, 0xfc, 0x03, 0x42, 0x00, 0xe7, 0x4c, 0x0c,
356
+0xc1, 0x46, 0x40, 0x84, 0xe0, 0x11, 0xaf, 0x13, 0x40, 0x6c, 0xec, 0x11, 0xb3,
354
+    0x04, 0xf2, 0x93, 0xdd, 0x0a, 0x80, 0x93, 0xdd, 0x0c, 0x04, 0x00, 0xfa,
357
+0x13, 0x40, 0x70, 0xec, 0xc6, 0x43, 0xf0, 0xe0, 0x13, 0x40, 0xdc, 0xec, 0xc6,
355
+    0x06, 0x02, 0xec, 0xe1, 0x64, 0x84, 0x15, 0x0c, 0x2c, 0xe0, 0x14, 0x02,
358
+0x02, 0x24, 0xe0, 0x1c, 0x80, 0x93, 0xdd, 0x4c, 0x00, 0x00, 0xfa, 0xc8, 0x60,
356
+    0xa0, 0xfc, 0x15, 0x4c, 0x2c, 0xe0, 0xd8, 0x40, 0x00, 0xe8, 0x14, 0xd8,
359
+0x7c, 0xef, 0xe8, 0x61, 0x7c, 0xef, 0x28, 0x7e, 0x80, 0xef, 0xc6, 0x40, 0x98,
357
+    0x09, 0x82, 0x14, 0x02, 0x00, 0xfc, 0x1f, 0xa0, 0x1e, 0xd8, 0x01, 0x85,
360
+0xe1, 0x11, 0x83, 0x16, 0x80, 0x46, 0x01, 0x10, 0xe1, 0x11, 0x81, 0x16, 0x80,
358
+    0x0c, 0x0c, 0x00, 0xf2, 0xe8, 0x32, 0x2c, 0xff, 0x93, 0xdd, 0xc3, 0xc1,
361
+0x4c, 0x08, 0x00, 0xf2, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x0c, 0xfa, 0x6b,
359
+    0x0c, 0x04, 0x00, 0xfa, 0x6b, 0x80, 0xf6, 0x01, 0x94, 0xe0, 0x08, 0x80,
362
+0x80, 0x04, 0x98, 0x7b, 0x82, 0x56, 0x42, 0xb4, 0xe0, 0x88, 0x84, 0x05, 0x00,
360
+    0x4a, 0x40, 0x80, 0xe0, 0x45, 0x86, 0x06, 0x40, 0x0c, 0xe1, 0x04, 0x80,
363
+0x10, 0xe0, 0x09, 0x86, 0x0b, 0xa5, 0x46, 0x02, 0x00, 0x80, 0x06, 0x05, 0x00,
361
+    0xc6, 0x02, 0x40, 0xe2, 0x09, 0x00, 0xd0, 0xe0, 0x14, 0x84, 0x1b, 0xa5,
364
+0x80, 0x25, 0x82, 0x0b, 0xa3, 0xa5, 0x80, 0x0b, 0xa1, 0x06, 0x00, 0xf4, 0xef,
362
+    0x15, 0x84, 0x07, 0xc5, 0x09, 0x82, 0x18, 0x41, 0x00, 0xe8, 0x46, 0x43,
365
+0xd5, 0x84, 0x11, 0x85, 0x21, 0x91, 0x0b, 0x8e, 0x88, 0x74, 0x10, 0xef, 0x0b,
363
+    0xfc, 0xe0, 0x14, 0x84, 0x19, 0x02, 0xd8, 0xe0, 0x19, 0x82, 0x0b, 0x83,
366
+0xa1, 0xf5, 0x82, 0x0a, 0x9e, 0x1a, 0x9c, 0x24, 0x98, 0x07, 0xe0, 0x0f, 0xa2,
364
+    0x16, 0x00, 0x00, 0xc0, 0x01, 0x4c, 0x00, 0xc0, 0x0c, 0x0c, 0x00, 0xf2,
367
+0x0e, 0xca, 0x0a, 0xde, 0x1a, 0xdc, 0x24, 0x98, 0x03, 0xb0, 0x07, 0xe0, 0x0f,
365
+    0x93, 0xdd, 0xc3, 0xc1, 0x4a, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0xe2,
368
+0xa2, 0x0e, 0xc8, 0x01, 0x81, 0x0c, 0x0c, 0x0c, 0xf2, 0x93, 0xdd, 0xc3, 0xc1,
366
+    0x93, 0xdd, 0xc3, 0xc1, 0x46, 0x40, 0x84, 0xe0, 0x11, 0xaf, 0x13, 0x40,
369
+0x0c, 0x04, 0x7c, 0xfa, 0x46, 0x42, 0x9c, 0xe0, 0x0b, 0x02, 0x04, 0xe3, 0xf0,
367
+    0x6c, 0xec, 0x11, 0xb3, 0x13, 0x40, 0x70, 0xec, 0xc6, 0x43, 0xf0, 0xe0,
370
+0x1e, 0x30, 0xec, 0x0b, 0xa3, 0x35, 0x96, 0x8e, 0x01, 0x01, 0x60, 0x10, 0xc0,
368
+    0x13, 0x40, 0xdc, 0xec, 0xc6, 0x02, 0x24, 0xe0, 0x1c, 0x80, 0x93, 0xdd,
371
+0x0e, 0xfc, 0xc6, 0x05, 0xd0, 0xe1, 0x0b, 0x82, 0x31, 0x81, 0x10, 0x16, 0x00,
369
+    0x4c, 0x00, 0x00, 0xfa, 0xc8, 0x60, 0x7c, 0xef, 0xe8, 0x61, 0x7c, 0xef,
372
+0xe5, 0x20, 0x10, 0x20, 0xe7, 0x0e, 0xbe, 0xb5, 0x85, 0x94, 0xfc, 0xa4, 0xbe,
370
+    0x28, 0x7e, 0x80, 0xef, 0xc6, 0x40, 0x98, 0xe1, 0x11, 0x83, 0x16, 0x80,
373
+0x82, 0x4c, 0x9c, 0xf0, 0x05, 0x0c, 0x40, 0xe0, 0x11, 0x89, 0x93, 0x8e, 0xa3,
371
+    0x46, 0x01, 0x10, 0xe1, 0x11, 0x81, 0x16, 0x80, 0x4c, 0x08, 0x00, 0xf2,
374
+0x8e, 0x58, 0x44, 0x00, 0xe8, 0x15, 0x0c, 0xc0, 0xf8, 0x04, 0x0c, 0x80, 0xfb,
372
+    0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x0c, 0xfa, 0x6b, 0x80, 0x04, 0x98,
375
+0x0c, 0xed, 0x0b, 0x82, 0x1b, 0x8c, 0x48, 0x44, 0x00, 0xe8, 0x15, 0x10, 0x1c,
373
+    0x7b, 0x82, 0x56, 0x42, 0xb4, 0xe0, 0x88, 0x84, 0x05, 0x00, 0x10, 0xe0,
376
+0xfc, 0x0e, 0xa8, 0x0b, 0x82, 0x1b, 0x8c, 0xd8, 0x43, 0x00, 0xe8, 0x71, 0x88,
374
+    0x09, 0x86, 0x0b, 0xa5, 0x46, 0x02, 0x00, 0x80, 0x06, 0x05, 0x00, 0x80,
377
+0x0e, 0xa4, 0x0a, 0x0e, 0x40, 0xe0, 0x35, 0xf8, 0x04, 0xbe, 0x14, 0xbc, 0x81,
375
+    0x25, 0x82, 0x0b, 0xa3, 0xa5, 0x80, 0x0b, 0xa1, 0x06, 0x00, 0xf4, 0xef,
378
+0xa0, 0x03, 0x8e, 0x0e, 0xbe, 0x04, 0xfc, 0x11, 0x82, 0x3b, 0x82, 0x03, 0x8e,
376
+    0xd5, 0x84, 0x11, 0x85, 0x21, 0x91, 0x0b, 0x8e, 0x88, 0x74, 0x10, 0xef,
379
+0x0e, 0xfc, 0x3b, 0xa9, 0x06, 0x0e, 0x00, 0xc0, 0x35, 0x5e, 0x00, 0xc0, 0xd5,
377
+    0x0b, 0xa1, 0xf5, 0x82, 0x0a, 0x9e, 0x1a, 0x9c, 0x24, 0x98, 0x07, 0xe0,
380
+0xfa, 0xc6, 0x01, 0xd0, 0xe1, 0x7b, 0x80, 0x04, 0x9e, 0x11, 0x91, 0x98, 0x41,
378
+    0x0f, 0xa2, 0x0e, 0xca, 0x0a, 0xde, 0x1a, 0xdc, 0x24, 0x98, 0x03, 0xb0,
381
+0x00, 0xe8, 0x24, 0x9c, 0x46, 0x42, 0x9c, 0xe0, 0x6b, 0x82, 0x03, 0x4c, 0xc4,
379
+    0x07, 0xe0, 0x0f, 0xa2, 0x0e, 0xc8, 0x01, 0x81, 0x0c, 0x0c, 0x0c, 0xf2,
382
+0xe0, 0x11, 0x91, 0x0b, 0x84, 0xf8, 0x40, 0x00, 0xe8, 0x19, 0x0e, 0x20, 0xe5,
380
+    0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x7c, 0xfa, 0x46, 0x42, 0x9c, 0xe0,
383
+0x03, 0x4c, 0xc0, 0xe0, 0x0b, 0x82, 0x08, 0x72, 0xfc, 0xef, 0x01, 0x4c, 0x24,
381
+    0x0b, 0x02, 0x04, 0xe3, 0xf0, 0x1e, 0x30, 0xec, 0x0b, 0xa3, 0x35, 0x96,
384
+0xf9, 0xf1, 0x98, 0x0c, 0x0c, 0x7c, 0xf2, 0x93, 0xdd, 0x4c, 0x00, 0x00, 0xfa,
382
+    0x8e, 0x01, 0x01, 0x60, 0x10, 0xc0, 0x0e, 0xfc, 0xc6, 0x05, 0xd0, 0xe1,
385
+0x48, 0x65, 0x2c, 0xef, 0x4c, 0x08, 0x00, 0xf2, 0x93, 0xdd, 0xc3, 0xc1, 0x0c,
383
+    0x0b, 0x82, 0x31, 0x81, 0x10, 0x16, 0x00, 0xe5, 0x20, 0x10, 0x20, 0xe7,
386
+0x04, 0x00, 0xfa, 0x6b, 0x82, 0x78, 0x6e, 0xfc, 0xee, 0x46, 0x42, 0xec, 0xe0,
384
+    0x0e, 0xbe, 0xb5, 0x85, 0x94, 0xfc, 0xa4, 0xbe, 0x82, 0x4c, 0x9c, 0xf0,
387
+0x24, 0x84, 0x24, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x83, 0xf5, 0x82, 0x24,
385
+    0x05, 0x0c, 0x40, 0xe0, 0x11, 0x89, 0x93, 0x8e, 0xa3, 0x8e, 0x58, 0x44,
388
+0x02, 0xa0, 0xe1, 0x14, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x85, 0x15, 0x82,
386
+    0x00, 0xe8, 0x15, 0x0c, 0xc0, 0xf8, 0x04, 0x0c, 0x80, 0xfb, 0x0c, 0xed,
389
+0x27, 0xe1, 0x24, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x89, 0x86, 0x02, 0x00,
387
+    0x0b, 0x82, 0x1b, 0x8c, 0x48, 0x44, 0x00, 0xe8, 0x15, 0x10, 0x1c, 0xfc,
390
+0x80, 0x0c, 0x0c, 0x00, 0xf2, 0x18, 0x17, 0xfc, 0xfe, 0xc3, 0xc1, 0x0c, 0x04,
388
+    0x0e, 0xa8, 0x0b, 0x82, 0x1b, 0x8c, 0xd8, 0x43, 0x00, 0xe8, 0x71, 0x88,
391
+0x00, 0xfa, 0x06, 0x41, 0x8c, 0xe0, 0x1b, 0x00, 0xec, 0xe4, 0x1b, 0xa3, 0x75,
389
+    0x0e, 0xa4, 0x0a, 0x0e, 0x40, 0xe0, 0x35, 0xf8, 0x04, 0xbe, 0x14, 0xbc,
392
+0x84, 0x11, 0x81, 0x8e, 0x05, 0x01, 0x60, 0x10, 0xc0, 0x00, 0x06, 0xc0, 0xe5,
390
+    0x81, 0xa0, 0x03, 0x8e, 0x0e, 0xbe, 0x04, 0xfc, 0x11, 0x82, 0x3b, 0x82,
393
+0x95, 0x81, 0x44, 0x88, 0x1d, 0xee, 0x75, 0x80, 0x4e, 0xc1, 0x25, 0x81, 0x4e,
391
+    0x03, 0x8e, 0x0e, 0xfc, 0x3b, 0xa9, 0x06, 0x0e, 0x00, 0xc0, 0x35, 0x5e,
394
+0xcd, 0x21, 0x88, 0x11, 0x82, 0x0a, 0x02, 0x40, 0xe0, 0xd5, 0xfc, 0x56, 0x00,
392
+    0x00, 0xc0, 0xd5, 0xfa, 0xc6, 0x01, 0xd0, 0xe1, 0x7b, 0x80, 0x04, 0x9e,
395
+0x00, 0xe1, 0x18, 0x80, 0x1b, 0xa1, 0xc5, 0x84, 0x08, 0x82, 0x4a, 0x00, 0xfc,
393
+    0x11, 0x91, 0x98, 0x41, 0x00, 0xe8, 0x24, 0x9c, 0x46, 0x42, 0x9c, 0xe0,
396
+0xfb, 0x45, 0x84, 0x86, 0x4d, 0x84, 0xe1, 0x04, 0x98, 0x05, 0x00, 0x10, 0xe0,
394
+    0x6b, 0x82, 0x03, 0x4c, 0xc4, 0xe0, 0x11, 0x91, 0x0b, 0x84, 0xf8, 0x40,
397
+0x4a, 0x40, 0x80, 0xe0, 0x45, 0x82, 0x11, 0x81, 0x0b, 0x8c, 0x58, 0x76, 0x28,
395
+    0x00, 0xe8, 0x19, 0x0e, 0x20, 0xe5, 0x03, 0x4c, 0xc0, 0xe0, 0x0b, 0x82,
398
+0xef, 0x0b, 0x8c, 0x0c, 0x0c, 0x00, 0xf2, 0x88, 0x35, 0x28, 0xff, 0x0c, 0x0c,
396
+    0x08, 0x72, 0xfc, 0xef, 0x01, 0x4c, 0x24, 0xf9, 0xf1, 0x98, 0x0c, 0x0c,
399
+0x00, 0xf2, 0x93, 0xdd, 0xc3, 0xc1, 0x46, 0x41, 0xfc, 0xe0, 0x04, 0x80, 0x09,
397
+    0x7c, 0xf2, 0x93, 0xdd, 0x4c, 0x00, 0x00, 0xfa, 0x48, 0x65, 0x2c, 0xef,
400
+0x00, 0x80, 0xe0, 0x09, 0x9e, 0x0b, 0xa3, 0x75, 0x82, 0x46, 0x41, 0x80, 0xe1,
398
+    0x4c, 0x08, 0x00, 0xf2, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x00, 0xfa,
401
+0x04, 0x80, 0xc6, 0x42, 0x8c, 0xe0, 0x04, 0xc2, 0x00, 0x40, 0x00, 0xf2, 0x07,
399
+    0x6b, 0x82, 0x78, 0x6e, 0xfc, 0xee, 0x46, 0x42, 0xec, 0xe0, 0x24, 0x84,
402
+0xcf, 0x06, 0x84, 0x06, 0x40, 0x84, 0xe0, 0x15, 0x00, 0x28, 0xe5, 0x1c, 0xc2,
400
+    0x24, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x83, 0xf5, 0x82, 0x24, 0x02,
403
+0x93, 0xdd, 0x0b, 0xa1, 0xc6, 0x00, 0xa0, 0xe1, 0x15, 0x00, 0x04, 0xf8, 0x05,
401
+    0xa0, 0xe1, 0x14, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x85, 0x15, 0x82,
404
+0x84, 0x21, 0x8b, 0x2c, 0x84, 0x14, 0x80, 0x2c, 0x84, 0x14, 0x82, 0x2c, 0x84,
402
+    0x27, 0xe1, 0x24, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x89, 0x86, 0x02,
405
+0x15, 0x00, 0x10, 0xe0, 0x21, 0xa1, 0x21, 0x42, 0x10, 0xe0, 0x05, 0x00, 0x14,
403
+    0x00, 0x80, 0x0c, 0x0c, 0x00, 0xf2, 0x18, 0x17, 0xfc, 0xfe, 0xc3, 0xc1,
406
+0xe0, 0x01, 0x88, 0x75, 0x83, 0x21, 0x85, 0x2c, 0x84, 0x14, 0x80, 0x06, 0x46,
404
+    0x0c, 0x04, 0x00, 0xfa, 0x06, 0x41, 0x8c, 0xe0, 0x1b, 0x00, 0xec, 0xe4,
407
+0x00, 0xe0, 0x2c, 0x84, 0x14, 0x82, 0x2c, 0x84, 0x14, 0xc0, 0x21, 0xa1, 0x21,
405
+    0x1b, 0xa3, 0x75, 0x84, 0x11, 0x81, 0x8e, 0x05, 0x01, 0x60, 0x10, 0xc0,
408
+0x42, 0x20, 0xe0, 0x14, 0xc2, 0x31, 0x42, 0x20, 0xe0, 0x15, 0x00, 0x10, 0xe0,
406
+    0x00, 0x06, 0xc0, 0xe5, 0x95, 0x81, 0x44, 0x88, 0x1d, 0xee, 0x75, 0x80,
409
+0x21, 0x42, 0x20, 0xe0, 0x05, 0x00, 0x14, 0xe0, 0x01, 0x90, 0x06, 0x42, 0x00,
407
+    0x4e, 0xc1, 0x25, 0x81, 0x4e, 0xcd, 0x21, 0x88, 0x11, 0x82, 0x0a, 0x02,
410
+0xe0, 0x16, 0x80, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x7c, 0xfa, 0x4a, 0x40,
408
+    0x40, 0xe0, 0xd5, 0xfc, 0x56, 0x00, 0x00, 0xe1, 0x18, 0x80, 0x1b, 0xa1,
411
+0x80, 0xe0, 0xf0, 0x1e, 0x30, 0xec, 0xe5, 0x82, 0xa6, 0x40, 0x00, 0xe1, 0x1a,
409
+    0xc5, 0x84, 0x08, 0x82, 0x4a, 0x00, 0xfc, 0xfb, 0x45, 0x84, 0x86, 0x4d,
412
+0x80, 0x2a, 0xc0, 0x3a, 0xc2, 0x13, 0x40, 0x10, 0xe0, 0x1a, 0x82, 0x23, 0x40,
410
+    0x84, 0xe1, 0x04, 0x98, 0x05, 0x00, 0x10, 0xe0, 0x4a, 0x40, 0x80, 0xe0,
413
+0x18, 0xe0, 0x33, 0x40, 0x1c, 0xe0, 0x13, 0x40, 0x14, 0xe0, 0xf8, 0x61, 0x68,
411
+    0x45, 0x82, 0x11, 0x81, 0x0b, 0x8c, 0x58, 0x76, 0x28, 0xef, 0x0b, 0x8c,
414
+0xef, 0xc6, 0x13, 0x00, 0xe1, 0x15, 0x12, 0x28, 0xf8, 0x0b, 0x02, 0x2c, 0xe0,
412
+    0x0c, 0x0c, 0x00, 0xf2, 0x88, 0x35, 0x28, 0xff, 0x0c, 0x0c, 0x00, 0xf2,
415
+0x1b, 0x02, 0x24, 0xe0, 0x8a, 0x00, 0xa5, 0x64, 0x03, 0xc0, 0x35, 0x82, 0x0a,
413
+    0x93, 0xdd, 0xc3, 0xc1, 0x46, 0x41, 0xfc, 0xe0, 0x04, 0x80, 0x09, 0x00,
416
+0x4e, 0x9c, 0xe1, 0x1a, 0x03, 0x11, 0x6f, 0x02, 0xc0, 0xe8, 0x13, 0x01, 0x20,
414
+    0x80, 0xe0, 0x09, 0x9e, 0x0b, 0xa3, 0x75, 0x82, 0x46, 0x41, 0x80, 0xe1,
417
+0x00, 0xc0, 0x1f, 0xa0, 0x5a, 0x42, 0x80, 0xe0, 0x0a, 0x4e, 0x9c, 0xe1, 0x68,
415
+    0x04, 0x80, 0xc6, 0x42, 0x8c, 0xe0, 0x04, 0xc2, 0x00, 0x40, 0x00, 0xf2,
418
+0x13, 0x00, 0xa0, 0x09, 0x12, 0x78, 0xf8, 0xa1, 0x81, 0xf0, 0x02, 0x10, 0xe4,
416
+    0x07, 0xcf, 0x06, 0x84, 0x06, 0x40, 0x84, 0xe0, 0x15, 0x00, 0x28, 0xe5,
419
+0x07, 0xc4, 0x0c, 0xfc, 0xf0, 0x00, 0x20, 0xe4, 0xa6, 0x91, 0xa8, 0x53, 0x74,
417
+    0x1c, 0xc2, 0x93, 0xdd, 0x0b, 0xa1, 0xc6, 0x00, 0xa0, 0xe1, 0x15, 0x00,
420
+0xef, 0x05, 0x12, 0x30, 0xf8, 0x25, 0x12, 0x28, 0xf8, 0x61, 0x87, 0x09, 0x00,
418
+    0x04, 0xf8, 0x05, 0x84, 0x21, 0x8b, 0x2c, 0x84, 0x14, 0x80, 0x2c, 0x84,
421
+0x48, 0xe0, 0x81, 0x85, 0x09, 0x86, 0x0b, 0xa7, 0x26, 0x0c, 0x00, 0xc0, 0x0b,
419
+    0x14, 0x82, 0x2c, 0x84, 0x15, 0x00, 0x10, 0xe0, 0x21, 0xa1, 0x21, 0x42,
422
+0xa1, 0x0b, 0x04, 0x28, 0xe0, 0x16, 0x0c, 0x00, 0x80, 0x03, 0x52, 0x04, 0xf8,
420
+    0x10, 0xe0, 0x05, 0x00, 0x14, 0xe0, 0x01, 0x88, 0x75, 0x83, 0x21, 0x85,
423
+0x0b, 0x04, 0x20, 0xe0, 0x0c, 0xa6, 0x1b, 0x04, 0x2c, 0xe0, 0x3b, 0x04, 0x28,
421
+    0x2c, 0x84, 0x14, 0x80, 0x06, 0x46, 0x00, 0xe0, 0x2c, 0x84, 0x14, 0x82,
424
+0xe0, 0x4b, 0x04, 0x20, 0xe0, 0x13, 0x86, 0x3b, 0x04, 0x24, 0xe0, 0x10, 0x0a,
422
+    0x2c, 0x84, 0x14, 0xc0, 0x21, 0xa1, 0x21, 0x42, 0x20, 0xe0, 0x14, 0xc2,
425
+0x04, 0xec, 0x1a, 0xfc, 0x33, 0x88, 0x30, 0x06, 0x04, 0xec, 0x12, 0x4e, 0x94,
423
+    0x31, 0x42, 0x20, 0xe0, 0x15, 0x00, 0x10, 0xe0, 0x21, 0x42, 0x20, 0xe0,
426
+0xf0, 0x32, 0x48, 0x84, 0xf0, 0x4c, 0xe4, 0x7c, 0xa4, 0xcb, 0x04, 0x28, 0xe0,
424
+    0x05, 0x00, 0x14, 0xe0, 0x01, 0x90, 0x06, 0x42, 0x00, 0xe0, 0x16, 0x80,
427
+0x14, 0x08, 0x84, 0xe1, 0xcd, 0xc9, 0xc2, 0x58, 0x90, 0x91, 0x42, 0x4e, 0x94,
425
+    0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x7c, 0xfa, 0x4a, 0x40, 0x80, 0xe0,
428
+0x90, 0xc3, 0x52, 0x04, 0x98, 0x73, 0x52, 0x00, 0x80, 0x5b, 0x04, 0x20, 0xe0,
426
+    0xf0, 0x1e, 0x30, 0xec, 0xe5, 0x82, 0xa6, 0x40, 0x00, 0xe1, 0x1a, 0x80,
429
+0x5d, 0xc9, 0x52, 0x40, 0x90, 0x91, 0x42, 0x48, 0x8c, 0x90, 0x03, 0x52, 0x04,
427
+    0x2a, 0xc0, 0x3a, 0xc2, 0x13, 0x40, 0x10, 0xe0, 0x1a, 0x82, 0x23, 0x40,
430
+0x80, 0x43, 0x52, 0x08, 0x80, 0x3b, 0x04, 0x2c, 0xe0, 0x49, 0x04, 0xb8, 0xe0,
428
+    0x18, 0xe0, 0x33, 0x40, 0x1c, 0xe0, 0x13, 0x40, 0x14, 0xe0, 0xf8, 0x61,
431
+0x33, 0x52, 0x1c, 0xf8, 0x2b, 0x04, 0x24, 0xe0, 0x4b, 0xab, 0x23, 0x52, 0x18,
429
+    0x68, 0xef, 0xc6, 0x13, 0x00, 0xe1, 0x15, 0x12, 0x28, 0xf8, 0x0b, 0x02,
432
+0xf8, 0x65, 0x8a, 0x4b, 0xa9, 0xe5, 0x90, 0x4b, 0xa7, 0x22, 0x44, 0x84, 0xd0,
430
+    0x2c, 0xe0, 0x1b, 0x02, 0x24, 0xe0, 0x8a, 0x00, 0xa5, 0x64, 0x03, 0xc0,
433
+0x32, 0x46, 0x84, 0xd0, 0x33, 0x52, 0x1c, 0xd8, 0x23, 0x52, 0x18, 0xd8, 0x95,
431
+    0x35, 0x82, 0x0a, 0x4e, 0x9c, 0xe1, 0x1a, 0x03, 0x11, 0x6f, 0x02, 0xc0,
434
+0x96, 0x20, 0x44, 0xf9, 0x73, 0xff, 0xc0, 0x27, 0xc3, 0x23, 0x82, 0x23, 0x52,
432
+    0xe8, 0x13, 0x01, 0x20, 0x00, 0xc0, 0x1f, 0xa0, 0x5a, 0x42, 0x80, 0xe0,
435
+0x18, 0xf8, 0x24, 0x02, 0x80, 0xfb, 0x04, 0x00, 0x80, 0xfb, 0x2b, 0x8c, 0x58,
433
+    0x0a, 0x4e, 0x9c, 0xe1, 0x68, 0x13, 0x00, 0xa0, 0x09, 0x12, 0x78, 0xf8,
436
+0x52, 0x74, 0xef, 0x1b, 0x12, 0x1c, 0xf8, 0x2a, 0xfc, 0x0c, 0xe4, 0x17, 0xc3,
434
+    0xa1, 0x81, 0xf0, 0x02, 0x10, 0xe4, 0x07, 0xc4, 0x0c, 0xfc, 0xf0, 0x00,
437
+0x13, 0x84, 0x13, 0x52, 0x1c, 0xf8, 0x0b, 0x12, 0x04, 0xf8, 0x14, 0x02, 0x80,
435
+    0x20, 0xe4, 0xa6, 0x91, 0xa8, 0x53, 0x74, 0xef, 0x05, 0x12, 0x30, 0xf8,
438
+0xfb, 0x2b, 0x8c, 0x68, 0x51, 0x74, 0xef, 0xc5, 0x87, 0x20, 0x44, 0xe1, 0x73,
436
+    0x25, 0x12, 0x28, 0xf8, 0x61, 0x87, 0x09, 0x00, 0x48, 0xe0, 0x81, 0x85,
439
+0xff, 0xc0, 0x27, 0xc7, 0x23, 0x82, 0x23, 0x52, 0x18, 0xf8, 0x24, 0x02, 0x80,
437
+    0x09, 0x86, 0x0b, 0xa7, 0x26, 0x0c, 0x00, 0xc0, 0x0b, 0xa1, 0x0b, 0x04,
440
+0xfb, 0x04, 0x00, 0x80, 0xfb, 0x2b, 0x8c, 0x78, 0x57, 0x74, 0xef, 0x1b, 0x12,
438
+    0x28, 0xe0, 0x16, 0x0c, 0x00, 0x80, 0x03, 0x52, 0x04, 0xf8, 0x0b, 0x04,
441
+0x1c, 0xf8, 0x2a, 0xfc, 0x0c, 0xe4, 0x17, 0xc7, 0x13, 0x84, 0x13, 0x52, 0x1c,
439
+    0x20, 0xe0, 0x0c, 0xa6, 0x1b, 0x04, 0x2c, 0xe0, 0x3b, 0x04, 0x28, 0xe0,
442
+0xf8, 0x0b, 0x12, 0x04, 0xf8, 0x14, 0x02, 0x80, 0xfb, 0x2b, 0x8c, 0x88, 0x56,
440
+    0x4b, 0x04, 0x20, 0xe0, 0x13, 0x86, 0x3b, 0x04, 0x24, 0xe0, 0x10, 0x0a,
443
+0x74, 0xef, 0xe5, 0x83, 0x20, 0x44, 0xf1, 0x73, 0xff, 0xc0, 0x27, 0xc5, 0x23,
441
+    0x04, 0xec, 0x1a, 0xfc, 0x33, 0x88, 0x30, 0x06, 0x04, 0xec, 0x12, 0x4e,
444
+0x82, 0x23, 0x52, 0x18, 0xf8, 0x24, 0x02, 0x80, 0xfb, 0x04, 0x00, 0x80, 0xfb,
442
+    0x94, 0xf0, 0x32, 0x48, 0x84, 0xf0, 0x4c, 0xe4, 0x7c, 0xa4, 0xcb, 0x04,
445
+0x2b, 0x8c, 0x18, 0x52, 0x74, 0xef, 0x1b, 0x12, 0x1c, 0xf8, 0x2a, 0xfc, 0x0c,
443
+    0x28, 0xe0, 0x14, 0x08, 0x84, 0xe1, 0xcd, 0xc9, 0xc2, 0x58, 0x90, 0x91,
446
+0xe4, 0x17, 0xc5, 0x13, 0x84, 0x13, 0x52, 0x1c, 0xf8, 0x0b, 0x12, 0x04, 0xf8,
444
+    0x42, 0x4e, 0x94, 0x90, 0xc3, 0x52, 0x04, 0x98, 0x73, 0x52, 0x00, 0x80,
447
+0x14, 0x02, 0x80, 0xfb, 0x2b, 0x8c, 0x28, 0x51, 0x74, 0xef, 0x7b, 0x80, 0x7c,
445
+    0x5b, 0x04, 0x20, 0xe0, 0x5d, 0xc9, 0x52, 0x40, 0x90, 0x91, 0x42, 0x48,
448
+0xa4, 0x08, 0x91, 0xa3, 0x52, 0x1c, 0xe0, 0xa3, 0x52, 0x24, 0xe0, 0x0b, 0xa1,
446
+    0x8c, 0x90, 0x03, 0x52, 0x04, 0x80, 0x43, 0x52, 0x08, 0x80, 0x3b, 0x04,
449
+0x83, 0x52, 0x1c, 0x80, 0x83, 0x52, 0x24, 0x80, 0x89, 0x12, 0x78, 0xf8, 0xf6,
447
+    0x2c, 0xe0, 0x49, 0x04, 0xb8, 0xe0, 0x33, 0x52, 0x1c, 0xf8, 0x2b, 0x04,
450
+0x57, 0xfc, 0xef, 0x6b, 0x12, 0x1c, 0xf8, 0xab, 0x12, 0x18, 0xf8, 0xd6, 0x57,
448
+    0x24, 0xe0, 0x4b, 0xab, 0x23, 0x52, 0x18, 0xf8, 0x65, 0x8a, 0x4b, 0xa9,
451
+0xfc, 0x8f, 0x8b, 0xa3, 0xa0, 0x40, 0x00, 0x9c, 0xa5, 0x86, 0x64, 0x00, 0x80,
449
+    0xe5, 0x90, 0x4b, 0xa7, 0x22, 0x44, 0x84, 0xd0, 0x32, 0x46, 0x84, 0xd0,
452
+0xfb, 0x1b, 0x90, 0xf8, 0x7d, 0xf8, 0xee, 0x6b, 0x80, 0xa4, 0x00, 0x80, 0xfb,
450
+    0x33, 0x52, 0x1c, 0xd8, 0x23, 0x52, 0x18, 0xd8, 0x95, 0x96, 0x20, 0x44,
453
+0x1b, 0x90, 0x98, 0x7d, 0xf8, 0xee, 0x15, 0x12, 0x28, 0xf8, 0x19, 0x02, 0xb8,
451
+    0xf9, 0x73, 0xff, 0xc0, 0x27, 0xc3, 0x23, 0x82, 0x23, 0x52, 0x18, 0xf8,
454
+0xe0, 0x1b, 0xad, 0x95, 0x82, 0x1a, 0xa6, 0xa0, 0x44, 0xf9, 0x73, 0xff, 0xc0,
452
+    0x24, 0x02, 0x80, 0xfb, 0x04, 0x00, 0x80, 0xfb, 0x2b, 0x8c, 0x58, 0x52,
455
+0x27, 0xc3, 0x13, 0x94, 0x10, 0x02, 0x08, 0xec, 0x1c, 0xe4, 0x23, 0x52, 0x18,
453
+    0x74, 0xef, 0x1b, 0x12, 0x1c, 0xf8, 0x2a, 0xfc, 0x0c, 0xe4, 0x17, 0xc3,
456
+0xf8, 0x1b, 0x12, 0x04, 0xf8, 0x03, 0x96, 0x03, 0x52, 0x28, 0xe0, 0x1c, 0xe6,
454
+    0x13, 0x84, 0x13, 0x52, 0x1c, 0xf8, 0x0b, 0x12, 0x04, 0xf8, 0x14, 0x02,
457
+0x0a, 0xa6, 0x1a, 0xe4, 0x63, 0x96, 0x63, 0x52, 0x20, 0xe0, 0x73, 0x52, 0x10,
455
+    0x80, 0xfb, 0x2b, 0x8c, 0x68, 0x51, 0x74, 0xef, 0xc5, 0x87, 0x20, 0x44,
458
+0xe0, 0x03, 0x52, 0x14, 0xe0, 0x13, 0x52, 0x18, 0xe0, 0x98, 0x52, 0x74, 0xef,
456
+    0xe1, 0x73, 0xff, 0xc0, 0x27, 0xc7, 0x23, 0x82, 0x23, 0x52, 0x18, 0xf8,
459
+0x09, 0x12, 0x8c, 0xe0, 0x0b, 0xa1, 0x01, 0x81, 0x01, 0x52, 0x90, 0xe0, 0x65,
457
+    0x24, 0x02, 0x80, 0xfb, 0x04, 0x00, 0x80, 0xfb, 0x2b, 0x8c, 0x78, 0x57,
460
+0x82, 0x05, 0x12, 0x30, 0xf8, 0x09, 0x00, 0xa8, 0xe0, 0x0a, 0x00, 0x0c, 0xf8,
458
+    0x74, 0xef, 0x1b, 0x12, 0x1c, 0xf8, 0x2a, 0xfc, 0x0c, 0xe4, 0x17, 0xc7,
461
+0x16, 0x00, 0x00, 0xc0, 0x01, 0x52, 0x90, 0xc0, 0x46, 0x41, 0x84, 0xe0, 0x0a,
459
+    0x13, 0x84, 0x13, 0x52, 0x1c, 0xf8, 0x0b, 0x12, 0x04, 0xf8, 0x14, 0x02,
462
+0x80, 0x0a, 0x4e, 0x9c, 0xe9, 0x1a, 0x00, 0x08, 0xe0, 0x38, 0x01, 0x01, 0x20,
460
+    0x80, 0xfb, 0x2b, 0x8c, 0x88, 0x56, 0x74, 0xef, 0xe5, 0x83, 0x20, 0x44,
463
+0x00, 0xc0, 0x0b, 0x12, 0x1c, 0xe0, 0x1b, 0x12, 0x24, 0xe0, 0x2b, 0x12, 0x28,
461
+    0xf1, 0x73, 0xff, 0xc0, 0x27, 0xc5, 0x23, 0x82, 0x23, 0x52, 0x18, 0xf8,
464
+0xe0, 0x03, 0x52, 0x2c, 0xe0, 0x0b, 0x12, 0x20, 0xe0, 0x13, 0x52, 0x34, 0xe0,
462
+    0x24, 0x02, 0x80, 0xfb, 0x04, 0x00, 0x80, 0xfb, 0x2b, 0x8c, 0x18, 0x52,
465
+0x23, 0x52, 0x38, 0xe0, 0x03, 0x52, 0x30, 0xe0, 0x0c, 0x00, 0x00, 0xe2, 0xf1,
463
+    0x74, 0xef, 0x1b, 0x12, 0x1c, 0xf8, 0x2a, 0xfc, 0x0c, 0xe4, 0x17, 0xc5,
466
+0x98, 0x0c, 0x0c, 0x7c, 0xf2, 0x93, 0xdd, 0x13, 0xa9, 0x00, 0x00, 0xa8, 0xc1,
464
+    0x13, 0x84, 0x13, 0x52, 0x1c, 0xf8, 0x0b, 0x12, 0x04, 0xf8, 0x14, 0x02,
467
+0x40, 0x00, 0x68, 0x04, 0xa0, 0xe0, 0x40, 0x6c, 0x40, 0x00, 0xe8, 0x34, 0xc8,
465
+    0x80, 0xfb, 0x2b, 0x8c, 0x28, 0x51, 0x74, 0xef, 0x7b, 0x80, 0x7c, 0xa4,
468
+0xe0, 0xfc, 0x91, 0x40, 0x00, 0x68, 0x1f, 0xb8, 0xe0, 0x30, 0x16, 0x41, 0x00,
466
+    0x08, 0x91, 0xa3, 0x52, 0x1c, 0xe0, 0xa3, 0x52, 0x24, 0xe0, 0x0b, 0xa1,
469
+0x28, 0x39, 0x74, 0xe0, 0xb0, 0x7e, 0x40, 0x00, 0xe8, 0x38, 0xc0, 0xe0, 0x30,
467
+    0x83, 0x52, 0x1c, 0x80, 0x83, 0x52, 0x24, 0x80, 0x89, 0x12, 0x78, 0xf8,
470
+0x04, 0x41, 0x00, 0x48, 0x1b, 0x80, 0xe0, 0x30, 0x2e, 0x40, 0x00, 0x88, 0x0c,
468
+    0xf6, 0x57, 0xfc, 0xef, 0x6b, 0x12, 0x1c, 0xf8, 0xab, 0x12, 0x18, 0xf8,
471
+0xec, 0xe0, 0x10, 0x9f, 0x40, 0x00, 0x88, 0x08, 0xb4, 0xe0, 0x10, 0x01, 0x41,
469
+    0xd6, 0x57, 0xfc, 0x8f, 0x8b, 0xa3, 0xa0, 0x40, 0x00, 0x9c, 0xa5, 0x86,
472
+0x00, 0x68, 0x01, 0x84, 0xe0, 0x54, 0xd6, 0x40, 0x00, 0xc8, 0x1a, 0x98, 0xe0,
470
+    0x64, 0x00, 0x80, 0xfb, 0x1b, 0x90, 0xf8, 0x7d, 0xf8, 0xee, 0x6b, 0x80,
473
+0xd0, 0xc8, 0x40, 0x00, 0x68, 0x08, 0xa0, 0xe0, 0x80, 0xdb, 0x40, 0x00, 0xe8,
471
+    0xa4, 0x00, 0x80, 0xfb, 0x1b, 0x90, 0x98, 0x7d, 0xf8, 0xee, 0x15, 0x12,
474
+0x35, 0x94, 0xe0, 0x74, 0xff, 0x40, 0x00, 0xa8, 0x11, 0x80, 0xe0, 0xf8, 0x89,
472
+    0x28, 0xf8, 0x19, 0x02, 0xb8, 0xe0, 0x1b, 0xad, 0x95, 0x82, 0x1a, 0xa6,
475
+0x40, 0x00, 0x88, 0x16, 0xbc, 0xe0, 0x00, 0x90, 0x40, 0x00, 0x08, 0x35, 0xb8,
473
+    0xa0, 0x44, 0xf9, 0x73, 0xff, 0xc0, 0x27, 0xc3, 0x13, 0x94, 0x10, 0x02,
476
+0xe0, 0x7c, 0x73, 0x40, 0x00, 0x88, 0x1b, 0xc8, 0xe0, 0xf4, 0xff, 0x40, 0x00,
474
+    0x08, 0xec, 0x1c, 0xe4, 0x23, 0x52, 0x18, 0xf8, 0x1b, 0x12, 0x04, 0xf8,
477
+0x68, 0x39, 0x80, 0xe0, 0xa4, 0xa4, 0x40, 0x00, 0xa8, 0x16, 0xb0, 0xe0, 0x50,
475
+    0x03, 0x96, 0x03, 0x52, 0x28, 0xe0, 0x1c, 0xe6, 0x0a, 0xa6, 0x1a, 0xe4,
478
+0xc9, 0x40, 0x00, 0x28, 0x3a, 0x98, 0xe0, 0x00, 0xb9, 0x00, 0x00, 0xb6, 0x85,
476
+    0x63, 0x96, 0x63, 0x52, 0x20, 0xe0, 0x73, 0x52, 0x10, 0xe0, 0x03, 0x52,
479
+0x00, 0x00,
477
+    0x14, 0xe0, 0x13, 0x52, 0x18, 0xe0, 0x98, 0x52, 0x74, 0xef, 0x09, 0x12,
478
+    0x8c, 0xe0, 0x0b, 0xa1, 0x01, 0x81, 0x01, 0x52, 0x90, 0xe0, 0x65, 0x82,
479
+    0x05, 0x12, 0x30, 0xf8, 0x09, 0x00, 0xa8, 0xe0, 0x0a, 0x00, 0x0c, 0xf8,
480
+    0x16, 0x00, 0x00, 0xc0, 0x01, 0x52, 0x90, 0xc0, 0x46, 0x41, 0x84, 0xe0,
481
+    0x0a, 0x80, 0x0a, 0x4e, 0x9c, 0xe9, 0x1a, 0x00, 0x08, 0xe0, 0x38, 0x01,
482
+    0x01, 0x20, 0x00, 0xc0, 0x0b, 0x12, 0x1c, 0xe0, 0x1b, 0x12, 0x24, 0xe0,
483
+    0x2b, 0x12, 0x28, 0xe0, 0x03, 0x52, 0x2c, 0xe0, 0x0b, 0x12, 0x20, 0xe0,
484
+    0x13, 0x52, 0x34, 0xe0, 0x23, 0x52, 0x38, 0xe0, 0x03, 0x52, 0x30, 0xe0,
485
+    0x0c, 0x00, 0x00, 0xe2, 0xf1, 0x98, 0x0c, 0x0c, 0x7c, 0xf2, 0x93, 0xdd,
486
+    0x13, 0xa9, 0x00, 0x00, 0xa8, 0xc1, 0x40, 0x00, 0x68, 0x04, 0xa0, 0xe0,
487
+    0x40, 0x6c, 0x40, 0x00, 0xe8, 0x34, 0xc8, 0xe0, 0xfc, 0x91, 0x40, 0x00,
488
+    0x68, 0x1f, 0xb8, 0xe0, 0x30, 0x16, 0x41, 0x00, 0x28, 0x39, 0x74, 0xe0,
489
+    0xb0, 0x7e, 0x40, 0x00, 0xe8, 0x38, 0xc0, 0xe0, 0x30, 0x04, 0x41, 0x00,
490
+    0x48, 0x1b, 0x80, 0xe0, 0x30, 0x2e, 0x40, 0x00, 0x88, 0x0c, 0xec, 0xe0,
491
+    0x10, 0x9f, 0x40, 0x00, 0x88, 0x08, 0xb4, 0xe0, 0x10, 0x01, 0x41, 0x00,
492
+    0x68, 0x01, 0x84, 0xe0, 0x54, 0xd6, 0x40, 0x00, 0xc8, 0x1a, 0x98, 0xe0,
493
+    0xd0, 0xc8, 0x40, 0x00, 0x68, 0x08, 0xa0, 0xe0, 0x80, 0xdb, 0x40, 0x00,
494
+    0xe8, 0x35, 0x94, 0xe0, 0x74, 0xff, 0x40, 0x00, 0xa8, 0x11, 0x80, 0xe0,
495
+    0xf8, 0x89, 0x40, 0x00, 0x88, 0x16, 0xbc, 0xe0, 0x00, 0x90, 0x40, 0x00,
496
+    0x08, 0x35, 0xb8, 0xe0, 0x7c, 0x73, 0x40, 0x00, 0x88, 0x1b, 0xc8, 0xe0,
497
+    0xf4, 0xff, 0x40, 0x00, 0x68, 0x39, 0x80, 0xe0, 0xa4, 0xa4, 0x40, 0x00,
498
+    0xa8, 0x16, 0xb0, 0xe0, 0x50, 0xc9, 0x40, 0x00, 0x28, 0x3a, 0x98, 0xe0,
499
+    0x00, 0xb9, 0x00, 0x00, 0xb6, 0x85, 0x00, 0x00,
480
+};
500
+};
481
+
501
+
482
+static const char * const vd55g1_tp_menu[] = {
502
+static const char * const vd55g1_tp_menu[] = {
483
+    "Disabled",
503
+    "Disabled",
484
+    "Dgrey",
504
+    "Dgrey",
...
...
504
+static const char * const vd55g1_supply_name[] = {
524
+static const char * const vd55g1_supply_name[] = {
505
+    "vcore",
525
+    "vcore",
506
+    "vddio",
526
+    "vddio",
507
+    "vana",
527
+    "vana",
508
+};
528
+};
509
+
510
+/* Will be filled on device tree parse */
511
+static u64 link_freq[1];
512
+
529
+
513
+enum vd55g1_hdr_mode {
530
+enum vd55g1_hdr_mode {
514
+    VD55G1_NO_HDR,
531
+    VD55G1_NO_HDR,
515
+    VD55G1_HDR_SUB,
532
+    VD55G1_HDR_SUB,
516
+};
533
+};
...
...
599
+    u16 oif_ctrl;
616
+    u16 oif_ctrl;
600
+    enum vd55g1_gpio_mode gpios[VD55G1_NB_GPIOS];
617
+    enum vd55g1_gpio_mode gpios[VD55G1_NB_GPIOS];
601
+    unsigned long ext_leds_mask;
618
+    unsigned long ext_leds_mask;
602
+    int data_rate_in_mbps;
619
+    int data_rate_in_mbps;
603
+    u32 pixel_clock;
620
+    u32 pixel_clock;
621
+    u64 link_freq;
604
+    struct v4l2_ctrl_handler ctrl_handler;
622
+    struct v4l2_ctrl_handler ctrl_handler;
605
+    struct v4l2_ctrl *pixel_rate_ctrl;
623
+    struct v4l2_ctrl *pixel_rate_ctrl;
606
+    struct v4l2_ctrl *vblank_ctrl;
624
+    struct v4l2_ctrl *vblank_ctrl;
607
+    struct v4l2_ctrl *hblank_ctrl;
625
+    struct v4l2_ctrl *hblank_ctrl;
608
+    struct {
626
+    struct {
...
...
628
+}
646
+}
629
+
647
+
630
+static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl)
648
+static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl)
631
+{
649
+{
632
+    return &container_of_const(ctrl->handler, struct vd55g1,
650
+    return &container_of_const(ctrl->handler, struct vd55g1,
633
+        ctrl_handler)->sd;
651
+                 ctrl_handler)->sd;
634
+}
652
+}
635
+
653
+
636
+static u8 get_bpp_by_code(struct vd55g1 *sensor, u32 code)
654
+static u8 get_bpp_by_code(struct vd55g1 *sensor, u32 code)
637
+{
655
+{
638
+    struct i2c_client *client = sensor->i2c_client;
656
+    struct i2c_client *client = sensor->i2c_client;
...
...
709
+    const struct v4l2_rect *crop = v4l2_subdev_state_get_crop(state, 0);
727
+    const struct v4l2_rect *crop = v4l2_subdev_state_get_crop(state, 0);
710
+
728
+
711
+    return get_min_line_length(sensor) - crop->width;
729
+    return get_min_line_length(sensor) - crop->width;
712
+}
730
+}
713
+
731
+
714
+static struct vblank_limits get_vblank_limits(struct vd55g1 *sensor)
732
+static void get_vblank_limits(struct vd55g1 *sensor,
715
+{
733
+             struct vblank_limits *limits)
716
+    struct vblank_limits limits;
734
+{
717
+    struct v4l2_subdev_state *state =
735
+    struct v4l2_subdev_state *state =
718
+        v4l2_subdev_get_locked_active_state(&sensor->sd);
736
+        v4l2_subdev_get_locked_active_state(&sensor->sd);
719
+    const struct v4l2_rect *crop = v4l2_subdev_state_get_crop(state, 0);
737
+    const struct v4l2_rect *crop = v4l2_subdev_state_get_crop(state, 0);
720
+
738
+
721
+    limits.min = VD55G1_VBLANK_MIN;
739
+    limits->min = VD55G1_VBLANK_MIN;
722
+    limits.def = VD55G1_FRAME_LENGTH_DEF - crop->height;
740
+    limits->def = VD55G1_FRAME_LENGTH_DEF - crop->height;
723
+    limits.max = VD55G1_VBLANK_MAX - crop->height;
741
+    limits->max = VD55G1_VBLANK_MAX - crop->height;
724
+
725
+    return limits;
726
+}
742
+}
727
+
743
+
728
+#define vd55g1_read(sensor, reg, val, err) \
744
+#define vd55g1_read(sensor, reg, val, err) \
729
+    cci_read((sensor)->regmap, reg, val, err)
745
+    cci_read((sensor)->regmap, reg, val, err)
730
+
746
+
731
+#define vd55g1_write(sensor, reg, val, err) \
747
+#define vd55g1_write(sensor, reg, val, err) \
732
+    cci_write((sensor)->regmap, reg, (u64)val, err)
748
+    cci_write((sensor)->regmap, reg, val, err)
733
+
749
+
734
+static int vd55g1_write_array(struct vd55g1 *sensor, u32 reg, unsigned int len,
750
+static int vd55g1_write_array(struct vd55g1 *sensor, u32 reg, unsigned int len,
735
+             const u8 *array, int *err)
751
+             const u8 *array, int *err)
736
+{
752
+{
737
+    unsigned int chunk_sz = 1024;
753
+    unsigned int chunk_sz = 1024;
...
...
786
+    return vd55g1_poll_reg(sensor, VD55G1_REG_SYSTEM_FSM, state, err);
802
+    return vd55g1_poll_reg(sensor, VD55G1_REG_SYSTEM_FSM, state, err);
787
+}
803
+}
788
+
804
+
789
+static int vd55g1_get_regulators(struct vd55g1 *sensor)
805
+static int vd55g1_get_regulators(struct vd55g1 *sensor)
790
+{
806
+{
791
+    int i;
807
+    unsigned int i;
792
+
808
+
793
+    for (i = 0; i < ARRAY_SIZE(vd55g1_supply_name); i++)
809
+    for (i = 0; i < ARRAY_SIZE(vd55g1_supply_name); i++)
794
+        sensor->supplies[i].supply = vd55g1_supply_name[i];
810
+        sensor->supplies[i].supply = vd55g1_supply_name[i];
795
+
811
+
796
+    return devm_regulator_bulk_get(&sensor->i2c_client->dev,
812
+    return devm_regulator_bulk_get(&sensor->i2c_client->dev,
...
...
800
+
816
+
801
+static int vd55g1_prepare_clock_tree(struct vd55g1 *sensor)
817
+static int vd55g1_prepare_clock_tree(struct vd55g1 *sensor)
802
+{
818
+{
803
+    struct i2c_client *client = sensor->i2c_client;
819
+    struct i2c_client *client = sensor->i2c_client;
804
+    /* Double data rate */
820
+    /* Double data rate */
805
+    u32 mipi_freq = link_freq[0] * 2;
821
+    u32 mipi_freq = sensor->link_freq * 2;
806
+    u32 sys_clk, mipi_div, pixel_div;
822
+    u32 sys_clk, mipi_div, pixel_div;
807
+    int ret = 0;
823
+    int ret = 0;
808
+
824
+
809
+    if (sensor->xclk_freq < 6 * HZ_PER_MHZ ||
825
+    if (sensor->xclk_freq < 6 * HZ_PER_MHZ ||
810
+     sensor->xclk_freq > 27 * HZ_PER_MHZ) {
826
+     sensor->xclk_freq > 27 * HZ_PER_MHZ) {
...
...
850
+    static const u8 index2val[] = {
866
+    static const u8 index2val[] = {
851
+        0x0, 0x22, 0x28
867
+        0x0, 0x22, 0x28
852
+    };
868
+    };
853
+    u32 pattern = index2val[patgen_index];
869
+    u32 pattern = index2val[patgen_index];
854
+    u32 reg = pattern << VD55G1_PATGEN_TYPE_SHIFT;
870
+    u32 reg = pattern << VD55G1_PATGEN_TYPE_SHIFT;
855
+    u8 darkcal = VD55G1_DARKCAL_AUTO;
856
+    u8 duster = VD55G1_DUSTER_RING_ENABLE | VD55G1_DUSTER_DYN_ENABLE |
871
+    u8 duster = VD55G1_DUSTER_RING_ENABLE | VD55G1_DUSTER_DYN_ENABLE |
857
+         VD55G1_DUSTER_ENABLE;
872
+         VD55G1_DUSTER_ENABLE;
858
+    int ret = 0;
873
+    int ret = 0;
859
+
874
+
875
+    BUILD_BUG_ON(ARRAY_SIZE(index2val) != ARRAY_SIZE(vd55g1_tp_menu));
876
+
860
+    if (pattern != 0) {
877
+    if (pattern != 0) {
861
+        reg |= VD55G1_PATGEN_ENABLE;
878
+        reg |= VD55G1_PATGEN_ENABLE;
862
+        /*
879
+        /* Take care of duster to not mess up the test pattern output */
863
+         * Take care of dark calibaration and duster to not mess up the
864
+         * test pattern output.
865
+         */
866
+        darkcal = VD55G1_DARKCAL_BYPASS;
867
+        duster = VD55G1_DUSTER_DISABLE;
880
+        duster = VD55G1_DUSTER_DISABLE;
868
+    }
881
+    }
869
+
882
+
870
+    vd55g1_write(sensor, VD55G1_REG_DARKCAL_CTRL, darkcal, &ret);
871
+    vd55g1_write(sensor, VD55G1_REG_DUSTER_CTRL, duster, &ret);
883
+    vd55g1_write(sensor, VD55G1_REG_DUSTER_CTRL, duster, &ret);
872
+    vd55g1_write(sensor, VD55G1_REG_PATGEN_CTRL, reg, &ret);
884
+    vd55g1_write(sensor, VD55G1_REG_PATGEN_CTRL, reg, &ret);
873
+
885
+
874
+    return ret;
886
+    return ret;
875
+}
887
+}
...
...
944
+static int vd55g1_update_frame_length(struct vd55g1 *sensor,
956
+static int vd55g1_update_frame_length(struct vd55g1 *sensor,
945
+                 unsigned int frame_length)
957
+                 unsigned int frame_length)
946
+{
958
+{
947
+    int ret = 0;
959
+    int ret = 0;
948
+
960
+
949
+    if (sensor->hdr_ctrl->val == VD55G1_HDR_SUB) {
961
+    if (sensor->hdr_ctrl->val == VD55G1_HDR_SUB)
950
+        vd55g1_write(sensor, VD55G1_REG_FRAME_LENGTH(1), frame_length,
962
+        vd55g1_write(sensor, VD55G1_REG_FRAME_LENGTH(1), frame_length,
951
+             &ret);
963
+             &ret);
952
+    }
953
+    vd55g1_write(sensor, VD55G1_REG_FRAME_LENGTH(0), frame_length, &ret);
964
+    vd55g1_write(sensor, VD55G1_REG_FRAME_LENGTH(0), frame_length, &ret);
954
+
965
+
955
+    return ret;
966
+    return ret;
956
+}
967
+}
957
+
968
+
...
...
1226
+        dev_warn(&client->dev, "Can't disable stream");
1237
+        dev_warn(&client->dev, "Can't disable stream");
1227
+
1238
+
1228
+    vd55g1_lock_ctrls(sensor, false);
1239
+    vd55g1_lock_ctrls(sensor, false);
1229
+
1240
+
1230
+    pm_runtime_mark_last_busy(&client->dev);
1241
+    pm_runtime_mark_last_busy(&client->dev);
1231
+    __pm_runtime_put_autosuspend(&client->dev);
1242
+    pm_runtime_put_autosuspend(&client->dev);
1232
+
1243
+
1233
+    return ret;
1244
+    return ret;
1234
+}
1245
+}
1235
+
1246
+
1236
+static int vd55g1_patch(struct vd55g1 *sensor)
1247
+static int vd55g1_patch(struct vd55g1 *sensor)
...
...
1308
+    unsigned int frame_length = 0;
1319
+    unsigned int frame_length = 0;
1309
+    unsigned int expo_max;
1320
+    unsigned int expo_max;
1310
+    int ret;
1321
+    int ret;
1311
+
1322
+
1312
+    /* Reset vblank and frame length to default */
1323
+    /* Reset vblank and frame length to default */
1313
+    vblank = get_vblank_limits(sensor);
1324
+    get_vblank_limits(sensor, &vblank);
1314
+    ret = __v4l2_ctrl_modify_range(sensor->vblank_ctrl, vblank.min,
1325
+    ret = __v4l2_ctrl_modify_range(sensor->vblank_ctrl, vblank.min,
1315
+                 vblank.max, 1, vblank.def);
1326
+                 vblank.max, 1, vblank.def);
1316
+    if (ret)
1327
+    if (ret)
1317
+        return ret;
1328
+        return ret;
1318
+
1329
+
...
...
1383
+             struct v4l2_subdev_state *sd_state)
1394
+             struct v4l2_subdev_state *sd_state)
1384
+{
1395
+{
1385
+    unsigned int def_mode = VD55G1_DEFAULT_MODE;
1396
+    unsigned int def_mode = VD55G1_DEFAULT_MODE;
1386
+    struct vd55g1 *sensor = to_vd55g1(sd);
1397
+    struct vd55g1 *sensor = to_vd55g1(sd);
1387
+    struct v4l2_subdev_format fmt = { 0 };
1398
+    struct v4l2_subdev_format fmt = { 0 };
1388
+    struct v4l2_subdev_route routes[] = { 0 };
1399
+    struct v4l2_subdev_route routes[] = {
1400
+        { .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE }
1401
+    };
1389
+    struct v4l2_subdev_krouting routing = {
1402
+    struct v4l2_subdev_krouting routing = {
1390
+     .num_routes = ARRAY_SIZE(routes),
1403
+     .num_routes = ARRAY_SIZE(routes),
1391
+     .routes = routes,
1404
+     .routes = routes,
1392
+    };
1405
+    };
1393
+    int ret;
1406
+    int ret;
1394
+
1407
+
1395
+    /* Needed by v4l2_subdev_s_stream_helper(), even with 1 stream only */
1408
+    /* Needed by v4l2_subdev_s_stream_helper(), even with 1 stream only */
1396
+    routes[0].flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE;
1397
+    ret = v4l2_subdev_set_routing(sd, sd_state, &routing);
1409
+    ret = v4l2_subdev_set_routing(sd, sd_state, &routing);
1398
+    if (ret)
1410
+    if (ret)
1399
+        return ret;
1411
+        return ret;
1400
+
1412
+
1401
+    vd55g1_update_img_pad_format(sensor, &vd55g1_supported_modes[def_mode],
1413
+    vd55g1_update_img_pad_format(sensor, &vd55g1_supported_modes[def_mode],
...
...
1604
+    sensor->patgen_ctrl =
1616
+    sensor->patgen_ctrl =
1605
+        v4l2_ctrl_new_std_menu_items(hdl, ops, V4L2_CID_TEST_PATTERN,
1617
+        v4l2_ctrl_new_std_menu_items(hdl, ops, V4L2_CID_TEST_PATTERN,
1606
+                     ARRAY_SIZE(vd55g1_tp_menu) - 1, 0,
1618
+                     ARRAY_SIZE(vd55g1_tp_menu) - 1, 0,
1607
+                     0, vd55g1_tp_menu);
1619
+                     0, vd55g1_tp_menu);
1608
+    ctrl = v4l2_ctrl_new_int_menu(hdl, ops, V4L2_CID_LINK_FREQ,
1620
+    ctrl = v4l2_ctrl_new_int_menu(hdl, ops, V4L2_CID_LINK_FREQ,
1609
+                 ARRAY_SIZE(link_freq) - 1, 0, link_freq);
1621
+                 0, 0, &sensor->link_freq);
1610
+    if (ctrl)
1622
+    if (ctrl)
1611
+        ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1623
+        ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1612
+    sensor->pixel_rate_ctrl = v4l2_ctrl_new_std(hdl, ops,
1624
+    sensor->pixel_rate_ctrl = v4l2_ctrl_new_std(hdl, ops,
1613
+                         V4L2_CID_PIXEL_RATE, 1,
1625
+                         V4L2_CID_PIXEL_RATE, 1,
1614
+                         INT_MAX, 1,
1626
+                         INT_MAX, 1,
...
...
1631
+    hblank = get_hblank_min(sensor);
1643
+    hblank = get_hblank_min(sensor);
1632
+    sensor->hblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HBLANK,
1644
+    sensor->hblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HBLANK,
1633
+                        hblank, hblank, 1, hblank);
1645
+                        hblank, hblank, 1, hblank);
1634
+    if (sensor->hblank_ctrl)
1646
+    if (sensor->hblank_ctrl)
1635
+        sensor->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1647
+        sensor->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
1636
+    vblank = get_vblank_limits(sensor);
1648
+    get_vblank_limits(sensor, &vblank);
1637
+    sensor->vblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VBLANK,
1649
+    sensor->vblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VBLANK,
1638
+                        vblank.min, vblank.max,
1650
+                        vblank.min, vblank.max,
1639
+                        1, vblank.def);
1651
+                        1, vblank.def);
1640
+
1652
+
1641
+    /* Additional controls based on device tree properties */
1653
+    /* Additional controls based on device tree properties */
...
...
1645
+                     V4L2_CID_FLASH_LED_MODE,
1657
+                     V4L2_CID_FLASH_LED_MODE,
1646
+                     V4L2_FLASH_LED_MODE_FLASH, 0,
1658
+                     V4L2_FLASH_LED_MODE_FLASH, 0,
1647
+                     V4L2_FLASH_LED_MODE_NONE);
1659
+                     V4L2_FLASH_LED_MODE_NONE);
1648
+    }
1660
+    }
1649
+
1661
+
1650
+    if (hdl->error) {
1651
+        ret = hdl->error;
1652
+        goto free_ctrls;
1653
+    }
1654
+
1655
+    ret = v4l2_fwnode_device_parse(&sensor->i2c_client->dev, &fwnode_props);
1662
+    ret = v4l2_fwnode_device_parse(&sensor->i2c_client->dev, &fwnode_props);
1656
+    if (ret)
1663
+    if (ret)
1657
+        goto free_ctrls;
1664
+        goto free_ctrls;
1658
+
1665
+
1659
+    ret = v4l2_ctrl_new_fwnode_properties(hdl, ops, &fwnode_props);
1666
+    ret = v4l2_ctrl_new_fwnode_properties(hdl, ops, &fwnode_props);
...
...
1815
+    if (ep.nr_of_link_frequencies != 1) {
1822
+    if (ep.nr_of_link_frequencies != 1) {
1816
+        dev_err(&client->dev, "Multiple link frequencies not supported\n");
1823
+        dev_err(&client->dev, "Multiple link frequencies not supported\n");
1817
+        ret = -EINVAL;
1824
+        ret = -EINVAL;
1818
+        goto done;
1825
+        goto done;
1819
+    }
1826
+    }
1820
+    link_freq[0] = ep.link_frequencies[0];
1827
+    sensor->link_freq = ep.link_frequencies[0];
1821
+
1828
+
1822
+done:
1829
+done:
1823
+    v4l2_fwnode_endpoint_free(&ep);
1830
+    v4l2_fwnode_endpoint_free(&ep);
1824
+
1831
+
1825
+    return ret;
1832
+    return ret;
1826
+}
1833
+}
1827
+
1834
+
1828
+static int vd55g1_parse_dt_gpios_array(struct vd55g1 *sensor,
1835
+static int vd55g1_parse_dt_gpios_array(struct vd55g1 *sensor,
1829
+                 char *prop_name, u32 *array, int *nb)
1836
+                 char *prop_name, u32 *array, int *nb)
1830
+{
1837
+{
1831
+    struct i2c_client *client = sensor->i2c_client;
1838
+    struct i2c_client *client = sensor->i2c_client;
1832
+    struct device_node *np = client->dev.of_node;
1839
+    struct device *dev = &client->dev;
1833
+    unsigned int i;
1840
+    unsigned int i;
1834
+
1841
+    int ret;
1835
+    *nb = of_property_read_variable_u32_array(np, prop_name, array, 0,
1842
+
1836
+                         VD55G1_NB_GPIOS);
1843
+    *nb = device_property_count_u32(dev, prop_name);
1837
+    if (*nb == -EINVAL) {
1844
+    if (*nb == -EINVAL) {
1838
+        /* Property not found */
1845
+        /* Property not found */
1839
+        *nb = 0;
1846
+        *nb = 0;
1840
+        return 0;
1847
+        return 0;
1841
+    } else if (*nb < 0) {
1848
+    }
1849
+
1850
+    ret = device_property_read_u32_array(dev, prop_name, array, *nb);
1851
+    if (ret) {
1842
+        dev_err(&client->dev, "Failed to read %s prop\n", prop_name);
1852
+        dev_err(&client->dev, "Failed to read %s prop\n", prop_name);
1843
+        return *nb;
1853
+        return ret;
1844
+    }
1854
+    }
1845
+
1846
+    for (i = 0; i < *nb; i++) {
1855
+    for (i = 0; i < *nb; i++) {
1847
+        if (array[i] >= VD55G1_NB_GPIOS) {
1856
+        if (array[i] >= VD55G1_NB_GPIOS) {
1848
+            dev_err(&client->dev, "Invalid GPIO number %d\n",
1857
+            dev_err(&client->dev, "Invalid GPIO number %d\n",
1849
+                array[i]);
1858
+                array[i]);
1850
+            return -EINVAL;
1859
+            return -EINVAL;
...
...
2000
+    /* Detect if sensor is present and if its revision is supported */
2009
+    /* Detect if sensor is present and if its revision is supported */
2001
+    ret = vd55g1_power_on(dev);
2010
+    ret = vd55g1_power_on(dev);
2002
+    if (ret)
2011
+    if (ret)
2003
+        return ret;
2012
+        return ret;
2004
+
2013
+
2005
+    ret = vd55g1_subdev_init(sensor);
2006
+    if (ret) {
2007
+        dev_err(dev, "V4l2 init failed : %d", ret);
2008
+        goto err_power_off;
2009
+    }
2010
+
2011
+    ret = v4l2_async_register_subdev(&sensor->sd);
2012
+    if (ret) {
2013
+        dev_err(dev, "async subdev register failed %d", ret);
2014
+        goto err_subdev;
2015
+    }
2016
+
2017
+    /* Enable pm_runtime and power off the sensor */
2014
+    /* Enable pm_runtime and power off the sensor */
2018
+    pm_runtime_set_active(dev);
2015
+    pm_runtime_set_active(dev);
2019
+    pm_runtime_get_noresume(dev);
2016
+    pm_runtime_get_noresume(dev);
2020
+    pm_runtime_enable(dev);
2017
+    pm_runtime_enable(dev);
2021
+    pm_runtime_set_autosuspend_delay(dev, 4000);
2018
+    pm_runtime_set_autosuspend_delay(dev, 4000);
2022
+    pm_runtime_use_autosuspend(dev);
2019
+    pm_runtime_use_autosuspend(dev);
2023
+    pm_runtime_mark_last_busy(dev);
2020
+    pm_runtime_mark_last_busy(dev);
2024
+
2021
+
2022
+    ret = vd55g1_subdev_init(sensor);
2023
+    if (ret) {
2024
+        dev_err(dev, "V4l2 init failed : %d", ret);
2025
+        goto err_power_off;
2026
+    }
2027
+
2028
+    ret = v4l2_async_register_subdev(&sensor->sd);
2029
+    if (ret) {
2030
+        dev_err(dev, "async subdev register failed %d", ret);
2031
+        goto err_subdev;
2032
+    }
2033
+
2025
+    return 0;
2034
+    return 0;
2026
+
2035
+
2027
+err_subdev:
2036
+err_subdev:
2028
+    vd55g1_subdev_cleanup(sensor);
2037
+    vd55g1_subdev_cleanup(sensor);
2029
+err_power_off:
2038
+err_power_off:
2039
+    pm_runtime_disable(dev);
2040
+    pm_runtime_put_noidle(dev);
2030
+    vd55g1_power_off(dev);
2041
+    vd55g1_power_off(dev);
2031
+
2042
+
2032
+    return ret;
2043
+    return ret;
2033
+}
2044
+}
2034
+
2045
+
...
...
2041
+
2052
+
2042
+    pm_runtime_disable(&client->dev);
2053
+    pm_runtime_disable(&client->dev);
2043
+    if (!pm_runtime_status_suspended(&client->dev))
2054
+    if (!pm_runtime_status_suspended(&client->dev))
2044
+        vd55g1_power_off(&client->dev);
2055
+        vd55g1_power_off(&client->dev);
2045
+    pm_runtime_set_suspended(&client->dev);
2056
+    pm_runtime_set_suspended(&client->dev);
2057
+    pm_runtime_dont_use_autosuspend(&client->dev);
2046
+}
2058
+}
2047
+
2059
+
2048
+static const struct of_device_id vd55g1_dt_ids[] = {
2060
+static const struct of_device_id vd55g1_dt_ids[] = {
2049
+    { .compatible = "st,vd55g1" },
2061
+    { .compatible = "st,vd55g1" },
2050
+    { /* sentinel */ }
2062
+    { /* sentinel */ }
...
...
diff view generated by jsdifflib