@piying/view-svelte 2.10.0 → 2.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/builder.js CHANGED
@@ -1,4 +1,3 @@
1
1
  import { FormBuilder } from '@piying/view-core';
2
2
  export class SvelteFormBuilder extends FormBuilder {
3
3
  }
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2hELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxXQUErQjtDQUFHIn0=
@@ -0,0 +1,37 @@
1
+ <script lang="ts">
2
+ import type { KeyPath } from '@piying/view-core';
3
+ import { createViewControlLink, isFieldControl } from '@piying/view-core';
4
+ import type { PiResolvedViewFieldConfig } from '../type/group';
5
+ import { useControlValueAccessor } from '../util/use-control-value-accessor.svelte';
6
+
7
+ let props: {
8
+ field: PiResolvedViewFieldConfig;
9
+ path?: KeyPath;
10
+ children: (cvaa: any, field: PiResolvedViewFieldConfig) => any;
11
+ } = $props();
12
+
13
+ let dispose: ((destroy?: boolean) => void) | undefined;
14
+
15
+ const resolvedField = $derived(props.path ? props.field.get(props.path)! : props.field);
16
+
17
+ const { cva, cvaa } = useControlValueAccessor();
18
+ $effect.pre(() => {
19
+ dispose?.();
20
+ const control = resolvedField?.form.control;
21
+ if (!control) {
22
+ throw new Error(
23
+ `📍 fieldControlBind:[${props.field?.keyPath || ''}]->[${props.path || ''}]❗`
24
+ );
25
+ }
26
+ if (!isFieldControl(control)) {
27
+ throw new Error(`🏷️ fieldControl❗`);
28
+ }
29
+ dispose = createViewControlLink(() => control, cva, props.field.injector);
30
+ return () => {
31
+ dispose?.(true);
32
+ dispose = undefined;
33
+ };
34
+ });
35
+ </script>
36
+
37
+ {@render props.children(cvaa, resolvedField)}
@@ -0,0 +1,10 @@
1
+ import type { KeyPath } from '@piying/view-core';
2
+ import type { PiResolvedViewFieldConfig } from '../type/group';
3
+ type $$ComponentProps = {
4
+ field: PiResolvedViewFieldConfig;
5
+ path?: KeyPath;
6
+ children: (cvaa: any, field: PiResolvedViewFieldConfig) => any;
7
+ };
8
+ declare const FieldControlBind: import("svelte").Component<$$ComponentProps, {}, "">;
9
+ type FieldControlBind = ReturnType<typeof FieldControlBind>;
10
+ export default FieldControlBind;
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import type { PiResolvedViewFieldConfig } from '../type/group';
2
+ import type { _PiResolvedCommonViewFieldConfig, KeyPath } from '@piying/view-core';
3
3
  import { signalToState } from '../util/signal-convert.svelte';
4
4
  import { PI_VIEW_FIELD_TOKEN, InjectorToken } from '../token';
5
5
  import { createViewControlLink, getLazyImport, isLazyMark } from '@piying/view-core';
@@ -7,20 +7,22 @@
7
7
  import type { Injector } from 'static-injector';
8
8
  import PiWrapper from './wrapper.svelte';
9
9
  const props: {
10
- field: PiResolvedViewFieldConfig;
10
+ field: _PiResolvedCommonViewFieldConfig;
11
+ path?: KeyPath;
11
12
  } = $props();
12
13
  const injector = getContext<() => Injector>(InjectorToken)!;
14
+ const field = $derived(props.path ? props.field.get(props.path)! : props.field);
13
15
  const fieldInputs = signalToState(() => {
14
16
  return {
15
- ...props.field.attributes(),
16
- ...props.field.inputs(),
17
+ ...field.attributes(),
18
+ ...field.inputs(),
17
19
  // todo outputs不应该加signal,因为没必要动态更新?
18
- ...props.field.outputs()
20
+ ...field.outputs()
19
21
  };
20
22
  });
21
23
  let controlRef = $state<any>();
22
- const renderConfig = signalToState(() => props.field.renderConfig());
23
- const control = $derived.by(() => props.field.form.control);
24
+ const renderConfig = signalToState(() => field.renderConfig());
25
+ const control = $derived.by(() => field.form.control);
24
26
  $effect.pre(() => {
25
27
  let dispose: (() => any) | undefined;
26
28
  if (controlRef?.cva) {
@@ -31,11 +33,11 @@
31
33
  dispose = undefined;
32
34
  };
33
35
  });
34
- const fieldChildren = signalToState(() => props.field.children?.());
36
+ const fieldChildren = signalToState(() => field.children?.());
35
37
 
36
- const wrappers = signalToState(() => props.field.wrappers());
38
+ const wrappers = signalToState(() => field.wrappers());
37
39
  const ComponentType = $derived.by(() => {
38
- return props.field.define?.()?.type;
40
+ return field.define?.()?.type;
39
41
  });
40
42
  const isLazy = $derived.by(() => {
41
43
  return isLazyMark(ComponentType);
@@ -43,7 +45,6 @@
43
45
  const loading = $derived.by(() => {
44
46
  return getLazyImport<() => Promise<any>>(ComponentType)!();
45
47
  });
46
- const field = $derived(props.field);
47
48
  setContext(PI_VIEW_FIELD_TOKEN, () => field);
48
49
  </script>
49
50
 
@@ -1,6 +1,7 @@
1
- import type { PiResolvedViewFieldConfig } from '../type/group';
1
+ import type { _PiResolvedCommonViewFieldConfig, KeyPath } from '@piying/view-core';
2
2
  type $$ComponentProps = {
3
- field: PiResolvedViewFieldConfig;
3
+ field: _PiResolvedCommonViewFieldConfig;
4
+ path?: KeyPath;
4
5
  };
5
6
  declare const FieldTemplate: import("svelte").Component<$$ComponentProps, {}, "">;
6
7
  type FieldTemplate = ReturnType<typeof FieldTemplate>;
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import * as v from 'valibot';
3
- import { convert } from '@piying/view-core';
3
+ import type { FieldConvertViewOptions } from '@piying/view-core';
4
4
  import {
5
5
  ChangeDetectionScheduler,
6
6
  ChangeDetectionSchedulerImpl,
@@ -11,22 +11,15 @@
11
11
  } from 'static-injector';
12
12
  import type { Injector } from 'static-injector';
13
13
  import { getContext, setContext } from 'svelte';
14
- import {
15
- InjectorToken,
16
- PI_INPUT_MODEL_TOKEN,
17
- PI_INPUT_OPTIONS_TOKEN,
18
- PI_INPUT_SCHEMA_TOKEN,
19
- PI_VIEW_FIELD_TOKEN
20
- } from '../token';
21
- import { SvelteSchemaHandle } from '../svelte-schema';
22
- import { SvelteFormBuilder } from '../builder';
14
+ import { InjectorToken, PI_VIEW_FIELD_TOKEN } from '../token';
23
15
  import FieldTemplate from './field-template.svelte';
24
16
  import { initListen } from '@piying/view-core';
17
+ import { convertToField } from '../util/convert-wrapper.svelte';
25
18
  let inputs: {
26
- schema: v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>;
19
+ schema: v.BaseSchema<any, any, any>;
27
20
  model?: any;
28
21
  modelChange?: (value: any) => void;
29
- options: { injector?: Injector; builder?: any; [name: string]: any };
22
+ options: FieldConvertViewOptions;
30
23
  } = $props();
31
24
  const maybeParentField = getContext<PI_VIEW_FIELD_TOKEN>(PI_VIEW_FIELD_TOKEN);
32
25
  const rootInjector = $derived.by(() => {
@@ -44,10 +37,8 @@
44
37
  );
45
38
  });
46
39
 
47
- setContext(InjectorToken, () => rootInjector);
48
- setContext(PI_INPUT_OPTIONS_TOKEN, () => inputs.options);
49
- setContext(PI_INPUT_SCHEMA_TOKEN, () => inputs.schema);
50
- setContext(PI_INPUT_MODEL_TOKEN, () => inputs.model);
40
+ setContext(InjectorToken, () => rootInjector!);
41
+
51
42
  let injectorDispose: (() => any) | undefined;
52
43
 
53
44
  const [field, subInjector] = $derived.by(() => {
@@ -57,12 +48,11 @@
57
48
  subInjector.destroy();
58
49
  injectorDispose = undefined;
59
50
  };
60
- const field = convert(inputs.schema as any, {
61
- ...inputs.options,
62
- handle: SvelteSchemaHandle as any,
63
- builder: SvelteFormBuilder,
64
- injector: subInjector
65
- });
51
+ const field = convertToField(
52
+ () => inputs.schema,
53
+ subInjector,
54
+ () => inputs.options
55
+ );
66
56
  return [field, subInjector];
67
57
  });
68
58
  $effect.pre(() => {
@@ -1,14 +1,10 @@
1
1
  import * as v from 'valibot';
2
- import type { Injector } from 'static-injector';
2
+ import type { FieldConvertViewOptions } from '@piying/view-core';
3
3
  type $$ComponentProps = {
4
- schema: v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>;
4
+ schema: v.BaseSchema<any, any, any>;
5
5
  model?: any;
6
6
  modelChange?: (value: any) => void;
7
- options: {
8
- injector?: Injector;
9
- builder?: any;
10
- [name: string]: any;
11
- };
7
+ options: FieldConvertViewOptions;
12
8
  };
13
9
  declare const PiyingView: import("svelte").Component<$$ComponentProps, {}, "">;
14
10
  type PiyingView = ReturnType<typeof PiyingView>;
package/index.d.ts CHANGED
@@ -2,11 +2,14 @@ import PiyingView from './component/piying-view.svelte';
2
2
  export { PiyingView };
3
3
  import PiyingFieldTemplate from './component/field-template.svelte';
4
4
  export { PiyingFieldTemplate };
5
+ import Field from './component/field-control-bind.svelte';
6
+ export { Field };
5
7
  import PiyingViewGroup from './component/group.svelte';
6
8
  export { PiyingViewGroup };
7
9
  export * from './type';
8
10
  export * from './token';
9
11
  export * from './builder';
10
12
  export * from './svelte-schema';
13
+ export * from './util/convert-wrapper.svelte';
11
14
  export * from './util/use-control-value-accessor.svelte';
12
15
  export * from './util/signal-convert.svelte';
package/index.js CHANGED
@@ -2,12 +2,14 @@ import PiyingView from './component/piying-view.svelte';
2
2
  export { PiyingView };
3
3
  import PiyingFieldTemplate from './component/field-template.svelte';
4
4
  export { PiyingFieldTemplate };
5
+ import Field from './component/field-control-bind.svelte';
6
+ export { Field };
5
7
  import PiyingViewGroup from './component/group.svelte';
6
8
  export { PiyingViewGroup };
7
9
  export * from './type';
8
10
  export * from './token';
9
11
  export * from './builder';
10
12
  export * from './svelte-schema';
13
+ export * from './util/convert-wrapper.svelte';
11
14
  export * from './util/use-control-value-accessor.svelte';
12
15
  export * from './util/signal-convert.svelte';
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFVBQVUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDdEIsT0FBTyxtQkFBbUIsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQztBQUMvQixPQUFPLGVBQWUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUM7QUFDM0IsY0FBYyxRQUFRLENBQUM7QUFDdkIsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsOEJBQThCLENBQUMifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@piying/view-svelte",
3
- "version": "2.10.0",
3
+ "version": "2.10.2",
4
4
  "description": "Piying view For Svelte;Valibot to Component",
5
5
  "type": "module",
6
6
  "homepage": "https://piying-org.github.io/website/docs/client/intro",
@@ -34,7 +34,7 @@
34
34
  ],
35
35
  "license": "MIT",
36
36
  "dependencies": {
37
- "@piying/view-core": "^2.10.0",
37
+ "@piying/view-core": "^2.10.2",
38
38
  "static-injector": "^6.3.1"
39
39
  },
40
40
  "sideEffects": false,
package/svelte-schema.js CHANGED
@@ -1,4 +1,3 @@
1
1
  import { CoreSchemaHandle } from '@piying/view-core';
2
2
  export class SvelteSchemaHandle extends CoreSchemaHandle {
3
3
  }
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZlbHRlLXNjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN2ZWx0ZS1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHckQsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGdCQUd2QztDQUVBIn0=
package/token.d.ts CHANGED
@@ -1,16 +1,4 @@
1
- import type { ConvertOptions } from '@piying/valibot-visit';
2
- import type { SetOptional, CoreSchemaHandle, FormBuilder } from '@piying/view-core';
3
- import type { PiResolvedViewFieldConfig, PiViewConfig } from './type/group';
4
- import * as v from 'valibot';
1
+ import type { PiResolvedViewFieldConfig } from './type/group';
5
2
  export declare const InjectorToken: unique symbol;
6
3
  export declare const PI_VIEW_FIELD_TOKEN: unique symbol;
7
- export declare const PI_INPUT_OPTIONS_TOKEN: unique symbol;
8
- export type PI_INPUT_OPTIONS_TOKEN = () => SetOptional<ConvertOptions<typeof CoreSchemaHandle<any, any>>, 'handle'> & {
9
- builder: typeof FormBuilder<CoreSchemaHandle<any, any>>;
10
- fieldGlobalConfig?: PiViewConfig;
11
- };
12
- export declare const PI_INPUT_SCHEMA_TOKEN: unique symbol;
13
- export type PI_INPUT_SCHEMA_TOKEN = () => v.BaseSchema<any, any, any> | v.SchemaWithPipe<any>;
14
- export declare const PI_INPUT_MODEL_TOKEN: unique symbol;
15
- export type PI_INPUT_MODEL_TOKEN = () => any;
16
4
  export type PI_VIEW_FIELD_TOKEN = () => PiResolvedViewFieldConfig;
package/token.js CHANGED
@@ -1,7 +1,2 @@
1
- import * as v from 'valibot';
2
1
  export const InjectorToken = Symbol();
3
2
  export const PI_VIEW_FIELD_TOKEN = Symbol();
4
- export const PI_INPUT_OPTIONS_TOKEN = Symbol();
5
- export const PI_INPUT_SCHEMA_TOKEN = Symbol();
6
- export const PI_INPUT_MODEL_TOKEN = Symbol();
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEtBQUssQ0FBQyxNQUFNLFNBQVMsQ0FBQztBQUU3QixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFDdEMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFRL0MsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFFOUMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxFQUFFLENBQUMifQ==
package/type/group.js CHANGED
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJncm91cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
package/type/index.js CHANGED
@@ -1,2 +1 @@
1
1
  export * from './group';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFNBQVMsQ0FBQyJ9
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 转换 Valibot 定义为 Piying 字段
3
+ */
4
+ export declare const convertToField: <T extends import("valibot").BaseSchema<any, any, any>>(schema: () => T, parent?: import("static-injector").Injector, options?: () => import("@piying/view-core").FieldConvertOptions | undefined, providers?: import("static-injector").Provider[]) => any;
@@ -0,0 +1,19 @@
1
+ import { createConvertToField } from '@piying/view-core';
2
+ import { SvelteFormBuilder } from '../builder';
3
+ import { SvelteSchemaHandle } from '../svelte-schema';
4
+ import { ChangeDetectionScheduler, ChangeDetectionSchedulerImpl, createRootInjector } from 'static-injector';
5
+ const DefaultConvertOptions = {
6
+ builder: SvelteFormBuilder,
7
+ handle: SvelteSchemaHandle
8
+ };
9
+ /**
10
+ * 转换 Valibot 定义为 Piying 字段
11
+ */
12
+ export const convertToField = createConvertToField(DefaultConvertOptions, createRootInjector({
13
+ providers: [
14
+ {
15
+ provide: ChangeDetectionScheduler,
16
+ useClass: ChangeDetectionSchedulerImpl
17
+ }
18
+ ]
19
+ }));
@@ -18,4 +18,3 @@ export function signalToState(value) {
18
18
  });
19
19
  return () => dataRef;
20
20
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLWNvbnZlcnQuc3ZlbHRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2lnbmFsLWNvbnZlcnQuc3ZlbHRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXBDLE1BQU0sVUFBVSxhQUFhLENBQUksS0FBMEI7SUFDMUQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFpQixhQUFhLENBQUUsQ0FBQztJQUM1RCxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFnQixTQUFnQixDQUFDLENBQUM7SUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDaEIsT0FBTyxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FDakIsR0FBRyxFQUFFO1lBQ0osTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU8sR0FBRyxZQUFZLENBQUM7WUFDeEIsQ0FBQztRQUNGLENBQUMsRUFDRCxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUN4QixDQUFDO1FBQ0YsT0FBTyxHQUFHLEVBQUU7WUFDWCxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixDQUFDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDO0FBQ3RCLENBQUMifQ==
@@ -46,4 +46,3 @@ export function useControlValueAccessor(optionalBind) {
46
46
  }
47
47
  };
48
48
  }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNvbnRyb2wtdmFsdWUtYWNjZXNzb3Iuc3ZlbHRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidXNlLWNvbnRyb2wtdmFsdWUtYWNjZXNzb3Iuc3ZlbHRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxZQUFzQjtJQUM3RCxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUNyQixJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsSUFBSSxRQUE4QixDQUFDO0lBQ25DLElBQUksT0FBbUIsQ0FBQztJQUN4QixNQUFNLFFBQVEsR0FBeUI7UUFDdEMsVUFBVSxDQUFDLEdBQUc7WUFDYixLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUNELGdCQUFnQixDQUFDLEVBQUU7WUFDbEIsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFDRCxpQkFBaUIsQ0FBQyxFQUFFO1lBQ25CLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDZCxDQUFDO1FBQ0QsZ0JBQWdCLENBQUMsS0FBSztZQUNyQixRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLENBQUM7S0FDRCxDQUFDO0lBQ0YsT0FBTztRQUNOLEdBQUcsRUFBRSxRQUFRO1FBQ2IsSUFBSSxFQUFFO1lBQ0wsSUFBSSxLQUFLO2dCQUNSLE9BQU8sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUNELElBQUksUUFBUTtnQkFDWCxPQUFPLFFBQVEsQ0FBQztZQUNqQixDQUFDO1lBQ0QsV0FBVyxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQzNCLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2xCLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQixDQUFDO3FCQUFNLENBQUM7b0JBQ1AsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQixDQUFDO2dCQUNELEtBQUssR0FBRyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsYUFBYSxFQUFFLEdBQUcsRUFBRTtnQkFDbkIsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDbEIsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDYixDQUFDO3FCQUFNLENBQUM7b0JBQ1AsT0FBTyxFQUFFLENBQUM7Z0JBQ1gsQ0FBQztZQUNGLENBQUM7U0FDRDtLQUNELENBQUM7QUFDSCxDQUFDIn0=